Commit fd88f147 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag '6.4-rc1-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6

Pull cifs client fixes from Steve French:

 - fix for copy_file_range bug for very large files that are multiples
   of rsize

 - do not ignore "isolated transport" flag if set on share

 - set rasize default better

 - three fixes related to shutdown and freezing (fixes 4 xfstests, and
   closes deferred handles faster in some places that were missed)

* tag '6.4-rc1-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6:
  cifs: release leases for deferred close handles when freezing
  smb3: fix problem remounting a share after shutdown
  SMB3: force unmount was failing to close deferred close files
  smb3: improve parallel reads of large files
  do not reuse connection if share marked as isolated
  cifs: fix pcchunk length type in smb2_copychunk_range
parents df8c2d13 d39fc592
...@@ -246,7 +246,7 @@ cifs_read_super(struct super_block *sb) ...@@ -246,7 +246,7 @@ cifs_read_super(struct super_block *sb)
if (cifs_sb->ctx->rasize) if (cifs_sb->ctx->rasize)
sb->s_bdi->ra_pages = cifs_sb->ctx->rasize / PAGE_SIZE; sb->s_bdi->ra_pages = cifs_sb->ctx->rasize / PAGE_SIZE;
else else
sb->s_bdi->ra_pages = cifs_sb->ctx->rsize / PAGE_SIZE; sb->s_bdi->ra_pages = 2 * (cifs_sb->ctx->rsize / PAGE_SIZE);
sb->s_blocksize = CIFS_MAX_MSGSIZE; sb->s_blocksize = CIFS_MAX_MSGSIZE;
sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */ sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */
...@@ -744,6 +744,7 @@ static void cifs_umount_begin(struct super_block *sb) ...@@ -744,6 +744,7 @@ static void cifs_umount_begin(struct super_block *sb)
spin_unlock(&tcon->tc_lock); spin_unlock(&tcon->tc_lock);
spin_unlock(&cifs_tcp_ses_lock); spin_unlock(&cifs_tcp_ses_lock);
cifs_close_all_deferred_files(tcon);
/* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */ /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
/* cancel_notify_requests(tcon); */ /* cancel_notify_requests(tcon); */
if (tcon->ses && tcon->ses->server) { if (tcon->ses && tcon->ses->server) {
...@@ -759,6 +760,20 @@ static void cifs_umount_begin(struct super_block *sb) ...@@ -759,6 +760,20 @@ static void cifs_umount_begin(struct super_block *sb)
return; return;
} }
static int cifs_freeze(struct super_block *sb)
{
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
struct cifs_tcon *tcon;
if (cifs_sb == NULL)
return 0;
tcon = cifs_sb_master_tcon(cifs_sb);
cifs_close_all_deferred_files(tcon);
return 0;
}
#ifdef CONFIG_CIFS_STATS2 #ifdef CONFIG_CIFS_STATS2
static int cifs_show_stats(struct seq_file *s, struct dentry *root) static int cifs_show_stats(struct seq_file *s, struct dentry *root)
{ {
...@@ -797,6 +812,7 @@ static const struct super_operations cifs_super_ops = { ...@@ -797,6 +812,7 @@ static const struct super_operations cifs_super_ops = {
as opens */ as opens */
.show_options = cifs_show_options, .show_options = cifs_show_options,
.umount_begin = cifs_umount_begin, .umount_begin = cifs_umount_begin,
.freeze_fs = cifs_freeze,
#ifdef CONFIG_CIFS_STATS2 #ifdef CONFIG_CIFS_STATS2
.show_stats = cifs_show_stats, .show_stats = cifs_show_stats,
#endif #endif
......
...@@ -2709,6 +2709,13 @@ cifs_match_super(struct super_block *sb, void *data) ...@@ -2709,6 +2709,13 @@ cifs_match_super(struct super_block *sb, void *data)
spin_lock(&cifs_tcp_ses_lock); spin_lock(&cifs_tcp_ses_lock);
cifs_sb = CIFS_SB(sb); cifs_sb = CIFS_SB(sb);
/* We do not want to use a superblock that has been shutdown */
if (CIFS_MOUNT_SHUTDOWN & cifs_sb->mnt_cifs_flags) {
spin_unlock(&cifs_tcp_ses_lock);
return 0;
}
tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb)); tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
if (tlink == NULL) { if (tlink == NULL) {
/* can not match superblock if tlink were ever null */ /* can not match superblock if tlink were ever null */
......
...@@ -1682,7 +1682,7 @@ smb2_copychunk_range(const unsigned int xid, ...@@ -1682,7 +1682,7 @@ smb2_copychunk_range(const unsigned int xid,
pcchunk->SourceOffset = cpu_to_le64(src_off); pcchunk->SourceOffset = cpu_to_le64(src_off);
pcchunk->TargetOffset = cpu_to_le64(dest_off); pcchunk->TargetOffset = cpu_to_le64(dest_off);
pcchunk->Length = pcchunk->Length =
cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk)); cpu_to_le32(min_t(u64, len, tcon->max_bytes_chunk));
/* Request server copy to target from src identified by key */ /* Request server copy to target from src identified by key */
kfree(retbuf); kfree(retbuf);
......
...@@ -1947,6 +1947,9 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, ...@@ -1947,6 +1947,9 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
init_copy_chunk_defaults(tcon); init_copy_chunk_defaults(tcon);
if (server->ops->validate_negotiate) if (server->ops->validate_negotiate)
rc = server->ops->validate_negotiate(xid, tcon); rc = server->ops->validate_negotiate(xid, tcon);
if (rc == 0) /* See MS-SMB2 2.2.10 and 3.2.5.5 */
if (tcon->share_flags & SMB2_SHAREFLAG_ISOLATED_TRANSPORT)
server->nosharesock = true;
tcon_exit: tcon_exit:
free_rsp_buf(resp_buftype, rsp); free_rsp_buf(resp_buftype, rsp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment