aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2011-10-31 17:45:46 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2011-11-02 23:56:03 -0400
commite6c40fe3f4c4967f1cb486191ed4a5d5f55f3f7e (patch)
treea7747effb21709bfbb0b3ded2e85253f37e7711e /fs/nfs
parent4cdc685c7d06f659ef6c336d4242005cdd8df401 (diff)
pnfs-obj: Return PNFS_NOT_ATTEMPTED in case of read/write_pagelist
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> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/objlayout/objio_osd.c32
-rw-r--r--fs/nfs/objlayout/objlayout.c36
-rw-r--r--fs/nfs/objlayout/objlayout.h4
3 files changed, 37 insertions, 35 deletions
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
index d0cda12fddc3..0c7c9ec24e67 100644
--- a/fs/nfs/objlayout/objio_osd.c
+++ b/fs/nfs/objlayout/objio_osd.c
@@ -142,7 +142,7 @@ OBJIO_LSEG(struct pnfs_layout_segment *lseg)
142} 142}
143 143
144struct objio_state; 144struct objio_state;
145typedef ssize_t (*objio_done_fn)(struct objio_state *ios); 145typedef int (*objio_done_fn)(struct objio_state *ios);
146 146
147struct objio_state { 147struct objio_state {
148 /* Generic layer */ 148 /* Generic layer */
@@ -720,7 +720,7 @@ out:
720 return 0; 720 return 0;
721} 721}
722 722
723static ssize_t _sync_done(struct objio_state *ios) 723static int _sync_done(struct objio_state *ios)
724{ 724{
725 struct completion *waiting = ios->private; 725 struct completion *waiting = ios->private;
726 726
@@ -742,10 +742,10 @@ static void _done_io(struct osd_request *or, void *p)
742 kref_put(&ios->kref, _last_io); 742 kref_put(&ios->kref, _last_io);
743} 743}
744 744
745static ssize_t _io_exec(struct objio_state *ios) 745static int _io_exec(struct objio_state *ios)
746{ 746{
747 DECLARE_COMPLETION_ONSTACK(wait); 747 DECLARE_COMPLETION_ONSTACK(wait);
748 ssize_t status = 0; /* sync status */ 748 int ret = 0;
749 unsigned i; 749 unsigned i;
750 objio_done_fn saved_done_fn = ios->done; 750 objio_done_fn saved_done_fn = ios->done;
751 bool sync = ios->ol_state.sync; 751 bool sync = ios->ol_state.sync;
@@ -771,16 +771,16 @@ static ssize_t _io_exec(struct objio_state *ios)
771 771
772 if (sync) { 772 if (sync) {
773 wait_for_completion(&wait); 773 wait_for_completion(&wait);
774 status = saved_done_fn(ios); 774 ret = saved_done_fn(ios);
775 } 775 }
776 776
777 return status; 777 return ret;
778} 778}
779 779
780/* 780/*
781 * read 781 * read
782 */ 782 */
783static ssize_t _read_done(struct objio_state *ios) 783static int _read_done(struct objio_state *ios)
784{ 784{
785 ssize_t status; 785 ssize_t status;
786 int ret = _io_check(ios, false); 786 int ret = _io_check(ios, false);
@@ -793,7 +793,7 @@ static ssize_t _read_done(struct objio_state *ios)
793 status = ret; 793 status = ret;
794 794
795 objlayout_read_done(&ios->ol_state, status, ios->ol_state.sync); 795 objlayout_read_done(&ios->ol_state, status, ios->ol_state.sync);
796 return status; 796 return ret;
797} 797}
798 798
799static int _read_mirrors(struct objio_state *ios, unsigned cur_comp) 799static int _read_mirrors(struct objio_state *ios, unsigned cur_comp)
@@ -833,7 +833,7 @@ err:
833 return ret; 833 return ret;
834} 834}
835 835
836static ssize_t _read_exec(struct objio_state *ios) 836static int _read_exec(struct objio_state *ios)
837{ 837{
838 unsigned i; 838 unsigned i;
839 int ret; 839 int ret;
@@ -847,14 +847,14 @@ static ssize_t _read_exec(struct objio_state *ios)
847 } 847 }
848 848
849 ios->done = _read_done; 849 ios->done = _read_done;
850 return _io_exec(ios); /* In sync mode exec returns the io status */ 850 return _io_exec(ios);
851 851
852err: 852err:
853 _io_free(ios); 853 _io_free(ios);
854 return ret; 854 return ret;
855} 855}
856 856
857ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state) 857int objio_read_pagelist(struct objlayout_io_state *ol_state)
858{ 858{
859 struct objio_state *ios = container_of(ol_state, struct objio_state, 859 struct objio_state *ios = container_of(ol_state, struct objio_state,
860 ol_state); 860 ol_state);
@@ -870,7 +870,7 @@ ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state)
870/* 870/*
871 * write 871 * write
872 */ 872 */
873static ssize_t _write_done(struct objio_state *ios) 873static int _write_done(struct objio_state *ios)
874{ 874{
875 ssize_t status; 875 ssize_t status;
876 int ret = _io_check(ios, true); 876 int ret = _io_check(ios, true);
@@ -887,7 +887,7 @@ static ssize_t _write_done(struct objio_state *ios)
887 } 887 }
888 888
889 objlayout_write_done(&ios->ol_state, status, ios->ol_state.sync); 889 objlayout_write_done(&ios->ol_state, status, ios->ol_state.sync);
890 return status; 890 return ret;
891} 891}
892 892
893static int _write_mirrors(struct objio_state *ios, unsigned cur_comp) 893static int _write_mirrors(struct objio_state *ios, unsigned cur_comp)
@@ -955,7 +955,7 @@ err:
955 return ret; 955 return ret;
956} 956}
957 957
958static ssize_t _write_exec(struct objio_state *ios) 958static int _write_exec(struct objio_state *ios)
959{ 959{
960 unsigned i; 960 unsigned i;
961 int ret; 961 int ret;
@@ -969,14 +969,14 @@ static ssize_t _write_exec(struct objio_state *ios)
969 } 969 }
970 970
971 ios->done = _write_done; 971 ios->done = _write_done;
972 return _io_exec(ios); /* In sync mode exec returns the io->status */ 972 return _io_exec(ios);
973 973
974err: 974err:
975 _io_free(ios); 975 _io_free(ios);
976 return ret; 976 return ret;
977} 977}
978 978
979ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state, bool stable) 979int objio_write_pagelist(struct objlayout_io_state *ol_state, bool stable)
980{ 980{
981 struct objio_state *ios = container_of(ol_state, struct objio_state, 981 struct objio_state *ios = container_of(ol_state, struct objio_state,
982 ol_state); 982 ol_state);
diff --git a/fs/nfs/objlayout/objlayout.c b/fs/nfs/objlayout/objlayout.c
index 1300736e0fb4..99c807df11dc 100644
--- a/fs/nfs/objlayout/objlayout.c
+++ b/fs/nfs/objlayout/objlayout.c
@@ -315,16 +315,13 @@ objlayout_read_pagelist(struct nfs_read_data *rdata)
315 loff_t offset = rdata->args.offset; 315 loff_t offset = rdata->args.offset;
316 size_t count = rdata->args.count; 316 size_t count = rdata->args.count;
317 struct objlayout_io_state *state; 317 struct objlayout_io_state *state;
318 ssize_t status = 0; 318 int err;
319 loff_t eof; 319 loff_t eof;
320 320
321 dprintk("%s: Begin inode %p offset %llu count %d\n",
322 __func__, rdata->inode, offset, (int)count);
323
324 eof = i_size_read(rdata->inode); 321 eof = i_size_read(rdata->inode);
325 if (unlikely(offset + count > eof)) { 322 if (unlikely(offset + count > eof)) {
326 if (offset >= eof) { 323 if (offset >= eof) {
327 status = 0; 324 err = 0;
328 rdata->res.count = 0; 325 rdata->res.count = 0;
329 rdata->res.eof = 1; 326 rdata->res.eof = 1;
330 /*FIXME: do we need to call pnfs_ld_read_done() */ 327 /*FIXME: do we need to call pnfs_ld_read_done() */
@@ -341,14 +338,19 @@ objlayout_read_pagelist(struct nfs_read_data *rdata)
341 rdata->lseg, rdata, 338 rdata->lseg, rdata,
342 GFP_KERNEL); 339 GFP_KERNEL);
343 if (unlikely(!state)) { 340 if (unlikely(!state)) {
344 status = -ENOMEM; 341 err = -ENOMEM;
345 goto out; 342 goto out;
346 } 343 }
344 dprintk("%s: inode(%lx) offset 0x%llx count 0x%Zx eof=%d\n",
345 __func__, rdata->inode->i_ino, offset, count, rdata->res.eof);
347 346
348 status = objio_read_pagelist(state); 347 err = objio_read_pagelist(state);
349 out: 348 out:
350 dprintk("%s: Return status %Zd\n", __func__, status); 349 if (unlikely(err)) {
351 rdata->pnfs_error = status; 350 rdata->pnfs_error = err;
351 dprintk("%s: Returned Error %d\n", __func__, err);
352 return PNFS_NOT_ATTEMPTED;
353 }
352 return PNFS_ATTEMPTED; 354 return PNFS_ATTEMPTED;
353} 355}
354 356
@@ -406,10 +408,7 @@ objlayout_write_pagelist(struct nfs_write_data *wdata,
406 int how) 408 int how)
407{ 409{
408 struct objlayout_io_state *state; 410 struct objlayout_io_state *state;
409 ssize_t status; 411 int err;
410
411 dprintk("%s: Begin inode %p offset %llu count %u\n",
412 __func__, wdata->inode, wdata->args.offset, wdata->args.count);
413 412
414 state = objlayout_alloc_io_state(NFS_I(wdata->inode)->layout, 413 state = objlayout_alloc_io_state(NFS_I(wdata->inode)->layout,
415 wdata->args.pages, 414 wdata->args.pages,
@@ -419,16 +418,19 @@ objlayout_write_pagelist(struct nfs_write_data *wdata,
419 wdata->lseg, wdata, 418 wdata->lseg, wdata,
420 GFP_NOFS); 419 GFP_NOFS);
421 if (unlikely(!state)) { 420 if (unlikely(!state)) {
422 status = -ENOMEM; 421 err = -ENOMEM;
423 goto out; 422 goto out;
424 } 423 }
425 424
426 state->sync = how & FLUSH_SYNC; 425 state->sync = how & FLUSH_SYNC;
427 426
428 status = objio_write_pagelist(state, how & FLUSH_STABLE); 427 err = objio_write_pagelist(state, how & FLUSH_STABLE);
429 out: 428 out:
430 dprintk("%s: Return status %Zd\n", __func__, status); 429 if (unlikely(err)) {
431 wdata->pnfs_error = status; 430 wdata->pnfs_error = err;
431 dprintk("%s: Returned Error %d\n", __func__, err);
432 return PNFS_NOT_ATTEMPTED;
433 }
432 return PNFS_ATTEMPTED; 434 return PNFS_ATTEMPTED;
433} 435}
434 436
diff --git a/fs/nfs/objlayout/objlayout.h b/fs/nfs/objlayout/objlayout.h
index ffb884c6fef0..4edac9b6ac0c 100644
--- a/fs/nfs/objlayout/objlayout.h
+++ b/fs/nfs/objlayout/objlayout.h
@@ -115,8 +115,8 @@ extern int objio_alloc_io_state(
115 gfp_t gfp_flags); 115 gfp_t gfp_flags);
116extern void objio_free_io_state(struct objlayout_io_state *state); 116extern void objio_free_io_state(struct objlayout_io_state *state);
117 117
118extern ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state); 118extern int objio_read_pagelist(struct objlayout_io_state *ol_state);
119extern ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state, 119extern int objio_write_pagelist(struct objlayout_io_state *ol_state,
120 bool stable); 120 bool stable);
121 121
122/* 122/*