From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Steve French" Subject: [PATCH] do not attempt to close cifs files which are already closed due to session reconnect Date: Tue, 18 Nov 2008 21:46:59 -0600 Message-ID: <524f69650811181946s79fdba88w11c8c4c6677df1db@mail.gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_81742_30114154.1227066419451" To: linux-fsdevel , "linux-cifs-client@lists.samba.org" Return-path: Received: from nf-out-0910.google.com ([64.233.182.186]:6305 "EHLO nf-out-0910.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750928AbYKSDrB (ORCPT ); Tue, 18 Nov 2008 22:47:01 -0500 Received: by nf-out-0910.google.com with SMTP id d3so1584875nfc.21 for ; Tue, 18 Nov 2008 19:46:59 -0800 (PST) Sender: linux-fsdevel-owner@vger.kernel.org List-ID: ------=_Part_81742_30114154.1227066419451 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline In hunting down why we could get EBADF returned on close in some cases after reconnect, I found out that cifs_close was checking to see if the share (mounted server export) was valid (didn't need reconnect due to session crash/timeout) but we weren't checking if the handle was valid (ie the share was reconnected, but the file handle was not reopened yet). It also adds some locking around the updates/checks of the cifs_file->invalidHandle flag diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 6449e1a..cd975fe 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -512,8 +512,9 @@ int cifs_close(struct inode *inode, struct file *file) if (atomic_read(&pSMBFile->wrtPending)) cERROR(1, ("close with pending writes")); - rc = CIFSSMBClose(xid, pTcon, - pSMBFile->netfid); + if (!pSMBFile->invalidHandle) + rc = CIFSSMBClose(xid, pTcon, + pSMBFile->netfid); } } @@ -587,15 +588,18 @@ int cifs_closedir(struct inode *inode, struct file *file) pTcon = cifs_sb->tcon; cFYI(1, ("Freeing private data in close dir")); + write_lock(&GlobalSMBSeslock); if (!pCFileStruct->srch_inf.endOfSearch && !pCFileStruct->invalidHandle) { pCFileStruct->invalidHandle = true; + write_unlock(&GlobalSMBSeslock); rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); cFYI(1, ("Closing uncompleted readdir with rc %d", rc)); /* not much we can do if it fails anyway, ignore rc */ rc = 0; - } + } else + write_unlock(&GlobalSMBSeslock); ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; if (ptmp) { cFYI(1, ("closedir free smb buf in srch struct")); diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index addd1dc..9ee3f68 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) continue; cifs_stats_inc(&tcon->num_oplock_brks); + write_lock(&GlobalSMBSeslock); list_for_each(tmp2, &tcon->openFileList) { netfile = list_entry(tmp2, struct cifsFileInfo, tlist); if (pSMB->Fid != netfile->netfid) continue; + write_unlock(&GlobalSMBSeslock); read_unlock(&cifs_tcp_ses_lock); cFYI(1, ("file id match, oplock break")); pCifsInode = CIFS_I(netfile->pInode); @@ -576,6 +578,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) return true; } + write_unlock(&GlobalSMBSeslock); read_unlock(&cifs_tcp_ses_lock); cFYI(1, ("No matching file for oplock break")); return true; diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 58d5729..9f51f9b 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c @@ -741,11 +741,14 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, (index_to_find < first_entry_in_buffer)) { /* close and restart search */ cFYI(1, ("search backing up - close and restart search")); + write_lock(&GlobalSMBSeslock); if (!cifsFile->srch_inf.endOfSearch && !cifsFile->invalidHandle) { cifsFile->invalidHandle = true; + write_unlock(&GlobalSMBSeslock); CIFSFindClose(xid, pTcon, cifsFile->netfid); - } + } else + write_unlock(&GlobalSMBSeslock); if (cifsFile->srch_inf.ntwrk_buf_start) { cFYI(1, ("freeing SMB ff cache buf on search rewind")); if (cifsFile->srch_inf.smallBuf) -- Thanks, Steve ------=_Part_81742_30114154.1227066419451 Content-Type: text/x-diff; name=do-not-attempt-to-close-invalid-handle.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fnpflrdr0 Content-Disposition: attachment; filename=do-not-attempt-to-close-invalid-handle.patch ZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggNjQ0OWUx YS4uY2Q5NzVmZSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxl LmMKQEAgLTUxMiw4ICs1MTIsOSBAQCBpbnQgY2lmc19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2Rl LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIAkJCQlpZiAoYXRvbWljX3JlYWQoJnBTTUJGaWxlLT53cnRQ ZW5kaW5nKSkKIAkJCQkJY0VSUk9SKDEsCiAJCQkJCQkoImNsb3NlIHdpdGggcGVuZGluZyB3cml0 ZXMiKSk7Ci0JCQkJcmMgPSBDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwKLQkJCQkJCSAgcFNNQkZp bGUtPm5ldGZpZCk7CisJCQkJaWYgKCFwU01CRmlsZS0+aW52YWxpZEhhbmRsZSkKKwkJCQkJcmMg PSBDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwKKwkJCQkJCQkgIHBTTUJGaWxlLT5uZXRmaWQpOwog CQkJfQogCQl9CiAKQEAgLTU4NywxNSArNTg4LDE4IEBAIGludCBjaWZzX2Nsb3NlZGlyKHN0cnVj dCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogCQlwVGNvbiA9IGNpZnNfc2ItPnRj b247CiAKIAkJY0ZZSSgxLCAoIkZyZWVpbmcgcHJpdmF0ZSBkYXRhIGluIGNsb3NlIGRpciIpKTsK KwkJd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CiAJCWlmICghcENGaWxlU3RydWN0LT5z cmNoX2luZi5lbmRPZlNlYXJjaCAmJgogCQkgICAgIXBDRmlsZVN0cnVjdC0+aW52YWxpZEhhbmRs ZSkgewogCQkJcENGaWxlU3RydWN0LT5pbnZhbGlkSGFuZGxlID0gdHJ1ZTsKKwkJCXdyaXRlX3Vu bG9jaygmR2xvYmFsU01CU2VzbG9jayk7CiAJCQlyYyA9IENJRlNGaW5kQ2xvc2UoeGlkLCBwVGNv biwgcENGaWxlU3RydWN0LT5uZXRmaWQpOwogCQkJY0ZZSSgxLCAoIkNsb3NpbmcgdW5jb21wbGV0 ZWQgcmVhZGRpciB3aXRoIHJjICVkIiwKIAkJCQkgcmMpKTsKIAkJCS8qIG5vdCBtdWNoIHdlIGNh biBkbyBpZiBpdCBmYWlscyBhbnl3YXksIGlnbm9yZSByYyAqLwogCQkJcmMgPSAwOwotCQl9CisJ CX0gZWxzZQorCQkJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKIAkJcHRtcCA9IHBD RmlsZVN0cnVjdC0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0OwogCQlpZiAocHRtcCkgewogCQkJ Y0ZZSSgxLCAoImNsb3NlZGlyIGZyZWUgc21iIGJ1ZiBpbiBzcmNoIHN0cnVjdCIpKTsKZGlmZiAt LWdpdCBhL2ZzL2NpZnMvbWlzYy5jIGIvZnMvY2lmcy9taXNjLmMKaW5kZXggYWRkZDFkYy4uOWVl M2Y2OCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9taXNjLmMKKysrIGIvZnMvY2lmcy9taXNjLmMKQEAg LTU1NSwxMiArNTU1LDE0IEBAIGlzX3ZhbGlkX29wbG9ja19icmVhayhzdHJ1Y3Qgc21iX2hkciAq YnVmLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzcnYpCiAJCQkJY29udGludWU7CiAKIAkJCWNp ZnNfc3RhdHNfaW5jKCZ0Y29uLT5udW1fb3Bsb2NrX2Jya3MpOworCQkJd3JpdGVfbG9jaygmR2xv YmFsU01CU2VzbG9jayk7CiAJCQlsaXN0X2Zvcl9lYWNoKHRtcDIsICZ0Y29uLT5vcGVuRmlsZUxp c3QpIHsKIAkJCQluZXRmaWxlID0gbGlzdF9lbnRyeSh0bXAyLCBzdHJ1Y3QgY2lmc0ZpbGVJbmZv LAogCQkJCQkJICAgICB0bGlzdCk7CiAJCQkJaWYgKHBTTUItPkZpZCAhPSBuZXRmaWxlLT5uZXRm aWQpCiAJCQkJCWNvbnRpbnVlOwogCisJCQkJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2Nr KTsKIAkJCQlyZWFkX3VubG9jaygmY2lmc190Y3Bfc2VzX2xvY2spOwogCQkJCWNGWUkoMSwgKCJm aWxlIGlkIG1hdGNoLCBvcGxvY2sgYnJlYWsiKSk7CiAJCQkJcENpZnNJbm9kZSA9IENJRlNfSShu ZXRmaWxlLT5wSW5vZGUpOwpAQCAtNTc2LDYgKzU3OCw3IEBAIGlzX3ZhbGlkX29wbG9ja19icmVh ayhzdHJ1Y3Qgc21iX2hkciAqYnVmLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzcnYpCiAKIAkJ CQlyZXR1cm4gdHJ1ZTsKIAkJCX0KKwkJCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7 CiAJCQlyZWFkX3VubG9jaygmY2lmc190Y3Bfc2VzX2xvY2spOwogCQkJY0ZZSSgxLCAoIk5vIG1h dGNoaW5nIGZpbGUgZm9yIG9wbG9jayBicmVhayIpKTsKIAkJCXJldHVybiB0cnVlOwpkaWZmIC0t Z2l0IGEvZnMvY2lmcy9yZWFkZGlyLmMgYi9mcy9jaWZzL3JlYWRkaXIuYwppbmRleCA1OGQ1NzI5 Li45ZjUxZjliIDEwMDY0NAotLS0gYS9mcy9jaWZzL3JlYWRkaXIuYworKysgYi9mcy9jaWZzL3Jl YWRkaXIuYwpAQCAtNzQxLDExICs3NDEsMTQgQEAgc3RhdGljIGludCBmaW5kX2NpZnNfZW50cnko Y29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb24sCiAJICAgKGluZGV4X3Rv X2ZpbmQgPCBmaXJzdF9lbnRyeV9pbl9idWZmZXIpKSB7CiAJCS8qIGNsb3NlIGFuZCByZXN0YXJ0 IHNlYXJjaCAqLwogCQljRllJKDEsICgic2VhcmNoIGJhY2tpbmcgdXAgLSBjbG9zZSBhbmQgcmVz dGFydCBzZWFyY2giKSk7CisJCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOwogCQlpZiAo IWNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCAmJgogCQkgICAgIWNpZnNGaWxlLT5pbnZh bGlkSGFuZGxlKSB7CiAJCQljaWZzRmlsZS0+aW52YWxpZEhhbmRsZSA9IHRydWU7CisJCQl3cml0 ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOwogCQkJQ0lGU0ZpbmRDbG9zZSh4aWQsIHBUY29u LCBjaWZzRmlsZS0+bmV0ZmlkKTsKLQkJfQorCQl9IGVsc2UKKwkJCXdyaXRlX3VubG9jaygmR2xv YmFsU01CU2VzbG9jayk7CiAJCWlmIChjaWZzRmlsZS0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0 KSB7CiAJCQljRllJKDEsICgiZnJlZWluZyBTTUIgZmYgY2FjaGUgYnVmIG9uIHNlYXJjaCByZXdp bmQiKSk7CiAJCQlpZiAoY2lmc0ZpbGUtPnNyY2hfaW5mLnNtYWxsQnVmKQo= ------=_Part_81742_30114154.1227066419451--