libfs: add DEFINE_SIMPLE_ATTRIBUTE_SIGNED for signed value
[ Upstream commit 2e41f274f9aa71cdcc69dc1f26a3f9304a651804 ]
Patch series "fix error when writing negative value to simple attribute
files".
The simple attribute files do not accept a negative value since the commit
488dac0c9237 ("libfs: fix error cast of negative value in
simple_attr_write()"), but some attribute files want to accept a negative
value.
This patch (of 3):
The simple attribute files do not accept a negative value since the commit
488dac0c9237 ("libfs: fix error cast of negative value in
simple_attr_write()"), so we have to use a 64-bit value to write a
negative value.
This adds DEFINE_SIMPLE_ATTRIBUTE_SIGNED for a signed value.
Link: https://lkml.kernel.org/r/20220919172418.45257-1-akinobu.mita@gmail.com
Link: https://lkml.kernel.org/r/20220919172418.45257-2-akinobu.mita@gmail.com
Fixes: 488dac0c9237 ("libfs: fix error cast of negative value in simple_attr_write()")
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Reported-by: Zhao Gongyi <zhaogongyi@huawei.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Rafael J. Wysocki <rafael@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Wei Yongjun <weiyongjun1@huawei.com>
Cc: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8dc428b308
commit
871d7dc859
22
fs/libfs.c
22
fs/libfs.c
@@ -864,8 +864,8 @@ ssize_t simple_attr_read(struct file *file, char __user *buf,
|
||||
EXPORT_SYMBOL_GPL(simple_attr_read);
|
||||
|
||||
/* interpret the buffer as a number to call the set function with */
|
||||
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
static ssize_t simple_attr_write_xsigned(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos, bool is_signed)
|
||||
{
|
||||
struct simple_attr *attr;
|
||||
unsigned long long val;
|
||||
@@ -886,7 +886,10 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
goto out;
|
||||
|
||||
attr->set_buf[size] = '\0';
|
||||
ret = kstrtoull(attr->set_buf, 0, &val);
|
||||
if (is_signed)
|
||||
ret = kstrtoll(attr->set_buf, 0, &val);
|
||||
else
|
||||
ret = kstrtoull(attr->set_buf, 0, &val);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = attr->set(attr->data, val);
|
||||
@@ -896,8 +899,21 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
mutex_unlock(&attr->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
return simple_attr_write_xsigned(file, buf, len, ppos, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_attr_write);
|
||||
|
||||
ssize_t simple_attr_write_signed(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
return simple_attr_write_xsigned(file, buf, len, ppos, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_attr_write_signed);
|
||||
|
||||
/**
|
||||
* generic_fh_to_dentry - generic helper for the fh_to_dentry export operation
|
||||
* @sb: filesystem to do the file handle conversion on
|
||||
|
||||
Reference in New Issue
Block a user