From c1b603ad7f20fef3c828ed8635ddc830136dfd8c Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Mon, 6 Jun 2011 12:49:10 -0400 Subject: [PATCH] pnfs: fix for BADLAYOUT error from LAYOUTGET Signed-off-by: Casey Bodley --- daemon/nfs41_ops.c | 4 +++- daemon/nfs41_ops.h | 1 + daemon/pnfs_layout.c | 19 ++++++++++--------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/daemon/nfs41_ops.c b/daemon/nfs41_ops.c index f366136..c241d22 100644 --- a/daemon/nfs41_ops.c +++ b/daemon/nfs41_ops.c @@ -1741,6 +1741,7 @@ enum nfsstat4 pnfs_rpc_layoutget( IN stateid_arg *stateid, IN enum pnfs_iomode iomode, IN uint64_t offset, + IN uint64_t minlength, IN uint64_t length, OUT pnfs_layoutget_res_ok *layoutget_res_ok) { @@ -1773,7 +1774,8 @@ enum nfsstat4 pnfs_rpc_layoutget( layoutget_args.layout_type = PNFS_LAYOUTTYPE_FILE; layoutget_args.iomode = iomode; layoutget_args.offset = offset; - layoutget_args.minlength = layoutget_args.length = length; + layoutget_args.minlength = minlength; + layoutget_args.length = length; layoutget_args.stateid = stateid; layoutget_args.maxcount = session->fore_chan_attrs.ca_maxresponsesize - READ_OVERHEAD; ZeroMemory(&layoutget_res, sizeof(layoutget_res)); diff --git a/daemon/nfs41_ops.h b/daemon/nfs41_ops.h index 1dfb3ca..e9ed0a1 100644 --- a/daemon/nfs41_ops.h +++ b/daemon/nfs41_ops.h @@ -1151,6 +1151,7 @@ enum nfsstat4 pnfs_rpc_layoutget( IN stateid_arg *stateid, IN enum pnfs_iomode iomode, IN uint64_t offset, + IN uint64_t minlength, IN uint64_t length, OUT pnfs_layoutget_res_ok *layoutget_res); diff --git a/daemon/pnfs_layout.c b/daemon/pnfs_layout.c index 05f89ab..2e90acd 100644 --- a/daemon/pnfs_layout.c +++ b/daemon/pnfs_layout.c @@ -286,6 +286,7 @@ static enum pnfs_status file_layout_fetch( IN stateid_arg *stateid, IN enum pnfs_iomode iomode, IN uint64_t offset, + IN uint64_t minlength, IN uint64_t length) { pnfs_layoutget_res_ok layoutget_res = { 0 }; @@ -299,8 +300,8 @@ static enum pnfs_status file_layout_fetch( /* drop the lock during the rpc call */ ReleaseSRWLockExclusive(&state->lock); - nfsstat = pnfs_rpc_layoutget(session, meta_file, - stateid, iomode, offset, length, &layoutget_res); + nfsstat = pnfs_rpc_layoutget(session, meta_file, stateid, + iomode, offset, minlength, length, &layoutget_res); AcquireSRWLockExclusive(&state->lock); if (nfsstat) { @@ -395,14 +396,14 @@ static enum pnfs_status file_layout_cache( if ((state->status & PNFS_LAYOUT_NOT_RW) == 0) { /* try to get a RW layout first */ - status = file_layout_fetch(state, session, - meta_file, stateid, PNFS_IOMODE_RW, offset, length); + status = file_layout_fetch(state, session, meta_file, + stateid, PNFS_IOMODE_RW, offset, 0, NFS4_UINT32_MAX); } if (status && iomode == PNFS_IOMODE_READ) { /* fall back on READ if necessary */ - status = file_layout_fetch(state, session, - meta_file, stateid, iomode, offset, length); + status = file_layout_fetch(state, session, meta_file, + stateid, iomode, offset, 0, NFS4_UINT32_MAX); } } @@ -517,9 +518,9 @@ static enum pnfs_status file_layout_get( { enum pnfs_status status; - /* request a range for the entire file */ - status = file_layout_cache(state, session, meta_file, - stateid, iomode, 0, NFS4_UINT64_MAX); + /* request a range that covers this io */ + status = file_layout_cache(state, session, + meta_file, stateid, iomode, offset, length); if (status) { dprintf(FLLVL, "file_layout_cache() failed with %s\n", pnfs_error_string(status));