cifs: store a pointer to the root dentry in cifs_sb_info once we have completed mounting the share
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>
This commit is contained in:
Родитель
45c0f1aabe
Коммит
269f67e1ff
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче