diff options
Diffstat (limited to 'include/linux/netfs.h')
| -rw-r--r-- | include/linux/netfs.h | 58 | 
1 files changed, 23 insertions, 35 deletions
diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 77fa6a61706a..1773e5df8e65 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -119,9 +119,10 @@ typedef void (*netfs_io_terminated_t)(void *priv, ssize_t transferred_or_error,  				      bool was_async);  /* - * Per-inode description.  This must be directly after the inode struct. + * Per-inode context.  This wraps the VFS inode.   */ -struct netfs_i_context { +struct netfs_inode { +	struct inode		inode;		/* The VFS inode */  	const struct netfs_request_ops *ops;  #if IS_ENABLED(CONFIG_FSCACHE)  	struct fscache_cookie	*cache; @@ -205,7 +206,9 @@ struct netfs_io_request {   */  struct netfs_request_ops {  	int (*init_request)(struct netfs_io_request *rreq, struct file *file); +	void (*free_request)(struct netfs_io_request *rreq);  	int (*begin_cache_operation)(struct netfs_io_request *rreq); +  	void (*expand_readahead)(struct netfs_io_request *rreq);  	bool (*clamp_length)(struct netfs_io_subrequest *subreq);  	void (*issue_read)(struct netfs_io_subrequest *subreq); @@ -213,7 +216,6 @@ struct netfs_request_ops {  	int (*check_write_begin)(struct file *file, loff_t pos, unsigned len,  				 struct folio *folio, void **_fsdata);  	void (*done)(struct netfs_io_request *rreq); -	void (*cleanup)(struct address_space *mapping, void *netfs_priv);  };  /* @@ -256,7 +258,7 @@ struct netfs_cache_ops {  	 * boundary as appropriate.  	 */  	enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *subreq, -					       loff_t i_size); +					     loff_t i_size);  	/* Prepare a write operation, working out what part of the write we can  	 * actually do. @@ -276,7 +278,8 @@ struct netfs_cache_ops {  struct readahead_control;  extern void netfs_readahead(struct readahead_control *);  int netfs_read_folio(struct file *, struct folio *); -extern int netfs_write_begin(struct file *, struct address_space *, +extern int netfs_write_begin(struct netfs_inode *, +			     struct file *, struct address_space *,  			     loff_t, unsigned int, struct folio **,  			     void **); @@ -288,71 +291,56 @@ extern void netfs_put_subrequest(struct netfs_io_subrequest *subreq,  extern void netfs_stats_show(struct seq_file *);  /** - * netfs_i_context - Get the netfs inode context from the inode + * netfs_inode - Get the netfs inode context from the inode   * @inode: The inode to query   *   * Get the netfs lib inode context from the network filesystem's inode.  The   * context struct is expected to directly follow on from the VFS inode struct.   */ -static inline struct netfs_i_context *netfs_i_context(struct inode *inode) -{ -	return (void *)inode + sizeof(*inode); -} - -/** - * netfs_inode - Get the netfs inode from the inode context - * @ctx: The context to query - * - * Get the netfs inode from the netfs library's inode context.  The VFS inode - * is expected to directly precede the context struct. - */ -static inline struct inode *netfs_inode(struct netfs_i_context *ctx) +static inline struct netfs_inode *netfs_inode(struct inode *inode)  { -	return (void *)ctx - sizeof(struct inode); +	return container_of(inode, struct netfs_inode, inode);  }  /** - * netfs_i_context_init - Initialise a netfs lib context - * @inode: The inode with which the context is associated + * netfs_inode_init - Initialise a netfslib inode context + * @ctx: The netfs inode to initialise   * @ops: The netfs's operations list   *   * Initialise the netfs library context struct.  This is expected to follow on   * directly from the VFS inode struct.   */ -static inline void netfs_i_context_init(struct inode *inode, -					const struct netfs_request_ops *ops) +static inline void netfs_inode_init(struct netfs_inode *ctx, +				    const struct netfs_request_ops *ops)  { -	struct netfs_i_context *ctx = netfs_i_context(inode); - -	memset(ctx, 0, sizeof(*ctx));  	ctx->ops = ops; -	ctx->remote_i_size = i_size_read(inode); +	ctx->remote_i_size = i_size_read(&ctx->inode); +#if IS_ENABLED(CONFIG_FSCACHE) +	ctx->cache = NULL; +#endif  }  /**   * netfs_resize_file - Note that a file got resized - * @inode: The inode being resized + * @ctx: The netfs inode being resized   * @new_i_size: The new file size   *   * Inform the netfs lib that a file got resized so that it can adjust its state.   */ -static inline void netfs_resize_file(struct inode *inode, loff_t new_i_size) +static inline void netfs_resize_file(struct netfs_inode *ctx, loff_t new_i_size)  { -	struct netfs_i_context *ctx = netfs_i_context(inode); -  	ctx->remote_i_size = new_i_size;  }  /**   * netfs_i_cookie - Get the cache cookie from the inode - * @inode: The inode to query + * @ctx: The netfs inode to query   *   * Get the caching cookie (if enabled) from the network filesystem's inode.   */ -static inline struct fscache_cookie *netfs_i_cookie(struct inode *inode) +static inline struct fscache_cookie *netfs_i_cookie(struct netfs_inode *ctx)  {  #if IS_ENABLED(CONFIG_FSCACHE) -	struct netfs_i_context *ctx = netfs_i_context(inode);  	return ctx->cache;  #else  	return NULL;  | 
