diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_lrw.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 94 |
1 files changed, 12 insertions, 82 deletions
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 072050f8d346..0d32457abef1 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -48,73 +48,12 @@ | |||
48 | #include "xfs_utils.h" | 48 | #include "xfs_utils.h" |
49 | #include "xfs_iomap.h" | 49 | #include "xfs_iomap.h" |
50 | #include "xfs_vnodeops.h" | 50 | #include "xfs_vnodeops.h" |
51 | #include "xfs_trace.h" | ||
51 | 52 | ||
52 | #include <linux/capability.h> | 53 | #include <linux/capability.h> |
53 | #include <linux/writeback.h> | 54 | #include <linux/writeback.h> |
54 | 55 | ||
55 | 56 | ||
56 | #if defined(XFS_RW_TRACE) | ||
57 | void | ||
58 | xfs_rw_enter_trace( | ||
59 | int tag, | ||
60 | xfs_inode_t *ip, | ||
61 | void *data, | ||
62 | size_t segs, | ||
63 | loff_t offset, | ||
64 | int ioflags) | ||
65 | { | ||
66 | if (ip->i_rwtrace == NULL) | ||
67 | return; | ||
68 | ktrace_enter(ip->i_rwtrace, | ||
69 | (void *)(unsigned long)tag, | ||
70 | (void *)ip, | ||
71 | (void *)((unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff)), | ||
72 | (void *)((unsigned long)(ip->i_d.di_size & 0xffffffff)), | ||
73 | (void *)data, | ||
74 | (void *)((unsigned long)segs), | ||
75 | (void *)((unsigned long)((offset >> 32) & 0xffffffff)), | ||
76 | (void *)((unsigned long)(offset & 0xffffffff)), | ||
77 | (void *)((unsigned long)ioflags), | ||
78 | (void *)((unsigned long)((ip->i_new_size >> 32) & 0xffffffff)), | ||
79 | (void *)((unsigned long)(ip->i_new_size & 0xffffffff)), | ||
80 | (void *)((unsigned long)current_pid()), | ||
81 | (void *)NULL, | ||
82 | (void *)NULL, | ||
83 | (void *)NULL, | ||
84 | (void *)NULL); | ||
85 | } | ||
86 | |||
87 | void | ||
88 | xfs_inval_cached_trace( | ||
89 | xfs_inode_t *ip, | ||
90 | xfs_off_t offset, | ||
91 | xfs_off_t len, | ||
92 | xfs_off_t first, | ||
93 | xfs_off_t last) | ||
94 | { | ||
95 | |||
96 | if (ip->i_rwtrace == NULL) | ||
97 | return; | ||
98 | ktrace_enter(ip->i_rwtrace, | ||
99 | (void *)(__psint_t)XFS_INVAL_CACHED, | ||
100 | (void *)ip, | ||
101 | (void *)((unsigned long)((offset >> 32) & 0xffffffff)), | ||
102 | (void *)((unsigned long)(offset & 0xffffffff)), | ||
103 | (void *)((unsigned long)((len >> 32) & 0xffffffff)), | ||
104 | (void *)((unsigned long)(len & 0xffffffff)), | ||
105 | (void *)((unsigned long)((first >> 32) & 0xffffffff)), | ||
106 | (void *)((unsigned long)(first & 0xffffffff)), | ||
107 | (void *)((unsigned long)((last >> 32) & 0xffffffff)), | ||
108 | (void *)((unsigned long)(last & 0xffffffff)), | ||
109 | (void *)((unsigned long)current_pid()), | ||
110 | (void *)NULL, | ||
111 | (void *)NULL, | ||
112 | (void *)NULL, | ||
113 | (void *)NULL, | ||
114 | (void *)NULL); | ||
115 | } | ||
116 | #endif | ||
117 | |||
118 | /* | 57 | /* |
119 | * xfs_iozero | 58 | * xfs_iozero |
120 | * | 59 | * |
@@ -250,13 +189,10 @@ xfs_read( | |||
250 | } | 189 | } |
251 | } | 190 | } |
252 | 191 | ||
253 | xfs_rw_enter_trace(XFS_READ_ENTER, ip, | 192 | trace_xfs_file_read(ip, size, *offset, ioflags); |
254 | (void *)iovp, segs, *offset, ioflags); | ||
255 | 193 | ||
256 | iocb->ki_pos = *offset; | 194 | iocb->ki_pos = *offset; |
257 | ret = generic_file_aio_read(iocb, iovp, segs, *offset); | 195 | ret = generic_file_aio_read(iocb, iovp, segs, *offset); |
258 | if (ret == -EIOCBQUEUED && !(ioflags & IO_ISAIO)) | ||
259 | ret = wait_on_sync_kiocb(iocb); | ||
260 | if (ret > 0) | 196 | if (ret > 0) |
261 | XFS_STATS_ADD(xs_read_bytes, ret); | 197 | XFS_STATS_ADD(xs_read_bytes, ret); |
262 | 198 | ||
@@ -294,8 +230,9 @@ xfs_splice_read( | |||
294 | return -error; | 230 | return -error; |
295 | } | 231 | } |
296 | } | 232 | } |
297 | xfs_rw_enter_trace(XFS_SPLICE_READ_ENTER, ip, | 233 | |
298 | pipe, count, *ppos, ioflags); | 234 | trace_xfs_file_splice_read(ip, count, *ppos, ioflags); |
235 | |||
299 | ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); | 236 | ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); |
300 | if (ret > 0) | 237 | if (ret > 0) |
301 | XFS_STATS_ADD(xs_read_bytes, ret); | 238 | XFS_STATS_ADD(xs_read_bytes, ret); |
@@ -344,8 +281,8 @@ xfs_splice_write( | |||
344 | ip->i_new_size = new_size; | 281 | ip->i_new_size = new_size; |
345 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 282 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
346 | 283 | ||
347 | xfs_rw_enter_trace(XFS_SPLICE_WRITE_ENTER, ip, | 284 | trace_xfs_file_splice_write(ip, count, *ppos, ioflags); |
348 | pipe, count, *ppos, ioflags); | 285 | |
349 | ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); | 286 | ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); |
350 | if (ret > 0) | 287 | if (ret > 0) |
351 | XFS_STATS_ADD(xs_write_bytes, ret); | 288 | XFS_STATS_ADD(xs_write_bytes, ret); |
@@ -712,8 +649,6 @@ start: | |||
712 | if ((ioflags & IO_ISDIRECT)) { | 649 | if ((ioflags & IO_ISDIRECT)) { |
713 | if (mapping->nrpages) { | 650 | if (mapping->nrpages) { |
714 | WARN_ON(need_i_mutex == 0); | 651 | WARN_ON(need_i_mutex == 0); |
715 | xfs_inval_cached_trace(xip, pos, -1, | ||
716 | (pos & PAGE_CACHE_MASK), -1); | ||
717 | error = xfs_flushinval_pages(xip, | 652 | error = xfs_flushinval_pages(xip, |
718 | (pos & PAGE_CACHE_MASK), | 653 | (pos & PAGE_CACHE_MASK), |
719 | -1, FI_REMAPF_LOCKED); | 654 | -1, FI_REMAPF_LOCKED); |
@@ -730,8 +665,7 @@ start: | |||
730 | need_i_mutex = 0; | 665 | need_i_mutex = 0; |
731 | } | 666 | } |
732 | 667 | ||
733 | xfs_rw_enter_trace(XFS_DIOWR_ENTER, xip, (void *)iovp, segs, | 668 | trace_xfs_file_direct_write(xip, count, *offset, ioflags); |
734 | *offset, ioflags); | ||
735 | ret = generic_file_direct_write(iocb, iovp, | 669 | ret = generic_file_direct_write(iocb, iovp, |
736 | &segs, pos, offset, count, ocount); | 670 | &segs, pos, offset, count, ocount); |
737 | 671 | ||
@@ -754,8 +688,7 @@ start: | |||
754 | ssize_t ret2 = 0; | 688 | ssize_t ret2 = 0; |
755 | 689 | ||
756 | write_retry: | 690 | write_retry: |
757 | xfs_rw_enter_trace(XFS_WRITE_ENTER, xip, (void *)iovp, segs, | 691 | trace_xfs_file_buffered_write(xip, count, *offset, ioflags); |
758 | *offset, ioflags); | ||
759 | ret2 = generic_file_buffered_write(iocb, iovp, segs, | 692 | ret2 = generic_file_buffered_write(iocb, iovp, segs, |
760 | pos, offset, count, ret); | 693 | pos, offset, count, ret); |
761 | /* | 694 | /* |
@@ -774,9 +707,6 @@ write_retry: | |||
774 | 707 | ||
775 | current->backing_dev_info = NULL; | 708 | current->backing_dev_info = NULL; |
776 | 709 | ||
777 | if (ret == -EIOCBQUEUED && !(ioflags & IO_ISAIO)) | ||
778 | ret = wait_on_sync_kiocb(iocb); | ||
779 | |||
780 | isize = i_size_read(inode); | 710 | isize = i_size_read(inode); |
781 | if (unlikely(ret < 0 && ret != -EFAULT && *offset > isize)) | 711 | if (unlikely(ret < 0 && ret != -EFAULT && *offset > isize)) |
782 | *offset = isize; | 712 | *offset = isize; |
@@ -811,7 +741,7 @@ write_retry: | |||
811 | XFS_STATS_ADD(xs_write_bytes, ret); | 741 | XFS_STATS_ADD(xs_write_bytes, ret); |
812 | 742 | ||
813 | /* Handle various SYNC-type writes */ | 743 | /* Handle various SYNC-type writes */ |
814 | if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) { | 744 | if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { |
815 | loff_t end = pos + ret - 1; | 745 | loff_t end = pos + ret - 1; |
816 | int error2; | 746 | int error2; |
817 | 747 | ||
@@ -863,7 +793,7 @@ int | |||
863 | xfs_bdstrat_cb(struct xfs_buf *bp) | 793 | xfs_bdstrat_cb(struct xfs_buf *bp) |
864 | { | 794 | { |
865 | if (XFS_FORCED_SHUTDOWN(bp->b_mount)) { | 795 | if (XFS_FORCED_SHUTDOWN(bp->b_mount)) { |
866 | xfs_buftrace("XFS__BDSTRAT IOERROR", bp); | 796 | trace_xfs_bdstrat_shut(bp, _RET_IP_); |
867 | /* | 797 | /* |
868 | * Metadata write that didn't get logged but | 798 | * Metadata write that didn't get logged but |
869 | * written delayed anyway. These aren't associated | 799 | * written delayed anyway. These aren't associated |
@@ -896,7 +826,7 @@ xfsbdstrat( | |||
896 | return; | 826 | return; |
897 | } | 827 | } |
898 | 828 | ||
899 | xfs_buftrace("XFSBDSTRAT IOERROR", bp); | 829 | trace_xfs_bdstrat_shut(bp, _RET_IP_); |
900 | xfs_bioerror_relse(bp); | 830 | xfs_bioerror_relse(bp); |
901 | } | 831 | } |
902 | 832 | ||