diff options
Diffstat (limited to 'fs/cifs/misc.c')
| -rw-r--r-- | fs/cifs/misc.c | 40 | 
1 files changed, 26 insertions, 14 deletions
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 35962a1a23b9..0e84e6fcf8ab 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c @@ -75,6 +75,7 @@ sesInfoAlloc(void)  		INIT_LIST_HEAD(&ret_buf->tcon_list);  		mutex_init(&ret_buf->session_mutex);  		spin_lock_init(&ret_buf->iface_lock); +		INIT_LIST_HEAD(&ret_buf->iface_list);  		spin_lock_init(&ret_buf->chan_lock);  	}  	return ret_buf; @@ -83,6 +84,8 @@ sesInfoAlloc(void)  void  sesInfoFree(struct cifs_ses *buf_to_free)  { +	struct cifs_server_iface *iface = NULL, *niface = NULL; +  	if (buf_to_free == NULL) {  		cifs_dbg(FYI, "Null buffer passed to sesInfoFree\n");  		return; @@ -96,7 +99,11 @@ sesInfoFree(struct cifs_ses *buf_to_free)  	kfree(buf_to_free->user_name);  	kfree(buf_to_free->domainName);  	kfree_sensitive(buf_to_free->auth_key.response); -	kfree(buf_to_free->iface_list); +	spin_lock(&buf_to_free->iface_lock); +	list_for_each_entry_safe(iface, niface, &buf_to_free->iface_list, +				 iface_head) +		kref_put(&iface->refcount, release_iface); +	spin_unlock(&buf_to_free->iface_lock);  	kfree_sensitive(buf_to_free);  } @@ -537,11 +544,11 @@ void cifs_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock)  	if (oplock == OPLOCK_EXCLUSIVE) {  		cinode->oplock = CIFS_CACHE_WRITE_FLG | CIFS_CACHE_READ_FLG;  		cifs_dbg(FYI, "Exclusive Oplock granted on inode %p\n", -			 &cinode->vfs_inode); +			 &cinode->netfs.inode);  	} else if (oplock == OPLOCK_READ) {  		cinode->oplock = CIFS_CACHE_READ_FLG;  		cifs_dbg(FYI, "Level II Oplock granted on inode %p\n", -			 &cinode->vfs_inode); +			 &cinode->netfs.inode);  	} else  		cinode->oplock = 0;  } @@ -1211,18 +1218,23 @@ static struct super_block *__cifs_get_super(void (*f)(struct super_block *, void  		.data = data,  		.sb = NULL,  	}; +	struct file_system_type **fs_type = (struct file_system_type *[]) { +		&cifs_fs_type, &smb3_fs_type, NULL, +	}; -	iterate_supers_type(&cifs_fs_type, f, &sd); - -	if (!sd.sb) -		return ERR_PTR(-EINVAL); -	/* -	 * Grab an active reference in order to prevent automounts (DFS links) -	 * of expiring and then freeing up our cifs superblock pointer while -	 * we're doing failover. -	 */ -	cifs_sb_active(sd.sb); -	return sd.sb; +	for (; *fs_type; fs_type++) { +		iterate_supers_type(*fs_type, f, &sd); +		if (sd.sb) { +			/* +			 * Grab an active reference in order to prevent automounts (DFS links) +			 * of expiring and then freeing up our cifs superblock pointer while +			 * we're doing failover. +			 */ +			cifs_sb_active(sd.sb); +			return sd.sb; +		} +	} +	return ERR_PTR(-EINVAL);  }  static void __cifs_put_super(struct super_block *sb)  | 
