diff options
Diffstat (limited to 'fs/nfs/pnfs.h')
| -rw-r--r-- | fs/nfs/pnfs.h | 102 | 
1 files changed, 55 insertions, 47 deletions
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 96bf4e6f45b..01cbfd54f3c 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -36,16 +36,16 @@  enum {  	NFS_LSEG_VALID = 0,	/* cleared when lseg is recalled/returned */  	NFS_LSEG_ROC,		/* roc bit received from server */ +	NFS_LSEG_LAYOUTCOMMIT,	/* layoutcommit bit set for layoutcommit */  };  struct pnfs_layout_segment {  	struct list_head pls_list; +	struct list_head pls_lc_list;  	struct pnfs_layout_range pls_range;  	atomic_t pls_refcount;  	unsigned long pls_flags;  	struct pnfs_layout_hdr *pls_layout; -	struct rpc_cred	*pls_lc_cred; /* LAYOUTCOMMIT credential */ -	loff_t pls_end_pos; /* LAYOUTCOMMIT write end */  };  enum pnfs_try_status { @@ -80,6 +80,9 @@ struct pnfs_layoutdriver_type {  	struct module *owner;  	unsigned flags; +	int (*set_layoutdriver) (struct nfs_server *, const struct nfs_fh *); +	int (*clear_layoutdriver) (struct nfs_server *); +  	struct pnfs_layout_hdr * (*alloc_layout_hdr) (struct inode *inode, gfp_t gfp_flags);  	void (*free_layout_hdr) (struct pnfs_layout_hdr *); @@ -87,7 +90,8 @@ struct pnfs_layoutdriver_type {  	void (*free_lseg) (struct pnfs_layout_segment *lseg);  	/* test for nfs page cache coalescing */ -	bool (*pg_test)(struct nfs_pageio_descriptor *, struct nfs_page *, struct nfs_page *); +	const struct nfs_pageio_ops *pg_read_ops; +	const struct nfs_pageio_ops *pg_write_ops;  	/* Returns true if layoutdriver wants to divert this request to  	 * driver's commit routine. @@ -109,6 +113,8 @@ struct pnfs_layoutdriver_type {  				     struct xdr_stream *xdr,  				     const struct nfs4_layoutreturn_args *args); +	void (*cleanup_layoutcommit) (struct nfs4_layoutcommit_data *data); +  	void (*encode_layoutcommit) (struct pnfs_layout_hdr *layoutid,  				     struct xdr_stream *xdr,  				     const struct nfs4_layoutcommit_args *args); @@ -124,6 +130,8 @@ struct pnfs_layout_hdr {  	unsigned long		plh_block_lgets; /* block LAYOUTGET if >0 */  	u32			plh_barrier; /* ignore lower seqids */  	unsigned long		plh_flags; +	loff_t			plh_lwb; /* last write byte for layoutcommit */ +	struct rpc_cred		*plh_lc_cred; /* layoutcommit cred */  	struct inode		*plh_inode;  }; @@ -136,10 +144,21 @@ struct pnfs_device {  	unsigned int  pglen;  }; +#define NFS4_PNFS_GETDEVLIST_MAXNUM 16 + +struct pnfs_devicelist { +	unsigned int		eof; +	unsigned int		num_devs; +	struct nfs4_deviceid	dev_id[NFS4_PNFS_GETDEVLIST_MAXNUM]; +}; +  extern int pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *);  extern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *);  /* nfs4proc.c */ +extern int nfs4_proc_getdevicelist(struct nfs_server *server, +				   const struct nfs_fh *fh, +				   struct pnfs_devicelist *devlist);  extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,  				   struct pnfs_device *dev);  extern int nfs4_proc_layoutget(struct nfs4_layoutget *lgp); @@ -148,16 +167,16 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp);  /* pnfs.c */  void get_layout_hdr(struct pnfs_layout_hdr *lo);  void put_lseg(struct pnfs_layout_segment *lseg); -struct pnfs_layout_segment * -pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx, -		   loff_t pos, u64 count, enum pnfs_iomode access_type, -		   gfp_t gfp_flags); -void set_pnfs_layoutdriver(struct nfs_server *, u32 id); + +bool pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *); +bool pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *, int); + +void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, u32);  void unset_pnfs_layoutdriver(struct nfs_server *); -enum pnfs_try_status pnfs_try_to_write_data(struct nfs_write_data *, -					     const struct rpc_call_ops *, int); -enum pnfs_try_status pnfs_try_to_read_data(struct nfs_read_data *, -					    const struct rpc_call_ops *); +void pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *, struct nfs_page *); +int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc); +void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *, struct nfs_page *); +int pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc);  bool pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, struct nfs_page *req);  int pnfs_layout_process(struct nfs4_layoutget *lgp);  void pnfs_free_lseg_list(struct list_head *tmp_list); @@ -178,10 +197,24 @@ void pnfs_roc_release(struct inode *ino);  void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);  bool pnfs_roc_drain(struct inode *ino, u32 *barrier);  void pnfs_set_layoutcommit(struct nfs_write_data *wdata); +void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data);  int pnfs_layoutcommit_inode(struct inode *inode, bool sync);  int _pnfs_return_layout(struct inode *);  int pnfs_ld_write_done(struct nfs_write_data *);  int pnfs_ld_read_done(struct nfs_read_data *); +struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino, +					       struct nfs_open_context *ctx, +					       loff_t pos, +					       u64 count, +					       enum pnfs_iomode iomode, +					       gfp_t gfp_flags); + +void nfs4_deviceid_mark_client_invalid(struct nfs_client *clp); + +/* nfs4_deviceid_flags */ +enum { +	NFS_DEVICEID_INVALID = 0,       /* set when MDS clientid recalled */ +};  /* pnfs_dev.c */  struct nfs4_deviceid_node { @@ -189,13 +222,13 @@ struct nfs4_deviceid_node {  	struct hlist_node		tmpnode;  	const struct pnfs_layoutdriver_type *ld;  	const struct nfs_client		*nfs_client; +	unsigned long 			flags;  	struct nfs4_deviceid		deviceid;  	atomic_t			ref;  };  void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id);  struct nfs4_deviceid_node *nfs4_find_get_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *); -struct nfs4_deviceid_node *nfs4_unhash_put_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);  void nfs4_delete_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);  void nfs4_init_deviceid_node(struct nfs4_deviceid_node *,  			     const struct pnfs_layoutdriver_type *, @@ -293,15 +326,6 @@ static inline int pnfs_return_layout(struct inode *ino)  	return 0;  } -static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio, -				    struct inode *inode) -{ -	struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld; - -	if (ld) -		pgio->pg_test = ld->pg_test; -} -  #else  /* CONFIG_NFS_V4_1 */  static inline void pnfs_destroy_all_layouts(struct nfs_client *clp) @@ -322,28 +346,6 @@ static inline void put_lseg(struct pnfs_layout_segment *lseg)  {  } -static inline struct pnfs_layout_segment * -pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx, -		   loff_t pos, u64 count, enum pnfs_iomode access_type, -		   gfp_t gfp_flags) -{ -	return NULL; -} - -static inline enum pnfs_try_status -pnfs_try_to_read_data(struct nfs_read_data *data, -		      const struct rpc_call_ops *call_ops) -{ -	return PNFS_NOT_ATTEMPTED; -} - -static inline enum pnfs_try_status -pnfs_try_to_write_data(struct nfs_write_data *data, -		       const struct rpc_call_ops *call_ops, int how) -{ -	return PNFS_NOT_ATTEMPTED; -} -  static inline int pnfs_return_layout(struct inode *ino)  {  	return 0; @@ -377,7 +379,8 @@ pnfs_roc_drain(struct inode *ino, u32 *barrier)  	return false;  } -static inline void set_pnfs_layoutdriver(struct nfs_server *s, u32 id) +static inline void set_pnfs_layoutdriver(struct nfs_server *s, +					 const struct nfs_fh *mntfh, u32 id)  {  } @@ -385,9 +388,14 @@ static inline void unset_pnfs_layoutdriver(struct nfs_server *s)  {  } -static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio, -				    struct inode *inode) +static inline bool pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode) +{ +	return false; +} + +static inline bool pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode, int ioflags)  { +	return false;  }  static inline void  |