3 small smb3 fixes for stable
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmAeJkgACgkQiiy9cAdy T1EXAwv+IMIPxilkjjArn/36IG9pFBwMHtsQUojGf4dhUesL5DQzSraaRu2aYDPB wdNnyuLHb7UUA6khramQnAr+eQ3O1nrCzHHgGK6RQk1tDlMqTZiR51cPLF67AVqA Jg2Q+KlSzdPUea1G8iv61pnD6y7bAufEklNXk1Xbq9mPd81y3gfGi5bM6tKwy1a/ pYhHsko/2n1C6NO5d24yrKjXj2rRobY8XJ0UOHax+D5VxKfZ+5ub0sulq8UEg4ki 8BztAwkYwwU87QzkKTD8imDfAzAKyvKIQM/idrkyt1ZVkf6HdwM+EKZWbEY0G9Mv u8y+E7cjT17jTtkthm2bfaubWepWkc1STxmFiEp3Xy7+HDRc1UUGY/wgHObzaDLo P3V/G/XGCn8AJuLkpsx1iO5Cee2CHEtMCaDbCBgAnrSBxcLxqtXKOCrGXMARSRaP ylUl94Ek9QGlG7YAGklcsNO896vWMNfstRUtFZBD68SV44Pam333ZBfOJ5fv0Xuy svG0qcr8 =5FIb -----END PGP SIGNATURE----- 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()
This commit is contained in:
Коммит
825b5991a4
|
@ -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)
|
||||||
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 {
|
||||||
__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,
|
||||||
|
|
||||||
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче