2005-04-16 15:20:36 -07:00
/*
2006-06-09 15:27:16 +10:00
* Copyright ( c ) 2000 - 2002 , 2005 - 2006 Silicon Graphics , Inc .
2005-11-02 14:58:39 +11:00
* All Rights Reserved .
2005-04-16 15:20:36 -07:00
*
2005-11-02 14:58:39 +11:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-16 15:20:36 -07:00
* published by the Free Software Foundation .
*
2005-11-02 14:58:39 +11:00
* This program is distributed in the hope that it would be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2005-04-16 15:20:36 -07:00
*
2005-11-02 14:58:39 +11:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
2005-04-16 15:20:36 -07:00
*/
# include "xfs.h"
2007-08-28 16:12:30 +10:00
# include "xfs_vnodeops.h"
# include "xfs_bmap_btree.h"
# include "xfs_inode.h"
2009-12-14 23:14:59 +00:00
# include "xfs_trace.h"
2005-04-16 15:20:36 -07:00
2008-11-28 14:23:33 +11:00
/*
* note : all filemap functions return negative error codes . These
* need to be inverted before returning to the xfs core functions .
*/
2005-04-16 15:20:36 -07:00
void
2007-08-28 16:12:30 +10:00
xfs_tosspages (
xfs_inode_t * ip ,
2005-04-16 15:20:36 -07:00
xfs_off_t first ,
xfs_off_t last ,
int fiopt )
{
2010-08-24 12:01:50 +10:00
/* can't toss partial tail pages, so mask them out */
last & = ~ ( PAGE_SIZE - 1 ) ;
truncate_inode_pages_range ( VFS_I ( ip ) - > i_mapping , first , last - 1 ) ;
2005-04-16 15:20:36 -07:00
}
2007-05-08 13:49:27 +10:00
int
2007-08-28 16:12:30 +10:00
xfs_flushinval_pages (
xfs_inode_t * ip ,
2005-04-16 15:20:36 -07:00
xfs_off_t first ,
xfs_off_t last ,
int fiopt )
{
2008-08-13 15:45:15 +10:00
struct address_space * mapping = VFS_I ( ip ) - > i_mapping ;
2007-05-08 13:49:27 +10:00
int ret = 0 ;
2005-04-16 15:20:36 -07:00
2009-12-14 23:14:59 +00:00
trace_xfs_pagecache_inval ( ip , first , last ) ;
2010-08-24 12:01:50 +10:00
xfs_iflags_clear ( ip , XFS_ITRUNCATED ) ;
ret = filemap_write_and_wait_range ( mapping , first ,
last = = - 1 ? LLONG_MAX : last ) ;
if ( ! ret )
truncate_inode_pages_range ( mapping , first , last ) ;
2008-11-28 14:23:33 +11:00
return - ret ;
2005-04-16 15:20:36 -07:00
}
int
2007-08-28 16:12:30 +10:00
xfs_flush_pages (
xfs_inode_t * ip ,
2005-04-16 15:20:36 -07:00
xfs_off_t first ,
xfs_off_t last ,
uint64_t flags ,
int fiopt )
{
2008-08-13 15:45:15 +10:00
struct address_space * mapping = VFS_I ( ip ) - > i_mapping ;
2007-05-08 13:49:27 +10:00
int ret = 0 ;
int ret2 ;
2005-04-16 15:20:36 -07:00
2010-08-24 12:01:50 +10:00
xfs_iflags_clear ( ip , XFS_ITRUNCATED ) ;
ret = - filemap_fdatawrite_range ( mapping , first ,
last = = - 1 ? LLONG_MAX : last ) ;
2010-01-19 09:56:44 +00:00
if ( flags & XBF_ASYNC )
2009-04-06 18:44:54 +02:00
return ret ;
ret2 = xfs_wait_on_pages ( ip , first , last ) ;
if ( ! ret )
ret = ret2 ;
return ret ;
2008-11-28 14:23:33 +11:00
}
int
xfs_wait_on_pages (
xfs_inode_t * ip ,
xfs_off_t first ,
xfs_off_t last )
{
struct address_space * mapping = VFS_I ( ip ) - > i_mapping ;
2010-08-24 12:01:50 +10:00
if ( mapping_tagged ( mapping , PAGECACHE_TAG_WRITEBACK ) ) {
return - filemap_fdatawait_range ( mapping , first ,
2011-12-18 20:00:11 +00:00
last = = - 1 ? XFS_ISIZE ( ip ) - 1 : last ) ;
2010-08-24 12:01:50 +10:00
}
2008-11-28 14:23:33 +11:00
return 0 ;
2005-04-16 15:20:36 -07:00
}