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)
|
||||
{
|
||||
struct inode *inode;
|
||||
int rc;
|
||||
|
||||
if (flags & LOOKUP_RCU)
|
||||
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)))
|
||||
CIFS_I(inode)->time = 0; /* force reval */
|
||||
|
||||
if (cifs_revalidate_dentry(direntry))
|
||||
return 0;
|
||||
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;
|
||||
default:
|
||||
/*
|
||||
* Otherwise some unexpected error happened
|
||||
* report it as-is to VFS layer
|
||||
*/
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* 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 */
|
||||
__le16 NegotiateContextCount; /* SMB3.1.1 only. MBZ earlier */
|
||||
__le16 Reserved2;
|
||||
__le16 Dialects[1]; /* One dialect (vers=) at a time for now */
|
||||
__le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */
|
||||
} __packed;
|
||||
|
||||
/* Dialects */
|
||||
|
|
|
@ -666,10 +666,22 @@ wait_for_compound_request(struct TCP_Server_Info *server, int num,
|
|||
|
||||
if (*credits < num) {
|
||||
/*
|
||||
* Return immediately if not too many requests in flight since
|
||||
* we will likely be stuck on waiting for credits.
|
||||
* If the server is tight on resources or just gives us less
|
||||
* 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);
|
||||
trace_smb3_insufficient_credits(server->CurrentMid,
|
||||
server->hostname, scredits, sin_flight);
|
||||
|
|
Загрузка…
Ссылка в новой задаче