It tries to find the lseg from local cache but not retrive layout from server. Signed-off-by: Peng Tao <peng_tao@xxxxxxx> --- fs/nfs/pnfs.c | 25 +++++++++++++++++++++++++ fs/nfs/pnfs.h | 5 +++++ 2 files changed, 30 insertions(+), 0 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 3be29c7..734e670 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -933,6 +933,31 @@ pnfs_find_lseg(struct pnfs_layout_hdr *lo, } /* + * Find and reference lseg with ino->i_lock held. + */ +struct pnfs_layout_segment * +pnfs_find_get_layout_locked(struct inode *ino, + loff_t pos, + u64 count, + enum pnfs_iomode iomode) +{ + struct pnfs_layout_segment *lseg = NULL; + struct pnfs_layout_range range = { + .iomode = iomode, + .offset = pos, + .length = count, + }; + + if (NFS_I(ino)->layout == NULL) + goto out; + + lseg = pnfs_find_lseg(NFS_I(ino)->layout, &range); +out: + return lseg; +} +EXPORT_SYMBOL_GPL(pnfs_find_get_layout_locked); + +/* * Layout segment is retreived from the server if not cached. * The appropriate layout segment is referenced and returned to the caller. */ diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 9614ac9..0c55fc1 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -213,6 +213,11 @@ struct pnfs_layout_hdr * pnfs_find_alloc_layout(struct inode *ino, struct nfs_open_context *ctx, gfp_t gfp_flags); +struct pnfs_layout_segment * +pnfs_find_get_layout_locked(struct inode *ino, + loff_t pos, + u64 count, + enum pnfs_iomode iomode); void nfs4_deviceid_mark_client_invalid(struct nfs_client *clp); -- 1.7.1.262.g5ef3d -- 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