Messages in this thread Patch in this message | | | Date | Tue, 3 Feb 2009 12:33:19 +0100 | From | Pavel Machek <> | Subject | /proc/sys/vm/drop_caches: add error handling |
| |
Document that drop_caches is unsafe, and add error checking so that it bails out on invalid inputs. [Note that this was triggered by Android trying to use it in production, and incidentally writing invalid value...]
Signed-off-by: Pavel Machek <pavel@suse.cz>
diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt index 3197fc8..b90f050 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt @@ -132,6 +132,10 @@ To free pagecache, dentries and inodes: As this is a non-destructive operation and dirty objects are not freeable, the user should run `sync' first. +Note that calling this causes some serious latencies, and that this is +a debug feature; it should not be used for production as it does not +contain neccessary locking to guarantee safe operation. + ============================================================== hugepages_treat_as_movable diff --git a/fs/drop_caches.c b/fs/drop_caches.c index 3e5637f..765dec3 100644 --- a/fs/drop_caches.c +++ b/fs/drop_caches.c @@ -9,8 +9,9 @@ #include <linux/sysctl.h> #include <linux/gfp.h> -/* A global variable is a bit ugly, but it keeps the code simple */ -int sysctl_drop_caches; +/* A global variable is a bit ugly, and has locking problems, + but it keeps the code simple */ +unsigned int sysctl_drop_caches; static void drop_pagecache_sb(struct super_block *sb) { @@ -65,12 +66,17 @@ static void drop_slab(void) int drop_caches_sysctl_handler(ctl_table *table, int write, struct file *file, void __user *buffer, size_t *length, loff_t *ppos) { - proc_dointvec_minmax(table, write, file, buffer, length, ppos); - if (write) { - if (sysctl_drop_caches & 1) - drop_pagecache(); - if (sysctl_drop_caches & 2) - drop_slab(); - } - return 0; + int res; + res = proc_dointvec_minmax(table, write, file, buffer, length, ppos); + if (res) + return res; + if (!write) + return res; + if (sysctl_drop_caches & ~3) + return -EINVAL; + if (sysctl_drop_caches & 1) + drop_pagecache(); + if (sysctl_drop_caches & 2) + drop_slab(); + return res; }
-- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
| |