[pnfs] [PATCH 31/37] pnfs: client layout_cache: pnfs_update_layout returns an lseg
Benny Halevy
bhalevy at panasas.com
Tue Jan 1 05:51:51 EST 2008
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
fs/nfs/pnfs.c | 20 ++++++++++++++------
fs/nfs/pnfs.h | 4 +++-
2 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 6c5f527..71250ab 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -751,19 +751,23 @@ pnfs_has_layout(struct pnfs_layout_type *lo,
/* Update the file's layout for the given range and iomode.
* Layout is retreived from the server if needed.
+ * If lsegpp is given, the appropriate layout segment is referenced and
+ * returned to the caller.
*/
int
pnfs_update_layout(struct inode *ino,
struct nfs_open_context *ctx,
size_t count,
loff_t pos,
- enum pnfs_iomode iomode)
+ enum pnfs_iomode iomode,
+ struct pnfs_layout_segment **lsegpp)
{
struct nfs4_pnfs_layoutget_res res;
struct nfs4_pnfs_layoutget_arg arg;
struct nfs_inode *nfsi = NFS_I(ino);
struct nfs_server *nfss = NFS_SERVER(ino);
struct pnfs_layout_type *layout_new;
+ struct pnfs_layout_segment *lseg = NULL;
int result = -EIO;
layout_new = get_alloc_layout(ino, nfss->pnfs_curr_ld->ld_io_ops);
@@ -879,8 +883,10 @@ get_out:
out:
put_unlock_current_layout(nfsi, layout_new);
ret:
- dprintk("%s end (err:%d) state 0x%lx\n",
- __FUNCTION__, result, nfsi->pnfs_layout_state);
+ dprintk("%s end (err:%d) state 0x%lx lseg %p\n",
+ __FUNCTION__, result, nfsi->pnfs_layout_state, lseg);
+ if (lsegpp)
+ *lsegpp = lseg;
return result;
}
@@ -1010,7 +1016,7 @@ pnfs_set_ds_rsize(struct inode *inode,
status = pnfs_update_layout(inode, ctx, count,
- offset, IOMODE_READ);
+ offset, IOMODE_READ, NULL);
dprintk("%s *rsize %Zd virt update returned %d\n",
__func__, *rsize, status);
@@ -1155,7 +1161,8 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
args->context,
args->count,
args->offset,
- IOMODE_RW);
+ IOMODE_RW,
+ NULL);
if (status) {
status = 1; /* retry with nfs I/O */
goto out;
@@ -1233,7 +1240,8 @@ pnfs_readpages(struct nfs_read_data *rdata)
args->context,
args->count,
args->offset,
- IOMODE_READ);
+ IOMODE_READ,
+ NULL);
if (status) {
printk(KERN_WARNING
"%s: ERROR %d from pnfs_update_layout\n",
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index ed1445e..310490c 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -14,9 +14,11 @@
#ifdef CONFIG_PNFS
#include <linux/nfs_page.h>
+#include <linux/nfs4_pnfs.h>
int pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
- size_t count, loff_t pos, enum pnfs_iomode access_type);
+ size_t count, loff_t pos, enum pnfs_iomode access_type,
+ struct pnfs_layout_segment **lsegpp);
int pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range);
int pnfs_return_layout_rpc(struct nfs_server *server, struct nfs4_pnfs_layoutreturn_arg *argp);
--
1.5.3.3
More information about the pNFS
mailing list