2005-04-16 15:20:36 -07:00
/*
2005-11-02 14:58:39 +11:00
* Copyright ( c ) 2000 - 2002 , 2005 Silicon Graphics , Inc .
* 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"
/*
* Stub for no - op vnode operations that return error status .
*/
int
fs_noerr ( void )
{
return 0 ;
}
/*
* Operation unsupported under this file system .
*/
int
fs_nosys ( void )
{
return ENOSYS ;
}
/*
* Stub for inactive , strategy , and read / write lock / unlock . Does nothing .
*/
/* ARGSUSED */
void
fs_noval ( void )
{
}
/*
* vnode pcache layer for vnode_tosspages .
* ' last ' parameter unused but left in for IRIX compatibility
*/
void
fs_tosspages (
bhv_desc_t * bdp ,
xfs_off_t first ,
xfs_off_t last ,
int fiopt )
{
vnode_t * vp = BHV_TO_VNODE ( bdp ) ;
2006-03-17 17:25:36 +11:00
struct inode * ip = vn_to_inode ( vp ) ;
2005-04-16 15:20:36 -07:00
if ( VN_CACHED ( vp ) )
truncate_inode_pages ( ip - > i_mapping , first ) ;
}
/*
* vnode pcache layer for vnode_flushinval_pages .
* ' last ' parameter unused but left in for IRIX compatibility
*/
void
fs_flushinval_pages (
bhv_desc_t * bdp ,
xfs_off_t first ,
xfs_off_t last ,
int fiopt )
{
vnode_t * vp = BHV_TO_VNODE ( bdp ) ;
2006-03-17 17:25:36 +11:00
struct inode * ip = vn_to_inode ( vp ) ;
2005-04-16 15:20:36 -07:00
if ( VN_CACHED ( vp ) ) {
[PATCH] Fix and add EXPORT_SYMBOL(filemap_write_and_wait)
This patch add EXPORT_SYMBOL(filemap_write_and_wait) and use it.
See mm/filemap.c:
And changes the filemap_write_and_wait() and filemap_write_and_wait_range().
Current filemap_write_and_wait() doesn't wait if filemap_fdatawrite()
returns error. However, even if filemap_fdatawrite() returned an
error, it may have submitted the partially data pages to the device.
(e.g. in the case of -ENOSPC)
<quotation>
Andrew Morton writes,
If filemap_fdatawrite() returns an error, this might be due to some
I/O problem: dead disk, unplugged cable, etc. Given the generally
crappy quality of the kernel's handling of such exceptions, there's a
good chance that the filemap_fdatawait() will get stuck in D state
forever.
</quotation>
So, this patch doesn't wait if filemap_fdatawrite() returns the -EIO.
Trond, could you please review the nfs part? Especially I'm not sure,
nfs must use the "filemap_fdatawrite(inode->i_mapping) == 0", or not.
Acked-by: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-01-08 01:02:14 -08:00
filemap_write_and_wait ( ip - > i_mapping ) ;
2005-04-16 15:20:36 -07:00
truncate_inode_pages ( ip - > i_mapping , first ) ;
}
}
/*
* vnode pcache layer for vnode_flush_pages .
* ' last ' parameter unused but left in for IRIX compatibility
*/
int
fs_flush_pages (
bhv_desc_t * bdp ,
xfs_off_t first ,
xfs_off_t last ,
uint64_t flags ,
int fiopt )
{
vnode_t * vp = BHV_TO_VNODE ( bdp ) ;
2006-03-17 17:25:36 +11:00
struct inode * ip = vn_to_inode ( vp ) ;
2005-04-16 15:20:36 -07:00
if ( VN_CACHED ( vp ) ) {
filemap_fdatawrite ( ip - > i_mapping ) ;
2005-11-02 10:32:38 +11:00
if ( flags & XFS_B_ASYNC )
return 0 ;
2005-04-16 15:20:36 -07:00
filemap_fdatawait ( ip - > i_mapping ) ;
}
return 0 ;
}