cifs: store a pointer to the root dentry in cifs_sb_info once we have completed mount...
authorRonnie Sahlberg <lsahlber@redhat.com>
Mon, 8 Mar 2021 23:07:30 +0000 (09:07 +1000)
committerSteve French <stfrench@microsoft.com>
Sun, 25 Apr 2021 21:28:23 +0000 (16:28 -0500)
And use this to only allow to take out a shared handle once the mount has completed and the
sb becomes available.
This will become important in follow up patches where we will start holding a reference to the
directory dentry for the shared handle during the lifetime of the handle.

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifs_fs_sb.h
fs/cifs/cifsfs.c
fs/cifs/smb2ops.c

index aa77edc12212680e53291806c0e98769d95031b8..2a5325a7ae49e3171ee95b6416b639d6b338de7b 100644 (file)
@@ -81,5 +81,9 @@ struct cifs_sb_info {
         * (cifs_autodisable_serverino) in order to match new mounts.
         */
        bool mnt_cifs_serverino_autodisabled;
+       /*
+        * Available once the mount has completed.
+        */
+       struct dentry *root;
 };
 #endif                         /* _CIFS_FS_SB_H */
index 8dc2306c9092a507c26d58c62b541d4b13c51f7e..cf8eceb1d5a53056b8f93f437579309a57891d00 100644 (file)
@@ -257,6 +257,12 @@ out_no_root:
 static void cifs_kill_sb(struct super_block *sb)
 {
        struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
+
+       if (cifs_sb->root) {
+               dput(cifs_sb->root);
+               cifs_sb->root = NULL;
+       }
+
        kill_anon_super(sb);
        cifs_umount(cifs_sb);
 }
@@ -886,6 +892,9 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,
        if (IS_ERR(root))
                goto out_super;
 
+       if (cifs_sb)
+               cifs_sb->root = dget(root);
+
        cifs_dbg(FYI, "dentry root is: %p\n", root);
        return root;
 
index 89269a5c02c7e0e6dccf82e61f9dd1352bcf8823..3ff4600357059abaa1828b79f8e8e96f03a82c32 100644 (file)
@@ -751,8 +751,11 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon,
        if (tcon->nohandlecache)
                return -ENOTSUPP;
 
+       if (cifs_sb->root == NULL)
+               return -ENOENT;
+
        if (strlen(path))
-               return -ENOTSUPP;
+               return -ENOENT;
 
        mutex_lock(&tcon->crfid.fid_mutex);
        if (tcon->crfid.is_valid) {