GFS2: Truncate address space mapping when deleting an inode
authorBob Peterson <rpeterso@redhat.com>
Mon, 7 Dec 2015 21:13:28 +0000 (15:13 -0600)
committerBob Peterson <rpeterso@redhat.com>
Fri, 18 Dec 2015 16:52:21 +0000 (10:52 -0600)
In function gfs2_delete_inode() we write and flush the mapping for
a glock, among other things. We truncate the mapping for the inode,
but we never truncate the mapping for the glock. This patch makes it
also truncate the metamapping. This avoid cases where the glock is
reused by another process who is trying to recreate an inode in its
place using the same block.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Acked-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/super.c

index 4f0708f7bf6c7af525340c4c0d5d4cd7788a1017..8f960a51a9a0d72b238e244eca9a336eacbd77f9 100644 (file)
@@ -1519,6 +1519,7 @@ static void gfs2_evict_inode(struct inode *inode)
        struct gfs2_sbd *sdp = sb->s_fs_info;
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_holder gh;
+       struct address_space *metamapping;
        int error;
 
        if (test_bit(GIF_FREE_VFS_INODE, &ip->i_flags)) {
@@ -1583,8 +1584,8 @@ static void gfs2_evict_inode(struct inode *inode)
 
 out_truncate:
        gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH);
+       metamapping = gfs2_glock2aspace(ip->i_gl);
        if (test_bit(GLF_DIRTY, &ip->i_gl->gl_flags)) {
-               struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl);
                filemap_fdatawrite(metamapping);
                filemap_fdatawait(metamapping);
        }
@@ -1597,6 +1598,7 @@ out_truncate:
                goto out_unlock;
        /* Needs to be done before glock release & also in a transaction */
        truncate_inode_pages(&inode->i_data, 0);
+       truncate_inode_pages(metamapping, 0);
        gfs2_trans_end(sdp);
 
 out_unlock: