1565bc101SPawel Jakub Dawidek /*- 2565bc101SPawel Jakub Dawidek * Copyright (c) 2005 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3565bc101SPawel Jakub Dawidek * All rights reserved. 4565bc101SPawel Jakub Dawidek * 5565bc101SPawel Jakub Dawidek * Redistribution and use in source and binary forms, with or without 6565bc101SPawel Jakub Dawidek * modification, are permitted provided that the following conditions 7565bc101SPawel Jakub Dawidek * are met: 8565bc101SPawel Jakub Dawidek * 1. Redistributions of source code must retain the above copyright 9565bc101SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer. 10565bc101SPawel Jakub Dawidek * 2. Redistributions in binary form must reproduce the above copyright 11565bc101SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer in the 12565bc101SPawel Jakub Dawidek * documentation and/or other materials provided with the distribution. 13565bc101SPawel Jakub Dawidek * 14565bc101SPawel Jakub Dawidek * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15565bc101SPawel Jakub Dawidek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16565bc101SPawel Jakub Dawidek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17565bc101SPawel Jakub Dawidek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18565bc101SPawel Jakub Dawidek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19565bc101SPawel Jakub Dawidek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20565bc101SPawel Jakub Dawidek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21565bc101SPawel Jakub Dawidek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22565bc101SPawel Jakub Dawidek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23565bc101SPawel Jakub Dawidek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24565bc101SPawel Jakub Dawidek * SUCH DAMAGE. 25565bc101SPawel Jakub Dawidek */ 26565bc101SPawel Jakub Dawidek 27a1c10dcbSPawel Jakub Dawidek #include <sys/cdefs.h> 28a1c10dcbSPawel Jakub Dawidek __FBSDID("$FreeBSD$"); 29a1c10dcbSPawel Jakub Dawidek 30565bc101SPawel Jakub Dawidek #include <sys/param.h> 31565bc101SPawel Jakub Dawidek #include <sys/bio.h> 32565bc101SPawel Jakub Dawidek #include <sys/kernel.h> 33565bc101SPawel Jakub Dawidek #include <sys/limits.h> 34565bc101SPawel Jakub Dawidek #include <sys/malloc.h> 35565bc101SPawel Jakub Dawidek #include <sys/queue.h> 36565bc101SPawel Jakub Dawidek #include <sys/sysctl.h> 37565bc101SPawel Jakub Dawidek #include <sys/systm.h> 38565bc101SPawel Jakub Dawidek 39565bc101SPawel Jakub Dawidek #include <geom/geom.h> 40565bc101SPawel Jakub Dawidek 41565bc101SPawel Jakub Dawidek 42565bc101SPawel Jakub Dawidek #define G_ZERO_CLASS_NAME "ZERO" 43565bc101SPawel Jakub Dawidek 44565bc101SPawel Jakub Dawidek SYSCTL_DECL(_kern_geom); 45565bc101SPawel Jakub Dawidek SYSCTL_NODE(_kern_geom, OID_AUTO, zero, CTLFLAG_RW, 0, "GEOM_ZERO stuff"); 4624e1fdcdSPawel Jakub Dawidek static int g_zero_clear = 1; 4724e1fdcdSPawel Jakub Dawidek SYSCTL_INT(_kern_geom_zero, OID_AUTO, clear, CTLFLAG_RW, &g_zero_clear, 0, 4824e1fdcdSPawel Jakub Dawidek "Clear read data buffer"); 4924e1fdcdSPawel Jakub Dawidek static int g_zero_byte = 0; 5024e1fdcdSPawel Jakub Dawidek SYSCTL_INT(_kern_geom_zero, OID_AUTO, byte, CTLFLAG_RW, &g_zero_byte, 0, 5124e1fdcdSPawel Jakub Dawidek "Byte (octet) value to clear the buffers with"); 52565bc101SPawel Jakub Dawidek 53565bc101SPawel Jakub Dawidek static void 54565bc101SPawel Jakub Dawidek g_zero_start(struct bio *bp) 55565bc101SPawel Jakub Dawidek { 56565bc101SPawel Jakub Dawidek int error = ENXIO; 57565bc101SPawel Jakub Dawidek 58565bc101SPawel Jakub Dawidek switch (bp->bio_cmd) { 59565bc101SPawel Jakub Dawidek case BIO_READ: 60565bc101SPawel Jakub Dawidek if (g_zero_clear) 6124e1fdcdSPawel Jakub Dawidek memset(bp->bio_data, g_zero_byte, bp->bio_length); 62565bc101SPawel Jakub Dawidek /* FALLTHROUGH */ 63565bc101SPawel Jakub Dawidek case BIO_DELETE: 64565bc101SPawel Jakub Dawidek case BIO_WRITE: 65565bc101SPawel Jakub Dawidek bp->bio_completed = bp->bio_length; 66565bc101SPawel Jakub Dawidek error = 0; 67565bc101SPawel Jakub Dawidek break; 68565bc101SPawel Jakub Dawidek case BIO_GETATTR: 69565bc101SPawel Jakub Dawidek default: 70565bc101SPawel Jakub Dawidek error = EOPNOTSUPP; 71565bc101SPawel Jakub Dawidek break; 72565bc101SPawel Jakub Dawidek } 73565bc101SPawel Jakub Dawidek g_io_deliver(bp, error); 74565bc101SPawel Jakub Dawidek } 75565bc101SPawel Jakub Dawidek 76565bc101SPawel Jakub Dawidek static void 77565bc101SPawel Jakub Dawidek g_zero_init(struct g_class *mp) 78565bc101SPawel Jakub Dawidek { 79565bc101SPawel Jakub Dawidek struct g_geom *gp; 80565bc101SPawel Jakub Dawidek struct g_provider *pp; 81565bc101SPawel Jakub Dawidek 82565bc101SPawel Jakub Dawidek g_topology_assert(); 83565bc101SPawel Jakub Dawidek gp = g_new_geomf(mp, "gzero"); 84565bc101SPawel Jakub Dawidek gp->start = g_zero_start; 85565bc101SPawel Jakub Dawidek gp->access = g_std_access; 86565bc101SPawel Jakub Dawidek pp = g_new_providerf(gp, "%s", gp->name); 87565bc101SPawel Jakub Dawidek pp->mediasize = 1152921504606846976LLU; 88565bc101SPawel Jakub Dawidek pp->sectorsize = 512; 89565bc101SPawel Jakub Dawidek g_error_provider(pp, 0); 90565bc101SPawel Jakub Dawidek } 91565bc101SPawel Jakub Dawidek 92565bc101SPawel Jakub Dawidek static int 93565bc101SPawel Jakub Dawidek g_zero_destroy_geom(struct gctl_req *req __unused, struct g_class *mp __unused, 94565bc101SPawel Jakub Dawidek struct g_geom *gp) 95565bc101SPawel Jakub Dawidek { 96565bc101SPawel Jakub Dawidek struct g_provider *pp; 97565bc101SPawel Jakub Dawidek 98565bc101SPawel Jakub Dawidek g_topology_assert(); 99565bc101SPawel Jakub Dawidek if (gp == NULL) 100565bc101SPawel Jakub Dawidek return (0); 101565bc101SPawel Jakub Dawidek pp = LIST_FIRST(&gp->provider); 102565bc101SPawel Jakub Dawidek if (pp == NULL) 103565bc101SPawel Jakub Dawidek return (0); 104565bc101SPawel Jakub Dawidek if (pp->acr > 0 || pp->acw > 0 || pp->ace > 0) 105565bc101SPawel Jakub Dawidek return (EBUSY); 106565bc101SPawel Jakub Dawidek g_wither_geom(gp, ENXIO); 107*5a279fc5SJaakko Heinonen return (0); 108565bc101SPawel Jakub Dawidek } 109565bc101SPawel Jakub Dawidek 110565bc101SPawel Jakub Dawidek static struct g_class g_zero_class = { 111565bc101SPawel Jakub Dawidek .name = G_ZERO_CLASS_NAME, 112565bc101SPawel Jakub Dawidek .version = G_VERSION, 113565bc101SPawel Jakub Dawidek .init = g_zero_init, 114565bc101SPawel Jakub Dawidek .destroy_geom = g_zero_destroy_geom 115565bc101SPawel Jakub Dawidek }; 116565bc101SPawel Jakub Dawidek 117565bc101SPawel Jakub Dawidek DECLARE_GEOM_CLASS(g_zero_class, g_zero); 118