On 8/18/22 9:52 PM, Jia Zhu wrote: > Previously, in ondemand read scenario, if the anonymous fd was closed by > user daemon, inflight and subsequent read requests would return EIO. > As long as the device connection is not released, user daemon can hold > and restore inflight requests by setting the request flag to > CACHEFILES_REQ_NEW. > > Suggested-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx> > Signed-off-by: Jia Zhu <zhujia.zj@xxxxxxxxxxxxx> > Signed-off-by: Xin Yin <yinxin.x@xxxxxxxxxxxxx> > --- > fs/cachefiles/daemon.c | 1 + > fs/cachefiles/internal.h | 3 +++ > fs/cachefiles/ondemand.c | 23 +++++++++++++++++++++++ > 3 files changed, 27 insertions(+) > > diff --git a/fs/cachefiles/daemon.c b/fs/cachefiles/daemon.c > index c74bd1f4ecf5..014369266cb2 100644 > --- a/fs/cachefiles/daemon.c > +++ b/fs/cachefiles/daemon.c > @@ -77,6 +77,7 @@ static const struct cachefiles_daemon_cmd cachefiles_daemon_cmds[] = { > { "tag", cachefiles_daemon_tag }, > #ifdef CONFIG_CACHEFILES_ONDEMAND > { "copen", cachefiles_ondemand_copen }, > + { "restore", cachefiles_ondemand_restore }, > #endif > { "", NULL } > }; > diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h > index b4af67f1cbd6..d504c61a5f03 100644 > --- a/fs/cachefiles/internal.h > +++ b/fs/cachefiles/internal.h > @@ -303,6 +303,9 @@ extern ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache, > extern int cachefiles_ondemand_copen(struct cachefiles_cache *cache, > char *args); > > +extern int cachefiles_ondemand_restore(struct cachefiles_cache *cache, > + char *args); > + > extern int cachefiles_ondemand_init_object(struct cachefiles_object *object); > extern void cachefiles_ondemand_clean_object(struct cachefiles_object *object); > > diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c > index 79ffb19380cd..5b1c447da976 100644 > --- a/fs/cachefiles/ondemand.c > +++ b/fs/cachefiles/ondemand.c > @@ -178,6 +178,29 @@ int cachefiles_ondemand_copen(struct cachefiles_cache *cache, char *args) > return ret; > } > > +int cachefiles_ondemand_restore(struct cachefiles_cache *cache, char *args) > +{ > + struct cachefiles_req *req; > + > + XA_STATE(xas, &cache->reqs, 0); > + > + if (!test_bit(CACHEFILES_ONDEMAND_MODE, &cache->flags)) > + return -EOPNOTSUPP; > + > + /* > + * Search the requests which being processed before > + * the user daemon crashed. > + * Set the CACHEFILES_REQ_NEW flag and user daemon will reprocess it. > + */ The comment can be improved as: Reset the requests to CACHEFILES_REQ_NEW state, so that the requests have been processed halfway before the crash of the user daemon could be reprocessed after the recovery. > + xas_lock(&xas); > + xas_for_each(&xas, req, ULONG_MAX) > + xas_set_mark(&xas, CACHEFILES_REQ_NEW); > + xas_unlock(&xas); > + > + wake_up_all(&cache->daemon_pollwq); > + return 0; > +} > + > static int cachefiles_ondemand_get_fd(struct cachefiles_req *req) > { > struct cachefiles_object *object; -- Thanks, Jingbo