From: Jeff Layton <jlayton@redhat.com>
To: smfrench@gmail.com
Cc: linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH 03/15] cifs: fix handling of signing with writepages
Date: Mon, 20 Sep 2010 16:01:32 -0700 [thread overview]
Message-ID: <1285023704-2159-4-git-send-email-jlayton@redhat.com> (raw)
In-Reply-To: <1285023704-2159-1-git-send-email-jlayton@redhat.com>
Get a reference to the file early so we can eventually base the decision
about signing on the correct tcon. If that doesn't work for some reason,
then fall back to generic_writepages. That's just as likely to fail, but
it simplifies the error handling.
In truth, I'm not sure how that could occur anyway, so maybe a NULL
open_file here ought to be a BUG()?
Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
fs/cifs/file.c | 82 +++++++++++++++++++++++++++----------------------------
1 files changed, 40 insertions(+), 42 deletions(-)
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 84979fc..8bff681 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1353,6 +1353,15 @@ static int cifs_writepages(struct address_space *mapping,
int scanned = 0;
int xid, long_op;
+ /*
+ * BB: Is this meaningful for a non-block-device file system?
+ * If it is, we should test it again after we do I/O
+ */
+ if (wbc->nonblocking && bdi_write_congested(bdi)) {
+ wbc->encountered_congestion = 1;
+ return 0;
+ }
+
cifs_sb = CIFS_SB(mapping->host->i_sb);
/*
@@ -1362,25 +1371,26 @@ static int cifs_writepages(struct address_space *mapping,
if (cifs_sb->wsize < PAGE_CACHE_SIZE)
return generic_writepages(mapping, wbc);
- if ((cifs_sb->tcon->ses) && (cifs_sb->tcon->ses->server))
- if (cifs_sb->tcon->ses->server->secMode &
- (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
- if (!experimEnabled)
- return generic_writepages(mapping, wbc);
-
iov = kmalloc(32 * sizeof(struct kvec), GFP_KERNEL);
if (iov == NULL)
return generic_writepages(mapping, wbc);
-
/*
- * BB: Is this meaningful for a non-block-device file system?
- * If it is, we should test it again after we do I/O
+ * if there's no open file, then this is likely to fail too,
+ * but it'll at least handle the return. Maybe it should be
+ * a BUG() instead?
*/
- if (wbc->nonblocking && bdi_write_congested(bdi)) {
- wbc->encountered_congestion = 1;
+ open_file = find_writable_file(CIFS_I(mapping->host));
+ if (!open_file) {
kfree(iov);
- return 0;
+ return generic_writepages(mapping, wbc);
+ }
+
+ tcon = open_file->tcon;
+ if (!experimEnabled && tcon->ses->server->secMode &
+ (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
+ cifsFileInfo_put(open_file);
+ return generic_writepages(mapping, wbc);
}
xid = GetXid();
@@ -1486,37 +1496,24 @@ retry:
break;
}
if (n_iov) {
- /* Search for a writable handle every time we call
- * CIFSSMBWrite2. We can't rely on the last handle
- * we used to still be valid
- */
- open_file = find_writable_file(CIFS_I(mapping->host));
- if (!open_file) {
- cERROR(1, "No writable handles for inode");
- rc = -EBADF;
+ long_op = cifs_write_timeout(cifsi, offset);
+ rc = CIFSSMBWrite2(xid, tcon, open_file->netfid,
+ bytes_to_write, offset,
+ &bytes_written, iov, n_iov,
+ long_op);
+ cifs_update_eof(cifsi, offset, bytes_written);
+
+ if (rc || bytes_written < bytes_to_write) {
+ cERROR(1, "Write2 ret %d, wrote %d",
+ rc, bytes_written);
+ /* BB what if continued retry is
+ requested via mount flags? */
+ if (rc == -ENOSPC)
+ set_bit(AS_ENOSPC, &mapping->flags);
+ else
+ set_bit(AS_EIO, &mapping->flags);
} else {
- tcon = open_file->tcon;
- long_op = cifs_write_timeout(cifsi, offset);
- rc = CIFSSMBWrite2(xid, tcon,
- open_file->netfid,
- bytes_to_write, offset,
- &bytes_written, iov, n_iov,
- long_op);
- cifsFileInfo_put(open_file);
- cifs_update_eof(cifsi, offset, bytes_written);
-
- if (rc || bytes_written < bytes_to_write) {
- cERROR(1, "Write2 ret %d, wrote %d",
- rc, bytes_written);
- /* BB what if continued retry is
- requested via mount flags? */
- if (rc == -ENOSPC)
- set_bit(AS_ENOSPC, &mapping->flags);
- else
- set_bit(AS_EIO, &mapping->flags);
- } else {
- cifs_stats_bytes_written(tcon, bytes_written);
- }
+ cifs_stats_bytes_written(tcon, bytes_written);
}
for (i = 0; i < n_iov; i++) {
page = pvec.pages[first + i];
@@ -1553,6 +1550,7 @@ retry:
if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
mapping->writeback_index = index;
+ cifsFileInfo_put(open_file);
FreeXid(xid);
kfree(iov);
return rc;
--
1.7.2.3
next prev parent reply other threads:[~2010-09-20 23:01 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-20 23:01 [PATCH 00/15] cifs: multiuser mount overhaul (try #4) Jeff Layton
2010-09-20 23:01 ` Jeff Layton [this message]
2010-09-20 23:01 ` [PATCH 06/15] cifs: add cifs_sb_master_tcon and convert some callers to use it Jeff Layton
[not found] ` <1285023704-2159-1-git-send-email-jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-09-20 23:01 ` [PATCH 01/15] cifs: add tcon field to cifsFileInfo struct Jeff Layton
2010-09-20 23:01 ` [PATCH 02/15] cifs: make various routines use the cifsFileInfo->tcon pointer Jeff Layton
2010-09-20 23:01 ` [PATCH 04/15] cifs: add function to get a tcon from cifs_sb Jeff Layton
2010-09-20 23:01 ` [PATCH 05/15] cifs: temporarily rename cifs_sb->tcon to ptcon to catch stragglers Jeff Layton
2010-09-20 23:01 ` [PATCH 07/15] cifs: have cifs_new_fileinfo take a tcon arg Jeff Layton
2010-09-20 23:01 ` [PATCH 08/15] cifs: add refcounted and timestamped container for holding tcons Jeff Layton
2010-09-20 23:01 ` [PATCH 09/15] cifs: have cifsFileInfo hold a reference to a tlink rather than tcon pointer Jeff Layton
[not found] ` <1285023704-2159-10-git-send-email-jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-09-23 6:08 ` Steve French
[not found] ` <AANLkTi=n=_R_WF8NizLo+zfcBEmzcQpBWWj=_GNEmua1-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-09-23 12:36 ` Jeff Layton
[not found] ` <20100923053623.09bd6f33-4QP7MXygkU+dMjc06nkz3ljfA9RmPOcC@public.gmane.org>
2010-09-23 12:43 ` Jeff Layton
2010-09-20 23:01 ` [PATCH 10/15] cifs: have find_readable/writable_file filter by fsuid Jeff Layton
2010-09-23 6:11 ` Steve French
2010-09-20 23:01 ` [PATCH 12/15] cifs: add routines to build sessions and tcons on the fly Jeff Layton
2010-09-20 23:01 ` [PATCH 13/15] cifs: on multiuser mount, set ownership to current_fsuid/current_fsgid Jeff Layton
[not found] ` <1285023704-2159-14-git-send-email-jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-09-23 6:19 ` Steve French
2010-09-23 12:38 ` Jeff Layton
2010-09-20 23:01 ` [PATCH 14/15] cifs: add "multiuser" mount option Jeff Layton
2010-09-20 23:01 ` [PATCH 15/15] cifs: implement recurring workqueue job to prune old tcons Jeff Layton
2010-09-20 23:01 ` [PATCH 11/15] cifs: fix cifs_show_options to show "username=" or "multiuser" Jeff Layton
2010-09-23 6:12 ` Steve French
2010-10-05 22:00 ` Steve French
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1285023704-2159-4-git-send-email-jlayton@redhat.com \
--to=jlayton@redhat.com \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=smfrench@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).