mirror of
git://git.code.sf.net/p/xtables-addons/xtables-addons
synced 2025-09-08 13:44:56 +02:00
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
This commit is contained in:

committed by
Jan Engelhardt

parent
a4a077ff86
commit
939fc901c1
@@ -82,7 +82,7 @@ quota_proc_write(struct file *file, const char __user *input,
|
|||||||
size_t size, loff_t *loff)
|
size_t size, loff_t *loff)
|
||||||
{
|
{
|
||||||
struct xt_quota_counter *e = PDE_DATA(file_inode(file));
|
struct xt_quota_counter *e = PDE_DATA(file_inode(file));
|
||||||
char buf[sizeof("18446744073709551616")];
|
char buf[sizeof("+-18446744073709551616")];
|
||||||
|
|
||||||
if (size > sizeof(buf))
|
if (size > sizeof(buf))
|
||||||
size = sizeof(buf);
|
size = sizeof(buf);
|
||||||
@@ -92,9 +92,29 @@ quota_proc_write(struct file *file, const char __user *input,
|
|||||||
if (size < sizeof(buf))
|
if (size < sizeof(buf))
|
||||||
buf[size] = '\0';
|
buf[size] = '\0';
|
||||||
|
|
||||||
|
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);
|
spin_lock_bh(&e->lock);
|
||||||
e->quota = simple_strtoull(buf, NULL, 0);
|
e->quota = simple_strtoull(buf, NULL, 0);
|
||||||
spin_unlock_bh(&e->lock);
|
spin_unlock_bh(&e->lock);
|
||||||
|
}
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user