lkml.org 
[lkml]   [2022]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 05/22] cachefiles: notify user daemon when withdrawing cookie
    Date
    Notify user daemon that cookie is going to be withdrawed, providing a
    hint that the associated anon_fd can be closed. The anon_fd attached in
    the CLOSE request shall be same with that in the previous OPEN request.

    Be noted that this is only a hint. User daemon can close the anon_fd
    when receiving the CLOSE request, then it will receive another anon_fd
    if the cookie gets looked up. Or it can also ignore the CLOSE request,
    and keep writing data into the anon_fd. However the next time cookie
    gets looked up, the user daemon will still receive another anon_fd.

    Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
    ---
    fs/cachefiles/daemon.c | 27 +++++++++++++++++++++++++++
    fs/cachefiles/interface.c | 2 ++
    fs/cachefiles/internal.h | 4 ++++
    include/uapi/linux/cachefiles.h | 5 +++++
    4 files changed, 38 insertions(+)

    diff --git a/fs/cachefiles/daemon.c b/fs/cachefiles/daemon.c
    index 3c3a461f8cd8..2ecfdf194206 100644
    --- a/fs/cachefiles/daemon.c
    +++ b/fs/cachefiles/daemon.c
    @@ -338,6 +338,12 @@ static ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache,
    goto err_put_fd;
    }

    + /* CLOSE request doesn't look forward a reply */
    + if (msg->opcode == CACHEFILES_OP_CLOSE) {
    + xa_erase(&cache->reqs, id);
    + complete(&req->done);
    + }
    +
    return n;

    err_put_fd:
    @@ -452,6 +458,19 @@ static int init_open_req(struct cachefiles_req *req, void *private)
    return 0;
    }

    +static int init_close_req(struct cachefiles_req *req, void *private)
    +{
    + struct cachefiles_object *object = req->object;
    + struct cachefiles_close *load = (void *)req->msg.data;
    + int fd = object->fd;
    +
    + if (WARN_ON_ONCE(fd == -1))
    + return -EIO;
    +
    + load->fd = fd;
    + return 0;
    +}
    +
    int cachefiles_ondemand_init_object(struct cachefiles_object *object)
    {
    struct fscache_cookie *cookie = object->cookie;
    @@ -477,6 +496,14 @@ int cachefiles_ondemand_init_object(struct cachefiles_object *object)
    init_open_req, NULL);
    }

    +void cachefiles_ondemand_cleanup_object(struct cachefiles_object *object)
    +{
    + cachefiles_ondemand_send_req(object,
    + CACHEFILES_OP_CLOSE,
    + sizeof(struct cachefiles_close),
    + init_close_req, NULL);
    +}
    +
    #else
    static inline void cachefiles_ondemand_open(struct cachefiles_cache *cache) {}
    static inline void cachefiles_ondemand_release(struct cachefiles_cache *cache) {}
    diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c
    index ae93cee9d25d..c5b8fefd4ccc 100644
    --- a/fs/cachefiles/interface.c
    +++ b/fs/cachefiles/interface.c
    @@ -322,6 +322,8 @@ static void cachefiles_commit_object(struct cachefiles_object *object,
    static void cachefiles_clean_up_object(struct cachefiles_object *object,
    struct cachefiles_cache *cache)
    {
    + cachefiles_ondemand_cleanup_object(object);
    +
    if (test_bit(FSCACHE_COOKIE_RETIRED, &object->cookie->flags)) {
    if (!test_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags)) {
    cachefiles_see_object(object, cachefiles_obj_see_clean_delete);
    diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h
    index 8450ebd77949..eaac9fae74eb 100644
    --- a/fs/cachefiles/internal.h
    +++ b/fs/cachefiles/internal.h
    @@ -167,6 +167,7 @@ extern const struct file_operations cachefiles_daemon_fops;

    #ifdef CONFIG_CACHEFILES_ONDEMAND
    extern int cachefiles_ondemand_init_object(struct cachefiles_object *object);
    +extern void cachefiles_ondemand_cleanup_object(struct cachefiles_object *object);

    #else
    static inline
    @@ -174,6 +175,9 @@ int cachefiles_ondemand_init_object(struct cachefiles_object *object)
    {
    return 0;
    }
    +
    +static inline
    +void cachefiles_ondemand_cleanup_object(struct cachefiles_object *object) {}
    #endif

    /*
    diff --git a/include/uapi/linux/cachefiles.h b/include/uapi/linux/cachefiles.h
    index 5ea7285863f1..47e53043cfad 100644
    --- a/include/uapi/linux/cachefiles.h
    +++ b/include/uapi/linux/cachefiles.h
    @@ -8,6 +8,7 @@

    enum cachefiles_opcode {
    CACHEFILES_OP_OPEN,
    + CACHEFILES_OP_CLOSE,
    };

    /*
    @@ -36,4 +37,8 @@ enum cachefiles_open_flags {
    CACHEFILES_OPEN_WANT_CACHE_SIZE,
    };

    +struct cachefiles_close {
    + __u32 fd;
    +};
    +
    #endif
    --
    2.27.0
    \
     
     \ /
      Last update: 2022-09-17 16:17    [W:2.646 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site