Messages in this thread Patch in this message | | | Date | Tue, 14 Oct 2003 19:12:47 -0400 | From | Mike Waychison <> | Subject | Re: [NFS] RE: [autofs] multiple servers per automount |
| |
H. Peter Anvin wrote: > Followup to: <3F8C1BB6.9010202@sun.com> > By author: Mike Waychison <Michael.Waychison@Sun.COM> > In newsgroup: linux.dev.kernel > >>Here is the quick fix for this in RH 2.1AS kernels: >> >>http://www.kernelnewbies.org/kernels/rh21as/SOURCES/linux-2.4.9-moreunnamed.patch >> >>It makes unnamed block devices use majors 12, 14, 38, 39, as well as 0. >> >>I don't know if anyone is working out a better scheme for >>get_unnamed_dev in 2.6 yet. It does need to be done though. A simple >>patch for 2.6 would maybe see the unnamed_dev_in_use bitmap grow to >>PAGE_SIZE, automatically allowing for 32768 unnamed devices. >> > > > dev_t enlargement, which solves this without a bunch of auxilliary > majors, should be in 2.6. > > -hpa
The problem still remains in 2.6 that we limit the count to 256. I've attached a quick patch that I've compiled and tested. I don't know if there is a better way to handle dynamic assignment of minors (haven't kept up to date in that realm), but if there is, then we should probably use it instead.
Mike Waychison ===== fs/super.c 1.108 vs edited ===== --- 1.108/fs/super.c Wed Oct 1 15:36:45 2003 +++ edited/fs/super.c Tue Oct 14 22:52:12 2003 @@ -528,14 +528,22 @@ * filesystems which don't use real block-devices. -- jrs */ -enum {Max_anon = 256}; -static unsigned long unnamed_dev_in_use[Max_anon/(8*sizeof(unsigned long))]; +enum {Max_anon = PAGE_SIZE * 8}; +static void *unnamed_dev_in_use = NULL; static spinlock_t unnamed_dev_lock = SPIN_LOCK_UNLOCKED;/* protects the above */ int set_anon_super(struct super_block *s, void *data) { int dev; spin_lock(&unnamed_dev_lock); + + if (!unnamed_dev_in_use) + unnamed_dev_in_use = (void *)get_zeroed_page(GFP_KERNEL); + if (!unnamed_dev_in_use) { + spin_unlock(&unnamed_dev_lock); + return -ENOMEM; + } + dev = find_first_zero_bit(unnamed_dev_in_use, Max_anon); if (dev == Max_anon) { spin_unlock(&unnamed_dev_lock); | |