diff options
author | Luis Henriques <lhenriques@suse.com> | 2018-01-05 11:47:22 +0100 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2018-04-02 11:17:52 +0200 |
commit | 1ab302a0cb1455631646aa66b7fc02afd617ea4f (patch) | |
tree | 73686da6a5aef8ef0190bd8498d3591fc766ddee /fs/ceph/quota.c | |
parent | ceph: quota: support for ceph.quota.max_bytes (diff) | |
download | linux-1ab302a0cb1455631646aa66b7fc02afd617ea4f.tar.xz linux-1ab302a0cb1455631646aa66b7fc02afd617ea4f.zip |
ceph: quota: update MDS when max_bytes is approaching
When we're reaching the ceph.quota.max_bytes limit, i.e., when writing
more than 1/16th of the space left in a quota realm, update the MDS with
the new file size.
This mirrors the fuse-client approach with commit 122c50315ed1 ("client:
Inform mds file size when approaching quota limit"), in the ceph git tree.
Signed-off-by: Luis Henriques <lhenriques@suse.com>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph/quota.c')
-rw-r--r-- | fs/ceph/quota.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/fs/ceph/quota.c b/fs/ceph/quota.c index 745f9f47027b..7d1e18e2249f 100644 --- a/fs/ceph/quota.c +++ b/fs/ceph/quota.c @@ -135,7 +135,9 @@ bool ceph_quota_is_same_realm(struct inode *old, struct inode *new) enum quota_check_op { QUOTA_CHECK_MAX_FILES_OP, /* check quota max_files limit */ - QUOTA_CHECK_MAX_BYTES_OP /* check quota max_files limit */ + QUOTA_CHECK_MAX_BYTES_OP, /* check quota max_files limit */ + QUOTA_CHECK_MAX_BYTES_APPROACHING_OP /* check if quota max_files + limit is approaching */ }; /* @@ -185,6 +187,20 @@ static bool check_quota_exceeded(struct inode *inode, enum quota_check_op op, case QUOTA_CHECK_MAX_BYTES_OP: exceeded = (max && (rvalue + delta > max)); break; + case QUOTA_CHECK_MAX_BYTES_APPROACHING_OP: + if (max) { + if (rvalue >= max) + exceeded = true; + else { + /* + * when we're writing more that 1/16th + * of the available space + */ + exceeded = + (((max - rvalue) >> 4) < delta); + } + } + break; default: /* Shouldn't happen */ pr_warn("Invalid quota check op (%d)\n", op); @@ -238,3 +254,23 @@ bool ceph_quota_is_max_bytes_exceeded(struct inode *inode, loff_t newsize) return check_quota_exceeded(inode, QUOTA_CHECK_MAX_BYTES_OP, (newsize - size)); } + +/* + * ceph_quota_is_max_bytes_approaching - check if we're reaching max_bytes + * @inode: inode being written + * @newsize: new size if write succeeds + * + * This function returns true if the new file size @newsize will be consuming + * more than 1/16th of the available quota space; it returns false otherwise. + */ +bool ceph_quota_is_max_bytes_approaching(struct inode *inode, loff_t newsize) +{ + loff_t size = ceph_inode(inode)->i_reported_size; + + /* return immediately if we're decreasing file size */ + if (newsize <= size) + return false; + + return check_quota_exceeded(inode, QUOTA_CHECK_MAX_BYTES_APPROACHING_OP, + (newsize - size)); +} |