summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Babrou <ivan@cloudflare.com>2022-10-24 10:31:40 -0700
committerAndrew Morton <akpm@linux-foundation.org>2022-10-25 21:11:18 -0700
commitb6fc0c0fd4a1ee44d0ef0656a593268d7438b796 (patch)
treea1744cec5b5f27251fe46f33b01732b790684765
parent9aeeae74d1d82c33665f520e01297e34ebf1f2f2 (diff)
downloadlinux-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.c17
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 = {