Skip to content

Commit

Permalink
cifs: ignore resource_id while getting fscache super cookie
Browse files Browse the repository at this point in the history
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: 5bf91ef ("cifs: wait for tcon resource_id before getting fscache super")
CC: David Howells <[email protected]>
Signed-off-by: Shyam Prasad N <[email protected]>
Signed-off-by: Steve French <[email protected]>
  • Loading branch information
sprasad-microsoft authored and Steve French committed Dec 18, 2021
1 parent 2585cf9 commit b774302
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 13 deletions.
7 changes: 7 additions & 0 deletions fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
13 changes: 0 additions & 13 deletions fs/cifs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1356,11 +1356,6 @@ struct inode *cifs_root_iget(struct super_block *sb)
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);
Expand All @@ -1375,14 +1370,6 @@ struct inode *cifs_root_iget(struct super_block *sb)
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);
Expand Down

0 comments on commit b774302

Please sign in to comment.