mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
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:
parent
20d9eb3b87
commit
65c8941e7d
17
mm/filemap.c
17
mm/filemap.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user