diff options
author | Ivan Babrou <ivan@cloudflare.com> | 2022-10-24 10:31:40 -0700 |
---|---|---|
committer | Andrew Morton <akpm@linux-foundation.org> | 2022-10-25 21:11:18 -0700 |
commit | b6fc0c0fd4a1ee44d0ef0656a593268d7438b796 (patch) | |
tree | a1744cec5b5f27251fe46f33b01732b790684765 | |
parent | 9aeeae74d1d82c33665f520e01297e34ebf1f2f2 (diff) | |
download | linux-b6fc0c0fd4a1ee44d0ef0656a593268d7438b796.tar.gz linux-b6fc0c0fd4a1ee44d0ef0656a593268d7438b796.tar.xz |
proc-report-open-files-as-size-in-stat-for-proc-pid-fd-v4
return errno from proc_fd_getattr() instead of setting negative size
Link: https://lkml.kernel.org/r/20221024173140.30673-1-ivan@cloudflare.com
Signed-off-by: Ivan Babrou <ivan@cloudflare.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Christoph Anton Mitterer <mail@christoph.anton.mitterer.name>
Cc: David Hildenbrand <david@redhat.com>
Cc: David Laight <David.Laight@ACULAB.COM>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Kalesh Singh <kaleshsingh@google.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-rw-r--r-- | fs/proc/fd.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/fs/proc/fd.c b/fs/proc/fd.c index f47b04676c96..fc46d6fe080c 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c @@ -280,11 +280,10 @@ out: return 0; } -static int proc_readfd_count(struct inode *inode) +static int proc_readfd_count(struct inode *inode, loff_t *count) { struct task_struct *p = get_proc_task(inode); struct fdtable *fdt; - unsigned int open_fds = 0; if (!p) return -ENOENT; @@ -294,7 +293,7 @@ static int proc_readfd_count(struct inode *inode) rcu_read_lock(); fdt = files_fdtable(p->files); - open_fds = bitmap_weight(fdt->open_fds, fdt->max_fds); + *count = bitmap_weight(fdt->open_fds, fdt->max_fds); rcu_read_unlock(); } @@ -302,7 +301,7 @@ static int proc_readfd_count(struct inode *inode) put_task_struct(p); - return open_fds; + return 0; } static int proc_readfd(struct file *file, struct dir_context *ctx) @@ -350,14 +349,18 @@ static int proc_fd_getattr(struct user_namespace *mnt_userns, u32 request_mask, unsigned int query_flags) { struct inode *inode = d_inode(path->dentry); + int rv = 0; generic_fillattr(&init_user_ns, inode, stat); /* If it's a directory, put the number of open fds there */ - if (S_ISDIR(inode->i_mode)) - stat->size = proc_readfd_count(inode); + if (S_ISDIR(inode->i_mode)) { + rv = proc_readfd_count(inode, &stat->size); + if (rv < 0) + return rv; + } - return 0; + return rv; } const struct inode_operations proc_fd_inode_operations = { |