From 8d73f6288249757662cf36e746835e3ecd84add1 Mon Sep 17 00:00:00 2001 From: vmallika Date: Thu, 8 Jan 2015 16:03:04 +0530 Subject: quota: For a link operation, do quota_check_limit only till the common ancestor of src and dst file In a dht_rename, if src_cached and dst_hashed are different, then rename is split into link and unlink. We need to handle quota_link properly. We have fixed quota_rename in patch# 8940, we need to handle quota_link similarly > http://review.gluster.org/#/c/8940/ > quota: For a rename operation, do quota_check_limit only till the > common ancestor of src and dst file > Example: > set quota limit set to 1GB on / > create a file /a1/b1/file1 of 600MB > mv /a1/b1/file1 /a1/b1/file2 > This rename fails as it takes delta into account which sums up to 1.2BG. > Though we are not creating new file, we still get quota exceeded error. > So quota enforce should happen only till b1. > Similarly: > mv /a/b/c/file /a/b/x/y/file > quota enforce should happen only till dir 'b' > Change-Id: Ia1e5363da876c3d71bd424e67a8bb28b7ac1c7c1 > BUG: 1153964 > Signed-off-by: vmallika > Reviewed-on: http://review.gluster.org/8940 > Tested-by: Gluster Build System > Reviewed-by: Raghavendra G > Tested-by: Raghavendra G Change-Id: I2c814018d17f7af1807c1d1d162d8bdcbb31e491 BUG: 1153964 Signed-off-by: vmallika Reviewed-on: http://review.gluster.org/9419 Tested-by: Gluster Build System Reviewed-by: Raghavendra G Tested-by: Raghavendra G --- xlators/features/quota/src/quota.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'xlators/features/quota/src/quota.h') diff --git a/xlators/features/quota/src/quota.h b/xlators/features/quota/src/quota.h index 3d6c65f8fb6..f21aed6c38f 100644 --- a/xlators/features/quota/src/quota.h +++ b/xlators/features/quota/src/quota.h @@ -51,6 +51,12 @@ if (!is_quota_on) \ goto label; +#define QUOTA_WIND_FOR_INTERNAL_FOP(xdata, label) \ + do { \ + if (xdata && dict_get (xdata, GLUSTERFS_INTERNAL_FOP_KEY)) \ + goto label; \ + } while (0) + #define DID_REACH_LIMIT(lim, prev_size, cur_size) \ ((cur_size) >= (lim) && (prev_size) < (lim)) @@ -196,7 +202,6 @@ struct quota_local { int32_t op_ret; int32_t op_errno; int64_t size; - gf_boolean_t skip_check; char just_validated; fop_lookup_cbk_t validate_cbk; quota_fop_continue_t fop_continue_cbk; -- cgit