cifs: allocate mountdata earlier
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 17 Jun 2011 13:17:28 +0000 (09:17 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 24 Jun 2011 22:39:41 +0000 (18:39 -0400)
pull mountdata allocation up, so that it won't stand in the way when
we lift cifs_mount() to location before sget().

Acked-by: Pavel Shilovsky <piastryyy@gmail.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/cifs/cifsfs.c

index 4162ee45d0433a689d80d63460b5c3a3b3a7236c..ec19161dd2785a634b8b0c9a0e0716806431e04c 100644 (file)
@@ -687,6 +687,14 @@ cifs_do_mount(struct file_system_type *fs_type,
                goto out;
        }
 
+       cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
+       if (cifs_sb->mountdata == NULL) {
+               root = ERR_PTR(-ENOMEM);
+               unload_nls(volume_info->local_nls);
+               kfree(cifs_sb);
+               goto out;
+       }
+
        cifs_setup_cifs_sb(volume_info, cifs_sb);
 
        mnt_data.vol = volume_info;
@@ -701,22 +709,12 @@ cifs_do_mount(struct file_system_type *fs_type,
 
        if (sb->s_fs_info) {
                cFYI(1, "Use existing superblock");
+               kfree(cifs_sb->mountdata);
                unload_nls(cifs_sb->local_nls);
                kfree(cifs_sb);
                goto out_shared;
        }
 
-       /*
-        * Copy mount params for use in submounts. Better to do
-        * the copy here and deal with the error before cleanup gets
-        * complicated post-mount.
-        */
-       cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
-       if (cifs_sb->mountdata == NULL) {
-               root = ERR_PTR(-ENOMEM);
-               goto out_super;
-       }
-
        sb->s_flags = flags;
        /* BB should we make this contingent on mount parm? */
        sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
@@ -749,6 +747,7 @@ out_super:
        goto out;
 
 out_cifs_sb:
+       kfree(cifs_sb->mountdata);
        unload_nls(cifs_sb->local_nls);
        kfree(cifs_sb);