cifs: add spinlock for the openFileList to cifsInodeInfo
We can not depend on the tcon->open_file_lock here since in multiuser mode we may have the same file/inode open via multiple different tcons. The current code is race prone and will crash if one user deletes a file at the same time a different user opens/create the file. To avoid this we need to have a spinlock attached to the inode and not the tcon. RHBZ: 1580165 CC: Stable <stable@vger.kernel.org> Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com> Signed-off-by: Steve French <stfrench@microsoft.com> Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
Bu işleme şunda yer alıyor:

işlemeyi yapan:
Steve French

ebeveyn
0ff2b018b0
işleme
487317c994
@@ -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;
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle