[pnfs] [PATCH 13/37] pnfs: add inode ptr and accessor functions for pnfs_layout_type
Benny Halevy
bhalevy at panasas.com
Tue Jan 1 05:50:17 EST 2008
Also, remove mountid from pnfs_layout_type. Use accessor to
reach it instead.
remove the inode arg from functions already receiving a pnfs_layout_type
argument.
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
fs/nfs/nfs4filelayout.c | 15 +++++----
fs/nfs/pnfs.c | 51 +++++++++++++++---------------
include/linux/nfs4_pnfs.h | 76 +++++++++++++++++++++++++++++++++++----------
3 files changed, 92 insertions(+), 50 deletions(-)
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 6bea89e..9edf175 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -265,7 +265,6 @@ struct rpc_call_ops filelayout_write_call_ops = {
*/
ssize_t filelayout_read_pagelist(
struct pnfs_layout_type *layoutid,
- struct inode *inode,
struct page **pages,
unsigned int pgbase,
unsigned nr_pages,
@@ -273,6 +272,7 @@ ssize_t filelayout_read_pagelist(
size_t count,
struct nfs_read_data *data)
{
+ struct inode *inode = PNFS_INODE(layoutid);
struct nfs4_filelayout *nfslay = NULL;
struct nfs4_pnfs_dserver dserver;
int status;
@@ -342,7 +342,6 @@ ssize_t filelayout_read_pagelist(
*/
ssize_t filelayout_write_pagelist(
struct pnfs_layout_type *layoutid,
- struct inode *inode,
struct page **pages,
unsigned int pgbase,
unsigned nr_pages,
@@ -351,6 +350,7 @@ ssize_t filelayout_write_pagelist(
int sync,
struct nfs_write_data *data)
{
+ struct inode *inode = PNFS_INODE(layoutid);
struct nfs4_filelayout *nfslay = (struct nfs4_filelayout *)layoutid->layoutid;
struct nfs4_pnfs_dserver dserver;
struct nfs4_pnfs_ds *ds;
@@ -422,7 +422,7 @@ filelayout_alloc_layout(struct pnfs_mount_type *mountid, struct inode *inode)
return NULL;
pnfslay->layoutid = (void *)nfslay;
- pnfslay->mountid = mountid;
+ pnfslay->inode = inode;
return pnfslay;
}
@@ -430,7 +430,6 @@ filelayout_alloc_layout(struct pnfs_mount_type *mountid, struct inode *inode)
*/
void
filelayout_free_layout(struct pnfs_layout_type **layoutidp,
- struct inode *inode,
struct nfs4_pnfs_layout_segment *range)
{
struct nfs4_filelayout *nfslay = NULL;
@@ -451,7 +450,7 @@ filelayout_free_layout(struct pnfs_layout_type **layoutidp,
* information for this file.
*/
struct pnfs_layout_type*
-filelayout_set_layout(struct pnfs_layout_type *layoutid, struct inode *inode,
+filelayout_set_layout(struct pnfs_layout_type *layoutid,
struct nfs4_pnfs_layoutget_res *lgr)
{
struct nfs4_filelayout *fl = NULL;
@@ -502,8 +501,10 @@ nfserr:
* Once we fix this, we will need to invoke the pnfs_commit_complete callback.
*/
int
-filelayout_commit(struct pnfs_layout_type *layoutid, struct inode *ino, struct list_head *pages, int sync, struct nfs_write_data *data)
+filelayout_commit(struct pnfs_layout_type *layoutid, struct list_head *pages,
+ int sync, struct nfs_write_data *data)
{
+ struct inode *ino = PNFS_INODE(layoutid);
struct nfs_write_data *dsdata = NULL;
struct pnfs_layout_type *laytype;
struct nfs4_filelayout *nfslay;
@@ -599,7 +600,7 @@ out_bad:
/* Return the stripesize for the specified file.
*/
ssize_t
-filelayout_get_stripesize(struct pnfs_layout_type *layoutid, struct inode *inode)
+filelayout_get_stripesize(struct pnfs_layout_type *layoutid)
{
struct nfs4_filelayout *fl = (struct nfs4_filelayout *)layoutid->layoutid;
ssize_t stripesize = fl->stripe_unit;
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 9d0afbf..9abd263 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -367,7 +367,7 @@ pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range)
dprintk("%s: removing layout\n", __FUNCTION__);
server->pnfs_curr_ld->ld_io_ops->free_layout(
- &nfsi->current_layout, ino, &arg.lseg);
+ &nfsi->current_layout, &arg.lseg);
}
dprintk("%s:Exit status %d\n", __FUNCTION__, status);
@@ -441,7 +441,7 @@ pnfs_inject_layout(struct nfs_inode *nfsi,
return NULL;
}
dprintk("%s Calling set layout\n", __FUNCTION__);
- return io_ops->set_layout(layid, inode, lgr);
+ return io_ops->set_layout(layid, lgr);
}
/* Update the file's layout for the given range and iomode.
@@ -653,7 +653,7 @@ pnfs_getboundary(struct inode *inode)
nfsi = NFS_I(inode);
lo = nfsi->current_layout;
if (lo)
- stripe_size = policy_ops->get_stripesize(lo, inode);
+ stripe_size = policy_ops->get_stripesize(lo);
out:
return stripe_size;
}
@@ -899,15 +899,15 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
numpages);
if (pnfs_get_type(inode) != LAYOUT_NFSV4_FILES)
wdata->pnfsflags |= PNFS_NO_RPC;
- status = nfss->pnfs_curr_ld->ld_io_ops->write_pagelist(nfsi->current_layout,
- inode,
- args->pages,
- args->pgbase,
- numpages,
- (loff_t)args->offset,
- args->count,
- how,
- wdata);
+ status = nfss->pnfs_curr_ld->ld_io_ops->write_pagelist(
+ nfsi->current_layout,
+ args->pages,
+ args->pgbase,
+ numpages,
+ (loff_t)args->offset,
+ args->count,
+ how,
+ wdata);
if (status > 0) {
dprintk("%s: LD write_pagelist returned status %d > 0\n", __FUNCTION__, status);
@@ -993,14 +993,14 @@ 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;
- status = nfss->pnfs_curr_ld->ld_io_ops->read_pagelist(nfsi->current_layout,
- inode,
- args->pages,
- args->pgbase,
- numpages,
- (loff_t)args->offset,
- args->count,
- rdata);
+ status = nfss->pnfs_curr_ld->ld_io_ops->read_pagelist(
+ nfsi->current_layout,
+ args->pages,
+ args->pgbase,
+ numpages,
+ (loff_t)args->offset,
+ args->count,
+ rdata);
if (status > 0) {
dprintk("%s: LD read_pagelist returned status %d > 0\n", __FUNCTION__, status);
status = 0;
@@ -1112,7 +1112,7 @@ pnfs_commit(struct inode *inode,
dprintk("%s: Calling layout driver commit\n", __FUNCTION__);
result = nfss->pnfs_curr_ld->ld_io_ops->commit(nfsi->current_layout,
- inode, head, sync, data);
+ head, sync, data);
dprintk("%s end (err:%d)\n", __FUNCTION__, result);
return result;
@@ -1165,10 +1165,10 @@ pnfs_layoutcommit_done(
* to directly xdr its layout on the wire.
*/
if (nfss->pnfs_curr_ld->ld_io_ops->cleanup_layoutcommit)
- nfss->pnfs_curr_ld->ld_io_ops->cleanup_layoutcommit(nfsi->current_layout,
- data->inode,
- &data->args,
- &data->res);
+ nfss->pnfs_curr_ld->ld_io_ops->cleanup_layoutcommit(
+ nfsi->current_layout,
+ &data->args,
+ &data->res);
/* release the open_context acquired in pnfs_writeback_done */
put_nfs_open_context(data->ctx);
@@ -1241,7 +1241,6 @@ pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
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;
diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
index 941dda7..fdc4622 100644
--- a/include/linux/nfs4_pnfs.h
+++ b/include/linux/nfs4_pnfs.h
@@ -17,6 +17,14 @@
#define NFS4_PNFS_DEV_MAXCOUNT 16
#define NFS4_PNFS_DEV_MAXSIZE 128
+/* Per-layout driver specific registration structure */
+struct pnfs_layoutdriver_type {
+ const u32 id;
+ const char *name;
+ struct layoutdriver_io_operations *ld_io_ops;
+ struct layoutdriver_policy_operations *ld_policy_ops;
+};
+
/* Layout driver specific identifier for a mount point. For each mountpoint
* a reference is stored in the nfs_server structure.
*/
@@ -29,11 +37,53 @@ struct pnfs_mount_type {
* A reference is stored in the nfs_inode structure.
*/
struct pnfs_layout_type {
- struct pnfs_mount_type *mountid;
void *layoutid;
int roc_iomode; /* iomode to return on close, 0=none */
+ struct inode *inode;
};
+static inline struct inode *
+PNFS_INODE(struct pnfs_layout_type *lo)
+{
+ return lo->inode;
+}
+
+static inline struct nfs_inode *
+PNFS_NFS_INODE(struct pnfs_layout_type *lo)
+{
+ return NFS_I(PNFS_INODE(lo));
+}
+
+static inline struct nfs_server *
+PNFS_NFS_SERVER(struct pnfs_layout_type *lo)
+{
+ return NFS_SERVER(PNFS_INODE(lo));
+}
+
+static inline struct pnfs_mount_type *
+PNFS_MOUNTID(struct pnfs_layout_type *lo)
+{
+ return NFS_SERVER(PNFS_INODE(lo))->pnfs_mountid;
+}
+
+static inline struct pnfs_layoutdriver_type *
+PNFS_LD(struct pnfs_layout_type *lo)
+{
+ return NFS_SERVER(PNFS_INODE(lo))->pnfs_curr_ld;
+}
+
+static inline struct layoutdriver_io_operations *
+PNFS_LD_IO_OPS(struct pnfs_layout_type *lo)
+{
+ return PNFS_LD(lo)->ld_io_ops;
+}
+
+static inline struct layoutdriver_policy_operations *
+PNFS_LD_POLICY_OPS(struct pnfs_layout_type *lo)
+{
+ return PNFS_LD(lo)->ld_policy_ops;
+}
+
/* Layout driver I/O operations.
* Either the pagecache or non-pagecache read/write operations must be implemented
*/
@@ -41,26 +91,26 @@ struct layoutdriver_io_operations {
/* Functions that use the pagecache.
* If use_pagecache == 1, then these functions must be implemented.
*/
- ssize_t (*read_pagelist) (struct pnfs_layout_type *layoutid, struct inode *, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, struct nfs_read_data *nfs_data);
- ssize_t (*write_pagelist) (struct pnfs_layout_type *layoutid, struct inode *, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, int sync, struct nfs_write_data *nfs_data);
+ ssize_t (*read_pagelist) (struct pnfs_layout_type *layoutid, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, struct nfs_read_data *nfs_data);
+ ssize_t (*write_pagelist) (struct pnfs_layout_type *layoutid, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, int sync, struct nfs_write_data *nfs_data);
/* Consistency ops */
/* 2 problems:
* 1) the page list contains nfs_pages, NOT pages
* 2) currently the NFS code doesn't create a page array (as it does with read/write)
*/
- int (*commit) (struct pnfs_layout_type *layoutid, struct inode *, struct list_head *, int sync, struct nfs_write_data *nfs_data);
+ int (*commit) (struct pnfs_layout_type *layoutid, struct list_head *, int sync, struct nfs_write_data *nfs_data);
/* Layout information. For each inode, alloc_layout is executed once to retrieve an
* inode specific layout structure. Each subsequent layoutget operation results in
* a set_layout call to set the opaque layout in the layout driver.*/
struct pnfs_layout_type * (*alloc_layout) (struct pnfs_mount_type *mountid, struct inode *inode);
int (*has_layout) (struct pnfs_layout_type *layoutid, struct inode *inode, struct nfs4_pnfs_layout_segment *range);
- void (*free_layout) (struct pnfs_layout_type **layoutidp, struct inode *inode, struct nfs4_pnfs_layout_segment *range);
- struct pnfs_layout_type * (*set_layout) (struct pnfs_layout_type *layoutid, struct inode *inode, struct nfs4_pnfs_layoutget_res *lgr);
+ void (*free_layout) (struct pnfs_layout_type **layoutidp, struct nfs4_pnfs_layout_segment *range);
+ struct pnfs_layout_type * (*set_layout) (struct pnfs_layout_type *layoutid, struct nfs4_pnfs_layoutget_res *lgr);
- 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);
+ int (*setup_layoutcommit) (struct pnfs_layout_type *layoutid, struct pnfs_layoutcommit_arg *arg);
+ void (*cleanup_layoutcommit) (struct pnfs_layout_type *layoutid, struct pnfs_layoutcommit_arg *arg, struct pnfs_layoutcommit_res *res);
/* Registration information for a new mounted file system
*/
@@ -73,7 +123,7 @@ struct layoutdriver_io_operations {
struct layoutdriver_policy_operations {
/* The stripe size of the file system */
- ssize_t (*get_stripesize) (struct pnfs_layout_type *layoutid, struct inode *);
+ ssize_t (*get_stripesize) (struct pnfs_layout_type *layoutid);
/* Should the NFS req. gather algorithm cross stripe boundaries? */
int (*gather_across_stripes) (struct pnfs_mount_type *mountid);
@@ -103,14 +153,6 @@ struct layoutdriver_policy_operations {
int (*layoutret_on_setattr) (struct pnfs_mount_type *);
};
-/* Per-layout driver specific registration structure */
-struct pnfs_layoutdriver_type {
- const u32 id;
- const char *name;
- struct layoutdriver_io_operations *ld_io_ops;
- struct layoutdriver_policy_operations *ld_policy_ops;
-};
-
struct pnfs_device {
int dev_id;
unsigned int dev_count;
--
1.5.3.3
More information about the pNFS
mailing list