geom_dev.c (274154) | geom_dev.c (274366) |
---|---|
1/*- 2 * Copyright (c) 2002 Poul-Henning Kamp 3 * Copyright (c) 2002 Networks Associates Technology, Inc. 4 * All rights reserved. 5 * 6 * This software was developed for the FreeBSD Project by Poul-Henning Kamp 7 * and NAI Labs, the Security Research Division of Network Associates, Inc. 8 * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the --- 20 unchanged lines hidden (view full) --- 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2002 Poul-Henning Kamp 3 * Copyright (c) 2002 Networks Associates Technology, Inc. 4 * All rights reserved. 5 * 6 * This software was developed for the FreeBSD Project by Poul-Henning Kamp 7 * and NAI Labs, the Security Research Division of Network Associates, Inc. 8 * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the --- 20 unchanged lines hidden (view full) --- 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include <sys/cdefs.h> |
37__FBSDID("$FreeBSD: head/sys/geom/geom_dev.c 274154 2014-11-06 00:48:36Z mav $"); | 37__FBSDID("$FreeBSD: head/sys/geom/geom_dev.c 274366 2014-11-11 04:48:09Z pjd $"); |
38 39#include <sys/param.h> 40#include <sys/systm.h> 41#include <sys/malloc.h> 42#include <sys/kernel.h> 43#include <sys/conf.h> 44#include <sys/ctype.h> 45#include <sys/bio.h> --- 76 unchanged lines hidden (view full) --- 122static void 123g_dev_fini(struct g_class *mp) 124{ 125 126 freeenv(dumpdev); 127} 128 129static int | 38 39#include <sys/param.h> 40#include <sys/systm.h> 41#include <sys/malloc.h> 42#include <sys/kernel.h> 43#include <sys/conf.h> 44#include <sys/ctype.h> 45#include <sys/bio.h> --- 76 unchanged lines hidden (view full) --- 122static void 123g_dev_fini(struct g_class *mp) 124{ 125 126 freeenv(dumpdev); 127} 128 129static int |
130g_dev_setdumpdev(struct cdev *dev) | 130g_dev_setdumpdev(struct cdev *dev, struct thread *td) |
131{ 132 struct g_kerneldump kd; 133 struct g_consumer *cp; 134 int error, len; 135 136 if (dev == NULL) | 131{ 132 struct g_kerneldump kd; 133 struct g_consumer *cp; 134 int error, len; 135 136 if (dev == NULL) |
137 return (set_dumper(NULL, NULL)); | 137 return (set_dumper(NULL, NULL, td)); |
138 139 cp = dev->si_drv2; 140 len = sizeof(kd); 141 kd.offset = 0; 142 kd.length = OFF_MAX; 143 error = g_io_getattr("GEOM::kerneldump", cp, &len, &kd); 144 if (error == 0) { | 138 139 cp = dev->si_drv2; 140 len = sizeof(kd); 141 kd.offset = 0; 142 kd.length = OFF_MAX; 143 error = g_io_getattr("GEOM::kerneldump", cp, &len, &kd); 144 if (error == 0) { |
145 error = set_dumper(&kd.di, devtoname(dev)); | 145 error = set_dumper(&kd.di, devtoname(dev), td); |
146 if (error == 0) 147 dev->si_flags |= SI_DUMPDEV; 148 } 149 return (error); 150} 151 152static void 153init_dumpdev(struct cdev *dev) 154{ 155 156 if (dumpdev == NULL) 157 return; 158 if (strcmp(devtoname(dev), dumpdev) != 0) 159 return; | 146 if (error == 0) 147 dev->si_flags |= SI_DUMPDEV; 148 } 149 return (error); 150} 151 152static void 153init_dumpdev(struct cdev *dev) 154{ 155 156 if (dumpdev == NULL) 157 return; 158 if (strcmp(devtoname(dev), dumpdev) != 0) 159 return; |
160 if (g_dev_setdumpdev(dev) == 0) { | 160 if (g_dev_setdumpdev(dev, curthread) == 0) { |
161 freeenv(dumpdev); 162 dumpdev = NULL; 163 } 164} 165 166static void 167g_dev_destroy(void *arg, int flags __unused) 168{ --- 279 unchanged lines hidden (view full) --- 448 if (error == 0 && *(u_int *)data == 0) 449 error = ENOENT; 450 break; 451 case DIOCGFRONTSTUFF: 452 error = g_io_getattr("GEOM::frontstuff", cp, &i, data); 453 break; 454 case DIOCSKERNELDUMP: 455 if (*(u_int *)data == 0) | 161 freeenv(dumpdev); 162 dumpdev = NULL; 163 } 164} 165 166static void 167g_dev_destroy(void *arg, int flags __unused) 168{ --- 279 unchanged lines hidden (view full) --- 448 if (error == 0 && *(u_int *)data == 0) 449 error = ENOENT; 450 break; 451 case DIOCGFRONTSTUFF: 452 error = g_io_getattr("GEOM::frontstuff", cp, &i, data); 453 break; 454 case DIOCSKERNELDUMP: 455 if (*(u_int *)data == 0) |
456 error = g_dev_setdumpdev(NULL); | 456 error = g_dev_setdumpdev(NULL, td); |
457 else | 457 else |
458 error = g_dev_setdumpdev(dev); | 458 error = g_dev_setdumpdev(dev, td); |
459 break; 460 case DIOCGFLUSH: 461 error = g_io_flush(cp); 462 break; 463 case DIOCGDELETE: 464 offset = ((off_t *)data)[0]; 465 length = ((off_t *)data)[1]; 466 if ((offset % cp->provider->sectorsize) != 0 || --- 201 unchanged lines hidden (view full) --- 668 669 g_topology_assert(); 670 sc = cp->private; 671 dev = sc->sc_dev; 672 g_trace(G_T_TOPOLOGY, "g_dev_orphan(%p(%s))", cp, cp->geom->name); 673 674 /* Reset any dump-area set on this device */ 675 if (dev->si_flags & SI_DUMPDEV) | 459 break; 460 case DIOCGFLUSH: 461 error = g_io_flush(cp); 462 break; 463 case DIOCGDELETE: 464 offset = ((off_t *)data)[0]; 465 length = ((off_t *)data)[1]; 466 if ((offset % cp->provider->sectorsize) != 0 || --- 201 unchanged lines hidden (view full) --- 668 669 g_topology_assert(); 670 sc = cp->private; 671 dev = sc->sc_dev; 672 g_trace(G_T_TOPOLOGY, "g_dev_orphan(%p(%s))", cp, cp->geom->name); 673 674 /* Reset any dump-area set on this device */ 675 if (dev->si_flags & SI_DUMPDEV) |
676 (void)set_dumper(NULL, NULL); | 676 (void)set_dumper(NULL, NULL, curthread); |
677 678 /* Destroy the struct cdev *so we get no more requests */ 679 destroy_dev_sched_cb(dev, g_dev_callback, cp); 680} 681 682DECLARE_GEOM_CLASS(g_dev_class, g_dev); | 677 678 /* Destroy the struct cdev *so we get no more requests */ 679 destroy_dev_sched_cb(dev, g_dev_callback, cp); 680} 681 682DECLARE_GEOM_CLASS(g_dev_class, g_dev); |