Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.5-rc5 96 lines 2.4 kB view raw
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/* 25 * note: all filemap functions return negative error codes. These 26 * need to be inverted before returning to the xfs core functions. 27 */ 28void 29xfs_tosspages( 30 xfs_inode_t *ip, 31 xfs_off_t first, 32 xfs_off_t last, 33 int fiopt) 34{ 35 /* can't toss partial tail pages, so mask them out */ 36 last &= ~(PAGE_SIZE - 1); 37 truncate_inode_pages_range(VFS_I(ip)->i_mapping, first, last - 1); 38} 39 40int 41xfs_flushinval_pages( 42 xfs_inode_t *ip, 43 xfs_off_t first, 44 xfs_off_t last, 45 int fiopt) 46{ 47 struct address_space *mapping = VFS_I(ip)->i_mapping; 48 int ret = 0; 49 50 trace_xfs_pagecache_inval(ip, first, last); 51 52 xfs_iflags_clear(ip, XFS_ITRUNCATED); 53 ret = filemap_write_and_wait_range(mapping, first, 54 last == -1 ? LLONG_MAX : last); 55 if (!ret) 56 truncate_inode_pages_range(mapping, first, last); 57 return -ret; 58} 59 60int 61xfs_flush_pages( 62 xfs_inode_t *ip, 63 xfs_off_t first, 64 xfs_off_t last, 65 uint64_t flags, 66 int fiopt) 67{ 68 struct address_space *mapping = VFS_I(ip)->i_mapping; 69 int ret = 0; 70 int ret2; 71 72 xfs_iflags_clear(ip, XFS_ITRUNCATED); 73 ret = -filemap_fdatawrite_range(mapping, first, 74 last == -1 ? LLONG_MAX : last); 75 if (flags & XBF_ASYNC) 76 return ret; 77 ret2 = xfs_wait_on_pages(ip, first, last); 78 if (!ret) 79 ret = ret2; 80 return ret; 81} 82 83int 84xfs_wait_on_pages( 85 xfs_inode_t *ip, 86 xfs_off_t first, 87 xfs_off_t last) 88{ 89 struct address_space *mapping = VFS_I(ip)->i_mapping; 90 91 if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) { 92 return -filemap_fdatawait_range(mapping, first, 93 last == -1 ? XFS_ISIZE(ip) - 1 : last); 94 } 95 return 0; 96}