|
@@ -1607,14 +1607,15 @@ rgrp_error:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * gfs2_free_data - free a contiguous run of data block(s)
|
|
|
+ * __gfs2_free_blocks - free a contiguous run of block(s)
|
|
|
* @ip: the inode these blocks are being freed from
|
|
|
* @bstart: first block of a run of contiguous blocks
|
|
|
* @blen: the length of the block run
|
|
|
+ * @meta: 1 if the blocks represent metadata
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
-void __gfs2_free_data(struct gfs2_inode *ip, u64 bstart, u32 blen)
|
|
|
+void __gfs2_free_blocks(struct gfs2_inode *ip, u64 bstart, u32 blen, int meta)
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
struct gfs2_rgrpd *rgd;
|
|
@@ -1631,53 +1632,10 @@ void __gfs2_free_data(struct gfs2_inode *ip, u64 bstart, u32 blen)
|
|
|
gfs2_trans_add_rg(rgd);
|
|
|
|
|
|
/* Directories keep their data in the metadata address space */
|
|
|
- if (ip->i_depth)
|
|
|
+ if (meta || ip->i_depth)
|
|
|
gfs2_meta_wipe(ip, bstart, blen);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * gfs2_free_data - free a contiguous run of data block(s)
|
|
|
- * @ip: the inode these blocks are being freed from
|
|
|
- * @bstart: first block of a run of contiguous blocks
|
|
|
- * @blen: the length of the block run
|
|
|
- *
|
|
|
- */
|
|
|
-
|
|
|
-void gfs2_free_data(struct gfs2_inode *ip, u64 bstart, u32 blen)
|
|
|
-{
|
|
|
- struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
-
|
|
|
- __gfs2_free_data(ip, bstart, blen);
|
|
|
- gfs2_statfs_change(sdp, 0, +blen, 0);
|
|
|
- gfs2_quota_change(ip, -(s64)blen, ip->i_inode.i_uid, ip->i_inode.i_gid);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * gfs2_free_meta - free a contiguous run of data block(s)
|
|
|
- * @ip: the inode these blocks are being freed from
|
|
|
- * @bstart: first block of a run of contiguous blocks
|
|
|
- * @blen: the length of the block run
|
|
|
- *
|
|
|
- */
|
|
|
-
|
|
|
-void __gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen)
|
|
|
-{
|
|
|
- struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
- struct gfs2_rgrpd *rgd;
|
|
|
-
|
|
|
- rgd = rgblk_free(sdp, bstart, blen, GFS2_BLKST_FREE);
|
|
|
- if (!rgd)
|
|
|
- return;
|
|
|
- trace_gfs2_block_alloc(ip, bstart, blen, GFS2_BLKST_FREE);
|
|
|
- rgd->rd_free += blen;
|
|
|
-
|
|
|
- gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
|
|
|
- gfs2_rgrp_out(rgd, rgd->rd_bits[0].bi_bh->b_data);
|
|
|
-
|
|
|
- gfs2_trans_add_rg(rgd);
|
|
|
- gfs2_meta_wipe(ip, bstart, blen);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* gfs2_free_meta - free a contiguous run of data block(s)
|
|
|
* @ip: the inode these blocks are being freed from
|
|
@@ -1690,7 +1648,7 @@ void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen)
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
|
|
|
- __gfs2_free_meta(ip, bstart, blen);
|
|
|
+ __gfs2_free_blocks(ip, bstart, blen, 1);
|
|
|
gfs2_statfs_change(sdp, 0, +blen, 0);
|
|
|
gfs2_quota_change(ip, -(s64)blen, ip->i_inode.i_uid, ip->i_inode.i_gid);
|
|
|
}
|