diff options
author | Steve French <sfrench@us.ibm.com> | 2008-11-20 15:00:44 -0500 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2008-11-20 15:14:13 -0500 |
commit | ddb4cbfc53aa0913ee8da059fcbf628d14f40f63 (patch) | |
tree | d77a2d510fa3a3b6556052af024355ed5cfc43d8 /fs/cifs/misc.c | |
parent | bfb59820ee46616a7bdb4af6b8f7e109646de6ec (diff) |
[CIFS] Do not attempt to close invalidated file handles
If a connection with open file handles has gone down
and come back up and reconnected without reopening
the file handle yet, do not attempt to send an SMB close
request for this handle in cifs_close. We were
checking for the connection being invalid in cifs_close
but since the connection may have been reconnected
we also need to check whether the file handle
was marked invalid (otherwise we could close the
wrong file handle by accident).
Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/misc.c')
-rw-r--r-- | fs/cifs/misc.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index addd1dcc2d79..9ee3f689c2b0 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
@@ -555,12 +555,14 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
555 | continue; | 555 | continue; |
556 | 556 | ||
557 | cifs_stats_inc(&tcon->num_oplock_brks); | 557 | cifs_stats_inc(&tcon->num_oplock_brks); |
558 | write_lock(&GlobalSMBSeslock); | ||
558 | list_for_each(tmp2, &tcon->openFileList) { | 559 | list_for_each(tmp2, &tcon->openFileList) { |
559 | netfile = list_entry(tmp2, struct cifsFileInfo, | 560 | netfile = list_entry(tmp2, struct cifsFileInfo, |
560 | tlist); | 561 | tlist); |
561 | if (pSMB->Fid != netfile->netfid) | 562 | if (pSMB->Fid != netfile->netfid) |
562 | continue; | 563 | continue; |
563 | 564 | ||
565 | write_unlock(&GlobalSMBSeslock); | ||
564 | read_unlock(&cifs_tcp_ses_lock); | 566 | read_unlock(&cifs_tcp_ses_lock); |
565 | cFYI(1, ("file id match, oplock break")); | 567 | cFYI(1, ("file id match, oplock break")); |
566 | pCifsInode = CIFS_I(netfile->pInode); | 568 | pCifsInode = CIFS_I(netfile->pInode); |
@@ -576,6 +578,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
576 | 578 | ||
577 | return true; | 579 | return true; |
578 | } | 580 | } |
581 | write_unlock(&GlobalSMBSeslock); | ||
579 | read_unlock(&cifs_tcp_ses_lock); | 582 | read_unlock(&cifs_tcp_ses_lock); |
580 | cFYI(1, ("No matching file for oplock break")); | 583 | cFYI(1, ("No matching file for oplock break")); |
581 | return true; | 584 | return true; |