| .. | .. |
|---|
| 378 | 378 | } |
|---|
| 379 | 379 | EXPORT_SYMBOL_GPL(debugfs_attr_read); |
|---|
| 380 | 380 | |
|---|
| 381 | | -ssize_t debugfs_attr_write(struct file *file, const char __user *buf, |
|---|
| 382 | | - size_t len, loff_t *ppos) |
|---|
| 381 | +static ssize_t debugfs_attr_write_xsigned(struct file *file, const char __user *buf, |
|---|
| 382 | + size_t len, loff_t *ppos, bool is_signed) |
|---|
| 383 | 383 | { |
|---|
| 384 | 384 | struct dentry *dentry = F_DENTRY(file); |
|---|
| 385 | 385 | ssize_t ret; |
|---|
| .. | .. |
|---|
| 387 | 387 | ret = debugfs_file_get(dentry); |
|---|
| 388 | 388 | if (unlikely(ret)) |
|---|
| 389 | 389 | return ret; |
|---|
| 390 | | - ret = simple_attr_write(file, buf, len, ppos); |
|---|
| 390 | + if (is_signed) |
|---|
| 391 | + ret = simple_attr_write_signed(file, buf, len, ppos); |
|---|
| 392 | + else |
|---|
| 393 | + ret = simple_attr_write(file, buf, len, ppos); |
|---|
| 391 | 394 | debugfs_file_put(dentry); |
|---|
| 392 | 395 | return ret; |
|---|
| 393 | 396 | } |
|---|
| 397 | + |
|---|
| 398 | +ssize_t debugfs_attr_write(struct file *file, const char __user *buf, |
|---|
| 399 | + size_t len, loff_t *ppos) |
|---|
| 400 | +{ |
|---|
| 401 | + return debugfs_attr_write_xsigned(file, buf, len, ppos, false); |
|---|
| 402 | +} |
|---|
| 394 | 403 | EXPORT_SYMBOL_GPL(debugfs_attr_write); |
|---|
| 404 | + |
|---|
| 405 | +ssize_t debugfs_attr_write_signed(struct file *file, const char __user *buf, |
|---|
| 406 | + size_t len, loff_t *ppos) |
|---|
| 407 | +{ |
|---|
| 408 | + return debugfs_attr_write_xsigned(file, buf, len, ppos, true); |
|---|
| 409 | +} |
|---|
| 410 | +EXPORT_SYMBOL_GPL(debugfs_attr_write_signed); |
|---|
| 395 | 411 | |
|---|
| 396 | 412 | static struct dentry *debugfs_create_mode_unsafe(const char *name, umode_t mode, |
|---|
| 397 | 413 | struct dentry *parent, void *value, |
|---|
| .. | .. |
|---|
| 748 | 764 | *val = atomic_read((atomic_t *)data); |
|---|
| 749 | 765 | return 0; |
|---|
| 750 | 766 | } |
|---|
| 751 | | -DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t, debugfs_atomic_t_get, |
|---|
| 767 | +DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t, debugfs_atomic_t_get, |
|---|
| 752 | 768 | debugfs_atomic_t_set, "%lld\n"); |
|---|
| 753 | | -DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t_ro, debugfs_atomic_t_get, NULL, |
|---|
| 769 | +DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t_ro, debugfs_atomic_t_get, NULL, |
|---|
| 754 | 770 | "%lld\n"); |
|---|
| 755 | | -DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t_wo, NULL, debugfs_atomic_t_set, |
|---|
| 771 | +DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t_wo, NULL, debugfs_atomic_t_set, |
|---|
| 756 | 772 | "%lld\n"); |
|---|
| 757 | 773 | |
|---|
| 758 | 774 | /** |
|---|