[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