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 * $FreeBSD$ 27565bc101SPawel Jakub Dawidek */ 28565bc101SPawel Jakub Dawidek 29565bc101SPawel Jakub Dawidek #include <sys/param.h> 30565bc101SPawel Jakub Dawidek #include <sys/bio.h> 31565bc101SPawel Jakub Dawidek #include <sys/kernel.h> 32565bc101SPawel Jakub Dawidek #include <sys/limits.h> 33565bc101SPawel Jakub Dawidek #include <sys/malloc.h> 34565bc101SPawel Jakub Dawidek #include <sys/queue.h> 35565bc101SPawel Jakub Dawidek #include <sys/sysctl.h> 36565bc101SPawel Jakub Dawidek #include <sys/systm.h> 37565bc101SPawel Jakub Dawidek 38565bc101SPawel Jakub Dawidek #include <geom/geom.h> 39565bc101SPawel Jakub Dawidek 40565bc101SPawel Jakub Dawidek 41565bc101SPawel Jakub Dawidek #define G_ZERO_CLASS_NAME "ZERO" 42565bc101SPawel Jakub Dawidek 43565bc101SPawel Jakub Dawidek SYSCTL_DECL(_kern_geom); 44565bc101SPawel Jakub Dawidek SYSCTL_NODE(_kern_geom, OID_AUTO, zero, CTLFLAG_RW, 0, "GEOM_ZERO stuff"); 45565bc101SPawel Jakub Dawidek static u_int g_zero_clear = 1; 46565bc101SPawel Jakub Dawidek SYSCTL_UINT(_kern_geom_zero, OID_AUTO, clear, CTLFLAG_RW, &g_zero_clear, 0, 47565bc101SPawel Jakub Dawidek "Zero-fill bio_data."); 48565bc101SPawel Jakub Dawidek 49565bc101SPawel Jakub Dawidek static void 50565bc101SPawel Jakub Dawidek g_zero_start(struct bio *bp) 51565bc101SPawel Jakub Dawidek { 52565bc101SPawel Jakub Dawidek int error = ENXIO; 53565bc101SPawel Jakub Dawidek 54565bc101SPawel Jakub Dawidek switch (bp->bio_cmd) { 55565bc101SPawel Jakub Dawidek case BIO_READ: 56565bc101SPawel Jakub Dawidek if (g_zero_clear) 57565bc101SPawel Jakub Dawidek bzero(bp->bio_data, bp->bio_length); 58565bc101SPawel Jakub Dawidek /* FALLTHROUGH */ 59565bc101SPawel Jakub Dawidek case BIO_DELETE: 60565bc101SPawel Jakub Dawidek case BIO_WRITE: 61565bc101SPawel Jakub Dawidek bp->bio_completed = bp->bio_length; 62565bc101SPawel Jakub Dawidek error = 0; 63565bc101SPawel Jakub Dawidek break; 64565bc101SPawel Jakub Dawidek case BIO_GETATTR: 65565bc101SPawel Jakub Dawidek default: 66565bc101SPawel Jakub Dawidek error = EOPNOTSUPP; 67565bc101SPawel Jakub Dawidek break; 68565bc101SPawel Jakub Dawidek } 69565bc101SPawel Jakub Dawidek g_io_deliver(bp, error); 70565bc101SPawel Jakub Dawidek } 71565bc101SPawel Jakub Dawidek 72565bc101SPawel Jakub Dawidek static void 73565bc101SPawel Jakub Dawidek g_zero_init(struct g_class *mp) 74565bc101SPawel Jakub Dawidek { 75565bc101SPawel Jakub Dawidek struct g_geom *gp; 76565bc101SPawel Jakub Dawidek struct g_provider *pp; 77565bc101SPawel Jakub Dawidek 78565bc101SPawel Jakub Dawidek g_topology_assert(); 79565bc101SPawel Jakub Dawidek gp = g_new_geomf(mp, "gzero"); 80565bc101SPawel Jakub Dawidek gp->start = g_zero_start; 81565bc101SPawel Jakub Dawidek gp->access = g_std_access; 82565bc101SPawel Jakub Dawidek pp = g_new_providerf(gp, "%s", gp->name); 83565bc101SPawel Jakub Dawidek pp->mediasize = 1152921504606846976LLU; 84565bc101SPawel Jakub Dawidek pp->sectorsize = 512; 85565bc101SPawel Jakub Dawidek g_error_provider(pp, 0); 86565bc101SPawel Jakub Dawidek } 87565bc101SPawel Jakub Dawidek 88565bc101SPawel Jakub Dawidek static int 89565bc101SPawel Jakub Dawidek g_zero_destroy_geom(struct gctl_req *req __unused, struct g_class *mp __unused, 90565bc101SPawel Jakub Dawidek struct g_geom *gp) 91565bc101SPawel Jakub Dawidek { 92565bc101SPawel Jakub Dawidek struct g_provider *pp; 93565bc101SPawel Jakub Dawidek 94565bc101SPawel Jakub Dawidek g_topology_assert(); 95565bc101SPawel Jakub Dawidek if (gp == NULL) 96565bc101SPawel Jakub Dawidek return (0); 97565bc101SPawel Jakub Dawidek pp = LIST_FIRST(&gp->provider); 98565bc101SPawel Jakub Dawidek if (pp == NULL) 99565bc101SPawel Jakub Dawidek return (0); 100565bc101SPawel Jakub Dawidek if (pp->acr > 0 || pp->acw > 0 || pp->ace > 0) 101565bc101SPawel Jakub Dawidek return (EBUSY); 102565bc101SPawel Jakub Dawidek g_wither_geom(gp, ENXIO); 103565bc101SPawel Jakub Dawidek return (EBUSY); 104565bc101SPawel Jakub Dawidek } 105565bc101SPawel Jakub Dawidek 106565bc101SPawel Jakub Dawidek static struct g_class g_zero_class = { 107565bc101SPawel Jakub Dawidek .name = G_ZERO_CLASS_NAME, 108565bc101SPawel Jakub Dawidek .version = G_VERSION, 109565bc101SPawel Jakub Dawidek .init = g_zero_init, 110565bc101SPawel Jakub Dawidek .destroy_geom = g_zero_destroy_geom 111565bc101SPawel Jakub Dawidek }; 112565bc101SPawel Jakub Dawidek 113565bc101SPawel Jakub Dawidek DECLARE_GEOM_CLASS(g_zero_class, g_zero); 114