Message ID | 20240628062930.2467993-6-libaokun@huaweicloud.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | cachefiles: random bugfixes | expand |
On 2024/6/28 14:29, libaokun@huaweicloud.com wrote: > From: Baokun Li <libaokun1@huawei.com> > > Added CACHEFILES_ONDEMAND_OBJSTATE_DROPPING indicates that the cachefiles > object is being dropped, and is set after the close request for the dropped > object completes, and no new requests are allowed to be sent after this > state. > > This prepares for the later addition of cancel_work_sync(). It prevents > leftover reopen requests from being sent, to avoid processing unnecessary > requests and to avoid cancel_work_sync() blocking by waiting for daemon to > complete the reopen requests. > > Signed-off-by: Baokun Li <libaokun1@huawei.com> > Acked-by: Jeff Layton <jlayton@kernel.org> LGTM, Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com> Thanks, Gao Xiang
在 2024/6/28 14:29, libaokun@huaweicloud.com 写道: > From: Baokun Li <libaokun1@huawei.com> > > Added CACHEFILES_ONDEMAND_OBJSTATE_DROPPING indicates that the cachefiles > object is being dropped, and is set after the close request for the dropped > object completes, and no new requests are allowed to be sent after this > state. > > This prepares for the later addition of cancel_work_sync(). It prevents > leftover reopen requests from being sent, to avoid processing unnecessary > requests and to avoid cancel_work_sync() blocking by waiting for daemon to > complete the reopen requests. > > Signed-off-by: Baokun Li <libaokun1@huawei.com> > Acked-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Jia Zhu <zhujia.zj@bytedance.com> > --- > fs/cachefiles/internal.h | 2 ++ > fs/cachefiles/ondemand.c | 10 ++++++++-- > 2 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h > index 6845a90cdfcc..a1a1d25e9514 100644 > --- a/fs/cachefiles/internal.h > +++ b/fs/cachefiles/internal.h > @@ -48,6 +48,7 @@ enum cachefiles_object_state { > CACHEFILES_ONDEMAND_OBJSTATE_CLOSE, /* Anonymous fd closed by daemon or initial state */ > CACHEFILES_ONDEMAND_OBJSTATE_OPEN, /* Anonymous fd associated with object is available */ > CACHEFILES_ONDEMAND_OBJSTATE_REOPENING, /* Object that was closed and is being reopened. */ > + CACHEFILES_ONDEMAND_OBJSTATE_DROPPING, /* Object is being dropped. */ > }; > > struct cachefiles_ondemand_info { > @@ -335,6 +336,7 @@ cachefiles_ondemand_set_object_##_state(struct cachefiles_object *object) \ > CACHEFILES_OBJECT_STATE_FUNCS(open, OPEN); > CACHEFILES_OBJECT_STATE_FUNCS(close, CLOSE); > CACHEFILES_OBJECT_STATE_FUNCS(reopening, REOPENING); > +CACHEFILES_OBJECT_STATE_FUNCS(dropping, DROPPING); > > static inline bool cachefiles_ondemand_is_reopening_read(struct cachefiles_req *req) > { > diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c > index bce005f2b456..8a3b52c3ebba 100644 > --- a/fs/cachefiles/ondemand.c > +++ b/fs/cachefiles/ondemand.c > @@ -517,7 +517,8 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object, > */ > xas_lock(&xas); > > - if (test_bit(CACHEFILES_DEAD, &cache->flags)) { > + if (test_bit(CACHEFILES_DEAD, &cache->flags) || > + cachefiles_ondemand_object_is_dropping(object)) { > xas_unlock(&xas); > ret = -EIO; > goto out; > @@ -568,7 +569,8 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object, > * If error occurs after creating the anonymous fd, > * cachefiles_ondemand_fd_release() will set object to close. > */ > - if (opcode == CACHEFILES_OP_OPEN) > + if (opcode == CACHEFILES_OP_OPEN && > + !cachefiles_ondemand_object_is_dropping(object)) > cachefiles_ondemand_set_object_close(object); > kfree(req); > return ret; > @@ -667,8 +669,12 @@ int cachefiles_ondemand_init_object(struct cachefiles_object *object) > > void cachefiles_ondemand_clean_object(struct cachefiles_object *object) > { > + if (!object->ondemand) > + return; > + > cachefiles_ondemand_send_req(object, CACHEFILES_OP_CLOSE, 0, > cachefiles_ondemand_init_close_req, NULL); > + cachefiles_ondemand_set_object_dropping(object); > } > > int cachefiles_ondemand_init_obj_info(struct cachefiles_object *object,
diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h index 6845a90cdfcc..a1a1d25e9514 100644 --- a/fs/cachefiles/internal.h +++ b/fs/cachefiles/internal.h @@ -48,6 +48,7 @@ enum cachefiles_object_state { CACHEFILES_ONDEMAND_OBJSTATE_CLOSE, /* Anonymous fd closed by daemon or initial state */ CACHEFILES_ONDEMAND_OBJSTATE_OPEN, /* Anonymous fd associated with object is available */ CACHEFILES_ONDEMAND_OBJSTATE_REOPENING, /* Object that was closed and is being reopened. */ + CACHEFILES_ONDEMAND_OBJSTATE_DROPPING, /* Object is being dropped. */ }; struct cachefiles_ondemand_info { @@ -335,6 +336,7 @@ cachefiles_ondemand_set_object_##_state(struct cachefiles_object *object) \ CACHEFILES_OBJECT_STATE_FUNCS(open, OPEN); CACHEFILES_OBJECT_STATE_FUNCS(close, CLOSE); CACHEFILES_OBJECT_STATE_FUNCS(reopening, REOPENING); +CACHEFILES_OBJECT_STATE_FUNCS(dropping, DROPPING); static inline bool cachefiles_ondemand_is_reopening_read(struct cachefiles_req *req) { diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c index bce005f2b456..8a3b52c3ebba 100644 --- a/fs/cachefiles/ondemand.c +++ b/fs/cachefiles/ondemand.c @@ -517,7 +517,8 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object, */ xas_lock(&xas); - if (test_bit(CACHEFILES_DEAD, &cache->flags)) { + if (test_bit(CACHEFILES_DEAD, &cache->flags) || + cachefiles_ondemand_object_is_dropping(object)) { xas_unlock(&xas); ret = -EIO; goto out; @@ -568,7 +569,8 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object, * If error occurs after creating the anonymous fd, * cachefiles_ondemand_fd_release() will set object to close. */ - if (opcode == CACHEFILES_OP_OPEN) + if (opcode == CACHEFILES_OP_OPEN && + !cachefiles_ondemand_object_is_dropping(object)) cachefiles_ondemand_set_object_close(object); kfree(req); return ret; @@ -667,8 +669,12 @@ int cachefiles_ondemand_init_object(struct cachefiles_object *object) void cachefiles_ondemand_clean_object(struct cachefiles_object *object) { + if (!object->ondemand) + return; + cachefiles_ondemand_send_req(object, CACHEFILES_OP_CLOSE, 0, cachefiles_ondemand_init_close_req, NULL); + cachefiles_ondemand_set_object_dropping(object); } int cachefiles_ondemand_init_obj_info(struct cachefiles_object *object,