summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2016-11-22 22:40:27 +0100
committerDarrick J. Wong <darrick.wong@oracle.com>2016-12-10 21:39:45 +0100
commit86e59436d406d833a5da4a94aefb3c3be6b26053 (patch)
treeddf46c1ea7d89ea12b6828d1fead5b8bb5576d64
parentocfs2: fix bad pointer cast (diff)
downloadlinux-86e59436d406d833a5da4a94aefb3c3be6b26053.tar.xz
linux-86e59436d406d833a5da4a94aefb3c3be6b26053.zip
ocfs2: charge quota for reflinked blocks
When ocfs2 shares blocks from one file to another, it's necessary to charge that many blocks to the quota because ocfs2 tallies block charges according to the number of blocks mapped, not the number of physical blocks used. Without this patch, reflinking X blocks and then CoWing all of them causes quota usage to *decrease* by X as seen in generic/305. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
-rw-r--r--fs/ocfs2/refcounttree.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c
index 6c98d567ba01..dc8089af9ddf 100644
--- a/fs/ocfs2/refcounttree.c
+++ b/fs/ocfs2/refcounttree.c
@@ -3933,6 +3933,13 @@ static int ocfs2_add_refcounted_extent(struct inode *inode,
ret = ocfs2_increase_refcount(handle, ref_ci, ref_root_bh,
p_cluster, num_clusters,
meta_ac, dealloc);
+ if (ret) {
+ mlog_errno(ret);
+ goto out_commit;
+ }
+
+ ret = dquot_alloc_space_nodirty(inode,
+ ocfs2_clusters_to_bytes(osb->sb, num_clusters));
if (ret)
mlog_errno(ret);