All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: David Howells <dhowells@redhat.com>, linux-cachefs@redhat.com
Cc: Anna Schumaker <anna.schumaker@netapp.com>,
	Steve French <sfrench@samba.org>,
	Dominique Martinet <asmadeus@codewreck.org>,
	David Wysochanski <dwysocha@redhat.com>,
	Ilya Dryomov <idryomov@gmail.com>,
	Jeffle Xu <jefflexu@linux.alibaba.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	linux-afs@lists.infradead.org, linux-nfs@vger.kernel.org,
	linux-cifs@vger.kernel.org, ceph-devel@vger.kernel.org,
	v9fs-developer@lists.sourceforge.net,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 11/19] netfs: Change ->init_request() to return an error code
Date: Wed, 09 Mar 2022 11:52:32 -0500	[thread overview]
Message-ID: <4cbb2bb06eafb8f03135fc377ced779102004ea7.camel@kernel.org> (raw)
In-Reply-To: <164678212401.1200972.16537041523832944934.stgit@warthog.procyon.org.uk>

On Tue, 2022-03-08 at 23:28 +0000, David Howells wrote:
> Change the request initialisation function to return an error code so that
> the network filesystem can return a failure (ENOMEM, for example).
> 
> This will also allow ceph to abort a ->readahead() op if the server refuses
> to give it a cap allowing local caching from within the netfslib framework
> (errors aren't passed back through ->readahead(), so returning, say,
> -ENOBUFS will cause the op to be aborted).
> 
> Signed-off-by: David Howells <dhowells@redhat.com>
> cc: linux-cachefs@redhat.com
> ---
> 
>  fs/9p/vfs_addr.c       |    3 ++-
>  fs/afs/file.c          |    3 ++-
>  fs/netfs/objects.c     |   41 ++++++++++++++++++++++++-----------------
>  fs/netfs/read_helper.c |   20 ++++++++++++--------
>  include/linux/netfs.h  |    2 +-
>  5 files changed, 41 insertions(+), 28 deletions(-)
> 
> diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c
> index fdc1033a1546..91d3926c9559 100644
> --- a/fs/9p/vfs_addr.c
> +++ b/fs/9p/vfs_addr.c
> @@ -56,12 +56,13 @@ static void v9fs_issue_read(struct netfs_io_subrequest *subreq)
>   * @rreq: The read request
>   * @file: The file being read from
>   */
> -static void v9fs_init_request(struct netfs_io_request *rreq, struct file *file)
> +static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file)
>  {
>  	struct p9_fid *fid = file->private_data;
>  
>  	refcount_inc(&fid->count);
>  	rreq->netfs_priv = fid;
> +	return 0;
>  }
>  
>  /**
> diff --git a/fs/afs/file.c b/fs/afs/file.c
> index b19d635eed12..6469d7f98ef5 100644
> --- a/fs/afs/file.c
> +++ b/fs/afs/file.c
> @@ -359,9 +359,10 @@ static int afs_symlink_readpage(struct file *file, struct page *page)
>  	return ret;
>  }
>  
> -static void afs_init_request(struct netfs_io_request *rreq, struct file *file)
> +static int afs_init_request(struct netfs_io_request *rreq, struct file *file)
>  {
>  	rreq->netfs_priv = key_get(afs_file_key(file));
> +	return 0;
>  }
>  
>  static bool afs_is_cache_enabled(struct inode *inode)
> diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c
> index 986d7a9d25dd..ae18827e156b 100644
> --- a/fs/netfs/objects.c
> +++ b/fs/netfs/objects.c
> @@ -20,27 +20,34 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
>  {
>  	static atomic_t debug_ids;
>  	struct netfs_io_request *rreq;
> +	int ret;
>  
>  	rreq = kzalloc(sizeof(struct netfs_io_request), GFP_KERNEL);
> -	if (rreq) {
> -		rreq->start	= start;
> -		rreq->len	= len;
> -		rreq->origin	= origin;
> -		rreq->netfs_ops	= ops;
> -		rreq->netfs_priv = netfs_priv;
> -		rreq->mapping	= mapping;
> -		rreq->inode	= file_inode(file);
> -		rreq->i_size	= i_size_read(rreq->inode);
> -		rreq->debug_id	= atomic_inc_return(&debug_ids);
> -		INIT_LIST_HEAD(&rreq->subrequests);
> -		INIT_WORK(&rreq->work, netfs_rreq_work);
> -		refcount_set(&rreq->ref, 1);
> -		__set_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags);
> -		if (ops->init_request)
> -			ops->init_request(rreq, file);
> -		netfs_stat(&netfs_n_rh_rreq);
> +	if (!rreq)
> +		return ERR_PTR(-ENOMEM);
> +
> +	rreq->start	= start;
> +	rreq->len	= len;
> +	rreq->origin	= origin;
> +	rreq->netfs_ops	= ops;
> +	rreq->netfs_priv = netfs_priv;
> +	rreq->mapping	= mapping;
> +	rreq->inode	= file_inode(file);
> +	rreq->i_size	= i_size_read(rreq->inode);
> +	rreq->debug_id	= atomic_inc_return(&debug_ids);
> +	INIT_LIST_HEAD(&rreq->subrequests);
> +	INIT_WORK(&rreq->work, netfs_rreq_work);
> +	refcount_set(&rreq->ref, 1);
> +	__set_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags);
> +	if (rreq->netfs_ops->init_request) {
> +		ret = rreq->netfs_ops->init_request(rreq, file);
> +		if (ret < 0) {
> +			kfree(rreq);
> +			return ERR_PTR(ret);
> +		}
>  	}
>  
> +	netfs_stat(&netfs_n_rh_rreq);
>  	return rreq;
>  }
>  
> diff --git a/fs/netfs/read_helper.c b/fs/netfs/read_helper.c
> index dea085715286..b5176f4320f4 100644
> --- a/fs/netfs/read_helper.c
> +++ b/fs/netfs/read_helper.c
> @@ -768,7 +768,7 @@ void netfs_readahead(struct readahead_control *ractl,
>  				   readahead_pos(ractl),
>  				   readahead_length(ractl),
>  				   NETFS_READAHEAD);
> -	if (!rreq)
> +	if (IS_ERR(rreq))
>  		goto cleanup;
>  
>  	if (ops->begin_cache_operation) {
> @@ -842,11 +842,9 @@ int netfs_readpage(struct file *file,
>  	rreq = netfs_alloc_request(folio->mapping, file, ops, netfs_priv,
>  				   folio_file_pos(folio), folio_size(folio),
>  				   NETFS_READPAGE);
> -	if (!rreq) {
> -		if (netfs_priv)
> -			ops->cleanup(folio_file_mapping(folio), netfs_priv);
> -		folio_unlock(folio);
> -		return -ENOMEM;
> +	if (IS_ERR(rreq)) {
> +		ret = PTR_ERR(rreq);
> +		goto alloc_error;
>  	}
>  
>  	if (ops->begin_cache_operation) {
> @@ -887,6 +885,11 @@ int netfs_readpage(struct file *file,
>  out:
>  	netfs_put_request(rreq, false, netfs_rreq_trace_put_hold);
>  	return ret;
> +alloc_error:
> +	if (netfs_priv)
> +		ops->cleanup(folio_file_mapping(folio), netfs_priv);
> +	folio_unlock(folio);
> +	return ret;
>  }
>  EXPORT_SYMBOL(netfs_readpage);
>  
> @@ -1007,12 +1010,13 @@ int netfs_write_begin(struct file *file, struct address_space *mapping,
>  		goto have_folio_no_wait;
>  	}
>  
> -	ret = -ENOMEM;
>  	rreq = netfs_alloc_request(mapping, file, ops, netfs_priv,
>  				   folio_file_pos(folio), folio_size(folio),
>  				   NETFS_READ_FOR_WRITE);
> -	if (!rreq)
> +	if (IS_ERR(rreq)) {
> +		ret = PTR_ERR(rreq);
>  		goto error;
> +	}
>  	rreq->no_unlock_folio	= folio_index(folio);
>  	__set_bit(NETFS_RREQ_NO_UNLOCK_FOLIO, &rreq->flags);
>  	netfs_priv = NULL;
> diff --git a/include/linux/netfs.h b/include/linux/netfs.h
> index 7dc741d9b21b..4b99e38f73d9 100644
> --- a/include/linux/netfs.h
> +++ b/include/linux/netfs.h
> @@ -193,7 +193,7 @@ struct netfs_io_request {
>   */
>  struct netfs_request_ops {
>  	bool (*is_cache_enabled)(struct inode *inode);
> -	void (*init_request)(struct netfs_io_request *rreq, struct file *file);
> +	int (*init_request)(struct netfs_io_request *rreq, struct file *file);
>  	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);
> 
> 

Reviewed-by: Jeff Layton <jlayton@kernel.org>

  reply	other threads:[~2022-03-09 17:04 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-08 23:24 [PATCH v2 00/19] netfs: Prep for write helpers David Howells
2022-03-08 23:25 ` [PATCH v2 01/19] fscache: export fscache_end_operation() David Howells
2022-03-09 15:26   ` Jeff Layton
2022-03-10  1:40     ` JeffleXu
2022-03-08 23:25 ` [PATCH v2 02/19] netfs: Generate enums from trace symbol mapping lists David Howells
2022-03-09 15:30   ` Jeff Layton
2022-03-09 15:49   ` David Howells
2022-03-09 18:39     ` Jeff Layton
2022-03-08 23:25 ` [PATCH v2 03/19] netfs: Rename netfs_read_*request to netfs_io_*request David Howells
2022-03-09 15:31   ` Jeff Layton
2022-03-08 23:26 ` [PATCH v2 04/19] netfs: Finish off rename of netfs_read_request to netfs_io_request David Howells
2022-03-09 15:34   ` Jeff Layton
2022-03-08 23:26 ` [PATCH v2 05/19] netfs: Split netfs_io_* object handling out David Howells
2022-03-09 15:44   ` Jeff Layton
2022-03-08 23:26 ` [PATCH v2 06/19] netfs: Adjust the netfs_rreq tracepoint slightly David Howells
2022-03-09 15:45   ` Jeff Layton
2022-03-08 23:26 ` [PATCH v2 07/19] netfs: Trace refcounting on the netfs_io_request struct David Howells
2022-03-08 23:27 ` [PATCH v2 08/19] netfs: Trace refcounting on the netfs_io_subrequest struct David Howells
2022-03-08 23:27 ` [PATCH v2 09/19] netfs: Adjust the netfs_failure tracepoint to indicate non-subreq lines David Howells
2022-03-08 23:28 ` [PATCH v2 10/19] netfs: Refactor arguments for netfs_alloc_read_request David Howells
2022-03-08 23:28 ` [PATCH v2 11/19] netfs: Change ->init_request() to return an error code David Howells
2022-03-09 16:52   ` Jeff Layton [this message]
2022-03-08 23:28 ` [PATCH v2 12/19] netfs: Add a netfs inode context David Howells
2022-03-09 18:22   ` Jeff Layton
2022-03-09 19:23   ` David Howells
2022-03-09 19:46     ` Jeff Layton
2022-03-08 23:29 ` [PATCH v2 13/19] netfs: Add a function to consolidate beginning a read David Howells
2022-03-09 19:26   ` Jeff Layton
2022-03-09 22:08   ` David Howells
2022-03-08 23:29 ` [PATCH v2 14/19] netfs: Prepare to split read_helper.c David Howells
2022-03-08 23:29 ` [PATCH v2 15/19] netfs: Rename read_helper.c to io.c David Howells
2022-03-08 23:29 ` [PATCH v2 16/19] netfs: Split fs/netfs/read_helper.c David Howells
2022-03-09 20:27   ` Jeff Layton
2022-03-08 23:29 ` [PATCH v2 17/19] netfs: Split some core bits out into their own file David Howells
2022-03-08 23:29 ` [PATCH v2 18/19] netfs: Keep track of the actual remote file size David Howells
2022-03-09 20:45   ` Jeff Layton
2022-03-09 22:27   ` David Howells
2022-03-08 23:30 ` [PATCH v2 19/19] afs: Maintain netfs_i_context::remote_i_size David Howells
2022-03-09 21:12   ` Jeff Layton
2022-03-09 22:35   ` David Howells

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4cbb2bb06eafb8f03135fc377ced779102004ea7.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=anna.schumaker@netapp.com \
    --cc=asmadeus@codewreck.org \
    --cc=ceph-devel@vger.kernel.org \
    --cc=dhowells@redhat.com \
    --cc=dwysocha@redhat.com \
    --cc=idryomov@gmail.com \
    --cc=jefflexu@linux.alibaba.com \
    --cc=linux-afs@lists.infradead.org \
    --cc=linux-cachefs@redhat.com \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=sfrench@samba.org \
    --cc=torvalds@linux-foundation.org \
    --cc=v9fs-developer@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.