From: Sam Liddicott Date: Tue, 7 Jan 2014 17:48:19 +0000 (-0800) Subject: xt_quota2: allow incremental value to be written to quota proc file X-Git-Tag: v2.9~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=939fc901c13e1441264af2d3ce386ce9bb099fd9;p=thirdparty%2Fxtables-addons.git xt_quota2: allow incremental value to be written to quota proc file As well as writing absolute numeric values to the quota file, you can now also write numbers preceded by a + sign or a - sign, e.g. * "+30" would increase the quota by 30 * "+-20" would increase the quota by negative 20, which is the same as decrease by 20 * "-5" would decrease the quota by 5 --- diff --git a/extensions/xt_quota2.c b/extensions/xt_quota2.c index 8a2a509..b4d142e 100644 --- a/extensions/xt_quota2.c +++ b/extensions/xt_quota2.c @@ -82,7 +82,7 @@ quota_proc_write(struct file *file, const char __user *input, size_t size, loff_t *loff) { struct xt_quota_counter *e = PDE_DATA(file_inode(file)); - char buf[sizeof("18446744073709551616")]; + char buf[sizeof("+-18446744073709551616")]; if (size > sizeof(buf)) size = sizeof(buf); @@ -92,9 +92,29 @@ quota_proc_write(struct file *file, const char __user *input, if (size < sizeof(buf)) buf[size] = '\0'; - spin_lock_bh(&e->lock); - e->quota = simple_strtoull(buf, NULL, 0); - spin_unlock_bh(&e->lock); + if (*buf == '+') { + int64_t temp = simple_strtoll(buf + 1, NULL, 0); + spin_lock_bh(&e->lock); + /* Do not let quota become negative if @tmp is very negative */ + if (temp > 0 || -temp < e->quota) + e->quota += temp; + else + e->quota = 0; + spin_unlock_bh(&e->lock); + } else if (*buf == '-') { + int64_t temp = simple_strtoll(buf + 1, NULL, 0); + spin_lock_bh(&e->lock); + /* Do not let quota become negative if @tmp is very big */ + if (temp < 0 || temp < e->quota) + e->quota -= temp; + else + e->quota = 0; + spin_unlock_bh(&e->lock); + } else { + spin_lock_bh(&e->lock); + e->quota = simple_strtoull(buf, NULL, 0); + spin_unlock_bh(&e->lock); + } return size; }