mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
6 cifs/smb3 fixes, 3 for stable, including some important mulitchannel crediting fixes
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmBIMv0ACgkQiiy9cAdy T1HNFwwAsXZ2JUK6TO2SGbNiW5uBDcIbRjfSH7rgmVQ/q1Csnszrpyz8iLEToUGP GH3g04n7GeM5zDB267QHifX44aA2Yy3GbE/goJUhdacAsmkMMDcHmHoJL6OoDvK4 PUlfLaWHOK1E3MWxpf0idftfNKlcequjxLOpcLTQQg83TC6peYvkMncbjCQVgldw 4npV40b3qXVZ0TagglR4POQ4gCJt6GXrLwEPIoUbzAPuTZtJfa4LEPa5cJ0gYbSI SJ6Ri8KcZu//O/FAEUTJOg3ggkmVy13H7dSf29rRsjVcLYI3lQ8zcMHlCBKw00YF Jc3m95Xyn0xsjELKAg5kHd/1yz4vFvitYn9NyVhYUAWtCbMs/2MEYSQJnuLxF1Vm RpLRLDQFpewkoEGFNMTfZyNY3A6hq1gQJYcqmmgVru+hAcozvs3+YHhNKWwEMWAP weTSpoa/ERUfAn5XcNP5gELcEQALLOHsACJtJ+00T+A+DD7XgWjTX1ynMDa58MfG UySTW3iY =zEnL -----END PGP SIGNATURE----- Merge tag '5.12-rc2-smb3' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs fixes from Steve French: "Six cifs/smb3 fixes, three of them for stable, including some important mulitchannel crediting fixes, and a fix for statfs error handling" * tag '5.12-rc2-smb3' of git://git.samba.org/sfrench/cifs-2.6: cifs: do not send close in compound create+close requests cifs: return proper error code in statfs(2) cifs: change noisy error message to FYI cifs: print MIDs in decimal notation cifs: ask for more credit on async read/write code paths cifs: fix credit accounting for extra channel
This commit is contained in:
commit
d0df9aabef
@ -207,7 +207,7 @@ static int cifs_debug_files_proc_show(struct seq_file *m, void *v)
|
||||
from_kuid(&init_user_ns, cfile->uid),
|
||||
cfile->dentry);
|
||||
#ifdef CONFIG_CIFS_DEBUG2
|
||||
seq_printf(m, " 0x%llx\n", cfile->fid.mid);
|
||||
seq_printf(m, " %llu\n", cfile->fid.mid);
|
||||
#else
|
||||
seq_printf(m, "\n");
|
||||
#endif /* CIFS_DEBUG2 */
|
||||
|
@ -290,7 +290,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
rc = server->ops->queryfs(xid, tcon, cifs_sb, buf);
|
||||
|
||||
free_xid(xid);
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static long cifs_fallocate(struct file *file, int mode, loff_t off, loff_t len)
|
||||
|
@ -257,7 +257,7 @@ struct smb_version_operations {
|
||||
/* verify the message */
|
||||
int (*check_message)(char *, unsigned int, struct TCP_Server_Info *);
|
||||
bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
|
||||
int (*handle_cancelled_mid)(char *, struct TCP_Server_Info *);
|
||||
int (*handle_cancelled_mid)(struct mid_q_entry *, struct TCP_Server_Info *);
|
||||
void (*downgrade_oplock)(struct TCP_Server_Info *server,
|
||||
struct cifsInodeInfo *cinode, __u32 oplock,
|
||||
unsigned int epoch, bool *purge_cache);
|
||||
@ -1705,16 +1705,17 @@ static inline bool is_retryable_error(int error)
|
||||
#define CIFS_NO_RSP_BUF 0x040 /* no response buffer required */
|
||||
|
||||
/* Type of request operation */
|
||||
#define CIFS_ECHO_OP 0x080 /* echo request */
|
||||
#define CIFS_OBREAK_OP 0x0100 /* oplock break request */
|
||||
#define CIFS_NEG_OP 0x0200 /* negotiate request */
|
||||
#define CIFS_ECHO_OP 0x080 /* echo request */
|
||||
#define CIFS_OBREAK_OP 0x0100 /* oplock break request */
|
||||
#define CIFS_NEG_OP 0x0200 /* negotiate request */
|
||||
#define CIFS_CP_CREATE_CLOSE_OP 0x0400 /* compound create+close request */
|
||||
/* Lower bitmask values are reserved by others below. */
|
||||
#define CIFS_SESS_OP 0x2000 /* session setup request */
|
||||
#define CIFS_OP_MASK 0x2380 /* mask request type */
|
||||
#define CIFS_SESS_OP 0x2000 /* session setup request */
|
||||
#define CIFS_OP_MASK 0x2780 /* mask request type */
|
||||
|
||||
#define CIFS_HAS_CREDITS 0x0400 /* already has credits */
|
||||
#define CIFS_TRANSFORM_REQ 0x0800 /* transform request before sending */
|
||||
#define CIFS_NO_SRV_RSP 0x1000 /* there is no server response */
|
||||
#define CIFS_HAS_CREDITS 0x0400 /* already has credits */
|
||||
#define CIFS_TRANSFORM_REQ 0x0800 /* transform request before sending */
|
||||
#define CIFS_NO_SRV_RSP 0x1000 /* there is no server response */
|
||||
|
||||
/* Security Flags: indicate type of session setup needed */
|
||||
#define CIFSSEC_MAY_SIGN 0x00001
|
||||
|
@ -741,7 +741,7 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
|
||||
mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
|
||||
cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
|
||||
cifs_dbg(FYI, "Clearing mid %llu\n", mid_entry->mid);
|
||||
kref_get(&mid_entry->refcount);
|
||||
mid_entry->mid_state = MID_SHUTDOWN;
|
||||
list_move(&mid_entry->qhead, &dispose_list);
|
||||
@ -752,7 +752,7 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
|
||||
/* now walk dispose list and issue callbacks */
|
||||
list_for_each_safe(tmp, tmp2, &dispose_list) {
|
||||
mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
|
||||
cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
|
||||
cifs_dbg(FYI, "Callback mid %llu\n", mid_entry->mid);
|
||||
list_del_init(&mid_entry->qhead);
|
||||
mid_entry->callback(mid_entry);
|
||||
cifs_mid_q_entry_release(mid_entry);
|
||||
@ -1429,6 +1429,11 @@ smbd_connected:
|
||||
tcp_ses->min_offload = ctx->min_offload;
|
||||
tcp_ses->tcpStatus = CifsNeedNegotiate;
|
||||
|
||||
if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
|
||||
tcp_ses->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
|
||||
else
|
||||
tcp_ses->max_credits = ctx->max_credits;
|
||||
|
||||
tcp_ses->nr_targets = 1;
|
||||
tcp_ses->ignore_signature = ctx->ignore_signature;
|
||||
/* thread spawned, put it on the list */
|
||||
@ -2832,11 +2837,6 @@ static int mount_get_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cif
|
||||
|
||||
*nserver = server;
|
||||
|
||||
if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
|
||||
server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
|
||||
else
|
||||
server->max_credits = ctx->max_credits;
|
||||
|
||||
/* get a reference to a SMB session */
|
||||
ses = cifs_get_smb_ses(server, ctx);
|
||||
if (IS_ERR(ses)) {
|
||||
|
@ -230,6 +230,7 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
|
||||
ctx.noautotune = ses->server->noautotune;
|
||||
ctx.sockopt_tcp_nodelay = ses->server->tcp_nodelay;
|
||||
ctx.echo_interval = ses->server->echo_interval / HZ;
|
||||
ctx.max_credits = ses->server->max_credits;
|
||||
|
||||
/*
|
||||
* This will be used for encoding/decoding user/domain/pw
|
||||
|
@ -358,6 +358,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
if (cfile)
|
||||
goto after_close;
|
||||
/* Close */
|
||||
flags |= CIFS_CP_CREATE_CLOSE_OP;
|
||||
rqst[num_rqst].rq_iov = &vars->close_iov[0];
|
||||
rqst[num_rqst].rq_nvec = 1;
|
||||
rc = SMB2_close_init(tcon, server,
|
||||
|
@ -767,7 +767,7 @@ smb2_cancelled_close_fid(struct work_struct *work)
|
||||
int rc;
|
||||
|
||||
if (cancelled->mid)
|
||||
cifs_tcon_dbg(VFS, "Close unmatched open for MID:%llx\n",
|
||||
cifs_tcon_dbg(VFS, "Close unmatched open for MID:%llu\n",
|
||||
cancelled->mid);
|
||||
else
|
||||
cifs_tcon_dbg(VFS, "Close interrupted close\n");
|
||||
@ -844,14 +844,14 @@ smb2_handle_cancelled_close(struct cifs_tcon *tcon, __u64 persistent_fid,
|
||||
}
|
||||
|
||||
int
|
||||
smb2_handle_cancelled_mid(char *buffer, struct TCP_Server_Info *server)
|
||||
smb2_handle_cancelled_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server)
|
||||
{
|
||||
struct smb2_sync_hdr *sync_hdr = (struct smb2_sync_hdr *)buffer;
|
||||
struct smb2_create_rsp *rsp = (struct smb2_create_rsp *)buffer;
|
||||
struct smb2_sync_hdr *sync_hdr = mid->resp_buf;
|
||||
struct smb2_create_rsp *rsp = mid->resp_buf;
|
||||
struct cifs_tcon *tcon;
|
||||
int rc;
|
||||
|
||||
if (sync_hdr->Command != SMB2_CREATE ||
|
||||
if ((mid->optype & CIFS_CP_CREATE_CLOSE_OP) || sync_hdr->Command != SMB2_CREATE ||
|
||||
sync_hdr->Status != STATUS_SUCCESS)
|
||||
return 0;
|
||||
|
||||
|
@ -1195,7 +1195,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct TCP_Server_Info *server = cifs_pick_channel(ses);
|
||||
__le16 *utf16_path = NULL;
|
||||
int ea_name_len = strlen(ea_name);
|
||||
int flags = 0;
|
||||
int flags = CIFS_CP_CREATE_CLOSE_OP;
|
||||
int len;
|
||||
struct smb_rqst rqst[3];
|
||||
int resp_buftype[3];
|
||||
@ -1573,7 +1573,7 @@ smb2_ioctl_query_info(const unsigned int xid,
|
||||
struct smb_query_info qi;
|
||||
struct smb_query_info __user *pqi;
|
||||
int rc = 0;
|
||||
int flags = 0;
|
||||
int flags = CIFS_CP_CREATE_CLOSE_OP;
|
||||
struct smb2_query_info_rsp *qi_rsp = NULL;
|
||||
struct smb2_ioctl_rsp *io_rsp = NULL;
|
||||
void *buffer = NULL;
|
||||
@ -2577,7 +2577,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
{
|
||||
struct cifs_ses *ses = tcon->ses;
|
||||
struct TCP_Server_Info *server = cifs_pick_channel(ses);
|
||||
int flags = 0;
|
||||
int flags = CIFS_CP_CREATE_CLOSE_OP;
|
||||
struct smb_rqst rqst[3];
|
||||
int resp_buftype[3];
|
||||
struct kvec rsp_iov[3];
|
||||
@ -2975,7 +2975,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
unsigned int sub_offset;
|
||||
unsigned int print_len;
|
||||
unsigned int print_offset;
|
||||
int flags = 0;
|
||||
int flags = CIFS_CP_CREATE_CLOSE_OP;
|
||||
struct smb_rqst rqst[3];
|
||||
int resp_buftype[3];
|
||||
struct kvec rsp_iov[3];
|
||||
@ -3157,7 +3157,7 @@ smb2_query_reparse_tag(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_open_parms oparms;
|
||||
struct cifs_fid fid;
|
||||
struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses);
|
||||
int flags = 0;
|
||||
int flags = CIFS_CP_CREATE_CLOSE_OP;
|
||||
struct smb_rqst rqst[3];
|
||||
int resp_buftype[3];
|
||||
struct kvec rsp_iov[3];
|
||||
|
@ -4041,8 +4041,7 @@ smb2_async_readv(struct cifs_readdata *rdata)
|
||||
if (rdata->credits.value > 0) {
|
||||
shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes,
|
||||
SMB2_MAX_BUFFER_SIZE));
|
||||
shdr->CreditRequest =
|
||||
cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 1);
|
||||
shdr->CreditRequest = cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 8);
|
||||
|
||||
rc = adjust_credits(server, &rdata->credits, rdata->bytes);
|
||||
if (rc)
|
||||
@ -4348,8 +4347,7 @@ smb2_async_writev(struct cifs_writedata *wdata,
|
||||
if (wdata->credits.value > 0) {
|
||||
shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->bytes,
|
||||
SMB2_MAX_BUFFER_SIZE));
|
||||
shdr->CreditRequest =
|
||||
cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 1);
|
||||
shdr->CreditRequest = cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 8);
|
||||
|
||||
rc = adjust_credits(server, &wdata->credits, wdata->bytes);
|
||||
if (rc)
|
||||
|
@ -246,8 +246,7 @@ extern int SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
extern int smb2_handle_cancelled_close(struct cifs_tcon *tcon,
|
||||
__u64 persistent_fid,
|
||||
__u64 volatile_fid);
|
||||
extern int smb2_handle_cancelled_mid(char *buffer,
|
||||
struct TCP_Server_Info *server);
|
||||
extern int smb2_handle_cancelled_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server);
|
||||
void smb2_cancelled_close_fid(struct work_struct *work);
|
||||
extern int SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
u64 persistent_file_id, u64 volatile_file_id,
|
||||
|
@ -101,7 +101,7 @@ static void _cifs_mid_q_entry_release(struct kref *refcount)
|
||||
if (midEntry->resp_buf && (midEntry->mid_flags & MID_WAIT_CANCELLED) &&
|
||||
midEntry->mid_state == MID_RESPONSE_RECEIVED &&
|
||||
server->ops->handle_cancelled_mid)
|
||||
server->ops->handle_cancelled_mid(midEntry->resp_buf, server);
|
||||
server->ops->handle_cancelled_mid(midEntry, server);
|
||||
|
||||
midEntry->mid_state = MID_FREE;
|
||||
atomic_dec(&midCount);
|
||||
@ -1207,7 +1207,7 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
|
||||
}
|
||||
if (rc != 0) {
|
||||
for (; i < num_rqst; i++) {
|
||||
cifs_server_dbg(VFS, "Cancelling wait for mid %llu cmd: %d\n",
|
||||
cifs_server_dbg(FYI, "Cancelling wait for mid %llu cmd: %d\n",
|
||||
midQ[i]->mid, le16_to_cpu(midQ[i]->command));
|
||||
send_cancel(server, &rqst[i], midQ[i]);
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
|
Loading…
x
Reference in New Issue
Block a user