mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-04 04:02:26 +00:00
three smb client fixes, all for stable
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmTaMT8ACgkQiiy9cAdy T1F7Ygv/ed2tYvcdwvrakFOvLWEvgTpAh/tb7dh+l58mG1WV7ZDRDWamSAyzy8OT s8IeBYmIaOdOv5opYakuQrY0lhTcUSRCoSsvH6k2vZAMLG0SX9nXVyHv0JgPDTuz gNvxDRrOusOhNfVlGya0dhH90hDyvW1wzU66HlCMbzrfmeQKKG6A6shOztGfw1y6 cXVKr4k315dcH9sAHzMDcg5bv3ucyKWztdAaF68dK71oEUwceMTmKpKc7OYPxThn DOY4blVefIUAPTZYh7RD1Ota1VYfQafZFu01ttqh3XvG9PtOlDTuEbRlANpYv2d/ Awn6ZIdx2tV8MERJ7R0p/vKdVj5m5sDaTls0q4PWc/OMFrOFGfvuMhoZ/uAFPhFc e9EKjg7u0B7q3F8aT4E34Hqwl6UNhyDvRqn5BhztcDgMdIke7OVuvHQSiLGXfMQT XJN0bTynTB6RnHDsFxG8i7YBlsHDk6Ic/xOAcSG42U/5hNBTrovY9HyhYdMzZ/TD 9sETDezn =Woor -----END PGP SIGNATURE----- Merge tag '6.5-rc6-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6 Pull smb client fixes from Steve French: "Three smb client fixes, all for stable: - fix for oops in unmount race with lease break of deferred close - debugging improvement for reconnect - fix for fscache deadlock (folio_wait_bit_common hang)" * tag '6.5-rc6-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6: smb3: display network namespace in debug information cifs: Release folio lock on fscache read hit. cifs: fix potential oops in cifs_oplock_break
This commit is contained in:
commit
2d7b8c6b90
@ -153,6 +153,11 @@ cifs_dump_channel(struct seq_file *m, int i, struct cifs_chan *chan)
|
||||
in_flight(server),
|
||||
atomic_read(&server->in_send),
|
||||
atomic_read(&server->num_waiters));
|
||||
#ifdef CONFIG_NET_NS
|
||||
if (server->net)
|
||||
seq_printf(m, " Net namespace: %u ", server->net->ns.inum);
|
||||
#endif /* NET_NS */
|
||||
|
||||
}
|
||||
|
||||
static inline const char *smb_speed_to_str(size_t bps)
|
||||
@ -430,10 +435,15 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
|
||||
server->reconnect_instance,
|
||||
server->srv_count,
|
||||
server->sec_mode, in_flight(server));
|
||||
#ifdef CONFIG_NET_NS
|
||||
if (server->net)
|
||||
seq_printf(m, " Net namespace: %u ", server->net->ns.inum);
|
||||
#endif /* NET_NS */
|
||||
|
||||
seq_printf(m, "\nIn Send: %d In MaxReq Wait: %d",
|
||||
atomic_read(&server->in_send),
|
||||
atomic_read(&server->num_waiters));
|
||||
|
||||
if (server->leaf_fullpath) {
|
||||
seq_printf(m, "\nDFS leaf full path: %s",
|
||||
server->leaf_fullpath);
|
||||
|
@ -4681,9 +4681,9 @@ static int cifs_readpage_worker(struct file *file, struct page *page,
|
||||
|
||||
io_error:
|
||||
kunmap(page);
|
||||
unlock_page(page);
|
||||
|
||||
read_complete:
|
||||
unlock_page(page);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -4878,9 +4878,11 @@ void cifs_oplock_break(struct work_struct *work)
|
||||
struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
|
||||
oplock_break);
|
||||
struct inode *inode = d_inode(cfile->dentry);
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct cifsInodeInfo *cinode = CIFS_I(inode);
|
||||
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
|
||||
struct TCP_Server_Info *server = tcon->ses->server;
|
||||
struct cifs_tcon *tcon;
|
||||
struct TCP_Server_Info *server;
|
||||
struct tcon_link *tlink;
|
||||
int rc = 0;
|
||||
bool purge_cache = false, oplock_break_cancelled;
|
||||
__u64 persistent_fid, volatile_fid;
|
||||
@ -4889,6 +4891,12 @@ void cifs_oplock_break(struct work_struct *work)
|
||||
wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS,
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
|
||||
tlink = cifs_sb_tlink(cifs_sb);
|
||||
if (IS_ERR(tlink))
|
||||
goto out;
|
||||
tcon = tlink_tcon(tlink);
|
||||
server = tcon->ses->server;
|
||||
|
||||
server->ops->downgrade_oplock(server, cinode, cfile->oplock_level,
|
||||
cfile->oplock_epoch, &purge_cache);
|
||||
|
||||
@ -4938,18 +4946,19 @@ void cifs_oplock_break(struct work_struct *work)
|
||||
/*
|
||||
* MS-SMB2 3.2.5.19.1 and 3.2.5.19.2 (and MS-CIFS 3.2.5.42) do not require
|
||||
* an acknowledgment to be sent when the file has already been closed.
|
||||
* check for server null, since can race with kill_sb calling tree disconnect.
|
||||
*/
|
||||
spin_lock(&cinode->open_file_lock);
|
||||
if (tcon->ses && tcon->ses->server && !oplock_break_cancelled &&
|
||||
!list_empty(&cinode->openFileList)) {
|
||||
/* check list empty since can race with kill_sb calling tree disconnect */
|
||||
if (!oplock_break_cancelled && !list_empty(&cinode->openFileList)) {
|
||||
spin_unlock(&cinode->open_file_lock);
|
||||
rc = tcon->ses->server->ops->oplock_response(tcon, persistent_fid,
|
||||
volatile_fid, net_fid, cinode);
|
||||
rc = server->ops->oplock_response(tcon, persistent_fid,
|
||||
volatile_fid, net_fid, cinode);
|
||||
cifs_dbg(FYI, "Oplock release rc = %d\n", rc);
|
||||
} else
|
||||
spin_unlock(&cinode->open_file_lock);
|
||||
|
||||
cifs_put_tlink(tlink);
|
||||
out:
|
||||
cifs_done_oplock_break(cinode);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user