diff options
Diffstat (limited to 'fs/xfs/linux-2.6')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 81 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 11 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_file.c | 43 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 3 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.c | 5 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 10 |
6 files changed, 107 insertions, 46 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 76a84758073a..9278e9aba9ba 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
| @@ -558,7 +558,8 @@ xfs_submit_page( | |||
| 558 | int i; | 558 | int i; |
| 559 | 559 | ||
| 560 | BUG_ON(PageWriteback(page)); | 560 | BUG_ON(PageWriteback(page)); |
| 561 | set_page_writeback(page); | 561 | if (bh_count) |
| 562 | set_page_writeback(page); | ||
| 562 | if (clear_dirty) | 563 | if (clear_dirty) |
| 563 | clear_page_dirty(page); | 564 | clear_page_dirty(page); |
| 564 | unlock_page(page); | 565 | unlock_page(page); |
| @@ -578,9 +579,6 @@ xfs_submit_page( | |||
| 578 | 579 | ||
| 579 | if (probed_page && clear_dirty) | 580 | if (probed_page && clear_dirty) |
| 580 | wbc->nr_to_write--; /* Wrote an "extra" page */ | 581 | wbc->nr_to_write--; /* Wrote an "extra" page */ |
| 581 | } else { | ||
| 582 | end_page_writeback(page); | ||
| 583 | wbc->pages_skipped++; /* We didn't write this page */ | ||
| 584 | } | 582 | } |
| 585 | } | 583 | } |
| 586 | 584 | ||
| @@ -602,21 +600,26 @@ xfs_convert_page( | |||
| 602 | { | 600 | { |
| 603 | struct buffer_head *bh_arr[MAX_BUF_PER_PAGE], *bh, *head; | 601 | struct buffer_head *bh_arr[MAX_BUF_PER_PAGE], *bh, *head; |
| 604 | xfs_iomap_t *mp = iomapp, *tmp; | 602 | xfs_iomap_t *mp = iomapp, *tmp; |
| 605 | unsigned long end, offset; | 603 | unsigned long offset, end_offset; |
| 606 | pgoff_t end_index; | 604 | int index = 0; |
| 607 | int i = 0, index = 0; | ||
| 608 | int bbits = inode->i_blkbits; | 605 | int bbits = inode->i_blkbits; |
| 606 | int len, page_dirty; | ||
| 609 | 607 | ||
| 610 | end_index = i_size_read(inode) >> PAGE_CACHE_SHIFT; | 608 | end_offset = (i_size_read(inode) & (PAGE_CACHE_SIZE - 1)); |
| 611 | if (page->index < end_index) { | 609 | |
| 612 | end = PAGE_CACHE_SIZE; | 610 | /* |
| 613 | } else { | 611 | * page_dirty is initially a count of buffers on the page before |
| 614 | end = i_size_read(inode) & (PAGE_CACHE_SIZE-1); | 612 | * EOF and is decrememted as we move each into a cleanable state. |
| 615 | } | 613 | */ |
| 614 | len = 1 << inode->i_blkbits; | ||
| 615 | end_offset = max(end_offset, PAGE_CACHE_SIZE); | ||
| 616 | end_offset = roundup(end_offset, len); | ||
| 617 | page_dirty = end_offset / len; | ||
| 618 | |||
| 619 | offset = 0; | ||
| 616 | bh = head = page_buffers(page); | 620 | bh = head = page_buffers(page); |
| 617 | do { | 621 | do { |
| 618 | offset = i << bbits; | 622 | if (offset >= end_offset) |
| 619 | if (offset >= end) | ||
| 620 | break; | 623 | break; |
| 621 | if (!(PageUptodate(page) || buffer_uptodate(bh))) | 624 | if (!(PageUptodate(page) || buffer_uptodate(bh))) |
| 622 | continue; | 625 | continue; |
| @@ -625,6 +628,7 @@ xfs_convert_page( | |||
| 625 | if (startio) { | 628 | if (startio) { |
| 626 | lock_buffer(bh); | 629 | lock_buffer(bh); |
| 627 | bh_arr[index++] = bh; | 630 | bh_arr[index++] = bh; |
| 631 | page_dirty--; | ||
| 628 | } | 632 | } |
| 629 | continue; | 633 | continue; |
| 630 | } | 634 | } |
| @@ -657,10 +661,11 @@ xfs_convert_page( | |||
| 657 | unlock_buffer(bh); | 661 | unlock_buffer(bh); |
| 658 | mark_buffer_dirty(bh); | 662 | mark_buffer_dirty(bh); |
| 659 | } | 663 | } |
| 660 | } while (i++, (bh = bh->b_this_page) != head); | 664 | page_dirty--; |
| 665 | } while (offset += len, (bh = bh->b_this_page) != head); | ||
| 661 | 666 | ||
| 662 | if (startio) { | 667 | if (startio && index) { |
| 663 | xfs_submit_page(page, wbc, bh_arr, index, 1, index == i); | 668 | xfs_submit_page(page, wbc, bh_arr, index, 1, !page_dirty); |
| 664 | } else { | 669 | } else { |
| 665 | unlock_page(page); | 670 | unlock_page(page); |
| 666 | } | 671 | } |
| @@ -725,8 +730,11 @@ xfs_page_state_convert( | |||
| 725 | __uint64_t end_offset; | 730 | __uint64_t end_offset; |
| 726 | pgoff_t end_index, last_index, tlast; | 731 | pgoff_t end_index, last_index, tlast; |
| 727 | int len, err, i, cnt = 0, uptodate = 1; | 732 | int len, err, i, cnt = 0, uptodate = 1; |
| 728 | int flags = startio ? 0 : BMAPI_TRYLOCK; | 733 | int flags; |
| 729 | int page_dirty, delalloc = 0; | 734 | int page_dirty; |
| 735 | |||
| 736 | /* wait for other IO threads? */ | ||
| 737 | flags = (startio && wbc->sync_mode != WB_SYNC_NONE) ? 0 : BMAPI_TRYLOCK; | ||
| 730 | 738 | ||
| 731 | /* Is this page beyond the end of the file? */ | 739 | /* Is this page beyond the end of the file? */ |
| 732 | offset = i_size_read(inode); | 740 | offset = i_size_read(inode); |
| @@ -740,19 +748,22 @@ xfs_page_state_convert( | |||
| 740 | } | 748 | } |
| 741 | } | 749 | } |
| 742 | 750 | ||
| 743 | offset = (loff_t)page->index << PAGE_CACHE_SHIFT; | ||
| 744 | end_offset = min_t(unsigned long long, | 751 | end_offset = min_t(unsigned long long, |
| 745 | offset + PAGE_CACHE_SIZE, i_size_read(inode)); | 752 | (loff_t)(page->index + 1) << PAGE_CACHE_SHIFT, offset); |
| 746 | 753 | offset = (loff_t)page->index << PAGE_CACHE_SHIFT; | |
| 747 | bh = head = page_buffers(page); | ||
| 748 | iomp = NULL; | ||
| 749 | 754 | ||
| 750 | /* | 755 | /* |
| 751 | * page_dirty is initially a count of buffers on the page and | 756 | * page_dirty is initially a count of buffers on the page before |
| 752 | * is decrememted as we move each into a cleanable state. | 757 | * EOF and is decrememted as we move each into a cleanable state. |
| 753 | */ | 758 | */ |
| 754 | len = bh->b_size; | 759 | len = 1 << inode->i_blkbits; |
| 755 | page_dirty = PAGE_CACHE_SIZE / len; | 760 | p_offset = max(p_offset, PAGE_CACHE_SIZE); |
| 761 | p_offset = roundup(p_offset, len); | ||
| 762 | page_dirty = p_offset / len; | ||
| 763 | |||
| 764 | iomp = NULL; | ||
| 765 | p_offset = 0; | ||
| 766 | bh = head = page_buffers(page); | ||
| 756 | 767 | ||
| 757 | do { | 768 | do { |
| 758 | if (offset >= end_offset) | 769 | if (offset >= end_offset) |
| @@ -804,7 +815,6 @@ xfs_page_state_convert( | |||
| 804 | */ | 815 | */ |
| 805 | } else if (buffer_delay(bh)) { | 816 | } else if (buffer_delay(bh)) { |
| 806 | if (!iomp) { | 817 | if (!iomp) { |
| 807 | delalloc = 1; | ||
| 808 | err = xfs_map_blocks(inode, offset, len, &iomap, | 818 | err = xfs_map_blocks(inode, offset, len, &iomap, |
| 809 | BMAPI_ALLOCATE | flags); | 819 | BMAPI_ALLOCATE | flags); |
| 810 | if (err) { | 820 | if (err) { |
| @@ -875,14 +885,15 @@ xfs_page_state_convert( | |||
| 875 | if (uptodate && bh == head) | 885 | if (uptodate && bh == head) |
| 876 | SetPageUptodate(page); | 886 | SetPageUptodate(page); |
| 877 | 887 | ||
| 878 | if (startio) | 888 | if (startio) { |
| 879 | xfs_submit_page(page, wbc, bh_arr, cnt, 0, 1); | 889 | WARN_ON(page_dirty); |
| 890 | xfs_submit_page(page, wbc, bh_arr, cnt, 0, !page_dirty); | ||
| 891 | } | ||
| 880 | 892 | ||
| 881 | if (iomp) { | 893 | if (iomp) { |
| 882 | tlast = (iomp->iomap_offset + iomp->iomap_bsize - 1) >> | 894 | offset = (iomp->iomap_offset + iomp->iomap_bsize - 1) >> |
| 883 | PAGE_CACHE_SHIFT; | 895 | PAGE_CACHE_SHIFT; |
| 884 | if (delalloc && (tlast > last_index)) | 896 | tlast = min_t(pgoff_t, offset, last_index); |
| 885 | tlast = last_index; | ||
| 886 | xfs_cluster_write(inode, page->index + 1, iomp, wbc, | 897 | xfs_cluster_write(inode, page->index + 1, iomp, wbc, |
| 887 | startio, unmapped, tlast); | 898 | startio, unmapped, tlast); |
| 888 | } | 899 | } |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 23e0eb67fc25..997963e53622 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -1746,13 +1746,15 @@ STATIC DECLARE_COMPLETION(pagebuf_daemon_done); | |||
| 1746 | STATIC struct task_struct *pagebuf_daemon_task; | 1746 | STATIC struct task_struct *pagebuf_daemon_task; |
| 1747 | STATIC int pagebuf_daemon_active; | 1747 | STATIC int pagebuf_daemon_active; |
| 1748 | STATIC int force_flush; | 1748 | STATIC int force_flush; |
| 1749 | 1749 | STATIC int force_sleep; | |
| 1750 | 1750 | ||
| 1751 | STATIC int | 1751 | STATIC int |
| 1752 | pagebuf_daemon_wakeup( | 1752 | pagebuf_daemon_wakeup( |
| 1753 | int priority, | 1753 | int priority, |
| 1754 | unsigned int mask) | 1754 | unsigned int mask) |
| 1755 | { | 1755 | { |
| 1756 | if (force_sleep) | ||
| 1757 | return 0; | ||
| 1756 | force_flush = 1; | 1758 | force_flush = 1; |
| 1757 | barrier(); | 1759 | barrier(); |
| 1758 | wake_up_process(pagebuf_daemon_task); | 1760 | wake_up_process(pagebuf_daemon_task); |
| @@ -1778,7 +1780,12 @@ pagebuf_daemon( | |||
| 1778 | 1780 | ||
| 1779 | INIT_LIST_HEAD(&tmp); | 1781 | INIT_LIST_HEAD(&tmp); |
| 1780 | do { | 1782 | do { |
| 1781 | try_to_freeze(PF_FREEZE); | 1783 | if (unlikely(current->flags & PF_FREEZE)) { |
| 1784 | force_sleep = 1; | ||
| 1785 | refrigerator(PF_FREEZE); | ||
| 1786 | } else { | ||
| 1787 | force_sleep = 0; | ||
| 1788 | } | ||
| 1782 | 1789 | ||
| 1783 | set_current_state(TASK_INTERRUPTIBLE); | 1790 | set_current_state(TASK_INTERRUPTIBLE); |
| 1784 | schedule_timeout((xfs_buf_timer_centisecs * HZ) / 100); | 1791 | schedule_timeout((xfs_buf_timer_centisecs * HZ) / 100); |
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 9f057a4a5b06..d0d412afd261 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
| @@ -515,10 +515,49 @@ open_exec_out: | |||
| 515 | } | 515 | } |
| 516 | #endif /* HAVE_FOP_OPEN_EXEC */ | 516 | #endif /* HAVE_FOP_OPEN_EXEC */ |
| 517 | 517 | ||
| 518 | /* | ||
| 519 | * Temporary workaround to the AIO direct IO write problem. | ||
| 520 | * This code can go and we can revert to do_sync_write once | ||
| 521 | * the writepage(s) rework is merged. | ||
| 522 | */ | ||
| 523 | STATIC ssize_t | ||
| 524 | linvfs_write( | ||
| 525 | struct file *filp, | ||
| 526 | const char __user *buf, | ||
| 527 | size_t len, | ||
| 528 | loff_t *ppos) | ||
| 529 | { | ||
| 530 | struct kiocb kiocb; | ||
| 531 | ssize_t ret; | ||
| 532 | |||
| 533 | init_sync_kiocb(&kiocb, filp); | ||
| 534 | kiocb.ki_pos = *ppos; | ||
| 535 | ret = __linvfs_write(&kiocb, buf, 0, len, kiocb.ki_pos); | ||
| 536 | *ppos = kiocb.ki_pos; | ||
| 537 | return ret; | ||
| 538 | } | ||
| 539 | STATIC ssize_t | ||
| 540 | linvfs_write_invis( | ||
| 541 | struct file *filp, | ||
| 542 | const char __user *buf, | ||
| 543 | size_t len, | ||
| 544 | loff_t *ppos) | ||
| 545 | { | ||
| 546 | struct kiocb kiocb; | ||
| 547 | ssize_t ret; | ||
| 548 | |||
| 549 | init_sync_kiocb(&kiocb, filp); | ||
| 550 | kiocb.ki_pos = *ppos; | ||
| 551 | ret = __linvfs_write(&kiocb, buf, IO_INVIS, len, kiocb.ki_pos); | ||
| 552 | *ppos = kiocb.ki_pos; | ||
| 553 | return ret; | ||
| 554 | } | ||
| 555 | |||
| 556 | |||
| 518 | struct file_operations linvfs_file_operations = { | 557 | struct file_operations linvfs_file_operations = { |
| 519 | .llseek = generic_file_llseek, | 558 | .llseek = generic_file_llseek, |
| 520 | .read = do_sync_read, | 559 | .read = do_sync_read, |
| 521 | .write = do_sync_write, | 560 | .write = linvfs_write, |
| 522 | .readv = linvfs_readv, | 561 | .readv = linvfs_readv, |
| 523 | .writev = linvfs_writev, | 562 | .writev = linvfs_writev, |
| 524 | .aio_read = linvfs_aio_read, | 563 | .aio_read = linvfs_aio_read, |
| @@ -540,7 +579,7 @@ struct file_operations linvfs_file_operations = { | |||
| 540 | struct file_operations linvfs_invis_file_operations = { | 579 | struct file_operations linvfs_invis_file_operations = { |
| 541 | .llseek = generic_file_llseek, | 580 | .llseek = generic_file_llseek, |
| 542 | .read = do_sync_read, | 581 | .read = do_sync_read, |
| 543 | .write = do_sync_write, | 582 | .write = linvfs_write_invis, |
| 544 | .readv = linvfs_readv_invis, | 583 | .readv = linvfs_readv_invis, |
| 545 | .writev = linvfs_writev_invis, | 584 | .writev = linvfs_writev_invis, |
| 546 | .aio_read = linvfs_aio_read_invis, | 585 | .aio_read = linvfs_aio_read_invis, |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index ff145fd0d1a4..aa9daaea6c34 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
| @@ -683,6 +683,9 @@ xfs_write( | |||
| 683 | (xip->i_d.di_flags & XFS_DIFLAG_REALTIME) ? | 683 | (xip->i_d.di_flags & XFS_DIFLAG_REALTIME) ? |
| 684 | mp->m_rtdev_targp : mp->m_ddev_targp; | 684 | mp->m_rtdev_targp : mp->m_ddev_targp; |
| 685 | 685 | ||
| 686 | if (ioflags & IO_ISAIO) | ||
| 687 | return XFS_ERROR(-ENOSYS); | ||
| 688 | |||
| 686 | if ((pos & target->pbr_smask) || (count & target->pbr_smask)) | 689 | if ((pos & target->pbr_smask) || (count & target->pbr_smask)) |
| 687 | return XFS_ERROR(-EINVAL); | 690 | return XFS_ERROR(-EINVAL); |
| 688 | 691 | ||
diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c index 849c61c74f3c..a832d165f24f 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.c +++ b/fs/xfs/linux-2.6/xfs_vnode.c | |||
| @@ -156,7 +156,6 @@ vn_initialize( | |||
| 156 | 156 | ||
| 157 | #ifdef XFS_VNODE_TRACE | 157 | #ifdef XFS_VNODE_TRACE |
| 158 | vp->v_trace = ktrace_alloc(VNODE_TRACE_SIZE, KM_SLEEP); | 158 | vp->v_trace = ktrace_alloc(VNODE_TRACE_SIZE, KM_SLEEP); |
| 159 | printk("Allocated VNODE_TRACE at 0x%p\n", vp->v_trace); | ||
| 160 | #endif /* XFS_VNODE_TRACE */ | 159 | #endif /* XFS_VNODE_TRACE */ |
| 161 | 160 | ||
| 162 | vn_trace_exit(vp, "vn_initialize", (inst_t *)__return_address); | 161 | vn_trace_exit(vp, "vn_initialize", (inst_t *)__return_address); |
| @@ -424,13 +423,13 @@ vn_remove( | |||
| 424 | * Vnode tracing code. | 423 | * Vnode tracing code. |
| 425 | */ | 424 | */ |
| 426 | void | 425 | void |
| 427 | vn_trace_entry(vnode_t *vp, char *func, inst_t *ra) | 426 | vn_trace_entry(vnode_t *vp, const char *func, inst_t *ra) |
| 428 | { | 427 | { |
| 429 | KTRACE_ENTER(vp, VNODE_KTRACE_ENTRY, func, 0, ra); | 428 | KTRACE_ENTER(vp, VNODE_KTRACE_ENTRY, func, 0, ra); |
| 430 | } | 429 | } |
| 431 | 430 | ||
| 432 | void | 431 | void |
| 433 | vn_trace_exit(vnode_t *vp, char *func, inst_t *ra) | 432 | vn_trace_exit(vnode_t *vp, const char *func, inst_t *ra) |
| 434 | { | 433 | { |
| 435 | KTRACE_ENTER(vp, VNODE_KTRACE_EXIT, func, 0, ra); | 434 | KTRACE_ENTER(vp, VNODE_KTRACE_EXIT, func, 0, ra); |
| 436 | } | 435 | } |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index da76c1f1e11c..00466c3194ac 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
| @@ -86,10 +86,11 @@ typedef struct vnode { | |||
| 86 | vnumber_t v_number; /* in-core vnode number */ | 86 | vnumber_t v_number; /* in-core vnode number */ |
| 87 | vn_bhv_head_t v_bh; /* behavior head */ | 87 | vn_bhv_head_t v_bh; /* behavior head */ |
| 88 | spinlock_t v_lock; /* VN_LOCK/VN_UNLOCK */ | 88 | spinlock_t v_lock; /* VN_LOCK/VN_UNLOCK */ |
| 89 | struct inode v_inode; /* Linux inode */ | ||
| 90 | #ifdef XFS_VNODE_TRACE | 89 | #ifdef XFS_VNODE_TRACE |
| 91 | struct ktrace *v_trace; /* trace header structure */ | 90 | struct ktrace *v_trace; /* trace header structure */ |
| 92 | #endif | 91 | #endif |
| 92 | struct inode v_inode; /* Linux inode */ | ||
| 93 | /* inode MUST be last */ | ||
| 93 | } vnode_t; | 94 | } vnode_t; |
| 94 | 95 | ||
| 95 | #define v_fbhv v_bh.bh_first /* first behavior */ | 96 | #define v_fbhv v_bh.bh_first /* first behavior */ |
| @@ -409,7 +410,7 @@ typedef struct vattr { | |||
| 409 | int va_mask; /* bit-mask of attributes present */ | 410 | int va_mask; /* bit-mask of attributes present */ |
| 410 | enum vtype va_type; /* vnode type (for create) */ | 411 | enum vtype va_type; /* vnode type (for create) */ |
| 411 | mode_t va_mode; /* file access mode and type */ | 412 | mode_t va_mode; /* file access mode and type */ |
| 412 | nlink_t va_nlink; /* number of references to file */ | 413 | xfs_nlink_t va_nlink; /* number of references to file */ |
| 413 | uid_t va_uid; /* owner user id */ | 414 | uid_t va_uid; /* owner user id */ |
| 414 | gid_t va_gid; /* owner group id */ | 415 | gid_t va_gid; /* owner group id */ |
| 415 | xfs_ino_t va_nodeid; /* file id */ | 416 | xfs_ino_t va_nodeid; /* file id */ |
| @@ -625,6 +626,7 @@ static inline int VN_BAD(struct vnode *vp) | |||
| 625 | #define ATTR_DMI 0x08 /* invocation from a DMI function */ | 626 | #define ATTR_DMI 0x08 /* invocation from a DMI function */ |
| 626 | #define ATTR_LAZY 0x80 /* set/get attributes lazily */ | 627 | #define ATTR_LAZY 0x80 /* set/get attributes lazily */ |
| 627 | #define ATTR_NONBLOCK 0x100 /* return EAGAIN if operation would block */ | 628 | #define ATTR_NONBLOCK 0x100 /* return EAGAIN if operation would block */ |
| 629 | #define ATTR_NOLOCK 0x200 /* Don't grab any conflicting locks */ | ||
| 628 | 630 | ||
| 629 | /* | 631 | /* |
| 630 | * Flags to VOP_FSYNC and VOP_RECLAIM. | 632 | * Flags to VOP_FSYNC and VOP_RECLAIM. |
| @@ -646,8 +648,8 @@ static inline int VN_BAD(struct vnode *vp) | |||
| 646 | #define VNODE_KTRACE_REF 4 | 648 | #define VNODE_KTRACE_REF 4 |
| 647 | #define VNODE_KTRACE_RELE 5 | 649 | #define VNODE_KTRACE_RELE 5 |
| 648 | 650 | ||
| 649 | extern void vn_trace_entry(struct vnode *, char *, inst_t *); | 651 | extern void vn_trace_entry(struct vnode *, const char *, inst_t *); |
| 650 | extern void vn_trace_exit(struct vnode *, char *, inst_t *); | 652 | extern void vn_trace_exit(struct vnode *, const char *, inst_t *); |
| 651 | extern void vn_trace_hold(struct vnode *, char *, int, inst_t *); | 653 | extern void vn_trace_hold(struct vnode *, char *, int, inst_t *); |
| 652 | extern void vn_trace_ref(struct vnode *, char *, int, inst_t *); | 654 | extern void vn_trace_ref(struct vnode *, char *, int, inst_t *); |
| 653 | extern void vn_trace_rele(struct vnode *, char *, int, inst_t *); | 655 | extern void vn_trace_rele(struct vnode *, char *, int, inst_t *); |
