cifs: share dfs connections and supers
[linux-2.6-microblaze.git] / fs / cifs / fs_context.c
index 4511959..6d13f82 100644 (file)
@@ -308,7 +308,6 @@ smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx
 {
        memcpy(new_ctx, ctx, sizeof(*ctx));
        new_ctx->prepath = NULL;
-       new_ctx->mount_options = NULL;
        new_ctx->nodename = NULL;
        new_ctx->username = NULL;
        new_ctx->password = NULL;
@@ -317,11 +316,11 @@ smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx
        new_ctx->UNC = NULL;
        new_ctx->source = NULL;
        new_ctx->iocharset = NULL;
+       new_ctx->leaf_fullpath = NULL;
        /*
         * Make sure to stay in sync with smb3_cleanup_fs_context_contents()
         */
        DUP_CTX_STR(prepath);
-       DUP_CTX_STR(mount_options);
        DUP_CTX_STR(username);
        DUP_CTX_STR(password);
        DUP_CTX_STR(server_hostname);
@@ -330,6 +329,7 @@ smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx
        DUP_CTX_STR(domainname);
        DUP_CTX_STR(nodename);
        DUP_CTX_STR(iocharset);
+       DUP_CTX_STR(leaf_fullpath);
 
        return 0;
 }
@@ -569,17 +569,12 @@ static const struct fs_context_operations smb3_fs_context_ops = {
 static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
                                           void *data)
 {
-       struct smb3_fs_context *ctx = smb3_fc2context(fc);
        char *options = data, *key;
        int ret = 0;
 
        if (!options)
                return 0;
 
-       ctx->mount_options = kstrdup(data, GFP_KERNEL);
-       if (ctx->mount_options == NULL)
-               return -ENOMEM;
-
        ret = security_sb_eat_lsm_opts(options, &fc->security);
        if (ret)
                return ret;
@@ -884,16 +879,21 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
                ctx->nodfs = 1;
                break;
        case Opt_hard:
-               if (result.negated)
+               if (result.negated) {
+                       if (ctx->retry == 1)
+                               cifs_dbg(VFS, "conflicting hard vs. soft mount options\n");
                        ctx->retry = 0;
-               else
+               else
                        ctx->retry = 1;
                break;
        case Opt_soft:
                if (result.negated)
                        ctx->retry = 1;
-               else
+               else {
+                       if (ctx->retry == 1)
+                               cifs_dbg(VFS, "conflicting hard vs soft mount options\n");
                        ctx->retry = 0;
+               }
                break;
        case Opt_mapposix:
                if (result.negated)
@@ -1576,8 +1576,6 @@ smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
        /*
         * Make sure this stays in sync with smb3_fs_context_dup()
         */
-       kfree(ctx->mount_options);
-       ctx->mount_options = NULL;
        kfree(ctx->username);
        ctx->username = NULL;
        kfree_sensitive(ctx->password);
@@ -1596,6 +1594,8 @@ smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
        ctx->iocharset = NULL;
        kfree(ctx->prepath);
        ctx->prepath = NULL;
+       kfree(ctx->leaf_fullpath);
+       ctx->leaf_fullpath = NULL;
 }
 
 void