diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_file.c')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_file.c | 104 |
1 files changed, 4 insertions, 100 deletions
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 257a56b127cf..ba8ad422a165 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
| @@ -22,23 +22,15 @@ | |||
| 22 | #include "xfs_inum.h" | 22 | #include "xfs_inum.h" |
| 23 | #include "xfs_sb.h" | 23 | #include "xfs_sb.h" |
| 24 | #include "xfs_ag.h" | 24 | #include "xfs_ag.h" |
| 25 | #include "xfs_dir2.h" | ||
| 26 | #include "xfs_trans.h" | 25 | #include "xfs_trans.h" |
| 27 | #include "xfs_dmapi.h" | ||
| 28 | #include "xfs_mount.h" | 26 | #include "xfs_mount.h" |
| 29 | #include "xfs_bmap_btree.h" | 27 | #include "xfs_bmap_btree.h" |
| 30 | #include "xfs_alloc_btree.h" | ||
| 31 | #include "xfs_ialloc_btree.h" | ||
| 32 | #include "xfs_alloc.h" | 28 | #include "xfs_alloc.h" |
| 33 | #include "xfs_btree.h" | ||
| 34 | #include "xfs_attr_sf.h" | ||
| 35 | #include "xfs_dir2_sf.h" | ||
| 36 | #include "xfs_dinode.h" | 29 | #include "xfs_dinode.h" |
| 37 | #include "xfs_inode.h" | 30 | #include "xfs_inode.h" |
| 38 | #include "xfs_inode_item.h" | 31 | #include "xfs_inode_item.h" |
| 39 | #include "xfs_bmap.h" | 32 | #include "xfs_bmap.h" |
| 40 | #include "xfs_error.h" | 33 | #include "xfs_error.h" |
| 41 | #include "xfs_rw.h" | ||
| 42 | #include "xfs_vnodeops.h" | 34 | #include "xfs_vnodeops.h" |
| 43 | #include "xfs_da_btree.h" | 35 | #include "xfs_da_btree.h" |
| 44 | #include "xfs_ioctl.h" | 36 | #include "xfs_ioctl.h" |
| @@ -108,7 +100,7 @@ xfs_file_fsync( | |||
| 108 | int error = 0; | 100 | int error = 0; |
| 109 | int log_flushed = 0; | 101 | int log_flushed = 0; |
| 110 | 102 | ||
| 111 | xfs_itrace_entry(ip); | 103 | trace_xfs_file_fsync(ip); |
| 112 | 104 | ||
| 113 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | 105 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) |
| 114 | return -XFS_ERROR(EIO); | 106 | return -XFS_ERROR(EIO); |
| @@ -166,8 +158,7 @@ xfs_file_fsync( | |||
| 166 | * transaction. So we play it safe and fire off the | 158 | * transaction. So we play it safe and fire off the |
| 167 | * transaction anyway. | 159 | * transaction anyway. |
| 168 | */ | 160 | */ |
| 169 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); | 161 | xfs_trans_ijoin(tp, ip); |
| 170 | xfs_trans_ihold(tp, ip); | ||
| 171 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 162 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
| 172 | xfs_trans_set_sync(tp); | 163 | xfs_trans_set_sync(tp); |
| 173 | error = _xfs_trans_commit(tp, 0, &log_flushed); | 164 | error = _xfs_trans_commit(tp, 0, &log_flushed); |
| @@ -275,20 +266,6 @@ xfs_file_aio_read( | |||
| 275 | mutex_lock(&inode->i_mutex); | 266 | mutex_lock(&inode->i_mutex); |
| 276 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | 267 | xfs_ilock(ip, XFS_IOLOCK_SHARED); |
| 277 | 268 | ||
| 278 | if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { | ||
| 279 | int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); | ||
| 280 | int iolock = XFS_IOLOCK_SHARED; | ||
| 281 | |||
| 282 | ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, iocb->ki_pos, size, | ||
| 283 | dmflags, &iolock); | ||
| 284 | if (ret) { | ||
| 285 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
| 286 | if (unlikely(ioflags & IO_ISDIRECT)) | ||
| 287 | mutex_unlock(&inode->i_mutex); | ||
| 288 | return ret; | ||
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 292 | if (unlikely(ioflags & IO_ISDIRECT)) { | 269 | if (unlikely(ioflags & IO_ISDIRECT)) { |
| 293 | if (inode->i_mapping->nrpages) { | 270 | if (inode->i_mapping->nrpages) { |
| 294 | ret = -xfs_flushinval_pages(ip, | 271 | ret = -xfs_flushinval_pages(ip, |
| @@ -321,7 +298,6 @@ xfs_file_splice_read( | |||
| 321 | unsigned int flags) | 298 | unsigned int flags) |
| 322 | { | 299 | { |
| 323 | struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); | 300 | struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); |
| 324 | struct xfs_mount *mp = ip->i_mount; | ||
| 325 | int ioflags = 0; | 301 | int ioflags = 0; |
| 326 | ssize_t ret; | 302 | ssize_t ret; |
| 327 | 303 | ||
| @@ -335,18 +311,6 @@ xfs_file_splice_read( | |||
| 335 | 311 | ||
| 336 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | 312 | xfs_ilock(ip, XFS_IOLOCK_SHARED); |
| 337 | 313 | ||
| 338 | if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { | ||
| 339 | int iolock = XFS_IOLOCK_SHARED; | ||
| 340 | int error; | ||
| 341 | |||
| 342 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *ppos, count, | ||
| 343 | FILP_DELAY_FLAG(infilp), &iolock); | ||
| 344 | if (error) { | ||
| 345 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
| 346 | return -error; | ||
| 347 | } | ||
| 348 | } | ||
| 349 | |||
| 350 | trace_xfs_file_splice_read(ip, count, *ppos, ioflags); | 314 | trace_xfs_file_splice_read(ip, count, *ppos, ioflags); |
| 351 | 315 | ||
| 352 | ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); | 316 | ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); |
| @@ -367,7 +331,6 @@ xfs_file_splice_write( | |||
| 367 | { | 331 | { |
| 368 | struct inode *inode = outfilp->f_mapping->host; | 332 | struct inode *inode = outfilp->f_mapping->host; |
| 369 | struct xfs_inode *ip = XFS_I(inode); | 333 | struct xfs_inode *ip = XFS_I(inode); |
| 370 | struct xfs_mount *mp = ip->i_mount; | ||
| 371 | xfs_fsize_t isize, new_size; | 334 | xfs_fsize_t isize, new_size; |
| 372 | int ioflags = 0; | 335 | int ioflags = 0; |
| 373 | ssize_t ret; | 336 | ssize_t ret; |
| @@ -382,18 +345,6 @@ xfs_file_splice_write( | |||
| 382 | 345 | ||
| 383 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | 346 | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
| 384 | 347 | ||
| 385 | if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) { | ||
| 386 | int iolock = XFS_IOLOCK_EXCL; | ||
| 387 | int error; | ||
| 388 | |||
| 389 | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, *ppos, count, | ||
| 390 | FILP_DELAY_FLAG(outfilp), &iolock); | ||
| 391 | if (error) { | ||
| 392 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | ||
| 393 | return -error; | ||
| 394 | } | ||
| 395 | } | ||
| 396 | |||
| 397 | new_size = *ppos + count; | 348 | new_size = *ppos + count; |
| 398 | 349 | ||
| 399 | xfs_ilock(ip, XFS_ILOCK_EXCL); | 350 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
| @@ -463,7 +414,7 @@ xfs_zero_last_block( | |||
| 463 | last_fsb = XFS_B_TO_FSBT(mp, isize); | 414 | last_fsb = XFS_B_TO_FSBT(mp, isize); |
| 464 | nimaps = 1; | 415 | nimaps = 1; |
| 465 | error = xfs_bmapi(NULL, ip, last_fsb, 1, 0, NULL, 0, &imap, | 416 | error = xfs_bmapi(NULL, ip, last_fsb, 1, 0, NULL, 0, &imap, |
| 466 | &nimaps, NULL, NULL); | 417 | &nimaps, NULL); |
| 467 | if (error) { | 418 | if (error) { |
| 468 | return error; | 419 | return error; |
| 469 | } | 420 | } |
| @@ -558,7 +509,7 @@ xfs_zero_eof( | |||
| 558 | nimaps = 1; | 509 | nimaps = 1; |
| 559 | zero_count_fsb = end_zero_fsb - start_zero_fsb + 1; | 510 | zero_count_fsb = end_zero_fsb - start_zero_fsb + 1; |
| 560 | error = xfs_bmapi(NULL, ip, start_zero_fsb, zero_count_fsb, | 511 | error = xfs_bmapi(NULL, ip, start_zero_fsb, zero_count_fsb, |
| 561 | 0, NULL, 0, &imap, &nimaps, NULL, NULL); | 512 | 0, NULL, 0, &imap, &nimaps, NULL); |
| 562 | if (error) { | 513 | if (error) { |
| 563 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); | 514 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); |
| 564 | return error; | 515 | return error; |
| @@ -627,7 +578,6 @@ xfs_file_aio_write( | |||
| 627 | int ioflags = 0; | 578 | int ioflags = 0; |
| 628 | xfs_fsize_t isize, new_size; | 579 | xfs_fsize_t isize, new_size; |
| 629 | int iolock; | 580 | int iolock; |
| 630 | int eventsent = 0; | ||
| 631 | size_t ocount = 0, count; | 581 | size_t ocount = 0, count; |
| 632 | int need_i_mutex; | 582 | int need_i_mutex; |
| 633 | 583 | ||
| @@ -673,33 +623,6 @@ start: | |||
| 673 | goto out_unlock_mutex; | 623 | goto out_unlock_mutex; |
| 674 | } | 624 | } |
| 675 | 625 | ||
| 676 | if ((DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && | ||
| 677 | !(ioflags & IO_INVIS) && !eventsent)) { | ||
| 678 | int dmflags = FILP_DELAY_FLAG(file); | ||
| 679 | |||
| 680 | if (need_i_mutex) | ||
| 681 | dmflags |= DM_FLAGS_IMUX; | ||
| 682 | |||
| 683 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | ||
| 684 | error = XFS_SEND_DATA(ip->i_mount, DM_EVENT_WRITE, ip, | ||
| 685 | pos, count, dmflags, &iolock); | ||
| 686 | if (error) { | ||
| 687 | goto out_unlock_internal; | ||
| 688 | } | ||
| 689 | xfs_ilock(ip, XFS_ILOCK_EXCL); | ||
| 690 | eventsent = 1; | ||
| 691 | |||
| 692 | /* | ||
| 693 | * The iolock was dropped and reacquired in XFS_SEND_DATA | ||
| 694 | * so we have to recheck the size when appending. | ||
| 695 | * We will only "goto start;" once, since having sent the | ||
| 696 | * event prevents another call to XFS_SEND_DATA, which is | ||
| 697 | * what allows the size to change in the first place. | ||
| 698 | */ | ||
| 699 | if ((file->f_flags & O_APPEND) && pos != ip->i_size) | ||
| 700 | goto start; | ||
| 701 | } | ||
| 702 | |||
| 703 | if (ioflags & IO_ISDIRECT) { | 626 | if (ioflags & IO_ISDIRECT) { |
| 704 | xfs_buftarg_t *target = | 627 | xfs_buftarg_t *target = |
| 705 | XFS_IS_REALTIME_INODE(ip) ? | 628 | XFS_IS_REALTIME_INODE(ip) ? |
| @@ -830,22 +753,6 @@ write_retry: | |||
| 830 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 753 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| 831 | } | 754 | } |
| 832 | 755 | ||
| 833 | if (ret == -ENOSPC && | ||
| 834 | DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { | ||
| 835 | xfs_iunlock(ip, iolock); | ||
| 836 | if (need_i_mutex) | ||
| 837 | mutex_unlock(&inode->i_mutex); | ||
| 838 | error = XFS_SEND_NAMESP(ip->i_mount, DM_EVENT_NOSPACE, ip, | ||
| 839 | DM_RIGHT_NULL, ip, DM_RIGHT_NULL, NULL, NULL, | ||
| 840 | 0, 0, 0); /* Delay flag intentionally unused */ | ||
| 841 | if (need_i_mutex) | ||
| 842 | mutex_lock(&inode->i_mutex); | ||
| 843 | xfs_ilock(ip, iolock); | ||
| 844 | if (error) | ||
| 845 | goto out_unlock_internal; | ||
| 846 | goto start; | ||
| 847 | } | ||
| 848 | |||
| 849 | error = -ret; | 756 | error = -ret; |
| 850 | if (ret <= 0) | 757 | if (ret <= 0) |
| 851 | goto out_unlock_internal; | 758 | goto out_unlock_internal; |
| @@ -1014,9 +921,6 @@ const struct file_operations xfs_file_operations = { | |||
| 1014 | .open = xfs_file_open, | 921 | .open = xfs_file_open, |
| 1015 | .release = xfs_file_release, | 922 | .release = xfs_file_release, |
| 1016 | .fsync = xfs_file_fsync, | 923 | .fsync = xfs_file_fsync, |
| 1017 | #ifdef HAVE_FOP_OPEN_EXEC | ||
| 1018 | .open_exec = xfs_file_open_exec, | ||
| 1019 | #endif | ||
| 1020 | }; | 924 | }; |
| 1021 | 925 | ||
| 1022 | const struct file_operations xfs_dir_file_operations = { | 926 | const struct file_operations xfs_dir_file_operations = { |
