Takes allocation/initalization of vfsmounts into separate function.
We will need this separation to deal with several places where we need
a non-blocking (and non-failing) equivalent of add_vfsmnt(). There allocation
will be done outside of critical area.

        Please, apply.

diff -urN S5-pre6-MNT_VISIBLE/fs/super.c S5-pre6-alloc_vfsmnt/fs/super.c
--- S5-pre6-MNT_VISIBLE/fs/super.c      Thu May 24 23:57:23 2001
+++ S5-pre6-alloc_vfsmnt/fs/super.c     Fri May 25 04:13:30 2001
@@ -282,6 +282,21 @@
 
 static LIST_HEAD(vfsmntlist);
 
+struct vfsmount *alloc_vfsmnt(void)
+{
+       struct vfsmount *mnt = kmalloc(sizeof(struct vfsmount), GFP_KERNEL); 
+       if (mnt) {
+               memset(mnt, 0, sizeof(struct vfsmount));
+               atomic_set(&mnt->mnt_count,1);
+               INIT_LIST_HEAD(&mnt->mnt_clash);
+               INIT_LIST_HEAD(&mnt->mnt_child);
+               INIT_LIST_HEAD(&mnt->mnt_mounts);
+               INIT_LIST_HEAD(&mnt->mnt_list);
+               mnt->mnt_owner = current->uid;
+       }
+       return mnt;
+}
+
 static void detach_mnt(struct vfsmount *mnt, struct nameidata *old_nd)
 {
        old_nd->dentry = mnt->mnt_mountpoint;
@@ -324,10 +339,9 @@
        struct super_block *sb = root->d_inode->i_sb;
        char *name;
 
-       mnt = kmalloc(sizeof(struct vfsmount), GFP_KERNEL);
+       mnt = alloc_vfsmnt();
        if (!mnt)
                goto out;
-       memset(mnt, 0, sizeof(struct vfsmount));
 
        /* It may be NULL, but who cares? */
        if (dev_name) {
@@ -337,8 +351,6 @@
                        mnt->mnt_devname = name;
                }
        }
-       mnt->mnt_owner = current->uid;
-       atomic_set(&mnt->mnt_count,1);
        mnt->mnt_sb = sb;
 
        spin_lock(&dcache_lock);
@@ -351,10 +363,7 @@
        } else {
                mnt->mnt_mountpoint = mnt->mnt_root;
                mnt->mnt_parent = mnt;
-               INIT_LIST_HEAD(&mnt->mnt_child);
-               INIT_LIST_HEAD(&mnt->mnt_clash);
        }
-       INIT_LIST_HEAD(&mnt->mnt_mounts);
        list_add(&mnt->mnt_instances, &sb->s_mounts);
        if (nd || dev_name)
                list_add(&mnt->mnt_list, vfsmntlist.prev);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to