cifs: ignore resource_id while getting fscache super cookie
authorShyam Prasad N <sprasad@microsoft.com>
Wed, 8 Dec 2021 16:33:19 +0000 (16:33 +0000)
committerSteve French <stfrench@microsoft.com>
Sat, 18 Dec 2021 01:09:06 +0000 (19:09 -0600)
We have a cyclic dependency between fscache super cookie
and root inode cookie. The super cookie relies on
tcon->resource_id, which gets populated from the root inode
number. However, fetching the root inode initializes inode
cookie as a child of super cookie, which is yet to be populated.

resource_id is only used as auxdata to check the validity of
super cookie. We can completely avoid setting resource_id to
remove the circular dependency. Since vol creation time and
vol serial numbers are used for auxdata, we should be fine.
Additionally, there will be auxiliary data check for each
inode cookie as well.

Fixes: 5bf91ef03d98 ("cifs: wait for tcon resource_id before getting fscache super")
CC: David Howells <dhowells@redhat.com>
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/connect.c
fs/cifs/inode.c

index 18448dbd762a89ce92b6c70e0b55eb54c1d0f74a..1060164b984a7459b5d2a05832e0b115490e8db9 100644 (file)
@@ -3064,6 +3064,13 @@ static int mount_get_conns(struct mount_ctx *mnt_ctx)
            (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
                cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
 
+       /*
+        * The cookie is initialized from volume info returned above.
+        * Inside cifs_fscache_get_super_cookie it checks
+        * that we do not get super cookie twice.
+        */
+       cifs_fscache_get_super_cookie(tcon);
+
 out:
        mnt_ctx->server = server;
        mnt_ctx->ses = ses;
index 96d083db173724901e3193b51ce4e1dda3bde64d..279622e4eb1c290b41d017bda10cb5cda93b5575 100644 (file)
@@ -1356,11 +1356,6 @@ iget_no_retry:
                goto out;
        }
 
-#ifdef CONFIG_CIFS_FSCACHE
-       /* populate tcon->resource_id */
-       tcon->resource_id = CIFS_I(inode)->uniqueid;
-#endif
-
        if (rc && tcon->pipe) {
                cifs_dbg(FYI, "ipc connection - fake read inode\n");
                spin_lock(&inode->i_lock);
@@ -1375,14 +1370,6 @@ iget_no_retry:
                iget_failed(inode);
                inode = ERR_PTR(rc);
        }
-
-       /*
-        * The cookie is initialized from volume info returned above.
-        * Inside cifs_fscache_get_super_cookie it checks
-        * that we do not get super cookie twice.
-        */
-       cifs_fscache_get_super_cookie(tcon);
-
 out:
        kfree(path);
        free_xid(xid);