convert cachestat(2)

fdput() can be transposed with copy_to_user()

Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2024-07-22 21:59:30 -04:00
parent 20d9eb3b87
commit 65c8941e7d

View File

@ -4421,31 +4421,25 @@ SYSCALL_DEFINE4(cachestat, unsigned int, fd,
struct cachestat_range __user *, cstat_range,
struct cachestat __user *, cstat, unsigned int, flags)
{
struct fd f = fdget(fd);
CLASS(fd, f)(fd);
struct address_space *mapping;
struct cachestat_range csr;
struct cachestat cs;
pgoff_t first_index, last_index;
if (!fd_file(f))
if (fd_empty(f))
return -EBADF;
if (copy_from_user(&csr, cstat_range,
sizeof(struct cachestat_range))) {
fdput(f);
sizeof(struct cachestat_range)))
return -EFAULT;
}
/* hugetlbfs is not supported */
if (is_file_hugepages(fd_file(f))) {
fdput(f);
if (is_file_hugepages(fd_file(f)))
return -EOPNOTSUPP;
}
if (flags != 0) {
fdput(f);
if (flags != 0)
return -EINVAL;
}
first_index = csr.off >> PAGE_SHIFT;
last_index =
@ -4453,7 +4447,6 @@ SYSCALL_DEFINE4(cachestat, unsigned int, fd,
memset(&cs, 0, sizeof(struct cachestat));
mapping = fd_file(f)->f_mapping;
filemap_cachestat(mapping, first_index, last_index, &cs);
fdput(f);
if (copy_to_user(cstat, &cs, sizeof(struct cachestat)))
return -EFAULT;