[PATCH] Fix x86-64 compilation
[linux-2.6/history.git] / mm / fadvise.c
bloba75c32d4b0886238825a99db03053b36a30754ff
1 /*
2 * mm/fadvise.c
4 * Copyright (C) 2002, Linus Torvalds
6 * 11Jan2003 akpm@digeo.com
7 * Initial version.
8 */
10 #include <linux/kernel.h>
11 #include <linux/file.h>
12 #include <linux/fs.h>
13 #include <linux/mm.h>
14 #include <linux/pagemap.h>
15 #include <linux/backing-dev.h>
16 #include <linux/pagevec.h>
17 #include <linux/fadvise.h>
20 * POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could
21 * deactivate the pages and clear PG_Referenced.
23 asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
25 struct file *file = fget(fd);
26 struct inode *inode;
27 struct address_space *mapping;
28 struct backing_dev_info *bdi;
29 pgoff_t start_index;
30 pgoff_t end_index;
31 int ret = 0;
33 if (!file)
34 return -EBADF;
36 inode = file->f_dentry->d_inode;
37 mapping = inode->i_mapping;
38 if (!mapping) {
39 ret = -EINVAL;
40 goto out;
43 bdi = mapping->backing_dev_info;
45 switch (advice) {
46 case POSIX_FADV_NORMAL:
47 file->f_ra.ra_pages = bdi->ra_pages;
48 break;
49 case POSIX_FADV_RANDOM:
50 file->f_ra.ra_pages = 0;
51 break;
52 case POSIX_FADV_SEQUENTIAL:
53 file->f_ra.ra_pages = bdi->ra_pages * 2;
54 break;
55 case POSIX_FADV_WILLNEED:
56 case POSIX_FADV_NOREUSE:
57 if (!mapping->a_ops->readpage) {
58 ret = -EINVAL;
59 break;
61 ret = force_page_cache_readahead(mapping, file,
62 offset >> PAGE_CACHE_SHIFT,
63 max_sane_readahead(len >> PAGE_CACHE_SHIFT));
64 if (ret > 0)
65 ret = 0;
66 break;
67 case POSIX_FADV_DONTNEED:
68 if (!bdi_write_congested(mapping->backing_dev_info))
69 filemap_flush(mapping);
70 start_index = offset >> PAGE_CACHE_SHIFT;
71 end_index = (offset + len + PAGE_CACHE_SIZE - 1) >>
72 PAGE_CACHE_SHIFT;
73 invalidate_mapping_pages(mapping, start_index, end_index);
74 break;
75 default:
76 ret = -EINVAL;
78 out:
79 fput(file);
80 return ret;
83 asmlinkage long sys_fadvise64(int fd, loff_t offset, size_t len, int advice)
85 return sys_fadvise64_64(fd, offset, len, advice);