Date: Thu, 10 May 2001 20:20:40 -0700 From: Dima Dorfman <dima@unixfreak.org> To: Poul-Henning Kamp <phk@critter.freebsd.dk> Cc: hackers@freebsd.org Subject: Re: Who's cleaning up after disk_clone? Message-ID: <20010511032041.F3FB43E28@bazooka.unixfreak.org> In-Reply-To: <75404.989482620@critter>; from phk@critter.freebsd.dk on "Thu, 10 May 2001 10:17:00 %2B0200"
next in thread | previous in thread | raw e-mail | index | archive | help
Poul-Henning Kamp <phk@critter.freebsd.dk> writes: > In message <20010510074028.847EE3E28@bazooka.unixfreak.org>, Dima Dorfman writes: > > - what should be destroying /dev/md0c? > > The disk-minilayer. > > We need some to keep track of cloned dev_t's so we can nuke them > at various strategic points, havn't gotten to that yet. Well, that sounds pretty easy to do. Patch attached. It solves this problem quite effectively. At this point it only nukes the clones when disk_destroy is called; I don't know if there are other places this should be done. Comments? Dima Dorfman dima@unixfreak.org Index: sys/conf.h =================================================================== RCS file: /st/src/FreeBSD/src/sys/sys/conf.h,v retrieving revision 1.127 diff -u -r1.127 conf.h --- sys/conf.h 2001/05/01 08:13:17 1.127 +++ sys/conf.h 2001/05/11 03:17:14 @@ -86,6 +86,7 @@ int __sid_bsize_best; /* optimal block size */ } __si_disk; } __si_u; + LIST_ENTRY(specinfo) si_clist; }; #define si_tty __si_u.__si_tty.__sit_tty Index: sys/disk.h =================================================================== RCS file: /st/src/FreeBSD/src/sys/sys/disk.h,v retrieving revision 1.17 diff -u -r1.17 disk.h --- sys/disk.h 2000/06/15 20:30:53 1.17 +++ sys/disk.h 2001/05/11 03:17:14 @@ -30,6 +30,7 @@ dev_t d_dev; struct diskslices *d_slice; struct disklabel d_label; + LIST_HEAD(, specinfo) d_clones; LIST_ENTRY(disk) d_list; }; Index: kern/subr_disk.c =================================================================== RCS file: /st/src/FreeBSD/src/sys/kern/subr_disk.c,v retrieving revision 1.36 diff -u -r1.36 subr_disk.c --- kern/subr_disk.c 2001/05/06 21:55:22 1.36 +++ kern/subr_disk.c 2001/05/11 03:17:14 @@ -86,6 +86,7 @@ *dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p), UID_ROOT, GID_OPERATOR, 0640, name); + LIST_INSERT_HEAD(&dp->d_clones, *dev, si_clist); return; } } @@ -129,6 +130,7 @@ dp->d_dev = dev; dp->d_dsflags = flags; dp->d_devsw = cdevsw; + LIST_INIT(&dp->d_clones); LIST_INSERT_HEAD(&disklist, dp, d_list); if (!once) { EVENTHANDLER_REGISTER(dev_clone, disk_clone, 0, 1000); @@ -174,7 +176,14 @@ void disk_destroy(dev_t dev) { + dev_t pdev; + LIST_REMOVE(dev->si_disk, d_list); + while (!LIST_EMPTY(&dev->si_disk->d_clones)) { + pdev = LIST_FIRST(&dev->si_disk->d_clones); + LIST_REMOVE(pdev, si_clist); + destroy_dev(pdev); + } bzero(dev->si_disk, sizeof(*dev->si_disk)); dev->si_disk = NULL; destroy_dev(dev); To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010511032041.F3FB43E28>