mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
four small SMB3 fixes, all for stable
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAl0MOgQACgkQiiy9cAdy T1EJYwv9HdThounjBOZJIxWEgrmZPDzrX4gC3qMtCW5kn8VIKu3em6QAh0N8F03y j4NZwH1bSUPaD+mtiWbSHA7An9On6xfGbLOPzJukVPYIjm58IxrUD5PUzgZk8lFg 5WL4F5TO7uyecokK5RP/HijgT6bg9ZAcC++dV/ZAZ0+ihGIc5iRFT+eH0Y4k3aGr tf97JDf02N5olOKKfOg4yfbZA0tG/A2W6BShZg+f1HaNxhBmRtzmPqMAOnGQQiL6 uig3la1KC7czC0gnaYqbQD7Nisy7KUbeF15B5/l8/ukUMMTQig4zoynBukMiasSQ XsHYGzNxLoNmnw3NKyZQ8FC3k1cYRz0gxQn++QQ2q1kbOxBvwlNaNWxJ/UXRQQTB Prc+PqYpUabzrNWjlXUP8uliRH6vDV/0Y5Ohotl8megKWNiJV5C3LV+Zaf04IDag Db0W6qTZbnlrQn+0rx7F643R+zBooS+cIfgP+U6zR5KyuO32bPN5+z/o1WXL71gQ 2PH8qw6k =SJLT -----END PGP SIGNATURE----- Merge tag '5.2-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs fixes from Steve French: "Four small SMB3 fixes, all for stable" * tag '5.2-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6: cifs: fix GlobalMid_Lock bug in cifs_reconnect SMB3: retry on STATUS_INSUFFICIENT_RESOURCES instead of failing write cifs: add spinlock for the openFileList to cifsInodeInfo cifs: fix panic in smb2_reconnect
This commit is contained in:
commit
05512b0f46
@ -303,6 +303,7 @@ cifs_alloc_inode(struct super_block *sb)
|
||||
cifs_inode->uniqueid = 0;
|
||||
cifs_inode->createtime = 0;
|
||||
cifs_inode->epoch = 0;
|
||||
spin_lock_init(&cifs_inode->open_file_lock);
|
||||
generate_random_uuid(cifs_inode->lease_key);
|
||||
|
||||
/*
|
||||
|
@ -1377,6 +1377,7 @@ struct cifsInodeInfo {
|
||||
struct rw_semaphore lock_sem; /* protect the fields above */
|
||||
/* BB add in lists for dirty pages i.e. write caching info for oplock */
|
||||
struct list_head openFileList;
|
||||
spinlock_t open_file_lock; /* protects openFileList */
|
||||
__u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
|
||||
unsigned int oplock; /* oplock/lease level we have */
|
||||
unsigned int epoch; /* used to track lease state changes */
|
||||
@ -1780,10 +1781,14 @@ require use of the stronger protocol */
|
||||
* tcp_ses_lock protects:
|
||||
* list operations on tcp and SMB session lists
|
||||
* tcon->open_file_lock protects the list of open files hanging off the tcon
|
||||
* inode->open_file_lock protects the openFileList hanging off the inode
|
||||
* cfile->file_info_lock protects counters and fields in cifs file struct
|
||||
* f_owner.lock protects certain per file struct operations
|
||||
* mapping->page_lock protects certain per page operations
|
||||
*
|
||||
* Note that the cifs_tcon.open_file_lock should be taken before
|
||||
* not after the cifsInodeInfo.open_file_lock
|
||||
*
|
||||
* Semaphores
|
||||
* ----------
|
||||
* sesSem operations on smb session
|
||||
|
@ -476,6 +476,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
server->nr_targets = 1;
|
||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
cifs_sb = find_super_by_tcp(server);
|
||||
if (IS_ERR(cifs_sb)) {
|
||||
rc = PTR_ERR(cifs_sb);
|
||||
@ -493,6 +494,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
|
||||
}
|
||||
cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
|
||||
server->nr_targets);
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
#endif
|
||||
if (server->tcpStatus == CifsExiting) {
|
||||
/* the demux thread will exit normally
|
||||
|
@ -338,10 +338,12 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
|
||||
atomic_inc(&tcon->num_local_opens);
|
||||
|
||||
/* if readable file instance put first in list*/
|
||||
spin_lock(&cinode->open_file_lock);
|
||||
if (file->f_mode & FMODE_READ)
|
||||
list_add(&cfile->flist, &cinode->openFileList);
|
||||
else
|
||||
list_add_tail(&cfile->flist, &cinode->openFileList);
|
||||
spin_unlock(&cinode->open_file_lock);
|
||||
spin_unlock(&tcon->open_file_lock);
|
||||
|
||||
if (fid->purge_cache)
|
||||
@ -413,7 +415,9 @@ void _cifsFileInfo_put(struct cifsFileInfo *cifs_file, bool wait_oplock_handler)
|
||||
cifs_add_pending_open_locked(&fid, cifs_file->tlink, &open);
|
||||
|
||||
/* remove it from the lists */
|
||||
spin_lock(&cifsi->open_file_lock);
|
||||
list_del(&cifs_file->flist);
|
||||
spin_unlock(&cifsi->open_file_lock);
|
||||
list_del(&cifs_file->tlist);
|
||||
atomic_dec(&tcon->num_local_opens);
|
||||
|
||||
@ -1950,9 +1954,9 @@ refind_writable:
|
||||
return 0;
|
||||
}
|
||||
|
||||
spin_lock(&tcon->open_file_lock);
|
||||
spin_lock(&cifs_inode->open_file_lock);
|
||||
list_move_tail(&inv_file->flist, &cifs_inode->openFileList);
|
||||
spin_unlock(&tcon->open_file_lock);
|
||||
spin_unlock(&cifs_inode->open_file_lock);
|
||||
cifsFileInfo_put(inv_file);
|
||||
++refind;
|
||||
inv_file = NULL;
|
||||
|
@ -457,7 +457,7 @@ static const struct status_to_posix_error smb2_error_map_table[] = {
|
||||
{STATUS_FILE_INVALID, -EIO, "STATUS_FILE_INVALID"},
|
||||
{STATUS_ALLOTTED_SPACE_EXCEEDED, -EIO,
|
||||
"STATUS_ALLOTTED_SPACE_EXCEEDED"},
|
||||
{STATUS_INSUFFICIENT_RESOURCES, -EREMOTEIO,
|
||||
{STATUS_INSUFFICIENT_RESOURCES, -EAGAIN,
|
||||
"STATUS_INSUFFICIENT_RESOURCES"},
|
||||
{STATUS_DFS_EXIT_PATH_FOUND, -EIO, "STATUS_DFS_EXIT_PATH_FOUND"},
|
||||
{STATUS_DEVICE_DATA_ERROR, -EIO, "STATUS_DEVICE_DATA_ERROR"},
|
||||
|
@ -3114,9 +3114,14 @@ void smb2_reconnect_server(struct work_struct *work)
|
||||
tcon_exist = true;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* IPC has the same lifetime as its session and uses its
|
||||
* refcount.
|
||||
*/
|
||||
if (ses->tcon_ipc && ses->tcon_ipc->need_reconnect) {
|
||||
list_add_tail(&ses->tcon_ipc->rlist, &tmp_list);
|
||||
tcon_exist = true;
|
||||
ses->ses_count++;
|
||||
}
|
||||
}
|
||||
/*
|
||||
@ -3135,7 +3140,10 @@ void smb2_reconnect_server(struct work_struct *work)
|
||||
else
|
||||
resched = true;
|
||||
list_del_init(&tcon->rlist);
|
||||
cifs_put_tcon(tcon);
|
||||
if (tcon->ipc)
|
||||
cifs_put_smb_ses(tcon->ses);
|
||||
else
|
||||
cifs_put_tcon(tcon);
|
||||
}
|
||||
|
||||
cifs_dbg(FYI, "Reconnecting tcons finished\n");
|
||||
|
Loading…
Reference in New Issue
Block a user