Message ID | 20220415123614.54024-7-jefflexu@linux.alibaba.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fscache,erofs: fscache-based on-demand read semantics | expand |
Jeffle Xu <jefflexu@linux.alibaba.com> wrote: > + if (IS_ENABLED(CONFIG_CACHEFILES_ONDEMAND) && > + !strcmp(args, "ondemand")) { > + set_bit(CACHEFILES_ONDEMAND_MODE, &cache->flags); > + } else if (*args) { > + pr_err("'bind' command doesn't take an argument\n"); The error message isn't true if CONFIG_CACHEFILES_ONDEMAND=y. It would be better to say "Invalid argument to the 'bind' command". > -retry: > /* If the caller asked us to seek for data before doing the read, then > * we should do that now. If we find a gap, we fill it with zeros. > */ > @@ -120,16 +119,6 @@ static int cachefiles_read(struct netfs_cache_resources *cres, > if (read_hole == NETFS_READ_HOLE_FAIL) > goto presubmission_error; > > - if (read_hole == NETFS_READ_HOLE_ONDEMAND) { > - ret = cachefiles_ondemand_read(object, off, len); > - if (ret) > - goto presubmission_error; > - > - /* fail the read if no progress achieved */ > - read_hole = NETFS_READ_HOLE_FAIL; > - goto retry; > - } > - Unexplained deletion of newly added code. David
On 4/21/22 10:17 PM, David Howells wrote: > Jeffle Xu <jefflexu@linux.alibaba.com> wrote: > >> + if (IS_ENABLED(CONFIG_CACHEFILES_ONDEMAND) && >> + !strcmp(args, "ondemand")) { >> + set_bit(CACHEFILES_ONDEMAND_MODE, &cache->flags); >> + } else if (*args) { >> + pr_err("'bind' command doesn't take an argument\n"); > > The error message isn't true if CONFIG_CACHEFILES_ONDEMAND=y. It would be > better to say "Invalid argument to the 'bind' command". Right. Or users may gets confused then. Will be fixed in the next version. > >> -retry: >> /* If the caller asked us to seek for data before doing the read, then >> * we should do that now. If we find a gap, we fill it with zeros. >> */ >> @@ -120,16 +119,6 @@ static int cachefiles_read(struct netfs_cache_resources *cres, >> if (read_hole == NETFS_READ_HOLE_FAIL) >> goto presubmission_error; >> >> - if (read_hole == NETFS_READ_HOLE_ONDEMAND) { >> - ret = cachefiles_ondemand_read(object, off, len); >> - if (ret) >> - goto presubmission_error; >> - >> - /* fail the read if no progress achieved */ >> - read_hole = NETFS_READ_HOLE_FAIL; >> - goto retry; >> - } >> - > Sorry, it's my mistake when doing "git rebase". The previous version (v8) actually calls cachefiles_ondemand_read() in cachefiles_read(). However as explained in the commit message of patch 5 ("cachefiles: implement on-demand read"), fscache_read() can only detect if the requested file range is fully cache miss, whilst it can't detect if it is partial cache miss, i.e. there's a hole inside the requested file range. Thus in this patchset (v9), we move the entry of calling cachefiles_ondemand_read() from cachefiles_read() to cachefiles_prepare_read(). The above "deletion of newly added code" is actually reverting the previous change to cachefiles_read(). It was mistakenly merged to this patch when I was doing "git rebase"... Actually it should be merged to patch 5 ("cachefiles: implement on-demand read"), which initially introduce the change to cachefiles_read(). Apologize for the careless mistake...
diff --git a/fs/cachefiles/daemon.c b/fs/cachefiles/daemon.c index 2e946e4eb65a..c8bde21ace6a 100644 --- a/fs/cachefiles/daemon.c +++ b/fs/cachefiles/daemon.c @@ -758,11 +758,6 @@ static int cachefiles_daemon_bind(struct cachefiles_cache *cache, char *args) cache->brun_percent >= 100) return -ERANGE; - if (*args) { - pr_err("'bind' command doesn't take an argument\n"); - return -EINVAL; - } - if (!cache->rootdirname) { pr_err("No cache directory specified\n"); return -EINVAL; @@ -774,6 +769,14 @@ static int cachefiles_daemon_bind(struct cachefiles_cache *cache, char *args) return -EBUSY; } + if (IS_ENABLED(CONFIG_CACHEFILES_ONDEMAND) && + !strcmp(args, "ondemand")) { + set_bit(CACHEFILES_ONDEMAND_MODE, &cache->flags); + } else if (*args) { + pr_err("'bind' command doesn't take an argument\n"); + return -EINVAL; + } + /* Make sure we have copies of the tag string */ if (!cache->tag) { /* diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index ccf77a969653..000a28f46e59 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -95,7 +95,6 @@ static int cachefiles_read(struct netfs_cache_resources *cres, file, file_inode(file)->i_ino, start_pos, len, i_size_read(file_inode(file))); -retry: /* If the caller asked us to seek for data before doing the read, then * we should do that now. If we find a gap, we fill it with zeros. */ @@ -120,16 +119,6 @@ static int cachefiles_read(struct netfs_cache_resources *cres, if (read_hole == NETFS_READ_HOLE_FAIL) goto presubmission_error; - if (read_hole == NETFS_READ_HOLE_ONDEMAND) { - ret = cachefiles_ondemand_read(object, off, len); - if (ret) - goto presubmission_error; - - /* fail the read if no progress achieved */ - read_hole = NETFS_READ_HOLE_FAIL; - goto retry; - } - iov_iter_zero(len, iter); skipped = len; ret = 0;
Enable on-demand read mode by adding an optional parameter to the "bind" command. On-demand mode will be turned on when this parameter is "ondemand", i.e. "bind ondemand". Otherwise cachefiles will work in the original mode. Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com> --- fs/cachefiles/daemon.c | 13 ++++++++----- fs/cachefiles/io.c | 11 ----------- 2 files changed, 8 insertions(+), 16 deletions(-)