|
|
| version 1.269, 2007/09/21 04:08:28 | version 1.270, 2007/09/21 16:10:12 |
|---|---|
| Line 58 | Line 58 |
| void | void |
| xfs_rw_enter_trace( | xfs_rw_enter_trace( |
| int tag, | int tag, |
| xfs_iocore_t *io, | xfs_inode_t *ip, |
| void *data, | void *data, |
| size_t segs, | size_t segs, |
| loff_t offset, | loff_t offset, |
| int ioflags) | int ioflags) |
| { | { |
| xfs_inode_t *ip = XFS_IO_INODE(io); | |
| if (ip->i_rwtrace == NULL) | if (ip->i_rwtrace == NULL) |
| return; | return; |
| ktrace_enter(ip->i_rwtrace, | ktrace_enter(ip->i_rwtrace, |
| Line 78 xfs_rw_enter_trace( | Line 76 xfs_rw_enter_trace( |
| (void *)((unsigned long)((offset >> 32) & 0xffffffff)), | (void *)((unsigned long)((offset >> 32) & 0xffffffff)), |
| (void *)((unsigned long)(offset & 0xffffffff)), | (void *)((unsigned long)(offset & 0xffffffff)), |
| (void *)((unsigned long)ioflags), | (void *)((unsigned long)ioflags), |
| (void *)((unsigned long)((io->io_new_size >> 32) & 0xffffffff)), | (void *)((unsigned long)((ip->i_new_size >> 32) & 0xffffffff)), |
| (void *)((unsigned long)(io->io_new_size & 0xffffffff)), | (void *)((unsigned long)(ip->i_new_size & 0xffffffff)), |
| (void *)((unsigned long)current_pid()), | (void *)((unsigned long)current_pid()), |
| (void *)NULL, | (void *)NULL, |
| (void *)NULL, | (void *)NULL, |
| Line 89 xfs_rw_enter_trace( | Line 87 xfs_rw_enter_trace( |
| void | void |
| xfs_inval_cached_trace( | xfs_inval_cached_trace( |
| xfs_iocore_t *io, | xfs_inode_t *ip, |
| xfs_off_t offset, | xfs_off_t offset, |
| xfs_off_t len, | xfs_off_t len, |
| xfs_off_t first, | xfs_off_t first, |
| xfs_off_t last) | xfs_off_t last) |
| { | { |
| xfs_inode_t *ip = XFS_IO_INODE(io); | |
| if (ip->i_rwtrace == NULL) | if (ip->i_rwtrace == NULL) |
| return; | return; |
| Line 267 xfs_read( | Line 264 xfs_read( |
| } | } |
| } | } |
| xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore, | xfs_rw_enter_trace(XFS_READ_ENTER, ip, |
| (void *)iovp, segs, *offset, ioflags); | (void *)iovp, segs, *offset, ioflags); |
| iocb->ki_pos = *offset; | iocb->ki_pos = *offset; |
| Line 312 xfs_splice_read( | Line 309 xfs_splice_read( |
| return -error; | return -error; |
| } | } |
| } | } |
| xfs_rw_enter_trace(XFS_SPLICE_READ_ENTER, &ip->i_iocore, | xfs_rw_enter_trace(XFS_SPLICE_READ_ENTER, ip, |
| pipe, count, *ppos, ioflags); | pipe, count, *ppos, ioflags); |
| ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); | ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); |
| if (ret > 0) | if (ret > 0) |
| Line 334 xfs_splice_write( | Line 331 xfs_splice_write( |
| { | { |
| bhv_vnode_t *vp = XFS_ITOV(ip); | bhv_vnode_t *vp = XFS_ITOV(ip); |
| xfs_mount_t *mp = ip->i_mount; | xfs_mount_t *mp = ip->i_mount; |
| xfs_iocore_t *io = &ip->i_iocore; | |
| ssize_t ret; | ssize_t ret; |
| struct inode *inode = outfilp->f_mapping->host; | struct inode *inode = outfilp->f_mapping->host; |
| xfs_fsize_t isize, new_size; | xfs_fsize_t isize, new_size; |
| Line 361 xfs_splice_write( | Line 357 xfs_splice_write( |
| xfs_ilock(ip, XFS_ILOCK_EXCL); | xfs_ilock(ip, XFS_ILOCK_EXCL); |
| if (new_size > ip->i_size) | if (new_size > ip->i_size) |
| io->io_new_size = new_size; | ip->i_new_size = new_size; |
| xfs_iunlock(ip, XFS_ILOCK_EXCL); | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| xfs_rw_enter_trace(XFS_SPLICE_WRITE_ENTER, &ip->i_iocore, | xfs_rw_enter_trace(XFS_SPLICE_WRITE_ENTER, ip, |
| pipe, count, *ppos, ioflags); | pipe, count, *ppos, ioflags); |
| ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); | ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); |
| if (ret > 0) | if (ret > 0) |
| Line 381 xfs_splice_write( | Line 377 xfs_splice_write( |
| xfs_iunlock(ip, XFS_ILOCK_EXCL); | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| } | } |
| if (io->io_new_size) { | if (ip->i_new_size) { |
| xfs_ilock(ip, XFS_ILOCK_EXCL); | xfs_ilock(ip, XFS_ILOCK_EXCL); |
| io->io_new_size = 0; | ip->i_new_size = 0; |
| if (ip->i_d.di_size > ip->i_size) | if (ip->i_d.di_size > ip->i_size) |
| ip->i_d.di_size = ip->i_size; | ip->i_d.di_size = ip->i_size; |
| xfs_iunlock(ip, XFS_ILOCK_EXCL); | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| Line 472 xfs_zero_eof( | Line 468 xfs_zero_eof( |
| xfs_off_t offset, /* starting I/O offset */ | xfs_off_t offset, /* starting I/O offset */ |
| xfs_fsize_t isize) /* current inode size */ | xfs_fsize_t isize) /* current inode size */ |
| { | { |
| xfs_iocore_t *io = &ip->i_iocore; | xfs_mount_t *mp = ip->i_mount; |
| xfs_fileoff_t start_zero_fsb; | xfs_fileoff_t start_zero_fsb; |
| xfs_fileoff_t end_zero_fsb; | xfs_fileoff_t end_zero_fsb; |
| xfs_fileoff_t zero_count_fsb; | xfs_fileoff_t zero_count_fsb; |
| xfs_fileoff_t last_fsb; | xfs_fileoff_t last_fsb; |
| xfs_fileoff_t zero_off; | xfs_fileoff_t zero_off; |
| xfs_fsize_t zero_len; | xfs_fsize_t zero_len; |
| xfs_mount_t *mp = io->io_mount; | |
| int nimaps; | int nimaps; |
| int error = 0; | int error = 0; |
| xfs_bmbt_irec_t imap; | xfs_bmbt_irec_t imap; |
| ASSERT(ismrlocked(io->io_lock, MR_UPDATE)); | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); |
| ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); |
| ASSERT(offset > isize); | ASSERT(offset > isize); |
| /* | /* |
| Line 494 xfs_zero_eof( | Line 489 xfs_zero_eof( |
| */ | */ |
| error = xfs_zero_last_block(ip, offset, isize); | error = xfs_zero_last_block(ip, offset, isize); |
| if (error) { | if (error) { |
| ASSERT(ismrlocked(io->io_lock, MR_UPDATE)); | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); |
| ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); |
| return error; | return error; |
| } | } |
| Line 526 xfs_zero_eof( | Line 521 xfs_zero_eof( |
| error = xfs_bmapi(NULL, ip, start_zero_fsb, zero_count_fsb, | error = xfs_bmapi(NULL, ip, start_zero_fsb, zero_count_fsb, |
| 0, NULL, 0, &imap, &nimaps, NULL, NULL); | 0, NULL, 0, &imap, &nimaps, NULL, NULL); |
| if (error) { | if (error) { |
| ASSERT(ismrlocked(io->io_lock, MR_UPDATE)); | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); |
| ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); |
| return error; | return error; |
| } | } |
| ASSERT(nimaps > 0); | ASSERT(nimaps > 0); |
| Line 595 xfs_write( | Line 590 xfs_write( |
| xfs_mount_t *mp; | xfs_mount_t *mp; |
| ssize_t ret = 0, error = 0; | ssize_t ret = 0, error = 0; |
| xfs_fsize_t isize, new_size; | xfs_fsize_t isize, new_size; |
| xfs_iocore_t *io; | |
| int iolock; | int iolock; |
| int eventsent = 0; | int eventsent = 0; |
| bhv_vrwlock_t locktype; | bhv_vrwlock_t locktype; |
| Line 615 xfs_write( | Line 609 xfs_write( |
| if (count == 0) | if (count == 0) |
| return 0; | return 0; |
| io = &xip->i_iocore; | mp = xip->i_mount; |
| mp = io->io_mount; | |
| xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); | xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); |
| Line 696 start: | Line 689 start: |
| new_size = pos + count; | new_size = pos + count; |
| if (new_size > xip->i_size) | if (new_size > xip->i_size) |
| io->io_new_size = new_size; | xip->i_new_size = new_size; |
| if (likely(!(ioflags & IO_INVIS))) { | if (likely(!(ioflags & IO_INVIS))) { |
| file_update_time(file); | file_update_time(file); |
| Line 748 retry: | Line 741 retry: |
| if ((ioflags & IO_ISDIRECT)) { | if ((ioflags & IO_ISDIRECT)) { |
| if (VN_CACHED(vp)) { | if (VN_CACHED(vp)) { |
| WARN_ON(need_i_mutex == 0); | WARN_ON(need_i_mutex == 0); |
| xfs_inval_cached_trace(io, pos, -1, | xfs_inval_cached_trace(xip, pos, -1, |
| ctooff(offtoct(pos)), -1); | ctooff(offtoct(pos)), -1); |
| error = xfs_flushinval_pages(xip, | error = xfs_flushinval_pages(xip, |
| ctooff(offtoct(pos)), | ctooff(offtoct(pos)), |
| Line 767 retry: | Line 760 retry: |
| need_i_mutex = 0; | need_i_mutex = 0; |
| } | } |
| xfs_rw_enter_trace(XFS_DIOWR_ENTER, io, (void *)iovp, segs, | xfs_rw_enter_trace(XFS_DIOWR_ENTER, xip, (void *)iovp, segs, |
| *offset, ioflags); | *offset, ioflags); |
| ret = generic_file_direct_write(iocb, iovp, | ret = generic_file_direct_write(iocb, iovp, |
| &segs, pos, offset, count, ocount); | &segs, pos, offset, count, ocount); |
| Line 787 retry: | Line 780 retry: |
| goto relock; | goto relock; |
| } | } |
| } else { | } else { |
| xfs_rw_enter_trace(XFS_WRITE_ENTER, io, (void *)iovp, segs, | xfs_rw_enter_trace(XFS_WRITE_ENTER, xip, (void *)iovp, segs, |
| *offset, ioflags); | *offset, ioflags); |
| ret = generic_file_buffered_write(iocb, iovp, segs, | ret = generic_file_buffered_write(iocb, iovp, segs, |
| pos, offset, count, ret); | pos, offset, count, ret); |
| Line 851 retry: | Line 844 retry: |
| } | } |
| out_unlock_internal: | out_unlock_internal: |
| if (io->io_new_size) { | if (xip->i_new_size) { |
| xfs_ilock(xip, XFS_ILOCK_EXCL); | xfs_ilock(xip, XFS_ILOCK_EXCL); |
| io->io_new_size = 0; | xip->i_new_size = 0; |
| /* | /* |
| * If this was a direct or synchronous I/O that failed (such | * If this was a direct or synchronous I/O that failed (such |
| * as ENOSPC) then part of the I/O may have been written to | * as ENOSPC) then part of the I/O may have been written to |