diff options
Diffstat (limited to 'fs/cifs/cifsfs.c')
| -rw-r--r-- | fs/cifs/cifsfs.c | 25 | 
1 files changed, 25 insertions, 0 deletions
| diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 1a052c0eee8..345fc89c428 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -91,6 +91,30 @@ struct workqueue_struct	*cifsiod_wq;  __u8 cifs_client_guid[SMB2_CLIENT_GUID_SIZE];  #endif +/* + * Bumps refcount for cifs super block. + * Note that it should be only called if a referece to VFS super block is + * already held, e.g. in open-type syscalls context. Otherwise it can race with + * atomic_dec_and_test in deactivate_locked_super. + */ +void +cifs_sb_active(struct super_block *sb) +{ +	struct cifs_sb_info *server = CIFS_SB(sb); + +	if (atomic_inc_return(&server->active) == 1) +		atomic_inc(&sb->s_active); +} + +void +cifs_sb_deactive(struct super_block *sb) +{ +	struct cifs_sb_info *server = CIFS_SB(sb); + +	if (atomic_dec_and_test(&server->active)) +		deactivate_super(sb); +} +  static int  cifs_read_super(struct super_block *sb)  { @@ -777,6 +801,7 @@ struct file_system_type cifs_fs_type = {  	.kill_sb = cifs_kill_sb,  	/*  .fs_flags */  }; +MODULE_ALIAS_FS("cifs");  const struct inode_operations cifs_dir_inode_ops = {  	.create = cifs_create,  	.atomic_open = cifs_atomic_open, |