lkml.org 
[lkml]   [2019]   [May]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v5 14/16] dcache: Provide a dentry constructor
    Date
    In order to support object migration on the dentry cache we need to have
    a determined object state at all times. Without a constructor the object
    would have a random state after allocation.

    Provide a dentry constructor.

    Signed-off-by: Tobin C. Harding <tobin@kernel.org>
    ---
    fs/dcache.c | 30 +++++++++++++++++++++---------
    1 file changed, 21 insertions(+), 9 deletions(-)

    diff --git a/fs/dcache.c b/fs/dcache.c
    index 8136bda27a1f..b7318615979d 100644
    --- a/fs/dcache.c
    +++ b/fs/dcache.c
    @@ -1602,6 +1602,16 @@ void d_invalidate(struct dentry *dentry)
    }
    EXPORT_SYMBOL(d_invalidate);

    +static void dcache_ctor(void *p)
    +{
    + struct dentry *dentry = p;
    +
    + /* Mimic lockref_mark_dead() */
    + dentry->d_lockref.count = -128;
    +
    + spin_lock_init(&dentry->d_lock);
    +}
    +
    /**
    * __d_alloc - allocate a dcache entry
    * @sb: filesystem it will belong to
    @@ -1657,7 +1667,6 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)

    dentry->d_lockref.count = 1;
    dentry->d_flags = 0;
    - spin_lock_init(&dentry->d_lock);
    seqcount_init(&dentry->d_seq);
    dentry->d_inode = NULL;
    dentry->d_parent = dentry;
    @@ -3095,14 +3104,17 @@ static void __init dcache_init_early(void)

    static void __init dcache_init(void)
    {
    - /*
    - * A constructor could be added for stable state like the lists,
    - * but it is probably not worth it because of the cache nature
    - * of the dcache.
    - */
    - dentry_cache = KMEM_CACHE_USERCOPY(dentry,
    - SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD|SLAB_ACCOUNT,
    - d_iname);
    + slab_flags_t flags =
    + SLAB_RECLAIM_ACCOUNT | SLAB_PANIC | SLAB_MEM_SPREAD | SLAB_ACCOUNT;
    +
    + dentry_cache =
    + kmem_cache_create_usercopy("dentry",
    + sizeof(struct dentry),
    + __alignof__(struct dentry),
    + flags,
    + offsetof(struct dentry, d_iname),
    + sizeof_field(struct dentry, d_iname),
    + dcache_ctor);

    /* Hash may have been set up in dcache_init_early */
    if (!hashdist)
    --
    2.21.0
    \
     
     \ /
      Last update: 2019-05-20 07:43    [W:3.792 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site