lkml.org 
[lkml]   [2021]   [Dec]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 10/23] erofs: add anonymous inode managing page cache of blob file
    Date
    Introduce one anonymous inode for managing page cache of corresponding
    blob file. Then erofs could read directly from the address space of the
    anonymous inode when cache hit.

    Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
    ---
    fs/erofs/fscache.c | 35 +++++++++++++++++++++++++++++++++++
    fs/erofs/internal.h | 1 +
    2 files changed, 36 insertions(+)

    diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c
    index 15c5bb0f8ea5..4dfca7c95710 100644
    --- a/fs/erofs/fscache.c
    +++ b/fs/erofs/fscache.c
    @@ -34,6 +34,33 @@ static void erofs_fscache_cleanup_cookie(struct erofs_cookie_ctx *ctx)
    ctx->cookie = NULL;
    }

    +static const struct address_space_operations erofs_fscache_aops = {
    +};
    +
    +static int erofs_fscache_get_inode(struct erofs_cookie_ctx *ctx,
    + struct super_block *sb)
    +{
    + struct inode *const inode = new_inode(sb);
    +
    + if (!inode)
    + return -ENOMEM;
    +
    + set_nlink(inode, 1);
    + inode->i_size = OFFSET_MAX;
    +
    + inode->i_mapping->a_ops = &erofs_fscache_aops;
    + mapping_set_gfp_mask(inode->i_mapping,
    + GFP_NOFS | __GFP_HIGHMEM | __GFP_MOVABLE);
    + ctx->inode = inode;
    + return 0;
    +}
    +
    +static void erofs_fscache_put_inode(struct erofs_cookie_ctx *ctx)
    +{
    + iput(ctx->inode);
    + ctx->inode = NULL;
    +}
    +
    static int erofs_fscahce_init_ctx(struct erofs_cookie_ctx *ctx,
    struct super_block *sb, char *path)
    {
    @@ -45,12 +72,20 @@ static int erofs_fscahce_init_ctx(struct erofs_cookie_ctx *ctx,
    return ret;
    }

    + ret = erofs_fscache_get_inode(ctx, sb);
    + if (ret) {
    + erofs_err(sb, "failed to get anonymous inode\n");
    + erofs_fscache_cleanup_cookie(ctx);
    + return ret;
    + }
    +
    return 0;
    }

    static void erofs_fscache_cleanup_ctx(struct erofs_cookie_ctx *ctx)
    {
    erofs_fscache_cleanup_cookie(ctx);
    + erofs_fscache_put_inode(ctx);
    }

    struct erofs_cookie_ctx *erofs_fscache_get_ctx(struct super_block *sb,
    diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
    index 4179c3dcb7f9..2e4f267b37e7 100644
    --- a/fs/erofs/internal.h
    +++ b/fs/erofs/internal.h
    @@ -93,6 +93,7 @@ struct erofs_sb_lz4_info {

    struct erofs_cookie_ctx {
    struct fscache_cookie *cookie;
    + struct inode *inode;
    };

    struct erofs_sb_info {
    --
    2.27.0
    \
     
     \ /
      Last update: 2021-12-27 13:56    [W:2.982 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site