lkml.org 
[lkml]   [2019]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] jffs2: reset pino_nlink to 0 when inode creation failed
    Date
    So jffs2_do_clear_inode() could mark all flash nodes used by
    the inode as obsolete and GC procedure will reclaim these
    flash nodes, else these flash spaces will not be reclaimable
    forever.

    Cc: stable@vger.kernel.org
    Signed-off-by: Hou Tao <houtao1@huawei.com>
    ---
    fs/jffs2/dir.c | 28 ++++++++++++++++++++++++----
    1 file changed, 24 insertions(+), 4 deletions(-)

    diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
    index f20cff1194bb..e02f85e516cb 100644
    --- a/fs/jffs2/dir.c
    +++ b/fs/jffs2/dir.c
    @@ -156,6 +156,26 @@ static int jffs2_readdir(struct file *file, struct dir_context *ctx)

    /***********************************************************************/

    +static void jffs2_iget_failed(struct jffs2_sb_info *c, struct inode *inode)
    +{
    + struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
    +
    + /*
    + * Reset pino_nlink to zero, so jffs2_do_clear_inode() will mark
    + * all flash nodes used by the inode as obsolete and GC procedure
    + * will reclaim these flash nodes, else these flash spaces will be
    + * unreclaimable forever.
    + *
    + * Update pino_nlink under inocache_lock, because no proceses could
    + * get the inode due to I_NEW flag, and only GC procedure may try to
    + * read pino_nlink under inocache_lock.
    + */
    + spin_lock(&c->inocache_lock);
    + f->inocache->pino_nlink = 0;
    + spin_unlock(&c->inocache_lock);
    +
    + iget_failed(inode);
    +}

    static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
    umode_t mode, bool excl)
    @@ -213,7 +233,7 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
    return 0;

    fail:
    - iget_failed(inode);
    + jffs2_iget_failed(c, inode);
    jffs2_free_raw_inode(ri);
    return ret;
    }
    @@ -433,7 +453,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
    return 0;

    fail:
    - iget_failed(inode);
    + jffs2_iget_failed(c, inode);
    return ret;
    }

    @@ -577,7 +597,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode
    return 0;

    fail:
    - iget_failed(inode);
    + jffs2_iget_failed(c, inode);
    return ret;
    }

    @@ -748,7 +768,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode
    return 0;

    fail:
    - iget_failed(inode);
    + jffs2_iget_failed(c, inode);
    return ret;
    }

    --
    2.16.2.dirty
    \
     
     \ /
      Last update: 2019-02-20 11:18    [W:5.136 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site