From: Baokun Li <libaok...@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.

Signed-off-by: Baokun Li <libaok...@huawei.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 d33169f0018b..8ecd296cc1c4 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 {
@@ -332,6 +333,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 4ba42f1fa3b4..73da4d4eaa9b 100644
--- a/fs/cachefiles/ondemand.c
+++ b/fs/cachefiles/ondemand.c
@@ -422,7 +422,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;
@@ -463,7 +464,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;
@@ -562,8 +564,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,
-- 
2.39.2

Reply via email to