On Tue, Jun 8, 2010 at 12:14 AM, Benny Halevy <bhalevy@xxxxxxxxxxx> wrote: > On 2010-06-08 00:11, Alexandros Batsakis wrote: >> In the first iteration of the pNFS code, we support only whole file layouts. >> To facilitate the move to multiple-segments, we keep the segment processing >> code, but the segment list should always contain at most one segment per I/O type >> >> Signed-off-by: Alexandros Batsakis <batsakis@xxxxxxxxxx> >> --- >> fs/nfs/callback_proc.c | 7 ++++--- >> fs/nfs/pnfs.c | 25 ++++++++----------------- >> 2 files changed, 12 insertions(+), 20 deletions(-) >> >> diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c >> index 8752239..16b4510 100644 >> --- a/fs/nfs/callback_proc.c >> +++ b/fs/nfs/callback_proc.c >> @@ -213,6 +213,10 @@ static int pnfs_recall_layout(void *data) >> then return layouts, resume after layoutreturns complete >> */ >> >> + /* support whole file layouts only */ >> + rl.cbl_seg.offset = 0; >> + rl.cbl_seg.length = NFS4_MAX_UINT64; >> + >> if (rl.cbl_recall_type == RETURN_FILE) { >> status = pnfs_return_layout(inode, &rl.cbl_seg, &rl.cbl_stateid, >> RETURN_FILE, true); >> @@ -221,9 +225,6 @@ static int pnfs_recall_layout(void *data) >> goto out; >> } >> >> - rl.cbl_seg.offset = 0; >> - rl.cbl_seg.length = NFS4_MAX_UINT64; >> - >> /* FIXME: This loop is inefficient, running in O(|s_inodes|^2) */ >> while ((ino = nfs_layoutrecall_find_inode(clp, &rl)) != NULL) { >> /* XXX need to check status on pnfs_return_layout */ >> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c >> index dd7ad26..8985e9f 100644 >> --- a/fs/nfs/pnfs.c >> +++ b/fs/nfs/pnfs.c >> @@ -551,12 +551,6 @@ pnfs_layout_from_open_stateid(nfs4_stateid *dst, struct nfs4_state *state) >> * for now, assume that whole file layouts are requested. >> * arg->offset: 0 >> * arg->length: all ones >> -* >> -* for now, assume the LAYOUTGET operation is triggered by an I/O request. >> -* the count field is the count in the I/O request, and will be used >> -* as the minlength. for the file operation that piggy-backs >> -* the LAYOUTGET operation with an OPEN, s >> -* arg->minlength = count. >> */ >> static int >> get_layout(struct inode *ino, >> @@ -577,11 +571,11 @@ get_layout(struct inode *ino, >> return -ENOMEM; >> } >> lgp->lo = lo; >> - lgp->args.minlength = PAGE_CACHE_SIZE; >> + lgp->args.minlength = NFS4_MAX_UINT64; >> lgp->args.maxcount = PNFS_LAYOUT_MAXSIZE; >> lgp->args.lseg.iomode = range->iomode; >> - lgp->args.lseg.offset = range->offset; >> - lgp->args.lseg.length = max(range->length, lgp->args.minlength); >> + lgp->args.lseg.offset = 0; >> + lgp->args.lseg.length = NFS4_MAX_UINT64; > > I'm not sure how well this will work for pnfs-obj writes. > We might have to revert it in the pnfs post-submit branch. > > Benny > Agreed... but bear in mind that there are other things that need to change too to properly (and efficiently) support partial layouts (e.g. layout operation sequencing). So maybe a fresh patch will be more appropriate, but it's up to you of course. -alexandros >> lgp->args.type = server->pnfs_curr_ld->id; >> lgp->args.inode = ino; >> lgp->lsegpp = lsegpp; >> @@ -756,7 +750,7 @@ _pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range, >> else { >> arg.iomode = IOMODE_ANY; >> arg.offset = 0; >> - arg.length = ~0; >> + arg.length = NFS4_MAX_UINT64; >> } >> if (type == RETURN_FILE) { >> lo = get_lock_current_layout(nfsi); >> @@ -1051,8 +1045,8 @@ pnfs_update_layout(struct inode *ino, >> { >> struct nfs4_pnfs_layout_segment arg = { >> .iomode = iomode, >> - .offset = pos, >> - .length = count >> + .offset = 0, >> + .length = ~0 >> }; >> struct nfs_inode *nfsi = NFS_I(ino); >> struct pnfs_layout_type *lo; >> @@ -1142,7 +1136,6 @@ out_put: >> void >> pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status) >> { >> - struct nfs4_pnfs_layoutget_res *res = &lgp->res; >> struct pnfs_layout_segment *lseg = NULL; >> struct nfs_inode *nfsi = PNFS_NFS_INODE(lgp->lo); >> time_t suspend = 0; >> @@ -1151,11 +1144,10 @@ pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status) >> >> lgp->status = rpc_status; >> if (likely(!rpc_status)) { >> - if (unlikely(res->layout.len <= 0)) { >> + if (unlikely(lgp->res.layout.len < 0)) { >> printk(KERN_ERR >> - "%s: ERROR! Layout size is ZERO!\n", __func__); >> + "%s: ERROR Returned layout size is ZERO\n", __func__); >> lgp->status = -EIO; >> - goto get_out; >> } >> goto out; >> } >> @@ -1233,7 +1225,6 @@ pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status) >> break; >> } >> >> -get_out: >> /* remember that get layout failed and suspend trying */ >> nfsi->layout.pnfs_layout_suspend = suspend; >> set_bit(lo_fail_bit(lgp->args.lseg.iomode), > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html