From: Peter Staubach <staubach@redhat.com>
To: nfs@lists.sourceforge.net
Subject: [PATCH] make NFS client side WRITE more defensive
Date: Wed, 29 Jun 2005 12:09:16 -0400 [thread overview]
Message-ID: <42C2C7AC.5070405@redhat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 391 bytes --]
Hi.
Attached are same changes to make the NFS client side WRITE processing a
little
more defensive. Currently, a response which indicates that the server wrote
more data than actually requested could cause bad things to happen. Such a
response could come from a broken or malicious server or from network
corruption
that the normal checksumming fails to catch.
Thanx...
ps
[-- Attachment #2: nfswrite.devel --]
[-- Type: text/plain, Size: 3047 bytes --]
--- write.c.org 2005-06-27 16:20:02.591244320 -0400
+++ write.c 2005-06-27 17:07:52.890892448 -0400
@@ -197,15 +197,21 @@ static int nfs_writepage_sync(struct nfs
result = NFS_PROTO(inode)->write(wdata);
- if (result < 0) {
+ if (result <= 0) {
/* Must mark the page invalid after I/O error */
ClearPageUptodate(page);
goto io_error;
}
- if (result < wdata->args.count)
- printk(KERN_WARNING "NFS: short write, count=%u, result=%d\n",
- wdata->args.count, result);
-
+ if (result > wdata->args.count) {
+ dprintk("NFS: faulty NFS server %s:"
+ " (requested = %u) != (result = %d)\n",
+ NFS_SERVER(inode)->hostname,
+ wdata->args.count, result);
+ /* Treat as I/O error */
+ ClearPageUptodate(page);
+ result = -EIO;
+ goto io_error;
+ }
wdata->args.offset += result;
wdata->args.pgbase += result;
written += result;
@@ -1165,32 +1171,50 @@ void nfs_writeback_done(struct rpc_task
}
}
#endif
- /* Is this a short write? */
- if (task->tk_status >= 0 && resp->count < argp->count) {
+ if (task->tk_status >= 0 && resp->count != argp->count) {
static unsigned long complain;
- /* Has the server at least made some progress? */
- if (resp->count != 0) {
- /* Was this an NFSv2 write or an NFSv3 stable write? */
- if (resp->verf->committed != NFS_UNSTABLE) {
- /* Resend from where the server left off */
- argp->offset += resp->count;
- argp->pgbase += resp->count;
- argp->count -= resp->count;
- } else {
- /* Resend as a stable write in order to avoid
- * headaches in the case of a server crash.
+ /* Is this a short write? */
+ if (resp->count < argp->count) {
+ /* Has the server at least made some progress? */
+ if (resp->count != 0) {
+ /*
+ * Was this an NFSv2 write or an NFSv3
+ * stable write?
*/
- argp->stable = NFS_FILE_SYNC;
+ if (resp->verf->committed != NFS_UNSTABLE) {
+ /*
+ * Resend from where the server
+ * left off
+ */
+ argp->offset += resp->count;
+ argp->pgbase += resp->count;
+ argp->count -= resp->count;
+ } else {
+ /*
+ * Resend as a stable write in
+ * order to avoid headaches in
+ * the case of a server crash.
+ */
+ argp->stable = NFS_FILE_SYNC;
+ }
+ rpc_restart_call(task);
+ return;
}
- rpc_restart_call(task);
- return;
- }
- if (time_before(complain, jiffies)) {
- printk(KERN_WARNING
- "NFS: Server wrote zero bytes, expected %u.\n",
+ if (time_before(complain, jiffies)) {
+ dprintk("NFS: Server wrote zero bytes,"
+ " expected %u.\n",
argp->count);
- complain = jiffies + 300 * HZ;
+ complain = jiffies + 300 * HZ;
+ }
+ } else {
+ /* Or an oversized write? */
+ if (time_before(complain, jiffies)) {
+ dprintk("NFS: Server wrote more than requested,"
+ " expected %u.\n",
+ argp->count);
+ complain = jiffies + 300 * HZ;
+ }
}
/* Can't do anything about it except throw an error. */
task->tk_status = -EIO;
next reply other threads:[~2005-06-29 16:13 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-06-29 16:09 Peter Staubach [this message]
2005-06-29 20:36 ` [PATCH] make NFS client side WRITE more defensive Peter Staubach
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=42C2C7AC.5070405@redhat.com \
--to=staubach@redhat.com \
--cc=nfs@lists.sourceforge.net \
/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