Re: [NFS] RE: [autofs] multiple servers per automount

From: Mike Waychison
Date: Wed Oct 15 2003 - 11:18:06 EST


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);