diff options
author | Steve French <sfrench@us.ibm.com> | 2005-06-22 21:26:47 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2005-06-22 21:26:47 -0400 |
commit | ea0daab4ae4a2f853f06c76961c0ed324fd0804c (patch) | |
tree | f6fbe2db5772695181b7a7257b05e43343bd8d75 /fs/xfs/linux-2.6/xfs_lrw.c | |
parent | 58aab753de605c14b9878a897e7349c3063afeff (diff) | |
parent | 1bdf7a78c2b21fb94dfe7994dbe89310b18479d2 (diff) |
Merge with rsync://rsync.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_lrw.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index aa9daaea6c34..acab58c48043 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -209,30 +209,6 @@ unlock: | |||
209 | return (-status); | 209 | return (-status); |
210 | } | 210 | } |
211 | 211 | ||
212 | /* | ||
213 | * xfs_inval_cached_pages | ||
214 | * | ||
215 | * This routine is responsible for keeping direct I/O and buffered I/O | ||
216 | * somewhat coherent. From here we make sure that we're at least | ||
217 | * temporarily holding the inode I/O lock exclusively and then call | ||
218 | * the page cache to flush and invalidate any cached pages. If there | ||
219 | * are no cached pages this routine will be very quick. | ||
220 | */ | ||
221 | void | ||
222 | xfs_inval_cached_pages( | ||
223 | vnode_t *vp, | ||
224 | xfs_iocore_t *io, | ||
225 | xfs_off_t offset, | ||
226 | int write, | ||
227 | int relock) | ||
228 | { | ||
229 | if (VN_CACHED(vp)) { | ||
230 | xfs_inval_cached_trace(io, offset, -1, ctooff(offtoct(offset)), -1); | ||
231 | VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(offset)), -1, FI_REMAPF_LOCKED); | ||
232 | } | ||
233 | |||
234 | } | ||
235 | |||
236 | ssize_t /* bytes read, or (-) error */ | 212 | ssize_t /* bytes read, or (-) error */ |
237 | xfs_read( | 213 | xfs_read( |
238 | bhv_desc_t *bdp, | 214 | bhv_desc_t *bdp, |
@@ -304,10 +280,11 @@ xfs_read( | |||
304 | if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ) && | 280 | if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ) && |
305 | !(ioflags & IO_INVIS)) { | 281 | !(ioflags & IO_INVIS)) { |
306 | vrwlock_t locktype = VRWLOCK_READ; | 282 | vrwlock_t locktype = VRWLOCK_READ; |
283 | int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); | ||
307 | 284 | ||
308 | ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, | 285 | ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, |
309 | BHV_TO_VNODE(bdp), *offset, size, | 286 | BHV_TO_VNODE(bdp), *offset, size, |
310 | FILP_DELAY_FLAG(file), &locktype); | 287 | dmflags, &locktype); |
311 | if (ret) { | 288 | if (ret) { |
312 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 289 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
313 | goto unlock_isem; | 290 | goto unlock_isem; |
@@ -867,11 +844,15 @@ retry: | |||
867 | !(ioflags & IO_INVIS)) { | 844 | !(ioflags & IO_INVIS)) { |
868 | 845 | ||
869 | xfs_rwunlock(bdp, locktype); | 846 | xfs_rwunlock(bdp, locktype); |
847 | if (need_isem) | ||
848 | up(&inode->i_sem); | ||
870 | error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp, | 849 | error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp, |
871 | DM_RIGHT_NULL, vp, DM_RIGHT_NULL, NULL, NULL, | 850 | DM_RIGHT_NULL, vp, DM_RIGHT_NULL, NULL, NULL, |
872 | 0, 0, 0); /* Delay flag intentionally unused */ | 851 | 0, 0, 0); /* Delay flag intentionally unused */ |
873 | if (error) | 852 | if (error) |
874 | goto out_unlock_isem; | 853 | goto out_nounlocks; |
854 | if (need_isem) | ||
855 | down(&inode->i_sem); | ||
875 | xfs_rwlock(bdp, locktype); | 856 | xfs_rwlock(bdp, locktype); |
876 | pos = xip->i_d.di_size; | 857 | pos = xip->i_d.di_size; |
877 | ret = 0; | 858 | ret = 0; |
@@ -986,6 +967,7 @@ retry: | |||
986 | out_unlock_isem: | 967 | out_unlock_isem: |
987 | if (need_isem) | 968 | if (need_isem) |
988 | up(&inode->i_sem); | 969 | up(&inode->i_sem); |
970 | out_nounlocks: | ||
989 | return -error; | 971 | return -error; |
990 | } | 972 | } |
991 | 973 | ||