GFS2: Truncate address space mapping when deleting an inode
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>
This commit is contained in:
parent
86d067a797
commit
ee530beafe
|
@ -1519,6 +1519,7 @@ static void gfs2_evict_inode(struct inode *inode)
|
||||||
struct gfs2_sbd *sdp = sb->s_fs_info;
|
struct gfs2_sbd *sdp = sb->s_fs_info;
|
||||||
struct gfs2_inode *ip = GFS2_I(inode);
|
struct gfs2_inode *ip = GFS2_I(inode);
|
||||||
struct gfs2_holder gh;
|
struct gfs2_holder gh;
|
||||||
|
struct address_space *metamapping;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (test_bit(GIF_FREE_VFS_INODE, &ip->i_flags)) {
|
if (test_bit(GIF_FREE_VFS_INODE, &ip->i_flags)) {
|
||||||
|
@ -1583,8 +1584,8 @@ static void gfs2_evict_inode(struct inode *inode)
|
||||||
|
|
||||||
out_truncate:
|
out_truncate:
|
||||||
gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH);
|
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)) {
|
if (test_bit(GLF_DIRTY, &ip->i_gl->gl_flags)) {
|
||||||
struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl);
|
|
||||||
filemap_fdatawrite(metamapping);
|
filemap_fdatawrite(metamapping);
|
||||||
filemap_fdatawait(metamapping);
|
filemap_fdatawait(metamapping);
|
||||||
}
|
}
|
||||||
|
@ -1597,6 +1598,7 @@ static void gfs2_evict_inode(struct inode *inode)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
/* Needs to be done before glock release & also in a transaction */
|
/* Needs to be done before glock release & also in a transaction */
|
||||||
truncate_inode_pages(&inode->i_data, 0);
|
truncate_inode_pages(&inode->i_data, 0);
|
||||||
|
truncate_inode_pages(metamapping, 0);
|
||||||
gfs2_trans_end(sdp);
|
gfs2_trans_end(sdp);
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
|
|
Loading…
Reference in New Issue