[pnfs] [PATCH 01/10] pnfs: free nfs page request data
Benny Halevy
bhalevy at panasas.com
Thu Jan 17 07:52:38 EST 2008
Ack
Benny
On Jan. 17, 2008, 0:52 +0200, andros at umich.edu wrote:
> From: Andy Adamson <andros at umich.edu>
>
> The filelayout module stores data server information in the wb_private
> pointer in a request (struct nfs_page). The kalloc'ed data server information
> (struct nfs4_pnfs_dserver) is pointed to by each page in a coalesce group
> and refcounted in the file layout modules flush_on layoutdriver I/O operation.
>
> The wb_pointer is referenced by the filelayout module COMMIT function to
> gather per-DS pages for COMMIT.
>
> Add a new layoutdriver io operation to any free wb_private data in
> nfs_free_requst().
>
> The per-layout private data portion of struct nfs_page (wb_private) will need
> the per-layout layoutdriver_io_operations pointer to operate on the data.
> Sometimes, as in nfs_free_request(), the inode is not available.
>
> Pass the pnfs layoutdriver_io_operations pointer in the page.
>
> Signed-off-by: Andy Adamson<andros at umich.edu>
> Signed-off-by: Fred Isaman<iisaman at umich.edu>
> ---
> fs/nfs/pagelist.c | 6 ++++++
> fs/nfs/pnfs.c | 11 +++++++++++
> fs/nfs/pnfs.h | 1 +
> include/linux/nfs4_pnfs.h | 1 +
> include/linux/nfs_page.h | 1 +
> 5 files changed, 20 insertions(+), 0 deletions(-)
>
> diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
> index b49ace5..15a66ab 100644
> --- a/fs/nfs/pagelist.c
> +++ b/fs/nfs/pagelist.c
> @@ -20,6 +20,9 @@
> #include <linux/nfs_mount.h>
>
> #include "internal.h"
> +#ifdef CONFIG_PNFS
> +#include "pnfs.h"
> +#endif /* CONFIG_PNFS */
>
> static struct kmem_cache *nfs_page_cachep;
>
> @@ -167,6 +170,9 @@ static void nfs_free_request(struct kref *kref)
> /* Release struct file or cached credential */
> nfs_clear_request(req);
> put_nfs_open_context(req->wb_context);
> +#ifdef CONFIG_PNFS
> + pnfs_free_request_data(req);
> +#endif /* CONFIG_PNFS */
> nfs_page_free(req);
> }
>
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 3091ef4..b00779b 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1730,6 +1730,17 @@ out_unlock:
> goto out;
> }
>
> +void pnfs_free_request_data(struct nfs_page *req)
> +{
> + struct layoutdriver_io_operations *lo;
> +
> + if (!req->wb_ops || !req->wb_private)
> + return;
> + lo = (struct layoutdriver_io_operations *)req->wb_ops;
> + if (lo->free_request_data)
> + lo->free_request_data(req);
> +}
> +
> /* Callback operations for layout drivers.
> */
> struct pnfs_client_operations pnfs_ops = {
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index 48cfb49..d450e24 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -46,6 +46,7 @@ void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *, struc
> void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *);
> void pnfs_update_layout_commit(struct inode *, struct list_head *, pgoff_t, unsigned int);
> int pnfs_flush_one(struct inode *, struct list_head *, unsigned int, size_t, int);
> +void pnfs_free_request_data(struct nfs_page *req);
>
> #endif /* CONFIG_PNFS */
>
> diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
> index 31dedb7..94e0227 100644
> --- a/include/linux/nfs4_pnfs.h
> +++ b/include/linux/nfs4_pnfs.h
> @@ -118,6 +118,7 @@ struct layoutdriver_io_operations {
> 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);
> int (*flush_one) (struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int how);
> + void (*free_request_data) (struct nfs_page *);
>
>
> /* Consistency ops */
> diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
> index cc5f1d0..098b788 100644
> --- a/include/linux/nfs_page.h
> +++ b/include/linux/nfs_page.h
> @@ -47,6 +47,7 @@ struct nfs_page {
> #ifdef CONFIG_PNFS
> unsigned int wb_devip; /* pNFS data server IP addr */
> unsigned int wb_devport; /* pNFS data server port */
> + void *wb_ops; /* pNFS io operations */
> void *wb_private;
> #endif
> };
More information about the pNFS
mailing list