cifs: add initial reconfigure support
authorRonnie Sahlberg <lsahlber@redhat.com>
Mon, 14 Dec 2020 06:40:18 +0000 (16:40 +1000)
committerSteve French <stfrench@microsoft.com>
Mon, 14 Dec 2020 15:26:30 +0000 (09:26 -0600)
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/fs_context.c

index b7f5633..18b469f 100644 (file)
@@ -621,14 +621,44 @@ static void smb3_fs_context_free(struct fs_context *fc)
        smb3_cleanup_fs_context(ctx);
 }
 
-static int smb3_reconfigure(struct fs_context *fc)
+/*
+ * Compare the old and new proposed context during reconfigure
+ * and check if the changes are compatible.
+ */
+static int smb3_verify_reconfigure_ctx(struct smb3_fs_context *new_ctx,
+                                      struct smb3_fs_context *old_ctx)
 {
-       // TODO:  struct smb3_fs_context *ctx = smb3_fc2context(fc);
+       if (new_ctx->sectype != old_ctx->sectype) {
+               cifs_dbg(VFS, "can not change sec during remount\n");
+               return -EINVAL;
+       }
 
-       /* FIXME : add actual reconfigure */
        return 0;
 }
 
+static int smb3_reconfigure(struct fs_context *fc)
+{
+       struct smb3_fs_context *ctx = smb3_fc2context(fc);
+       struct dentry *root = fc->root;
+       struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
+       int rc;
+
+       rc = smb3_verify_reconfigure_ctx(ctx, cifs_sb->ctx);
+       if (rc)
+               return rc;
+
+       /*
+        * Steal the UNC from the old and to be destroyed context.
+        */
+       ctx->UNC = cifs_sb->ctx->UNC;
+       cifs_sb->ctx->UNC = NULL;
+
+       smb3_cleanup_fs_context_contents(cifs_sb->ctx);
+       rc = smb3_fs_context_dup(cifs_sb->ctx, ctx);
+
+       return rc;
+}
+
 static int smb3_fs_context_parse_param(struct fs_context *fc,
                                      struct fs_parameter *param)
 {