From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751948AbcKZJPY (ORCPT ); Sat, 26 Nov 2016 04:15:24 -0500 Received: from szxga01-in.huawei.com ([58.251.152.64]:41312 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751001AbcKZJPO (ORCPT ); Sat, 26 Nov 2016 04:15:14 -0500 From: Yisheng Xie Subject: [RFC] kernel/sysctl.c: return -EINVAL when write invalid val to ulong type sysctl To: Linux Kernel Mailing List CC: Andrew Morton , Arnaldo Carvalho de Melo , Mel Gorman , Al Viro , Johannes Weiner , "Eric W. Biederman" , Daniel Bristot de Oliveira , Subash Abhinov Kasiviswanathan , Daniel Cashman , "Willy Tarreau" , Arnd Bergmann , Hanjun Guo , Xishi Qiu Message-ID: <669ac5a2-8b2f-5a47-305d-f6cf7cff4f63@huawei.com> Date: Sat, 26 Nov 2016 17:13:02 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.29.40] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I tried to echo an invalid value to an unsigned long type sysctl on 4.9.0-rc6: linux:~# cat /proc/sys/vm/user_reserve_kbytes 131072 linux:~# echo -1 > /proc/sys/vm/user_reserve_kbytes linux:~# cat /proc/sys/vm/user_reserve_kbytes 131072 The echo operation got error and the value do not write to user_reserve_kbytes, however, user do not know it until check the value again. Is it more suitable to return -EINVAL when echo an invalid value to an unsigned long type sysctl, in order to let user know what happened without checking its value once more? Just as what int type sysctl do: linux:~#cat /proc/sys/kernel/sysctl_writes_strict 1 linux:~# echo 3 > /proc/sys/kernel/sysctl_writes_strict bash: echo: write error: Invalid argument ---------------------- diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 706309f..40e9285 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -2485,10 +2485,14 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int sizeof(proc_wspace_sep), NULL); if (err) break; - if (neg) - continue; - if ((min && val < *min) || (max && val > *max)) - continue; + if (neg) { + err = -EINVAL; + break; + } + if ((min && val < *min) || (max && val > *max)) { + err = -EINVAL; + break; + } *i = val; } else { val = convdiv * (*i) / convmul;