Commit 15179cf2 authored by Steve French's avatar Steve French

smb3: fix problem unloading module due to leaked refcount on shutdown

The shutdown ioctl can leak a refcount on the tlink which can
prevent rmmod (unloading the cifs.ko) module from working.

Found while debugging xfstest generic/043

Fixes: 69ca1f57 ("smb3: add dynamic tracepoints for shutdown ioctl")
Reviewed-by: default avatarMeetakshi Setiya <msetiya@microsoft.com>
Reviewed-by: default avatarShyam Prasad N <sprasad@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent e4be320e
...@@ -4194,6 +4194,9 @@ tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink) ...@@ -4194,6 +4194,9 @@ tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
* *
* If one doesn't exist then insert a new tcon_link struct into the tree and * If one doesn't exist then insert a new tcon_link struct into the tree and
* try to construct a new one. * try to construct a new one.
*
* REMEMBER to call cifs_put_tlink() after successful calls to cifs_sb_tlink,
* to avoid refcount issues
*/ */
struct tcon_link * struct tcon_link *
cifs_sb_tlink(struct cifs_sb_info *cifs_sb) cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
......
...@@ -229,9 +229,11 @@ static int cifs_shutdown(struct super_block *sb, unsigned long arg) ...@@ -229,9 +229,11 @@ static int cifs_shutdown(struct super_block *sb, unsigned long arg)
shutdown_good: shutdown_good:
trace_smb3_shutdown_done(flags, tcon->tid); trace_smb3_shutdown_done(flags, tcon->tid);
cifs_put_tlink(tlink);
return 0; return 0;
shutdown_out_err: shutdown_out_err:
trace_smb3_shutdown_err(rc, flags, tcon->tid); trace_smb3_shutdown_err(rc, flags, tcon->tid);
cifs_put_tlink(tlink);
return rc; return rc;
} }
......
...@@ -588,6 +588,7 @@ cifs_symlink(struct mnt_idmap *idmap, struct inode *inode, ...@@ -588,6 +588,7 @@ cifs_symlink(struct mnt_idmap *idmap, struct inode *inode,
tlink = cifs_sb_tlink(cifs_sb); tlink = cifs_sb_tlink(cifs_sb);
if (IS_ERR(tlink)) { if (IS_ERR(tlink)) {
rc = PTR_ERR(tlink); rc = PTR_ERR(tlink);
/* BB could be clearer if skipped put_tlink on error here, but harmless */
goto symlink_exit; goto symlink_exit;
} }
pTcon = tlink_tcon(tlink); pTcon = tlink_tcon(tlink);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment