From: Boaz Harrosh <bharrosh@panasas.com>
To: Trond Myklebust <Trond.Myklebust@netapp.com>,
Brent Welch <welch@panasas.com>,
NFS list <linux-nfs@vger.kernel.org>,
open-osd <osd-dev@open-osd.org>
Subject: [PATCH 2/8] pnfs-obj: Return PNFS_NOT_ATTEMPTED in case of read/write_pagelist
Date: Mon, 31 Oct 2011 14:45:46 -0700 [thread overview]
Message-ID: <1320097546-775-1-git-send-email-bharrosh@panasas.com> (raw)
In-Reply-To: <4EAF146D.5060507@panasas.com>
objlayout driver was always returning PNFS_ATTEMPTED from it's
read/write_pagelist operations. Even on error. Fix that.
Start by establishing an error return API from io-engine, by
not returning ssize_t (length-or-error) but returning "int"
0=OK, 0>Error. And clean up all return types in io-engine.
Then if io-engine returned error return PNFS_NOT_ATTEMPTED
to generic layer. (With a dprint)
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
fs/nfs/objlayout/objio_osd.c | 32 ++++++++++++++++----------------
fs/nfs/objlayout/objlayout.c | 36 +++++++++++++++++++-----------------
fs/nfs/objlayout/objlayout.h | 4 ++--
3 files changed, 37 insertions(+), 35 deletions(-)
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
index d0cda12..0c7c9ec 100644
--- a/fs/nfs/objlayout/objio_osd.c
+++ b/fs/nfs/objlayout/objio_osd.c
@@ -142,7 +142,7 @@ struct objio_segment {
}
struct objio_state;
-typedef ssize_t (*objio_done_fn)(struct objio_state *ios);
+typedef int (*objio_done_fn)(struct objio_state *ios);
struct objio_state {
/* Generic layer */
@@ -720,7 +720,7 @@ static int _io_rw_pagelist(struct objio_state *ios, gfp_t gfp_flags)
return 0;
}
-static ssize_t _sync_done(struct objio_state *ios)
+static int _sync_done(struct objio_state *ios)
{
struct completion *waiting = ios->private;
@@ -742,10 +742,10 @@ static void _done_io(struct osd_request *or, void *p)
kref_put(&ios->kref, _last_io);
}
-static ssize_t _io_exec(struct objio_state *ios)
+static int _io_exec(struct objio_state *ios)
{
DECLARE_COMPLETION_ONSTACK(wait);
- ssize_t status = 0; /* sync status */
+ int ret = 0;
unsigned i;
objio_done_fn saved_done_fn = ios->done;
bool sync = ios->ol_state.sync;
@@ -771,16 +771,16 @@ static ssize_t _io_exec(struct objio_state *ios)
if (sync) {
wait_for_completion(&wait);
- status = saved_done_fn(ios);
+ ret = saved_done_fn(ios);
}
- return status;
+ return ret;
}
/*
* read
*/
-static ssize_t _read_done(struct objio_state *ios)
+static int _read_done(struct objio_state *ios)
{
ssize_t status;
int ret = _io_check(ios, false);
@@ -793,7 +793,7 @@ static ssize_t _read_done(struct objio_state *ios)
status = ret;
objlayout_read_done(&ios->ol_state, status, ios->ol_state.sync);
- return status;
+ return ret;
}
static int _read_mirrors(struct objio_state *ios, unsigned cur_comp)
@@ -833,7 +833,7 @@ static int _read_mirrors(struct objio_state *ios, unsigned cur_comp)
return ret;
}
-static ssize_t _read_exec(struct objio_state *ios)
+static int _read_exec(struct objio_state *ios)
{
unsigned i;
int ret;
@@ -847,14 +847,14 @@ static ssize_t _read_exec(struct objio_state *ios)
}
ios->done = _read_done;
- return _io_exec(ios); /* In sync mode exec returns the io status */
+ return _io_exec(ios);
err:
_io_free(ios);
return ret;
}
-ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state)
+int objio_read_pagelist(struct objlayout_io_state *ol_state)
{
struct objio_state *ios = container_of(ol_state, struct objio_state,
ol_state);
@@ -870,7 +870,7 @@ ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state)
/*
* write
*/
-static ssize_t _write_done(struct objio_state *ios)
+static int _write_done(struct objio_state *ios)
{
ssize_t status;
int ret = _io_check(ios, true);
@@ -887,7 +887,7 @@ static ssize_t _write_done(struct objio_state *ios)
}
objlayout_write_done(&ios->ol_state, status, ios->ol_state.sync);
- return status;
+ return ret;
}
static int _write_mirrors(struct objio_state *ios, unsigned cur_comp)
@@ -955,7 +955,7 @@ static int _write_mirrors(struct objio_state *ios, unsigned cur_comp)
return ret;
}
-static ssize_t _write_exec(struct objio_state *ios)
+static int _write_exec(struct objio_state *ios)
{
unsigned i;
int ret;
@@ -969,14 +969,14 @@ static ssize_t _write_exec(struct objio_state *ios)
}
ios->done = _write_done;
- return _io_exec(ios); /* In sync mode exec returns the io->status */
+ return _io_exec(ios);
err:
_io_free(ios);
return ret;
}
-ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state, bool stable)
+int objio_write_pagelist(struct objlayout_io_state *ol_state, bool stable)
{
struct objio_state *ios = container_of(ol_state, struct objio_state,
ol_state);
diff --git a/fs/nfs/objlayout/objlayout.c b/fs/nfs/objlayout/objlayout.c
index 1300736..99c807d 100644
--- a/fs/nfs/objlayout/objlayout.c
+++ b/fs/nfs/objlayout/objlayout.c
@@ -315,16 +315,13 @@ enum pnfs_try_status
loff_t offset = rdata->args.offset;
size_t count = rdata->args.count;
struct objlayout_io_state *state;
- ssize_t status = 0;
+ int err;
loff_t eof;
- dprintk("%s: Begin inode %p offset %llu count %d\n",
- __func__, rdata->inode, offset, (int)count);
-
eof = i_size_read(rdata->inode);
if (unlikely(offset + count > eof)) {
if (offset >= eof) {
- status = 0;
+ err = 0;
rdata->res.count = 0;
rdata->res.eof = 1;
/*FIXME: do we need to call pnfs_ld_read_done() */
@@ -341,14 +338,19 @@ enum pnfs_try_status
rdata->lseg, rdata,
GFP_KERNEL);
if (unlikely(!state)) {
- status = -ENOMEM;
+ err = -ENOMEM;
goto out;
}
+ dprintk("%s: inode(%lx) offset 0x%llx count 0x%Zx eof=%d\n",
+ __func__, rdata->inode->i_ino, offset, count, rdata->res.eof);
- status = objio_read_pagelist(state);
+ err = objio_read_pagelist(state);
out:
- dprintk("%s: Return status %Zd\n", __func__, status);
- rdata->pnfs_error = status;
+ if (unlikely(err)) {
+ rdata->pnfs_error = err;
+ dprintk("%s: Returned Error %d\n", __func__, err);
+ return PNFS_NOT_ATTEMPTED;
+ }
return PNFS_ATTEMPTED;
}
@@ -406,10 +408,7 @@ enum pnfs_try_status
int how)
{
struct objlayout_io_state *state;
- ssize_t status;
-
- dprintk("%s: Begin inode %p offset %llu count %u\n",
- __func__, wdata->inode, wdata->args.offset, wdata->args.count);
+ int err;
state = objlayout_alloc_io_state(NFS_I(wdata->inode)->layout,
wdata->args.pages,
@@ -419,16 +418,19 @@ enum pnfs_try_status
wdata->lseg, wdata,
GFP_NOFS);
if (unlikely(!state)) {
- status = -ENOMEM;
+ err = -ENOMEM;
goto out;
}
state->sync = how & FLUSH_SYNC;
- status = objio_write_pagelist(state, how & FLUSH_STABLE);
+ err = objio_write_pagelist(state, how & FLUSH_STABLE);
out:
- dprintk("%s: Return status %Zd\n", __func__, status);
- wdata->pnfs_error = status;
+ if (unlikely(err)) {
+ wdata->pnfs_error = err;
+ dprintk("%s: Returned Error %d\n", __func__, err);
+ return PNFS_NOT_ATTEMPTED;
+ }
return PNFS_ATTEMPTED;
}
diff --git a/fs/nfs/objlayout/objlayout.h b/fs/nfs/objlayout/objlayout.h
index ffb884c..4edac9b 100644
--- a/fs/nfs/objlayout/objlayout.h
+++ b/fs/nfs/objlayout/objlayout.h
@@ -115,8 +115,8 @@ extern int objio_alloc_io_state(
gfp_t gfp_flags);
extern void objio_free_io_state(struct objlayout_io_state *state);
-extern ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state);
-extern ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state,
+extern int objio_read_pagelist(struct objlayout_io_state *ol_state);
+extern int objio_write_pagelist(struct objlayout_io_state *ol_state,
bool stable);
/*
--
1.7.6.4
next prev parent reply other threads:[~2011-10-31 21:45 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-28 19:13 [patchset 0/8] pnfs-obj: Move to ORE for v3.2 merge window Boaz Harrosh
2011-10-29 17:24 ` Trond Myklebust
2011-10-31 17:49 ` Boaz Harrosh
2011-10-31 21:34 ` Boaz Harrosh
2011-10-31 21:45 ` [PATCH 1/8] pnfs-obj: Remove redundant EOF from objlayout_io_state Boaz Harrosh
2011-10-31 22:24 ` Trond Myklebust
2011-10-31 22:45 ` Boaz Harrosh
2011-10-31 23:23 ` Boaz Harrosh
2011-10-31 23:29 ` Trond Myklebust
2011-10-31 23:59 ` Boaz Harrosh
2011-11-01 2:25 ` Trond Myklebust
2011-10-31 21:45 ` Boaz Harrosh [this message]
2011-10-31 21:47 ` [PATCH 3/8] pnfs-obj: Get rid of objlayout_{alloc,free}_io_state Boaz Harrosh
2011-10-31 22:03 ` [PATCH 4/8] pnfs-obj: Rename objlayout_io_state => objlayout_io_res Boaz Harrosh
2011-10-31 22:04 ` [PATCH 5/8] pnfs-obj: move to ore 01: ore_layout & ore_components Boaz Harrosh
2011-10-31 22:15 ` [PATCH 6/8] pnfs-obj: move to ore 02: move to ORE Boaz Harrosh
2011-10-31 22:16 ` [PATCH 7/8] pnfs-obj: move to ore 03: Remove old raid engine Boaz Harrosh
2011-10-31 22:16 ` [PATCH 8/8] pnfs-obj: Support for RAID5 read-4-write interface Boaz Harrosh
2011-11-01 17:42 ` [patchset 0/8] pnfs-obj: Move to ORE for v3.2 merge window Boaz Harrosh
2011-11-02 19:01 ` [osd-dev] " Boaz Harrosh
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=1320097546-775-1-git-send-email-bharrosh@panasas.com \
--to=bharrosh@panasas.com \
--cc=Trond.Myklebust@netapp.com \
--cc=linux-nfs@vger.kernel.org \
--cc=osd-dev@open-osd.org \
--cc=welch@panasas.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).