[pnfs] CVS: nfsv4
Benny Halevy Panasas
bhalevy at citi.umich.edu
Wed Feb 21 12:05:20 EST 2007
CVSROOT: /cvs
Module name: nfsv4
Changes by: bhalevy at citi.umich.edu 2007/02/21 12:05:20
Modified files:
cvs/pnfs/fs/nfs: pnfs.c
cvs/pnfs/fs/nfsd: nfs4xdr.c
cvs/pnfs/include/linux: nfs4_pnfs.h
Log message:
* pnfs layout driver setup_layoutcommit may allocate memory hence it
should return status. propagate status via pnfs_layoutcommit_setup()
* fix nfsd layout commit xdr routine to correctly read the layout update
buffer
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
Index: fs/nfs/pnfs.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/pnfs.c,v
retrieving revision 1.61
diff -d -u -p -r1.61 pnfs.c
--- fs/nfs/pnfs.c 3 Feb 2007 18:40:09 -0000 1.61
+++ fs/nfs/pnfs.c 21 Feb 2007 17:00:01 -0000
@@ -1329,18 +1329,20 @@ static const struct rpc_call_ops pnfs_la
/*
* Set up the argument/result storage required for the RPC call.
*/
-static void
+static int
pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
{
struct nfs_inode *nfsi = NFS_I(data->inode);
struct nfs_server *nfss = NFS_SERVER(data->inode);
+ int result = 0;
dprintk("%s Begin (sync:%d)\n", __FUNCTION__, sync);
data->args.fh = NFS_FH(data->inode);
data->args.layout_type = nfss->pnfs_curr_ld->id;
/* Initialize new layout size.
- * TODO: Needs to be set to the actual size of an updated layout.
+ * layout driver's setup_layoutcommit may optionally set
+ * the actual size of an updated layout.
*/
data->args.new_layout_size = 0;
@@ -1360,16 +1362,20 @@ pnfs_layoutcommit_setup(struct pnfs_layo
* TODO: We may want to avoid memory copies by delay this
* until xdr time.
*/
- if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
- nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(nfsi->current_layout,
- data->inode,
- &data->args);
+ if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
+ result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
+ nfsi->current_layout,
+ data->inode,
+ &data->args);
+ if (result)
+ goto out;
+ }
data->res.fattr = &data->fattr;
nfs_fattr_init(&data->fattr);
if (sync)
- return;
+ goto out;
/* Finalize the task. */
rpc_init_task(&data->task, NFS_CLIENT(data->inode), RPC_TASK_ASYNC,
@@ -1380,12 +1386,17 @@ pnfs_layoutcommit_setup(struct pnfs_layo
data->task.tk_priority = RPC_PRIORITY_NORMAL;
data->task.tk_cookie = (unsigned long)data->inode;
- dprintk("NFS: %4d initiated layoutcommit call. %llu@%llu lbw: %llu type: %d\n",
+ dprintk("NFS: %4d initiated layoutcommit call. %llu@%llu lbw: %llu "
+ "type: %d new_layout_size: %d\n",
data->task.tk_pid,
data->args.length,
data->args.offset,
data->args.lastbytewritten,
- data->args.layout_type);
+ data->args.layout_type,
+ data->args.new_layout_size);
+out:
+ dprintk("%s End Status %d\n", __FUNCTION__, result);
+ return result;
}
/* Issue a async layoutcommit for an inode.
@@ -1414,7 +1425,9 @@ pnfs_layoutcommit_inode(struct inode *in
data->ctx = nfsi->layoutcommit_ctx;
/* Set up layout commit args*/
- pnfs_layoutcommit_setup(data, sync);
+ status = pnfs_layoutcommit_setup(data, sync);
+ if (status)
+ goto out_unlock;
/* Clear layoutcommit properties in the inode so
* new lc info can be generated
Index: fs/nfsd/nfs4xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4xdr.c,v
retrieving revision 1.35
diff -d -u -p -r1.35 nfs4xdr.c
--- fs/nfsd/nfs4xdr.c 31 Jan 2007 21:15:19 -0000 1.35
+++ fs/nfsd/nfs4xdr.c 21 Feb 2007 17:00:06 -0000
@@ -1260,7 +1260,7 @@ nfsd4_decode_layoutcommit(struct nfsd4_c
READ32(lcp->lc_access_sec);
READ32(lcp->lc_access_nsec);
}
- READ_BUF(8 + lcp->lc_loup.up_len);
+ READ_BUF(8);
READ32(lcp->lc_loup.up_type);
/* XXX: saving XDR'ed layout update. Since we don't have the
* current_fh yet, and therefore no export_ops, we can't call
@@ -1268,8 +1268,8 @@ nfsd4_decode_layoutcommit(struct nfsd4_c
* do not use the layout update....
*/
READ32(lcp->lc_loup.up_len);
- if (lcp->lc_loup.up_len > 0 && lcp->lc_loup.up_len <= PNFS_LAYOUT_MAXSIZE)
- COPYMEM(lcp->lc_loup.up_layout, lcp->lc_loup.up_len);
+ READ_BUF(lcp->lc_loup.up_len);
+ READMEM(lcp->lc_loup.up_layout, lcp->lc_loup.up_len);
DECODE_TAIL;
}
Index: include/linux/nfs4_pnfs.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfs4_pnfs.h,v
retrieving revision 1.14
diff -d -u -p -r1.14 nfs4_pnfs.h
--- include/linux/nfs4_pnfs.h 12 Dec 2006 10:08:34 -0000 1.14
+++ include/linux/nfs4_pnfs.h 21 Feb 2007 17:00:06 -0000
@@ -65,7 +65,7 @@ struct layoutdriver_io_operations {
void (*free_layout) (struct pnfs_layout_type * layoutid, struct inode * inode, loff_t offset, size_t count);
struct pnfs_layout_type* (*set_layout) (struct pnfs_layout_type * layoutid, struct inode * inode, void* layout);
- void (*setup_layoutcommit) (struct pnfs_layout_type * layoutid, struct inode * inode, struct pnfs_layoutcommit_arg* arg);
+ int (*setup_layoutcommit) (struct pnfs_layout_type * layoutid, struct inode * inode, struct pnfs_layoutcommit_arg* arg);
void (*cleanup_layoutcommit) (struct pnfs_layout_type * layoutid, struct inode * inode, struct pnfs_layoutcommit_arg* arg, struct pnfs_layoutcommit_res* res);
/* Registration information for a new mounted file system
More information about the pNFS
mailing list