[pnfs] [PATCH 32/37] pnfs: client layout_cache: hand off lseg to layout driver read/write functions
Benny Halevy
bhalevy at panasas.com
Tue Jan 1 05:51:56 EST 2008
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
fs/nfs/pnfs.c | 14 ++++++++++++--
include/linux/nfs_xdr.h | 2 ++
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 71250ab..c9851bb 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1127,6 +1127,7 @@ pnfs_writeback_done(struct nfs_write_data *data)
{
dprintk("%s: Begin (status %d)\n", __FUNCTION__, data->task.tk_status);
+ put_lseg(data->lseg);
data->call_ops->rpc_call_done(&data->task, data);
}
@@ -1149,6 +1150,7 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
int numpages, status, pgcount, temp;
struct nfs_server *nfss = NFS_SERVER(inode);
struct nfs_inode *nfsi = NFS_I(inode);
+ struct pnfs_layout_segment *lseg;
dprintk("%s: Writing ino:%lu %u@%llu\n",
__FUNCTION__,
@@ -1162,7 +1164,7 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
args->count,
args->offset,
IOMODE_RW,
- NULL);
+ &lseg);
if (status) {
status = 1; /* retry with nfs I/O */
goto out;
@@ -1182,6 +1184,7 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
numpages);
if (pnfs_get_type(inode) != LAYOUT_NFSV4_FILES)
wdata->pnfsflags |= PNFS_NO_RPC;
+ wdata->lseg = lseg;
status = nfss->pnfs_curr_ld->ld_io_ops->write_pagelist(
nfsi->current_layout,
args->pages,
@@ -1192,6 +1195,8 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
how,
wdata);
+ if (status)
+ put_lseg(lseg);
if (status > 0) {
dprintk("%s: LD write_pagelist returned status %d > 0\n", __FUNCTION__, status);
pnfs_update_last_write(nfsi, args->offset, status);
@@ -1212,6 +1217,7 @@ pnfs_read_done(struct nfs_read_data *data)
{
dprintk("%s: Begin (status %d)\n", __FUNCTION__, data->task.tk_status);
+ put_lseg(data->lseg);
data->call_ops->rpc_call_done(&data->task, data);
}
@@ -1228,6 +1234,7 @@ pnfs_readpages(struct nfs_read_data *rdata)
int numpages, status, pgcount, temp;
struct nfs_server *nfss = NFS_SERVER(inode);
struct nfs_inode *nfsi = NFS_I(inode);
+ struct pnfs_layout_segment *lseg;
dprintk("%s: Reading ino:%lu %u@%llu\n",
__FUNCTION__,
@@ -1241,7 +1248,7 @@ pnfs_readpages(struct nfs_read_data *rdata)
args->count,
args->offset,
IOMODE_READ,
- NULL);
+ &lseg);
if (status) {
printk(KERN_WARNING
"%s: ERROR %d from pnfs_update_layout\n",
@@ -1260,6 +1267,7 @@ pnfs_readpages(struct nfs_read_data *rdata)
dprintk("%s: Calling layout driver read with %d pages\n", __FUNCTION__, numpages);
if (pnfs_get_type(inode) != LAYOUT_NFSV4_FILES)
rdata->pnfsflags |= PNFS_NO_RPC;
+ rdata->lseg = lseg;
status = nfss->pnfs_curr_ld->ld_io_ops->read_pagelist(
nfsi->current_layout,
args->pages,
@@ -1268,6 +1276,8 @@ pnfs_readpages(struct nfs_read_data *rdata)
(loff_t)args->offset,
args->count,
rdata);
+ if (status)
+ put_lseg(lseg);
if (status > 0) {
dprintk("%s: LD read_pagelist returned status %d > 0\n", __FUNCTION__, status);
status = 0;
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 320b8c0..07d8882 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1043,6 +1043,7 @@ struct nfs_read_data {
unsigned long timestamp; /* For lease renewal */
#endif
#if defined(CONFIG_PNFS)
+ struct pnfs_layout_segment *lseg;
const struct rpc_call_ops *call_ops;
struct rpc_clnt *pnfs_client; /* Holds pNFS device across async calls */
int pnfsflags;
@@ -1076,6 +1077,7 @@ struct nfs_write_data {
unsigned long timestamp; /* For lease renewal */
#endif
#if defined(CONFIG_PNFS)
+ struct pnfs_layout_segment *lseg;
const struct rpc_call_ops *call_ops;
struct rpc_clnt *pnfs_client; /* Holds pNFS device across
async calls */
--
1.5.3.3
More information about the pNFS
mailing list