Commit 825b5991 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag '5.11-rc6-smb3' of git://git.samba.org/sfrench/cifs-2.6

Pull cifs fixes from Steve French:
 "Three small smb3 fixes for stable"

* tag '5.11-rc6-smb3' of git://git.samba.org/sfrench/cifs-2.6:
  cifs: report error instead of invalid when revalidating a dentry fails
  smb3: fix crediting for compounding when only one request in flight
  smb3: Fix out-of-bounds bug in SMB2_negotiate()
parents f7455e5d 21b200d0
...@@ -737,6 +737,7 @@ static int ...@@ -737,6 +737,7 @@ static int
cifs_d_revalidate(struct dentry *direntry, unsigned int flags) cifs_d_revalidate(struct dentry *direntry, unsigned int flags)
{ {
struct inode *inode; struct inode *inode;
int rc;
if (flags & LOOKUP_RCU) if (flags & LOOKUP_RCU)
return -ECHILD; return -ECHILD;
...@@ -746,8 +747,25 @@ cifs_d_revalidate(struct dentry *direntry, unsigned int flags) ...@@ -746,8 +747,25 @@ cifs_d_revalidate(struct dentry *direntry, unsigned int flags)
if ((flags & LOOKUP_REVAL) && !CIFS_CACHE_READ(CIFS_I(inode))) if ((flags & LOOKUP_REVAL) && !CIFS_CACHE_READ(CIFS_I(inode)))
CIFS_I(inode)->time = 0; /* force reval */ CIFS_I(inode)->time = 0; /* force reval */
if (cifs_revalidate_dentry(direntry)) rc = cifs_revalidate_dentry(direntry);
if (rc) {
cifs_dbg(FYI, "cifs_revalidate_dentry failed with rc=%d", rc);
switch (rc) {
case -ENOENT:
case -ESTALE:
/*
* Those errors mean the dentry is invalid
* (file was deleted or recreated)
*/
return 0; return 0;
default:
/*
* Otherwise some unexpected error happened
* report it as-is to VFS layer
*/
return rc;
}
}
else { else {
/* /*
* If the inode wasn't known to be a dfs entry when * If the inode wasn't known to be a dfs entry when
......
...@@ -286,7 +286,7 @@ struct smb2_negotiate_req { ...@@ -286,7 +286,7 @@ struct smb2_negotiate_req {
__le32 NegotiateContextOffset; /* SMB3.1.1 only. MBZ earlier */ __le32 NegotiateContextOffset; /* SMB3.1.1 only. MBZ earlier */
__le16 NegotiateContextCount; /* SMB3.1.1 only. MBZ earlier */ __le16 NegotiateContextCount; /* SMB3.1.1 only. MBZ earlier */
__le16 Reserved2; __le16 Reserved2;
__le16 Dialects[1]; /* One dialect (vers=) at a time for now */ __le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */
} __packed; } __packed;
/* Dialects */ /* Dialects */
......
...@@ -666,10 +666,22 @@ wait_for_compound_request(struct TCP_Server_Info *server, int num, ...@@ -666,10 +666,22 @@ wait_for_compound_request(struct TCP_Server_Info *server, int num,
if (*credits < num) { if (*credits < num) {
/* /*
* Return immediately if not too many requests in flight since * If the server is tight on resources or just gives us less
* we will likely be stuck on waiting for credits. * credits for other reasons (e.g. requests are coming out of
* order and the server delays granting more credits until it
* processes a missing mid) and we exhausted most available
* credits there may be situations when we try to send
* a compound request but we don't have enough credits. At this
* point the client needs to decide if it should wait for
* additional credits or fail the request. If at least one
* request is in flight there is a high probability that the
* server will return enough credits to satisfy this compound
* request.
*
* Return immediately if no requests in flight since we will be
* stuck on waiting for credits.
*/ */
if (server->in_flight < num - *credits) { if (server->in_flight == 0) {
spin_unlock(&server->req_lock); spin_unlock(&server->req_lock);
trace_smb3_insufficient_credits(server->CurrentMid, trace_smb3_insufficient_credits(server->CurrentMid,
server->hostname, scredits, sin_flight); server->hostname, scredits, sin_flight);
......
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