Messages in this thread Patch in this message | | | Date | Wed, 15 Oct 2003 12:16:07 -0400 | From | Mike Waychison <> | Subject | Re: [NFS] RE: [autofs] multiple servers per automount |
| |
Ingo Oeser wrote: > On Wednesday 15 October 2003 01:12, Mike Waychison wrote: > >>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. > > > > In your patch you allocate inside the spinlock. > > I would suggest to do sth. like the following: >
Better yet.. we could move it into an __init section that will panic if the allocation fails (this should be the desired behaviour..). This way we don't even have to grab the lock either.
Mike Waychison ===== fs/namespace.c 1.49 vs edited ===== --- 1.49/fs/namespace.c Thu Jul 17 22:30:49 2003 +++ edited/fs/namespace.c Wed Oct 15 15:59:11 2003 @@ -23,6 +23,7 @@ #include <linux/mount.h> #include <asm/uaccess.h> +extern void __init super_init(void); extern int __init init_rootfs(void); extern int __init sysfs_init(void); @@ -1154,6 +1155,7 @@ d++; i--; } while (i); + super_init(); sysfs_init(); init_rootfs(); init_mount_tree(); ===== fs/super.c 1.108 vs edited ===== --- 1.108/fs/super.c Wed Oct 1 15:36:45 2003 +++ edited/fs/super.c Wed Oct 15 15:59:50 2003 @@ -24,6 +24,7 @@ #include <linux/module.h> #include <linux/slab.h> #include <linux/smp_lock.h> +#include <linux/init.h> #include <linux/acct.h> #include <linux/blkdev.h> #include <linux/quotaops.h> @@ -527,15 +528,22 @@ * Unnamed block devices are dummy devices used by virtual * 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; static spinlock_t unnamed_dev_lock = SPIN_LOCK_UNLOCKED;/* protects the above */ +void __init super_init(void) +{ + unnamed_dev_in_use = (void *)get_zeroed_page(GFP_KERNEL); + if (!unnamed_dev_in_use) + panic("Could not allocate anonymous device map"); +} + int set_anon_super(struct super_block *s, void *data) { int dev; spin_lock(&unnamed_dev_lock); + dev = find_first_zero_bit(unnamed_dev_in_use, Max_anon); if (dev == Max_anon) { spin_unlock(&unnamed_dev_lock); | |