Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[sfrench/cifs-2.6.git] / fs / xfs / linux-2.6 / xfs_fs_subr.c
1 /*
2  * Copyright (c) 2000-2002,2005-2006 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #include "xfs.h"
19 #include "xfs_vnodeops.h"
20 #include "xfs_bmap_btree.h"
21 #include "xfs_inode.h"
22 #include "xfs_trace.h"
23
24 int  fs_noerr(void) { return 0; }
25 int  fs_nosys(void) { return ENOSYS; }
26 void fs_noval(void) { return; }
27
28 /*
29  * note: all filemap functions return negative error codes. These
30  * need to be inverted before returning to the xfs core functions.
31  */
32 void
33 xfs_tosspages(
34         xfs_inode_t     *ip,
35         xfs_off_t       first,
36         xfs_off_t       last,
37         int             fiopt)
38 {
39         struct address_space *mapping = VFS_I(ip)->i_mapping;
40
41         if (mapping->nrpages)
42                 truncate_inode_pages(mapping, first);
43 }
44
45 int
46 xfs_flushinval_pages(
47         xfs_inode_t     *ip,
48         xfs_off_t       first,
49         xfs_off_t       last,
50         int             fiopt)
51 {
52         struct address_space *mapping = VFS_I(ip)->i_mapping;
53         int             ret = 0;
54
55         trace_xfs_pagecache_inval(ip, first, last);
56
57         if (mapping->nrpages) {
58                 xfs_iflags_clear(ip, XFS_ITRUNCATED);
59                 ret = filemap_write_and_wait(mapping);
60                 if (!ret)
61                         truncate_inode_pages(mapping, first);
62         }
63         return -ret;
64 }
65
66 int
67 xfs_flush_pages(
68         xfs_inode_t     *ip,
69         xfs_off_t       first,
70         xfs_off_t       last,
71         uint64_t        flags,
72         int             fiopt)
73 {
74         struct address_space *mapping = VFS_I(ip)->i_mapping;
75         int             ret = 0;
76         int             ret2;
77
78         if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
79                 xfs_iflags_clear(ip, XFS_ITRUNCATED);
80                 ret = -filemap_fdatawrite(mapping);
81         }
82         if (flags & XFS_B_ASYNC)
83                 return ret;
84         ret2 = xfs_wait_on_pages(ip, first, last);
85         if (!ret)
86                 ret = ret2;
87         return ret;
88 }
89
90 int
91 xfs_wait_on_pages(
92         xfs_inode_t     *ip,
93         xfs_off_t       first,
94         xfs_off_t       last)
95 {
96         struct address_space *mapping = VFS_I(ip)->i_mapping;
97
98         if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK))
99                 return -filemap_fdatawait(mapping);
100         return 0;
101 }