diff options
author | Lachlan McIlroy <lachlan@sgi.com> | 2007-05-07 23:49:27 -0400 |
---|---|---|
committer | Tim Shimmin <tes@sgi.com> | 2007-05-07 23:49:27 -0400 |
commit | d3cf209476b72c83907a412b6708c5e498410aa7 (patch) | |
tree | 5e7a85751ae03b9eb3110e1cfc147b3492ae0fa5 /fs/xfs/linux-2.6 | |
parent | 424ea91ba61c1cdc2dac68576c97030cbf47d84f (diff) |
[XFS] propogate return codes from flush routines
This patch handles error return values in fs_flush_pages and
fs_flushinval_pages. It changes the prototype of fs_flushinval_pages so we
can propogate the errors and handle them at higher layers. I also modified
xfs_itruncate_start so that it could propogate the error further.
SGI-PV: 961990
SGI-Modid: xfs-linux-melb:xfs-kern:28231a
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: Stewart Smith <stewart@flamingspork.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
Diffstat (limited to 'fs/xfs/linux-2.6')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_fs_subr.c | 21 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_fs_subr.h | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 12 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 2 |
4 files changed, 25 insertions, 12 deletions
diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.c b/fs/xfs/linux-2.6/xfs_fs_subr.c index dc0562828e76..2eb87cd082af 100644 --- a/fs/xfs/linux-2.6/xfs_fs_subr.c +++ b/fs/xfs/linux-2.6/xfs_fs_subr.c | |||
@@ -35,7 +35,7 @@ fs_tosspages( | |||
35 | truncate_inode_pages(ip->i_mapping, first); | 35 | truncate_inode_pages(ip->i_mapping, first); |
36 | } | 36 | } |
37 | 37 | ||
38 | void | 38 | int |
39 | fs_flushinval_pages( | 39 | fs_flushinval_pages( |
40 | bhv_desc_t *bdp, | 40 | bhv_desc_t *bdp, |
41 | xfs_off_t first, | 41 | xfs_off_t first, |
@@ -44,13 +44,16 @@ fs_flushinval_pages( | |||
44 | { | 44 | { |
45 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); | 45 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); |
46 | struct inode *ip = vn_to_inode(vp); | 46 | struct inode *ip = vn_to_inode(vp); |
47 | int ret = 0; | ||
47 | 48 | ||
48 | if (VN_CACHED(vp)) { | 49 | if (VN_CACHED(vp)) { |
49 | if (VN_TRUNC(vp)) | 50 | if (VN_TRUNC(vp)) |
50 | VUNTRUNCATE(vp); | 51 | VUNTRUNCATE(vp); |
51 | filemap_write_and_wait(ip->i_mapping); | 52 | ret = filemap_write_and_wait(ip->i_mapping); |
52 | truncate_inode_pages(ip->i_mapping, first); | 53 | if (!ret) |
54 | truncate_inode_pages(ip->i_mapping, first); | ||
53 | } | 55 | } |
56 | return ret; | ||
54 | } | 57 | } |
55 | 58 | ||
56 | int | 59 | int |
@@ -63,14 +66,18 @@ fs_flush_pages( | |||
63 | { | 66 | { |
64 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); | 67 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); |
65 | struct inode *ip = vn_to_inode(vp); | 68 | struct inode *ip = vn_to_inode(vp); |
69 | int ret = 0; | ||
70 | int ret2; | ||
66 | 71 | ||
67 | if (VN_DIRTY(vp)) { | 72 | if (VN_DIRTY(vp)) { |
68 | if (VN_TRUNC(vp)) | 73 | if (VN_TRUNC(vp)) |
69 | VUNTRUNCATE(vp); | 74 | VUNTRUNCATE(vp); |
70 | filemap_fdatawrite(ip->i_mapping); | 75 | ret = filemap_fdatawrite(ip->i_mapping); |
71 | if (flags & XFS_B_ASYNC) | 76 | if (flags & XFS_B_ASYNC) |
72 | return 0; | 77 | return ret; |
73 | filemap_fdatawait(ip->i_mapping); | 78 | ret2 = filemap_fdatawait(ip->i_mapping); |
79 | if (!ret) | ||
80 | ret = ret2; | ||
74 | } | 81 | } |
75 | return 0; | 82 | return ret; |
76 | } | 83 | } |
diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.h b/fs/xfs/linux-2.6/xfs_fs_subr.h index aee9ccdd18f7..c1b53118a303 100644 --- a/fs/xfs/linux-2.6/xfs_fs_subr.h +++ b/fs/xfs/linux-2.6/xfs_fs_subr.h | |||
@@ -23,7 +23,7 @@ extern int fs_noerr(void); | |||
23 | extern int fs_nosys(void); | 23 | extern int fs_nosys(void); |
24 | extern void fs_noval(void); | 24 | extern void fs_noval(void); |
25 | extern void fs_tosspages(bhv_desc_t *, xfs_off_t, xfs_off_t, int); | 25 | extern void fs_tosspages(bhv_desc_t *, xfs_off_t, xfs_off_t, int); |
26 | extern void fs_flushinval_pages(bhv_desc_t *, xfs_off_t, xfs_off_t, int); | 26 | extern int fs_flushinval_pages(bhv_desc_t *, xfs_off_t, xfs_off_t, int); |
27 | extern int fs_flush_pages(bhv_desc_t *, xfs_off_t, xfs_off_t, uint64_t, int); | 27 | extern int fs_flush_pages(bhv_desc_t *, xfs_off_t, xfs_off_t, uint64_t, int); |
28 | 28 | ||
29 | #endif /* __XFS_FS_SUBR_H__ */ | 29 | #endif /* __XFS_FS_SUBR_H__ */ |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index ff8d64eba9f8..8e46c9798fbf 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -191,7 +191,7 @@ xfs_read( | |||
191 | struct file *file = iocb->ki_filp; | 191 | struct file *file = iocb->ki_filp; |
192 | struct inode *inode = file->f_mapping->host; | 192 | struct inode *inode = file->f_mapping->host; |
193 | size_t size = 0; | 193 | size_t size = 0; |
194 | ssize_t ret; | 194 | ssize_t ret = 0; |
195 | xfs_fsize_t n; | 195 | xfs_fsize_t n; |
196 | xfs_inode_t *ip; | 196 | xfs_inode_t *ip; |
197 | xfs_mount_t *mp; | 197 | xfs_mount_t *mp; |
@@ -263,9 +263,13 @@ xfs_read( | |||
263 | 263 | ||
264 | if (unlikely(ioflags & IO_ISDIRECT)) { | 264 | if (unlikely(ioflags & IO_ISDIRECT)) { |
265 | if (VN_CACHED(vp)) | 265 | if (VN_CACHED(vp)) |
266 | bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)), | 266 | ret = bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)), |
267 | -1, FI_REMAPF_LOCKED); | 267 | -1, FI_REMAPF_LOCKED); |
268 | mutex_unlock(&inode->i_mutex); | 268 | mutex_unlock(&inode->i_mutex); |
269 | if (ret) { | ||
270 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
271 | return ret; | ||
272 | } | ||
269 | } | 273 | } |
270 | 274 | ||
271 | xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore, | 275 | xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore, |
@@ -814,8 +818,10 @@ retry: | |||
814 | if (need_flush) { | 818 | if (need_flush) { |
815 | xfs_inval_cached_trace(io, pos, -1, | 819 | xfs_inval_cached_trace(io, pos, -1, |
816 | ctooff(offtoct(pos)), -1); | 820 | ctooff(offtoct(pos)), -1); |
817 | bhv_vop_flushinval_pages(vp, ctooff(offtoct(pos)), | 821 | error = bhv_vop_flushinval_pages(vp, ctooff(offtoct(pos)), |
818 | -1, FI_REMAPF_LOCKED); | 822 | -1, FI_REMAPF_LOCKED); |
823 | if (error) | ||
824 | goto out_unlock_internal; | ||
819 | } | 825 | } |
820 | 826 | ||
821 | if (need_i_mutex) { | 827 | if (need_i_mutex) { |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index b76118cf4897..d1b2d01843d1 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
@@ -194,7 +194,7 @@ typedef int (*vop_attr_list_t)(bhv_desc_t *, char *, int, int, | |||
194 | typedef void (*vop_link_removed_t)(bhv_desc_t *, bhv_vnode_t *, int); | 194 | typedef void (*vop_link_removed_t)(bhv_desc_t *, bhv_vnode_t *, int); |
195 | typedef void (*vop_vnode_change_t)(bhv_desc_t *, bhv_vchange_t, __psint_t); | 195 | typedef void (*vop_vnode_change_t)(bhv_desc_t *, bhv_vchange_t, __psint_t); |
196 | typedef void (*vop_ptossvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, int); | 196 | typedef void (*vop_ptossvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, int); |
197 | typedef void (*vop_pflushinvalvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, int); | 197 | typedef int (*vop_pflushinvalvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, int); |
198 | typedef int (*vop_pflushvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, | 198 | typedef int (*vop_pflushvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, |
199 | uint64_t, int); | 199 | uint64_t, int); |
200 | typedef int (*vop_iflush_t)(bhv_desc_t *, int); | 200 | typedef int (*vop_iflush_t)(bhv_desc_t *, int); |