diff options
Diffstat (limited to 'fs/xfs/linux-2.6')
-rw-r--r-- | fs/xfs/linux-2.6/kmem.h | 19 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 43 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 67 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.h | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_file.c | 37 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_globals.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl32.c | 321 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_linux.h | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 44 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.h | 3 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 6 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.h | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sysctl.c | 11 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sysctl.h | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vfs.h | 15 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 11 |
17 files changed, 395 insertions, 193 deletions
diff --git a/fs/xfs/linux-2.6/kmem.h b/fs/xfs/linux-2.6/kmem.h index 9ebabdf7829c..4b6470cf87f0 100644 --- a/fs/xfs/linux-2.6/kmem.h +++ b/fs/xfs/linux-2.6/kmem.h | |||
@@ -100,25 +100,6 @@ kmem_zone_destroy(kmem_zone_t *zone) | |||
100 | extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); | 100 | extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); |
101 | extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); | 101 | extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); |
102 | 102 | ||
103 | /* | ||
104 | * Low memory cache shrinkers | ||
105 | */ | ||
106 | |||
107 | typedef struct shrinker *kmem_shaker_t; | ||
108 | typedef int (*kmem_shake_func_t)(int, gfp_t); | ||
109 | |||
110 | static inline kmem_shaker_t | ||
111 | kmem_shake_register(kmem_shake_func_t sfunc) | ||
112 | { | ||
113 | return set_shrinker(DEFAULT_SEEKS, sfunc); | ||
114 | } | ||
115 | |||
116 | static inline void | ||
117 | kmem_shake_deregister(kmem_shaker_t shrinker) | ||
118 | { | ||
119 | remove_shrinker(shrinker); | ||
120 | } | ||
121 | |||
122 | static inline int | 103 | static inline int |
123 | kmem_shake_allow(gfp_t gfp_mask) | 104 | kmem_shake_allow(gfp_t gfp_mask) |
124 | { | 105 | { |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 7361861e3aac..fd4105d662e0 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -108,14 +108,19 @@ xfs_page_trace( | |||
108 | 108 | ||
109 | /* | 109 | /* |
110 | * Schedule IO completion handling on a xfsdatad if this was | 110 | * Schedule IO completion handling on a xfsdatad if this was |
111 | * the final hold on this ioend. | 111 | * the final hold on this ioend. If we are asked to wait, |
112 | * flush the workqueue. | ||
112 | */ | 113 | */ |
113 | STATIC void | 114 | STATIC void |
114 | xfs_finish_ioend( | 115 | xfs_finish_ioend( |
115 | xfs_ioend_t *ioend) | 116 | xfs_ioend_t *ioend, |
117 | int wait) | ||
116 | { | 118 | { |
117 | if (atomic_dec_and_test(&ioend->io_remaining)) | 119 | if (atomic_dec_and_test(&ioend->io_remaining)) { |
118 | queue_work(xfsdatad_workqueue, &ioend->io_work); | 120 | queue_work(xfsdatad_workqueue, &ioend->io_work); |
121 | if (wait) | ||
122 | flush_workqueue(xfsdatad_workqueue); | ||
123 | } | ||
119 | } | 124 | } |
120 | 125 | ||
121 | /* | 126 | /* |
@@ -156,6 +161,8 @@ xfs_setfilesize( | |||
156 | xfs_fsize_t bsize; | 161 | xfs_fsize_t bsize; |
157 | 162 | ||
158 | ip = xfs_vtoi(ioend->io_vnode); | 163 | ip = xfs_vtoi(ioend->io_vnode); |
164 | if (!ip) | ||
165 | return; | ||
159 | 166 | ||
160 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); | 167 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); |
161 | ASSERT(ioend->io_type != IOMAP_READ); | 168 | ASSERT(ioend->io_type != IOMAP_READ); |
@@ -334,7 +341,7 @@ xfs_end_bio( | |||
334 | bio->bi_end_io = NULL; | 341 | bio->bi_end_io = NULL; |
335 | bio_put(bio); | 342 | bio_put(bio); |
336 | 343 | ||
337 | xfs_finish_ioend(ioend); | 344 | xfs_finish_ioend(ioend, 0); |
338 | return 0; | 345 | return 0; |
339 | } | 346 | } |
340 | 347 | ||
@@ -470,7 +477,7 @@ xfs_submit_ioend( | |||
470 | } | 477 | } |
471 | if (bio) | 478 | if (bio) |
472 | xfs_submit_ioend_bio(ioend, bio); | 479 | xfs_submit_ioend_bio(ioend, bio); |
473 | xfs_finish_ioend(ioend); | 480 | xfs_finish_ioend(ioend, 0); |
474 | } while ((ioend = next) != NULL); | 481 | } while ((ioend = next) != NULL); |
475 | } | 482 | } |
476 | 483 | ||
@@ -1003,6 +1010,8 @@ xfs_page_state_convert( | |||
1003 | if (buffer_unwritten(bh) || buffer_delay(bh) || | 1010 | if (buffer_unwritten(bh) || buffer_delay(bh) || |
1004 | ((buffer_uptodate(bh) || PageUptodate(page)) && | 1011 | ((buffer_uptodate(bh) || PageUptodate(page)) && |
1005 | !buffer_mapped(bh) && (unmapped || startio))) { | 1012 | !buffer_mapped(bh) && (unmapped || startio))) { |
1013 | int new_ioend = 0; | ||
1014 | |||
1006 | /* | 1015 | /* |
1007 | * Make sure we don't use a read-only iomap | 1016 | * Make sure we don't use a read-only iomap |
1008 | */ | 1017 | */ |
@@ -1021,6 +1030,15 @@ xfs_page_state_convert( | |||
1021 | } | 1030 | } |
1022 | 1031 | ||
1023 | if (!iomap_valid) { | 1032 | if (!iomap_valid) { |
1033 | /* | ||
1034 | * if we didn't have a valid mapping then we | ||
1035 | * need to ensure that we put the new mapping | ||
1036 | * in a new ioend structure. This needs to be | ||
1037 | * done to ensure that the ioends correctly | ||
1038 | * reflect the block mappings at io completion | ||
1039 | * for unwritten extent conversion. | ||
1040 | */ | ||
1041 | new_ioend = 1; | ||
1024 | if (type == IOMAP_NEW) { | 1042 | if (type == IOMAP_NEW) { |
1025 | size = xfs_probe_cluster(inode, | 1043 | size = xfs_probe_cluster(inode, |
1026 | page, bh, head, 0); | 1044 | page, bh, head, 0); |
@@ -1040,7 +1058,7 @@ xfs_page_state_convert( | |||
1040 | if (startio) { | 1058 | if (startio) { |
1041 | xfs_add_to_ioend(inode, bh, offset, | 1059 | xfs_add_to_ioend(inode, bh, offset, |
1042 | type, &ioend, | 1060 | type, &ioend, |
1043 | !iomap_valid); | 1061 | new_ioend); |
1044 | } else { | 1062 | } else { |
1045 | set_buffer_dirty(bh); | 1063 | set_buffer_dirty(bh); |
1046 | unlock_buffer(bh); | 1064 | unlock_buffer(bh); |
@@ -1416,6 +1434,13 @@ xfs_end_io_direct( | |||
1416 | * This is not necessary for synchronous direct I/O, but we do | 1434 | * This is not necessary for synchronous direct I/O, but we do |
1417 | * it anyway to keep the code uniform and simpler. | 1435 | * it anyway to keep the code uniform and simpler. |
1418 | * | 1436 | * |
1437 | * Well, if only it were that simple. Because synchronous direct I/O | ||
1438 | * requires extent conversion to occur *before* we return to userspace, | ||
1439 | * we have to wait for extent conversion to complete. Look at the | ||
1440 | * iocb that has been passed to us to determine if this is AIO or | ||
1441 | * not. If it is synchronous, tell xfs_finish_ioend() to kick the | ||
1442 | * workqueue and wait for it to complete. | ||
1443 | * | ||
1419 | * The core direct I/O code might be changed to always call the | 1444 | * The core direct I/O code might be changed to always call the |
1420 | * completion handler in the future, in which case all this can | 1445 | * completion handler in the future, in which case all this can |
1421 | * go away. | 1446 | * go away. |
@@ -1423,9 +1448,9 @@ xfs_end_io_direct( | |||
1423 | ioend->io_offset = offset; | 1448 | ioend->io_offset = offset; |
1424 | ioend->io_size = size; | 1449 | ioend->io_size = size; |
1425 | if (ioend->io_type == IOMAP_READ) { | 1450 | if (ioend->io_type == IOMAP_READ) { |
1426 | xfs_finish_ioend(ioend); | 1451 | xfs_finish_ioend(ioend, 0); |
1427 | } else if (private && size > 0) { | 1452 | } else if (private && size > 0) { |
1428 | xfs_finish_ioend(ioend); | 1453 | xfs_finish_ioend(ioend, is_sync_kiocb(iocb)); |
1429 | } else { | 1454 | } else { |
1430 | /* | 1455 | /* |
1431 | * A direct I/O write ioend starts it's life in unwritten | 1456 | * A direct I/O write ioend starts it's life in unwritten |
@@ -1434,7 +1459,7 @@ xfs_end_io_direct( | |||
1434 | * handler. | 1459 | * handler. |
1435 | */ | 1460 | */ |
1436 | INIT_WORK(&ioend->io_work, xfs_end_bio_written); | 1461 | INIT_WORK(&ioend->io_work, xfs_end_bio_written); |
1437 | xfs_finish_ioend(ioend); | 1462 | xfs_finish_ioend(ioend, 0); |
1438 | } | 1463 | } |
1439 | 1464 | ||
1440 | /* | 1465 | /* |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index fe4f66a5af14..b0f0e58866de 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
@@ -35,10 +35,13 @@ | |||
35 | #include <linux/freezer.h> | 35 | #include <linux/freezer.h> |
36 | 36 | ||
37 | static kmem_zone_t *xfs_buf_zone; | 37 | static kmem_zone_t *xfs_buf_zone; |
38 | static kmem_shaker_t xfs_buf_shake; | ||
39 | STATIC int xfsbufd(void *); | 38 | STATIC int xfsbufd(void *); |
40 | STATIC int xfsbufd_wakeup(int, gfp_t); | 39 | STATIC int xfsbufd_wakeup(int, gfp_t); |
41 | STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); | 40 | STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); |
41 | static struct shrinker xfs_buf_shake = { | ||
42 | .shrink = xfsbufd_wakeup, | ||
43 | .seeks = DEFAULT_SEEKS, | ||
44 | }; | ||
42 | 45 | ||
43 | static struct workqueue_struct *xfslogd_workqueue; | 46 | static struct workqueue_struct *xfslogd_workqueue; |
44 | struct workqueue_struct *xfsdatad_workqueue; | 47 | struct workqueue_struct *xfsdatad_workqueue; |
@@ -314,7 +317,7 @@ xfs_buf_free( | |||
314 | 317 | ||
315 | ASSERT(list_empty(&bp->b_hash_list)); | 318 | ASSERT(list_empty(&bp->b_hash_list)); |
316 | 319 | ||
317 | if (bp->b_flags & _XBF_PAGE_CACHE) { | 320 | if (bp->b_flags & (_XBF_PAGE_CACHE|_XBF_PAGES)) { |
318 | uint i; | 321 | uint i; |
319 | 322 | ||
320 | if ((bp->b_flags & XBF_MAPPED) && (bp->b_page_count > 1)) | 323 | if ((bp->b_flags & XBF_MAPPED) && (bp->b_page_count > 1)) |
@@ -323,18 +326,11 @@ xfs_buf_free( | |||
323 | for (i = 0; i < bp->b_page_count; i++) { | 326 | for (i = 0; i < bp->b_page_count; i++) { |
324 | struct page *page = bp->b_pages[i]; | 327 | struct page *page = bp->b_pages[i]; |
325 | 328 | ||
326 | ASSERT(!PagePrivate(page)); | 329 | if (bp->b_flags & _XBF_PAGE_CACHE) |
330 | ASSERT(!PagePrivate(page)); | ||
327 | page_cache_release(page); | 331 | page_cache_release(page); |
328 | } | 332 | } |
329 | _xfs_buf_free_pages(bp); | 333 | _xfs_buf_free_pages(bp); |
330 | } else if (bp->b_flags & _XBF_KMEM_ALLOC) { | ||
331 | /* | ||
332 | * XXX(hch): bp->b_count_desired might be incorrect (see | ||
333 | * xfs_buf_associate_memory for details), but fortunately | ||
334 | * the Linux version of kmem_free ignores the len argument.. | ||
335 | */ | ||
336 | kmem_free(bp->b_addr, bp->b_count_desired); | ||
337 | _xfs_buf_free_pages(bp); | ||
338 | } | 334 | } |
339 | 335 | ||
340 | xfs_buf_deallocate(bp); | 336 | xfs_buf_deallocate(bp); |
@@ -764,43 +760,44 @@ xfs_buf_get_noaddr( | |||
764 | size_t len, | 760 | size_t len, |
765 | xfs_buftarg_t *target) | 761 | xfs_buftarg_t *target) |
766 | { | 762 | { |
767 | size_t malloc_len = len; | 763 | unsigned long page_count = PAGE_ALIGN(len) >> PAGE_SHIFT; |
764 | int error, i; | ||
768 | xfs_buf_t *bp; | 765 | xfs_buf_t *bp; |
769 | void *data; | ||
770 | int error; | ||
771 | 766 | ||
772 | bp = xfs_buf_allocate(0); | 767 | bp = xfs_buf_allocate(0); |
773 | if (unlikely(bp == NULL)) | 768 | if (unlikely(bp == NULL)) |
774 | goto fail; | 769 | goto fail; |
775 | _xfs_buf_initialize(bp, target, 0, len, 0); | 770 | _xfs_buf_initialize(bp, target, 0, len, 0); |
776 | 771 | ||
777 | try_again: | 772 | error = _xfs_buf_get_pages(bp, page_count, 0); |
778 | data = kmem_alloc(malloc_len, KM_SLEEP | KM_MAYFAIL | KM_LARGE); | 773 | if (error) |
779 | if (unlikely(data == NULL)) | ||
780 | goto fail_free_buf; | 774 | goto fail_free_buf; |
781 | 775 | ||
782 | /* check whether alignment matches.. */ | 776 | for (i = 0; i < page_count; i++) { |
783 | if ((__psunsigned_t)data != | 777 | bp->b_pages[i] = alloc_page(GFP_KERNEL); |
784 | ((__psunsigned_t)data & ~target->bt_smask)) { | 778 | if (!bp->b_pages[i]) |
785 | /* .. else double the size and try again */ | 779 | goto fail_free_mem; |
786 | kmem_free(data, malloc_len); | ||
787 | malloc_len <<= 1; | ||
788 | goto try_again; | ||
789 | } | 780 | } |
781 | bp->b_flags |= _XBF_PAGES; | ||
790 | 782 | ||
791 | error = xfs_buf_associate_memory(bp, data, len); | 783 | error = _xfs_buf_map_pages(bp, XBF_MAPPED); |
792 | if (error) | 784 | if (unlikely(error)) { |
785 | printk(KERN_WARNING "%s: failed to map pages\n", | ||
786 | __FUNCTION__); | ||
793 | goto fail_free_mem; | 787 | goto fail_free_mem; |
794 | bp->b_flags |= _XBF_KMEM_ALLOC; | 788 | } |
795 | 789 | ||
796 | xfs_buf_unlock(bp); | 790 | xfs_buf_unlock(bp); |
797 | 791 | ||
798 | XB_TRACE(bp, "no_daddr", data); | 792 | XB_TRACE(bp, "no_daddr", len); |
799 | return bp; | 793 | return bp; |
794 | |||
800 | fail_free_mem: | 795 | fail_free_mem: |
801 | kmem_free(data, malloc_len); | 796 | while (--i >= 0) |
797 | __free_page(bp->b_pages[i]); | ||
798 | _xfs_buf_free_pages(bp); | ||
802 | fail_free_buf: | 799 | fail_free_buf: |
803 | xfs_buf_free(bp); | 800 | xfs_buf_deallocate(bp); |
804 | fail: | 801 | fail: |
805 | return NULL; | 802 | return NULL; |
806 | } | 803 | } |
@@ -1453,6 +1450,7 @@ xfs_free_buftarg( | |||
1453 | int external) | 1450 | int external) |
1454 | { | 1451 | { |
1455 | xfs_flush_buftarg(btp, 1); | 1452 | xfs_flush_buftarg(btp, 1); |
1453 | xfs_blkdev_issue_flush(btp); | ||
1456 | if (external) | 1454 | if (external) |
1457 | xfs_blkdev_put(btp->bt_bdev); | 1455 | xfs_blkdev_put(btp->bt_bdev); |
1458 | xfs_free_bufhash(btp); | 1456 | xfs_free_bufhash(btp); |
@@ -1837,14 +1835,9 @@ xfs_buf_init(void) | |||
1837 | if (!xfsdatad_workqueue) | 1835 | if (!xfsdatad_workqueue) |
1838 | goto out_destroy_xfslogd_workqueue; | 1836 | goto out_destroy_xfslogd_workqueue; |
1839 | 1837 | ||
1840 | xfs_buf_shake = kmem_shake_register(xfsbufd_wakeup); | 1838 | register_shrinker(&xfs_buf_shake); |
1841 | if (!xfs_buf_shake) | ||
1842 | goto out_destroy_xfsdatad_workqueue; | ||
1843 | |||
1844 | return 0; | 1839 | return 0; |
1845 | 1840 | ||
1846 | out_destroy_xfsdatad_workqueue: | ||
1847 | destroy_workqueue(xfsdatad_workqueue); | ||
1848 | out_destroy_xfslogd_workqueue: | 1841 | out_destroy_xfslogd_workqueue: |
1849 | destroy_workqueue(xfslogd_workqueue); | 1842 | destroy_workqueue(xfslogd_workqueue); |
1850 | out_free_buf_zone: | 1843 | out_free_buf_zone: |
@@ -1859,7 +1852,7 @@ xfs_buf_init(void) | |||
1859 | void | 1852 | void |
1860 | xfs_buf_terminate(void) | 1853 | xfs_buf_terminate(void) |
1861 | { | 1854 | { |
1862 | kmem_shake_deregister(xfs_buf_shake); | 1855 | unregister_shrinker(&xfs_buf_shake); |
1863 | destroy_workqueue(xfsdatad_workqueue); | 1856 | destroy_workqueue(xfsdatad_workqueue); |
1864 | destroy_workqueue(xfslogd_workqueue); | 1857 | destroy_workqueue(xfslogd_workqueue); |
1865 | kmem_zone_destroy(xfs_buf_zone); | 1858 | kmem_zone_destroy(xfs_buf_zone); |
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index b6241f6201a5..b5908a34b15d 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h | |||
@@ -63,7 +63,7 @@ typedef enum { | |||
63 | 63 | ||
64 | /* flags used only internally */ | 64 | /* flags used only internally */ |
65 | _XBF_PAGE_CACHE = (1 << 17),/* backed by pagecache */ | 65 | _XBF_PAGE_CACHE = (1 << 17),/* backed by pagecache */ |
66 | _XBF_KMEM_ALLOC = (1 << 18),/* backed by kmem_alloc() */ | 66 | _XBF_PAGES = (1 << 18), /* backed by refcounted pages */ |
67 | _XBF_RUN_QUEUES = (1 << 19),/* run block device task queue */ | 67 | _XBF_RUN_QUEUES = (1 << 19),/* run block device task queue */ |
68 | _XBF_DELWRI_Q = (1 << 21), /* buffer on delwri queue */ | 68 | _XBF_DELWRI_Q = (1 << 21), /* buffer on delwri queue */ |
69 | } xfs_buf_flags_t; | 69 | } xfs_buf_flags_t; |
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index cb51dc961355..cbcd40c8c2a0 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
@@ -124,30 +124,6 @@ xfs_file_aio_write_invis( | |||
124 | } | 124 | } |
125 | 125 | ||
126 | STATIC ssize_t | 126 | STATIC ssize_t |
127 | xfs_file_sendfile( | ||
128 | struct file *filp, | ||
129 | loff_t *pos, | ||
130 | size_t count, | ||
131 | read_actor_t actor, | ||
132 | void *target) | ||
133 | { | ||
134 | return bhv_vop_sendfile(vn_from_inode(filp->f_path.dentry->d_inode), | ||
135 | filp, pos, 0, count, actor, target, NULL); | ||
136 | } | ||
137 | |||
138 | STATIC ssize_t | ||
139 | xfs_file_sendfile_invis( | ||
140 | struct file *filp, | ||
141 | loff_t *pos, | ||
142 | size_t count, | ||
143 | read_actor_t actor, | ||
144 | void *target) | ||
145 | { | ||
146 | return bhv_vop_sendfile(vn_from_inode(filp->f_path.dentry->d_inode), | ||
147 | filp, pos, IO_INVIS, count, actor, target, NULL); | ||
148 | } | ||
149 | |||
150 | STATIC ssize_t | ||
151 | xfs_file_splice_read( | 127 | xfs_file_splice_read( |
152 | struct file *infilp, | 128 | struct file *infilp, |
153 | loff_t *ppos, | 129 | loff_t *ppos, |
@@ -208,15 +184,6 @@ xfs_file_open( | |||
208 | } | 184 | } |
209 | 185 | ||
210 | STATIC int | 186 | STATIC int |
211 | xfs_file_close( | ||
212 | struct file *filp, | ||
213 | fl_owner_t id) | ||
214 | { | ||
215 | return -bhv_vop_close(vn_from_inode(filp->f_path.dentry->d_inode), 0, | ||
216 | file_count(filp) > 1 ? L_FALSE : L_TRUE, NULL); | ||
217 | } | ||
218 | |||
219 | STATIC int | ||
220 | xfs_file_release( | 187 | xfs_file_release( |
221 | struct inode *inode, | 188 | struct inode *inode, |
222 | struct file *filp) | 189 | struct file *filp) |
@@ -452,7 +419,6 @@ const struct file_operations xfs_file_operations = { | |||
452 | .write = do_sync_write, | 419 | .write = do_sync_write, |
453 | .aio_read = xfs_file_aio_read, | 420 | .aio_read = xfs_file_aio_read, |
454 | .aio_write = xfs_file_aio_write, | 421 | .aio_write = xfs_file_aio_write, |
455 | .sendfile = xfs_file_sendfile, | ||
456 | .splice_read = xfs_file_splice_read, | 422 | .splice_read = xfs_file_splice_read, |
457 | .splice_write = xfs_file_splice_write, | 423 | .splice_write = xfs_file_splice_write, |
458 | .unlocked_ioctl = xfs_file_ioctl, | 424 | .unlocked_ioctl = xfs_file_ioctl, |
@@ -461,7 +427,6 @@ const struct file_operations xfs_file_operations = { | |||
461 | #endif | 427 | #endif |
462 | .mmap = xfs_file_mmap, | 428 | .mmap = xfs_file_mmap, |
463 | .open = xfs_file_open, | 429 | .open = xfs_file_open, |
464 | .flush = xfs_file_close, | ||
465 | .release = xfs_file_release, | 430 | .release = xfs_file_release, |
466 | .fsync = xfs_file_fsync, | 431 | .fsync = xfs_file_fsync, |
467 | #ifdef HAVE_FOP_OPEN_EXEC | 432 | #ifdef HAVE_FOP_OPEN_EXEC |
@@ -475,7 +440,6 @@ const struct file_operations xfs_invis_file_operations = { | |||
475 | .write = do_sync_write, | 440 | .write = do_sync_write, |
476 | .aio_read = xfs_file_aio_read_invis, | 441 | .aio_read = xfs_file_aio_read_invis, |
477 | .aio_write = xfs_file_aio_write_invis, | 442 | .aio_write = xfs_file_aio_write_invis, |
478 | .sendfile = xfs_file_sendfile_invis, | ||
479 | .splice_read = xfs_file_splice_read_invis, | 443 | .splice_read = xfs_file_splice_read_invis, |
480 | .splice_write = xfs_file_splice_write_invis, | 444 | .splice_write = xfs_file_splice_write_invis, |
481 | .unlocked_ioctl = xfs_file_ioctl_invis, | 445 | .unlocked_ioctl = xfs_file_ioctl_invis, |
@@ -484,7 +448,6 @@ const struct file_operations xfs_invis_file_operations = { | |||
484 | #endif | 448 | #endif |
485 | .mmap = xfs_file_mmap, | 449 | .mmap = xfs_file_mmap, |
486 | .open = xfs_file_open, | 450 | .open = xfs_file_open, |
487 | .flush = xfs_file_close, | ||
488 | .release = xfs_file_release, | 451 | .release = xfs_file_release, |
489 | .fsync = xfs_file_fsync, | 452 | .fsync = xfs_file_fsync, |
490 | }; | 453 | }; |
diff --git a/fs/xfs/linux-2.6/xfs_globals.c b/fs/xfs/linux-2.6/xfs_globals.c index ed3a5e1b4b67..bb72c3d4141f 100644 --- a/fs/xfs/linux-2.6/xfs_globals.c +++ b/fs/xfs/linux-2.6/xfs_globals.c | |||
@@ -46,6 +46,7 @@ xfs_param_t xfs_params = { | |||
46 | .inherit_nosym = { 0, 0, 1 }, | 46 | .inherit_nosym = { 0, 0, 1 }, |
47 | .rotorstep = { 1, 1, 255 }, | 47 | .rotorstep = { 1, 1, 255 }, |
48 | .inherit_nodfrg = { 0, 1, 1 }, | 48 | .inherit_nodfrg = { 0, 1, 1 }, |
49 | .fstrm_timer = { 1, 50, 3600*100}, | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | /* | 52 | /* |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index ff5c41ff8d40..5917808abbd6 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
@@ -1019,7 +1019,7 @@ xfs_ioc_bulkstat( | |||
1019 | 1019 | ||
1020 | if (cmd == XFS_IOC_FSINUMBERS) | 1020 | if (cmd == XFS_IOC_FSINUMBERS) |
1021 | error = xfs_inumbers(mp, &inlast, &count, | 1021 | error = xfs_inumbers(mp, &inlast, &count, |
1022 | bulkreq.ubuffer); | 1022 | bulkreq.ubuffer, xfs_inumbers_fmt); |
1023 | else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) | 1023 | else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) |
1024 | error = xfs_bulkstat_single(mp, &inlast, | 1024 | error = xfs_bulkstat_single(mp, &inlast, |
1025 | bulkreq.ubuffer, &done); | 1025 | bulkreq.ubuffer, &done); |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index b83cebc165f1..141cf15067c2 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c | |||
@@ -23,10 +23,25 @@ | |||
23 | #include <linux/fs.h> | 23 | #include <linux/fs.h> |
24 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
25 | #include "xfs.h" | 25 | #include "xfs.h" |
26 | #include "xfs_types.h" | ||
27 | #include "xfs_fs.h" | 26 | #include "xfs_fs.h" |
27 | #include "xfs_bit.h" | ||
28 | #include "xfs_log.h" | ||
29 | #include "xfs_inum.h" | ||
30 | #include "xfs_trans.h" | ||
31 | #include "xfs_sb.h" | ||
32 | #include "xfs_ag.h" | ||
33 | #include "xfs_dir2.h" | ||
34 | #include "xfs_dmapi.h" | ||
35 | #include "xfs_mount.h" | ||
36 | #include "xfs_bmap_btree.h" | ||
37 | #include "xfs_attr_sf.h" | ||
38 | #include "xfs_dir2_sf.h" | ||
28 | #include "xfs_vfs.h" | 39 | #include "xfs_vfs.h" |
29 | #include "xfs_vnode.h" | 40 | #include "xfs_vnode.h" |
41 | #include "xfs_dinode.h" | ||
42 | #include "xfs_inode.h" | ||
43 | #include "xfs_itable.h" | ||
44 | #include "xfs_error.h" | ||
30 | #include "xfs_dfrag.h" | 45 | #include "xfs_dfrag.h" |
31 | 46 | ||
32 | #define _NATIVE_IOC(cmd, type) \ | 47 | #define _NATIVE_IOC(cmd, type) \ |
@@ -34,6 +49,7 @@ | |||
34 | 49 | ||
35 | #if defined(CONFIG_IA64) || defined(CONFIG_X86_64) | 50 | #if defined(CONFIG_IA64) || defined(CONFIG_X86_64) |
36 | #define BROKEN_X86_ALIGNMENT | 51 | #define BROKEN_X86_ALIGNMENT |
52 | #define _PACKED __attribute__((packed)) | ||
37 | /* on ia32 l_start is on a 32-bit boundary */ | 53 | /* on ia32 l_start is on a 32-bit boundary */ |
38 | typedef struct xfs_flock64_32 { | 54 | typedef struct xfs_flock64_32 { |
39 | __s16 l_type; | 55 | __s16 l_type; |
@@ -75,35 +91,276 @@ xfs_ioctl32_flock( | |||
75 | return (unsigned long)p; | 91 | return (unsigned long)p; |
76 | } | 92 | } |
77 | 93 | ||
94 | typedef struct compat_xfs_fsop_geom_v1 { | ||
95 | __u32 blocksize; /* filesystem (data) block size */ | ||
96 | __u32 rtextsize; /* realtime extent size */ | ||
97 | __u32 agblocks; /* fsblocks in an AG */ | ||
98 | __u32 agcount; /* number of allocation groups */ | ||
99 | __u32 logblocks; /* fsblocks in the log */ | ||
100 | __u32 sectsize; /* (data) sector size, bytes */ | ||
101 | __u32 inodesize; /* inode size in bytes */ | ||
102 | __u32 imaxpct; /* max allowed inode space(%) */ | ||
103 | __u64 datablocks; /* fsblocks in data subvolume */ | ||
104 | __u64 rtblocks; /* fsblocks in realtime subvol */ | ||
105 | __u64 rtextents; /* rt extents in realtime subvol*/ | ||
106 | __u64 logstart; /* starting fsblock of the log */ | ||
107 | unsigned char uuid[16]; /* unique id of the filesystem */ | ||
108 | __u32 sunit; /* stripe unit, fsblocks */ | ||
109 | __u32 swidth; /* stripe width, fsblocks */ | ||
110 | __s32 version; /* structure version */ | ||
111 | __u32 flags; /* superblock version flags */ | ||
112 | __u32 logsectsize; /* log sector size, bytes */ | ||
113 | __u32 rtsectsize; /* realtime sector size, bytes */ | ||
114 | __u32 dirblocksize; /* directory block size, bytes */ | ||
115 | } __attribute__((packed)) compat_xfs_fsop_geom_v1_t; | ||
116 | |||
117 | #define XFS_IOC_FSGEOMETRY_V1_32 \ | ||
118 | _IOR ('X', 100, struct compat_xfs_fsop_geom_v1) | ||
119 | |||
120 | STATIC unsigned long xfs_ioctl32_geom_v1(unsigned long arg) | ||
121 | { | ||
122 | compat_xfs_fsop_geom_v1_t __user *p32 = (void __user *)arg; | ||
123 | xfs_fsop_geom_v1_t __user *p = compat_alloc_user_space(sizeof(*p)); | ||
124 | |||
125 | if (copy_in_user(p, p32, sizeof(*p32))) | ||
126 | return -EFAULT; | ||
127 | return (unsigned long)p; | ||
128 | } | ||
129 | |||
130 | typedef struct compat_xfs_inogrp { | ||
131 | __u64 xi_startino; /* starting inode number */ | ||
132 | __s32 xi_alloccount; /* # bits set in allocmask */ | ||
133 | __u64 xi_allocmask; /* mask of allocated inodes */ | ||
134 | } __attribute__((packed)) compat_xfs_inogrp_t; | ||
135 | |||
136 | STATIC int xfs_inumbers_fmt_compat( | ||
137 | void __user *ubuffer, | ||
138 | const xfs_inogrp_t *buffer, | ||
139 | long count, | ||
140 | long *written) | ||
141 | { | ||
142 | compat_xfs_inogrp_t *p32 = ubuffer; | ||
143 | long i; | ||
144 | |||
145 | for (i = 0; i < count; i++) { | ||
146 | if (put_user(buffer[i].xi_startino, &p32[i].xi_startino) || | ||
147 | put_user(buffer[i].xi_alloccount, &p32[i].xi_alloccount) || | ||
148 | put_user(buffer[i].xi_allocmask, &p32[i].xi_allocmask)) | ||
149 | return -EFAULT; | ||
150 | } | ||
151 | *written = count * sizeof(*p32); | ||
152 | return 0; | ||
153 | } | ||
154 | |||
78 | #else | 155 | #else |
79 | 156 | ||
80 | typedef struct xfs_fsop_bulkreq32 { | 157 | #define xfs_inumbers_fmt_compat xfs_inumbers_fmt |
158 | #define _PACKED | ||
159 | |||
160 | #endif | ||
161 | |||
162 | /* XFS_IOC_FSBULKSTAT and friends */ | ||
163 | |||
164 | typedef struct compat_xfs_bstime { | ||
165 | __s32 tv_sec; /* seconds */ | ||
166 | __s32 tv_nsec; /* and nanoseconds */ | ||
167 | } compat_xfs_bstime_t; | ||
168 | |||
169 | STATIC int xfs_bstime_store_compat( | ||
170 | compat_xfs_bstime_t __user *p32, | ||
171 | const xfs_bstime_t *p) | ||
172 | { | ||
173 | __s32 sec32; | ||
174 | |||
175 | sec32 = p->tv_sec; | ||
176 | if (put_user(sec32, &p32->tv_sec) || | ||
177 | put_user(p->tv_nsec, &p32->tv_nsec)) | ||
178 | return -EFAULT; | ||
179 | return 0; | ||
180 | } | ||
181 | |||
182 | typedef struct compat_xfs_bstat { | ||
183 | __u64 bs_ino; /* inode number */ | ||
184 | __u16 bs_mode; /* type and mode */ | ||
185 | __u16 bs_nlink; /* number of links */ | ||
186 | __u32 bs_uid; /* user id */ | ||
187 | __u32 bs_gid; /* group id */ | ||
188 | __u32 bs_rdev; /* device value */ | ||
189 | __s32 bs_blksize; /* block size */ | ||
190 | __s64 bs_size; /* file size */ | ||
191 | compat_xfs_bstime_t bs_atime; /* access time */ | ||
192 | compat_xfs_bstime_t bs_mtime; /* modify time */ | ||
193 | compat_xfs_bstime_t bs_ctime; /* inode change time */ | ||
194 | int64_t bs_blocks; /* number of blocks */ | ||
195 | __u32 bs_xflags; /* extended flags */ | ||
196 | __s32 bs_extsize; /* extent size */ | ||
197 | __s32 bs_extents; /* number of extents */ | ||
198 | __u32 bs_gen; /* generation count */ | ||
199 | __u16 bs_projid; /* project id */ | ||
200 | unsigned char bs_pad[14]; /* pad space, unused */ | ||
201 | __u32 bs_dmevmask; /* DMIG event mask */ | ||
202 | __u16 bs_dmstate; /* DMIG state info */ | ||
203 | __u16 bs_aextents; /* attribute number of extents */ | ||
204 | } _PACKED compat_xfs_bstat_t; | ||
205 | |||
206 | STATIC int xfs_bulkstat_one_fmt_compat( | ||
207 | void __user *ubuffer, | ||
208 | const xfs_bstat_t *buffer) | ||
209 | { | ||
210 | compat_xfs_bstat_t __user *p32 = ubuffer; | ||
211 | |||
212 | if (put_user(buffer->bs_ino, &p32->bs_ino) || | ||
213 | put_user(buffer->bs_mode, &p32->bs_mode) || | ||
214 | put_user(buffer->bs_nlink, &p32->bs_nlink) || | ||
215 | put_user(buffer->bs_uid, &p32->bs_uid) || | ||
216 | put_user(buffer->bs_gid, &p32->bs_gid) || | ||
217 | put_user(buffer->bs_rdev, &p32->bs_rdev) || | ||
218 | put_user(buffer->bs_blksize, &p32->bs_blksize) || | ||
219 | put_user(buffer->bs_size, &p32->bs_size) || | ||
220 | xfs_bstime_store_compat(&p32->bs_atime, &buffer->bs_atime) || | ||
221 | xfs_bstime_store_compat(&p32->bs_mtime, &buffer->bs_mtime) || | ||
222 | xfs_bstime_store_compat(&p32->bs_ctime, &buffer->bs_ctime) || | ||
223 | put_user(buffer->bs_blocks, &p32->bs_blocks) || | ||
224 | put_user(buffer->bs_xflags, &p32->bs_xflags) || | ||
225 | put_user(buffer->bs_extsize, &p32->bs_extsize) || | ||
226 | put_user(buffer->bs_extents, &p32->bs_extents) || | ||
227 | put_user(buffer->bs_gen, &p32->bs_gen) || | ||
228 | put_user(buffer->bs_projid, &p32->bs_projid) || | ||
229 | put_user(buffer->bs_dmevmask, &p32->bs_dmevmask) || | ||
230 | put_user(buffer->bs_dmstate, &p32->bs_dmstate) || | ||
231 | put_user(buffer->bs_aextents, &p32->bs_aextents)) | ||
232 | return -EFAULT; | ||
233 | return sizeof(*p32); | ||
234 | } | ||
235 | |||
236 | |||
237 | |||
238 | typedef struct compat_xfs_fsop_bulkreq { | ||
81 | compat_uptr_t lastip; /* last inode # pointer */ | 239 | compat_uptr_t lastip; /* last inode # pointer */ |
82 | __s32 icount; /* count of entries in buffer */ | 240 | __s32 icount; /* count of entries in buffer */ |
83 | compat_uptr_t ubuffer; /* user buffer for inode desc. */ | 241 | compat_uptr_t ubuffer; /* user buffer for inode desc. */ |
84 | __s32 ocount; /* output count pointer */ | 242 | compat_uptr_t ocount; /* output count pointer */ |
85 | } xfs_fsop_bulkreq32_t; | 243 | } compat_xfs_fsop_bulkreq_t; |
86 | 244 | ||
87 | STATIC unsigned long | 245 | #define XFS_IOC_FSBULKSTAT_32 \ |
88 | xfs_ioctl32_bulkstat( | 246 | _IOWR('X', 101, struct compat_xfs_fsop_bulkreq) |
89 | unsigned long arg) | 247 | #define XFS_IOC_FSBULKSTAT_SINGLE_32 \ |
248 | _IOWR('X', 102, struct compat_xfs_fsop_bulkreq) | ||
249 | #define XFS_IOC_FSINUMBERS_32 \ | ||
250 | _IOWR('X', 103, struct compat_xfs_fsop_bulkreq) | ||
251 | |||
252 | /* copied from xfs_ioctl.c */ | ||
253 | STATIC int | ||
254 | xfs_ioc_bulkstat_compat( | ||
255 | xfs_mount_t *mp, | ||
256 | unsigned int cmd, | ||
257 | void __user *arg) | ||
90 | { | 258 | { |
91 | xfs_fsop_bulkreq32_t __user *p32 = (void __user *)arg; | 259 | compat_xfs_fsop_bulkreq_t __user *p32 = (void __user *)arg; |
92 | xfs_fsop_bulkreq_t __user *p = compat_alloc_user_space(sizeof(*p)); | ||
93 | u32 addr; | 260 | u32 addr; |
261 | xfs_fsop_bulkreq_t bulkreq; | ||
262 | int count; /* # of records returned */ | ||
263 | xfs_ino_t inlast; /* last inode number */ | ||
264 | int done; | ||
265 | int error; | ||
266 | |||
267 | /* done = 1 if there are more stats to get and if bulkstat */ | ||
268 | /* should be called again (unused here, but used in dmapi) */ | ||
269 | |||
270 | if (!capable(CAP_SYS_ADMIN)) | ||
271 | return -EPERM; | ||
272 | |||
273 | if (XFS_FORCED_SHUTDOWN(mp)) | ||
274 | return -XFS_ERROR(EIO); | ||
275 | |||
276 | if (get_user(addr, &p32->lastip)) | ||
277 | return -EFAULT; | ||
278 | bulkreq.lastip = compat_ptr(addr); | ||
279 | if (get_user(bulkreq.icount, &p32->icount) || | ||
280 | get_user(addr, &p32->ubuffer)) | ||
281 | return -EFAULT; | ||
282 | bulkreq.ubuffer = compat_ptr(addr); | ||
283 | if (get_user(addr, &p32->ocount)) | ||
284 | return -EFAULT; | ||
285 | bulkreq.ocount = compat_ptr(addr); | ||
286 | |||
287 | if (copy_from_user(&inlast, bulkreq.lastip, sizeof(__s64))) | ||
288 | return -XFS_ERROR(EFAULT); | ||
289 | |||
290 | if ((count = bulkreq.icount) <= 0) | ||
291 | return -XFS_ERROR(EINVAL); | ||
292 | |||
293 | if (cmd == XFS_IOC_FSINUMBERS) | ||
294 | error = xfs_inumbers(mp, &inlast, &count, | ||
295 | bulkreq.ubuffer, xfs_inumbers_fmt_compat); | ||
296 | else { | ||
297 | /* declare a var to get a warning in case the type changes */ | ||
298 | bulkstat_one_fmt_pf formatter = xfs_bulkstat_one_fmt_compat; | ||
299 | error = xfs_bulkstat(mp, &inlast, &count, | ||
300 | xfs_bulkstat_one, formatter, | ||
301 | sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, | ||
302 | BULKSTAT_FG_QUICK, &done); | ||
303 | } | ||
304 | if (error) | ||
305 | return -error; | ||
306 | |||
307 | if (bulkreq.ocount != NULL) { | ||
308 | if (copy_to_user(bulkreq.lastip, &inlast, | ||
309 | sizeof(xfs_ino_t))) | ||
310 | return -XFS_ERROR(EFAULT); | ||
311 | |||
312 | if (copy_to_user(bulkreq.ocount, &count, sizeof(count))) | ||
313 | return -XFS_ERROR(EFAULT); | ||
314 | } | ||
315 | |||
316 | return 0; | ||
317 | } | ||
318 | |||
319 | |||
320 | |||
321 | typedef struct compat_xfs_fsop_handlereq { | ||
322 | __u32 fd; /* fd for FD_TO_HANDLE */ | ||
323 | compat_uptr_t path; /* user pathname */ | ||
324 | __u32 oflags; /* open flags */ | ||
325 | compat_uptr_t ihandle; /* user supplied handle */ | ||
326 | __u32 ihandlen; /* user supplied length */ | ||
327 | compat_uptr_t ohandle; /* user buffer for handle */ | ||
328 | compat_uptr_t ohandlen; /* user buffer length */ | ||
329 | } compat_xfs_fsop_handlereq_t; | ||
330 | |||
331 | #define XFS_IOC_PATH_TO_FSHANDLE_32 \ | ||
332 | _IOWR('X', 104, struct compat_xfs_fsop_handlereq) | ||
333 | #define XFS_IOC_PATH_TO_HANDLE_32 \ | ||
334 | _IOWR('X', 105, struct compat_xfs_fsop_handlereq) | ||
335 | #define XFS_IOC_FD_TO_HANDLE_32 \ | ||
336 | _IOWR('X', 106, struct compat_xfs_fsop_handlereq) | ||
337 | #define XFS_IOC_OPEN_BY_HANDLE_32 \ | ||
338 | _IOWR('X', 107, struct compat_xfs_fsop_handlereq) | ||
339 | #define XFS_IOC_READLINK_BY_HANDLE_32 \ | ||
340 | _IOWR('X', 108, struct compat_xfs_fsop_handlereq) | ||
341 | |||
342 | STATIC unsigned long xfs_ioctl32_fshandle(unsigned long arg) | ||
343 | { | ||
344 | compat_xfs_fsop_handlereq_t __user *p32 = (void __user *)arg; | ||
345 | xfs_fsop_handlereq_t __user *p = compat_alloc_user_space(sizeof(*p)); | ||
346 | u32 addr; | ||
94 | 347 | ||
95 | if (get_user(addr, &p32->lastip) || | 348 | if (copy_in_user(&p->fd, &p32->fd, sizeof(__u32)) || |
96 | put_user(compat_ptr(addr), &p->lastip) || | 349 | get_user(addr, &p32->path) || |
97 | copy_in_user(&p->icount, &p32->icount, sizeof(s32)) || | 350 | put_user(compat_ptr(addr), &p->path) || |
98 | get_user(addr, &p32->ubuffer) || | 351 | copy_in_user(&p->oflags, &p32->oflags, sizeof(__u32)) || |
99 | put_user(compat_ptr(addr), &p->ubuffer) || | 352 | get_user(addr, &p32->ihandle) || |
100 | get_user(addr, &p32->ocount) || | 353 | put_user(compat_ptr(addr), &p->ihandle) || |
101 | put_user(compat_ptr(addr), &p->ocount)) | 354 | copy_in_user(&p->ihandlen, &p32->ihandlen, sizeof(__u32)) || |
355 | get_user(addr, &p32->ohandle) || | ||
356 | put_user(compat_ptr(addr), &p->ohandle) || | ||
357 | get_user(addr, &p32->ohandlen) || | ||
358 | put_user(compat_ptr(addr), &p->ohandlen)) | ||
102 | return -EFAULT; | 359 | return -EFAULT; |
103 | 360 | ||
104 | return (unsigned long)p; | 361 | return (unsigned long)p; |
105 | } | 362 | } |
106 | #endif | 363 | |
107 | 364 | ||
108 | STATIC long | 365 | STATIC long |
109 | xfs_compat_ioctl( | 366 | xfs_compat_ioctl( |
@@ -118,7 +375,6 @@ xfs_compat_ioctl( | |||
118 | 375 | ||
119 | switch (cmd) { | 376 | switch (cmd) { |
120 | case XFS_IOC_DIOINFO: | 377 | case XFS_IOC_DIOINFO: |
121 | case XFS_IOC_FSGEOMETRY_V1: | ||
122 | case XFS_IOC_FSGEOMETRY: | 378 | case XFS_IOC_FSGEOMETRY: |
123 | case XFS_IOC_GETVERSION: | 379 | case XFS_IOC_GETVERSION: |
124 | case XFS_IOC_GETXFLAGS: | 380 | case XFS_IOC_GETXFLAGS: |
@@ -131,12 +387,7 @@ xfs_compat_ioctl( | |||
131 | case XFS_IOC_GETBMAPA: | 387 | case XFS_IOC_GETBMAPA: |
132 | case XFS_IOC_GETBMAPX: | 388 | case XFS_IOC_GETBMAPX: |
133 | /* not handled | 389 | /* not handled |
134 | case XFS_IOC_FD_TO_HANDLE: | ||
135 | case XFS_IOC_PATH_TO_HANDLE: | ||
136 | case XFS_IOC_PATH_TO_FSHANDLE: | ||
137 | case XFS_IOC_OPEN_BY_HANDLE: | ||
138 | case XFS_IOC_FSSETDM_BY_HANDLE: | 390 | case XFS_IOC_FSSETDM_BY_HANDLE: |
139 | case XFS_IOC_READLINK_BY_HANDLE: | ||
140 | case XFS_IOC_ATTRLIST_BY_HANDLE: | 391 | case XFS_IOC_ATTRLIST_BY_HANDLE: |
141 | case XFS_IOC_ATTRMULTI_BY_HANDLE: | 392 | case XFS_IOC_ATTRMULTI_BY_HANDLE: |
142 | */ | 393 | */ |
@@ -166,6 +417,10 @@ xfs_compat_ioctl( | |||
166 | arg = xfs_ioctl32_flock(arg); | 417 | arg = xfs_ioctl32_flock(arg); |
167 | cmd = _NATIVE_IOC(cmd, struct xfs_flock64); | 418 | cmd = _NATIVE_IOC(cmd, struct xfs_flock64); |
168 | break; | 419 | break; |
420 | case XFS_IOC_FSGEOMETRY_V1_32: | ||
421 | arg = xfs_ioctl32_geom_v1(arg); | ||
422 | cmd = _NATIVE_IOC(cmd, struct xfs_fsop_geom_v1); | ||
423 | break; | ||
169 | 424 | ||
170 | #else /* These are handled fine if no alignment issues */ | 425 | #else /* These are handled fine if no alignment issues */ |
171 | case XFS_IOC_ALLOCSP: | 426 | case XFS_IOC_ALLOCSP: |
@@ -176,18 +431,28 @@ xfs_compat_ioctl( | |||
176 | case XFS_IOC_FREESP64: | 431 | case XFS_IOC_FREESP64: |
177 | case XFS_IOC_RESVSP64: | 432 | case XFS_IOC_RESVSP64: |
178 | case XFS_IOC_UNRESVSP64: | 433 | case XFS_IOC_UNRESVSP64: |
434 | case XFS_IOC_FSGEOMETRY_V1: | ||
179 | break; | 435 | break; |
180 | 436 | ||
181 | /* xfs_bstat_t still has wrong u32 vs u64 alignment */ | 437 | /* xfs_bstat_t still has wrong u32 vs u64 alignment */ |
182 | case XFS_IOC_SWAPEXT: | 438 | case XFS_IOC_SWAPEXT: |
183 | break; | 439 | break; |
184 | 440 | ||
185 | case XFS_IOC_FSBULKSTAT_SINGLE: | ||
186 | case XFS_IOC_FSBULKSTAT: | ||
187 | case XFS_IOC_FSINUMBERS: | ||
188 | arg = xfs_ioctl32_bulkstat(arg); | ||
189 | break; | ||
190 | #endif | 441 | #endif |
442 | case XFS_IOC_FSBULKSTAT_32: | ||
443 | case XFS_IOC_FSBULKSTAT_SINGLE_32: | ||
444 | case XFS_IOC_FSINUMBERS_32: | ||
445 | cmd = _NATIVE_IOC(cmd, struct xfs_fsop_bulkreq); | ||
446 | return xfs_ioc_bulkstat_compat(XFS_BHVTOI(VNHEAD(vp))->i_mount, | ||
447 | cmd, (void*)arg); | ||
448 | case XFS_IOC_FD_TO_HANDLE_32: | ||
449 | case XFS_IOC_PATH_TO_HANDLE_32: | ||
450 | case XFS_IOC_PATH_TO_FSHANDLE_32: | ||
451 | case XFS_IOC_OPEN_BY_HANDLE_32: | ||
452 | case XFS_IOC_READLINK_BY_HANDLE_32: | ||
453 | arg = xfs_ioctl32_fshandle(arg); | ||
454 | cmd = _NATIVE_IOC(cmd, struct xfs_fsop_handlereq); | ||
455 | break; | ||
191 | default: | 456 | default: |
192 | return -ENOIOCTLCMD; | 457 | return -ENOIOCTLCMD; |
193 | } | 458 | } |
diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 715adad7dd4d..330c4ba9d404 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h | |||
@@ -101,7 +101,6 @@ | |||
101 | * Feature macros (disable/enable) | 101 | * Feature macros (disable/enable) |
102 | */ | 102 | */ |
103 | #undef HAVE_REFCACHE /* reference cache not needed for NFS in 2.6 */ | 103 | #undef HAVE_REFCACHE /* reference cache not needed for NFS in 2.6 */ |
104 | #define HAVE_SENDFILE /* sendfile(2) exists in 2.6, but not in 2.4 */ | ||
105 | #define HAVE_SPLICE /* a splice(2) exists in 2.6, but not in 2.4 */ | 104 | #define HAVE_SPLICE /* a splice(2) exists in 2.6, but not in 2.4 */ |
106 | #ifdef CONFIG_SMP | 105 | #ifdef CONFIG_SMP |
107 | #define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ | 106 | #define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ |
@@ -124,6 +123,7 @@ | |||
124 | #define xfs_inherit_nosymlinks xfs_params.inherit_nosym.val | 123 | #define xfs_inherit_nosymlinks xfs_params.inherit_nosym.val |
125 | #define xfs_rotorstep xfs_params.rotorstep.val | 124 | #define xfs_rotorstep xfs_params.rotorstep.val |
126 | #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val | 125 | #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val |
126 | #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val | ||
127 | 127 | ||
128 | #define current_cpu() (raw_smp_processor_id()) | 128 | #define current_cpu() (raw_smp_processor_id()) |
129 | #define current_pid() (current->pid) | 129 | #define current_pid() (current->pid) |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index ed90403f0ee7..765ec16a6e39 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -287,50 +287,6 @@ xfs_read( | |||
287 | } | 287 | } |
288 | 288 | ||
289 | ssize_t | 289 | ssize_t |
290 | xfs_sendfile( | ||
291 | bhv_desc_t *bdp, | ||
292 | struct file *filp, | ||
293 | loff_t *offset, | ||
294 | int ioflags, | ||
295 | size_t count, | ||
296 | read_actor_t actor, | ||
297 | void *target, | ||
298 | cred_t *credp) | ||
299 | { | ||
300 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
301 | xfs_mount_t *mp = ip->i_mount; | ||
302 | ssize_t ret; | ||
303 | |||
304 | XFS_STATS_INC(xs_read_calls); | ||
305 | if (XFS_FORCED_SHUTDOWN(mp)) | ||
306 | return -EIO; | ||
307 | |||
308 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | ||
309 | |||
310 | if (DM_EVENT_ENABLED(BHV_TO_VNODE(bdp)->v_vfsp, ip, DM_EVENT_READ) && | ||
311 | (!(ioflags & IO_INVIS))) { | ||
312 | bhv_vrwlock_t locktype = VRWLOCK_READ; | ||
313 | int error; | ||
314 | |||
315 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), | ||
316 | *offset, count, | ||
317 | FILP_DELAY_FLAG(filp), &locktype); | ||
318 | if (error) { | ||
319 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
320 | return -error; | ||
321 | } | ||
322 | } | ||
323 | xfs_rw_enter_trace(XFS_SENDFILE_ENTER, &ip->i_iocore, | ||
324 | (void *)(unsigned long)target, count, *offset, ioflags); | ||
325 | ret = generic_file_sendfile(filp, offset, count, actor, target); | ||
326 | if (ret > 0) | ||
327 | XFS_STATS_ADD(xs_read_bytes, ret); | ||
328 | |||
329 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
330 | return ret; | ||
331 | } | ||
332 | |||
333 | ssize_t | ||
334 | xfs_splice_read( | 290 | xfs_splice_read( |
335 | bhv_desc_t *bdp, | 291 | bhv_desc_t *bdp, |
336 | struct file *infilp, | 292 | struct file *infilp, |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.h b/fs/xfs/linux-2.6/xfs_lrw.h index 7ac51b1d2161..7c60a1eed88b 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.h +++ b/fs/xfs/linux-2.6/xfs_lrw.h | |||
@@ -90,9 +90,6 @@ extern ssize_t xfs_read(struct bhv_desc *, struct kiocb *, | |||
90 | extern ssize_t xfs_write(struct bhv_desc *, struct kiocb *, | 90 | extern ssize_t xfs_write(struct bhv_desc *, struct kiocb *, |
91 | const struct iovec *, unsigned int, | 91 | const struct iovec *, unsigned int, |
92 | loff_t *, int, struct cred *); | 92 | loff_t *, int, struct cred *); |
93 | extern ssize_t xfs_sendfile(struct bhv_desc *, struct file *, | ||
94 | loff_t *, int, size_t, read_actor_t, | ||
95 | void *, struct cred *); | ||
96 | extern ssize_t xfs_splice_read(struct bhv_desc *, struct file *, loff_t *, | 93 | extern ssize_t xfs_splice_read(struct bhv_desc *, struct file *, loff_t *, |
97 | struct pipe_inode_info *, size_t, int, int, | 94 | struct pipe_inode_info *, size_t, int, int, |
98 | struct cred *); | 95 | struct cred *); |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index bf9a9d5909be..4528f9a3f304 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -547,7 +547,8 @@ vfs_sync_worker( | |||
547 | 547 | ||
548 | if (!(vfsp->vfs_flag & VFS_RDONLY)) | 548 | if (!(vfsp->vfs_flag & VFS_RDONLY)) |
549 | error = bhv_vfs_sync(vfsp, SYNC_FSDATA | SYNC_BDFLUSH | \ | 549 | error = bhv_vfs_sync(vfsp, SYNC_FSDATA | SYNC_BDFLUSH | \ |
550 | SYNC_ATTR | SYNC_REFCACHE, NULL); | 550 | SYNC_ATTR | SYNC_REFCACHE | SYNC_SUPER, |
551 | NULL); | ||
551 | vfsp->vfs_sync_seq++; | 552 | vfsp->vfs_sync_seq++; |
552 | wake_up(&vfsp->vfs_wait_single_sync_task); | 553 | wake_up(&vfsp->vfs_wait_single_sync_task); |
553 | } | 554 | } |
@@ -561,6 +562,7 @@ xfssyncd( | |||
561 | bhv_vfs_sync_work_t *work, *n; | 562 | bhv_vfs_sync_work_t *work, *n; |
562 | LIST_HEAD (tmp); | 563 | LIST_HEAD (tmp); |
563 | 564 | ||
565 | set_freezable(); | ||
564 | timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10); | 566 | timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10); |
565 | for (;;) { | 567 | for (;;) { |
566 | timeleft = schedule_timeout_interruptible(timeleft); | 568 | timeleft = schedule_timeout_interruptible(timeleft); |
@@ -663,7 +665,7 @@ xfs_fs_sync_super( | |||
663 | * occur here so don't bother flushing the buftarg (i.e | 665 | * occur here so don't bother flushing the buftarg (i.e |
664 | * SYNC_QUIESCE) because it'll just get dirty again. | 666 | * SYNC_QUIESCE) because it'll just get dirty again. |
665 | */ | 667 | */ |
666 | flags = SYNC_FSDATA | SYNC_DELWRI | SYNC_WAIT | SYNC_IOWAIT; | 668 | flags = SYNC_DATA_QUIESCE; |
667 | } else | 669 | } else |
668 | flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); | 670 | flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); |
669 | 671 | ||
diff --git a/fs/xfs/linux-2.6/xfs_super.h b/fs/xfs/linux-2.6/xfs_super.h index 33dd1ca13245..201cc3273c84 100644 --- a/fs/xfs/linux-2.6/xfs_super.h +++ b/fs/xfs/linux-2.6/xfs_super.h | |||
@@ -18,6 +18,8 @@ | |||
18 | #ifndef __XFS_SUPER_H__ | 18 | #ifndef __XFS_SUPER_H__ |
19 | #define __XFS_SUPER_H__ | 19 | #define __XFS_SUPER_H__ |
20 | 20 | ||
21 | #include <linux/exportfs.h> | ||
22 | |||
21 | #ifdef CONFIG_XFS_DMAPI | 23 | #ifdef CONFIG_XFS_DMAPI |
22 | # define vfs_insertdmapi(vfs) vfs_insertops(vfsp, &xfs_dmops) | 24 | # define vfs_insertdmapi(vfs) vfs_insertops(vfsp, &xfs_dmops) |
23 | # define vfs_initdmapi() dmapi_init() | 25 | # define vfs_initdmapi() dmapi_init() |
diff --git a/fs/xfs/linux-2.6/xfs_sysctl.c b/fs/xfs/linux-2.6/xfs_sysctl.c index cd6eaa44aa2b..bb997d75c05c 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.c +++ b/fs/xfs/linux-2.6/xfs_sysctl.c | |||
@@ -210,6 +210,17 @@ static ctl_table xfs_table[] = { | |||
210 | .extra1 = &xfs_params.inherit_nodfrg.min, | 210 | .extra1 = &xfs_params.inherit_nodfrg.min, |
211 | .extra2 = &xfs_params.inherit_nodfrg.max | 211 | .extra2 = &xfs_params.inherit_nodfrg.max |
212 | }, | 212 | }, |
213 | { | ||
214 | .ctl_name = XFS_FILESTREAM_TIMER, | ||
215 | .procname = "filestream_centisecs", | ||
216 | .data = &xfs_params.fstrm_timer.val, | ||
217 | .maxlen = sizeof(int), | ||
218 | .mode = 0644, | ||
219 | .proc_handler = &proc_dointvec_minmax, | ||
220 | .strategy = &sysctl_intvec, | ||
221 | .extra1 = &xfs_params.fstrm_timer.min, | ||
222 | .extra2 = &xfs_params.fstrm_timer.max, | ||
223 | }, | ||
213 | /* please keep this the last entry */ | 224 | /* please keep this the last entry */ |
214 | #ifdef CONFIG_PROC_FS | 225 | #ifdef CONFIG_PROC_FS |
215 | { | 226 | { |
diff --git a/fs/xfs/linux-2.6/xfs_sysctl.h b/fs/xfs/linux-2.6/xfs_sysctl.h index a631fb8cc5ac..98b97e399d6f 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.h +++ b/fs/xfs/linux-2.6/xfs_sysctl.h | |||
@@ -47,6 +47,7 @@ typedef struct xfs_param { | |||
47 | xfs_sysctl_val_t inherit_nosym; /* Inherit the "nosymlinks" flag. */ | 47 | xfs_sysctl_val_t inherit_nosym; /* Inherit the "nosymlinks" flag. */ |
48 | xfs_sysctl_val_t rotorstep; /* inode32 AG rotoring control knob */ | 48 | xfs_sysctl_val_t rotorstep; /* inode32 AG rotoring control knob */ |
49 | xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ | 49 | xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ |
50 | xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ | ||
50 | } xfs_param_t; | 51 | } xfs_param_t; |
51 | 52 | ||
52 | /* | 53 | /* |
@@ -86,6 +87,7 @@ enum { | |||
86 | XFS_INHERIT_NOSYM = 19, | 87 | XFS_INHERIT_NOSYM = 19, |
87 | XFS_ROTORSTEP = 20, | 88 | XFS_ROTORSTEP = 20, |
88 | XFS_INHERIT_NODFRG = 21, | 89 | XFS_INHERIT_NODFRG = 21, |
90 | XFS_FILESTREAM_TIMER = 22, | ||
89 | }; | 91 | }; |
90 | 92 | ||
91 | extern xfs_param_t xfs_params; | 93 | extern xfs_param_t xfs_params; |
diff --git a/fs/xfs/linux-2.6/xfs_vfs.h b/fs/xfs/linux-2.6/xfs_vfs.h index e2c2ce98ab5b..dca3481aaafa 100644 --- a/fs/xfs/linux-2.6/xfs_vfs.h +++ b/fs/xfs/linux-2.6/xfs_vfs.h | |||
@@ -92,6 +92,21 @@ typedef enum { | |||
92 | #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ | 92 | #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ |
93 | #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ | 93 | #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ |
94 | #define SYNC_IOWAIT 0x0100 /* wait for all I/O to complete */ | 94 | #define SYNC_IOWAIT 0x0100 /* wait for all I/O to complete */ |
95 | #define SYNC_SUPER 0x0200 /* flush superblock to disk */ | ||
96 | |||
97 | /* | ||
98 | * When remounting a filesystem read-only or freezing the filesystem, | ||
99 | * we have two phases to execute. This first phase is syncing the data | ||
100 | * before we quiesce the fielsystem, and the second is flushing all the | ||
101 | * inodes out after we've waited for all the transactions created by | ||
102 | * the first phase to complete. The second phase uses SYNC_INODE_QUIESCE | ||
103 | * to ensure that the inodes are written to their location on disk | ||
104 | * rather than just existing in transactions in the log. This means | ||
105 | * after a quiesce there is no log replay required to write the inodes | ||
106 | * to disk (this is the main difference between a sync and a quiesce). | ||
107 | */ | ||
108 | #define SYNC_DATA_QUIESCE (SYNC_DELWRI|SYNC_FSDATA|SYNC_WAIT|SYNC_IOWAIT) | ||
109 | #define SYNC_INODE_QUIESCE (SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT) | ||
95 | 110 | ||
96 | #define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ | 111 | #define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ |
97 | #define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ | 112 | #define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index d1b2d01843d1..5742d65f0785 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
@@ -129,19 +129,13 @@ typedef enum bhv_vchange { | |||
129 | VCHANGE_FLAGS_IOEXCL_COUNT = 4 | 129 | VCHANGE_FLAGS_IOEXCL_COUNT = 4 |
130 | } bhv_vchange_t; | 130 | } bhv_vchange_t; |
131 | 131 | ||
132 | typedef enum { L_FALSE, L_TRUE } lastclose_t; | ||
133 | |||
134 | typedef int (*vop_open_t)(bhv_desc_t *, struct cred *); | 132 | typedef int (*vop_open_t)(bhv_desc_t *, struct cred *); |
135 | typedef int (*vop_close_t)(bhv_desc_t *, int, lastclose_t, struct cred *); | ||
136 | typedef ssize_t (*vop_read_t)(bhv_desc_t *, struct kiocb *, | 133 | typedef ssize_t (*vop_read_t)(bhv_desc_t *, struct kiocb *, |
137 | const struct iovec *, unsigned int, | 134 | const struct iovec *, unsigned int, |
138 | loff_t *, int, struct cred *); | 135 | loff_t *, int, struct cred *); |
139 | typedef ssize_t (*vop_write_t)(bhv_desc_t *, struct kiocb *, | 136 | typedef ssize_t (*vop_write_t)(bhv_desc_t *, struct kiocb *, |
140 | const struct iovec *, unsigned int, | 137 | const struct iovec *, unsigned int, |
141 | loff_t *, int, struct cred *); | 138 | loff_t *, int, struct cred *); |
142 | typedef ssize_t (*vop_sendfile_t)(bhv_desc_t *, struct file *, | ||
143 | loff_t *, int, size_t, read_actor_t, | ||
144 | void *, struct cred *); | ||
145 | typedef ssize_t (*vop_splice_read_t)(bhv_desc_t *, struct file *, loff_t *, | 139 | typedef ssize_t (*vop_splice_read_t)(bhv_desc_t *, struct file *, loff_t *, |
146 | struct pipe_inode_info *, size_t, int, int, | 140 | struct pipe_inode_info *, size_t, int, int, |
147 | struct cred *); | 141 | struct cred *); |
@@ -203,10 +197,8 @@ typedef int (*vop_iflush_t)(bhv_desc_t *, int); | |||
203 | typedef struct bhv_vnodeops { | 197 | typedef struct bhv_vnodeops { |
204 | bhv_position_t vn_position; /* position within behavior chain */ | 198 | bhv_position_t vn_position; /* position within behavior chain */ |
205 | vop_open_t vop_open; | 199 | vop_open_t vop_open; |
206 | vop_close_t vop_close; | ||
207 | vop_read_t vop_read; | 200 | vop_read_t vop_read; |
208 | vop_write_t vop_write; | 201 | vop_write_t vop_write; |
209 | vop_sendfile_t vop_sendfile; | ||
210 | vop_splice_read_t vop_splice_read; | 202 | vop_splice_read_t vop_splice_read; |
211 | vop_splice_write_t vop_splice_write; | 203 | vop_splice_write_t vop_splice_write; |
212 | vop_ioctl_t vop_ioctl; | 204 | vop_ioctl_t vop_ioctl; |
@@ -249,13 +241,10 @@ typedef struct bhv_vnodeops { | |||
249 | #define VNHEAD(vp) ((vp)->v_bh.bh_first) | 241 | #define VNHEAD(vp) ((vp)->v_bh.bh_first) |
250 | #define VOP(op, vp) (*((bhv_vnodeops_t *)VNHEAD(vp)->bd_ops)->op) | 242 | #define VOP(op, vp) (*((bhv_vnodeops_t *)VNHEAD(vp)->bd_ops)->op) |
251 | #define bhv_vop_open(vp, cr) VOP(vop_open, vp)(VNHEAD(vp),cr) | 243 | #define bhv_vop_open(vp, cr) VOP(vop_open, vp)(VNHEAD(vp),cr) |
252 | #define bhv_vop_close(vp, f,last,cr) VOP(vop_close, vp)(VNHEAD(vp),f,last,cr) | ||
253 | #define bhv_vop_read(vp,file,iov,segs,offset,ioflags,cr) \ | 244 | #define bhv_vop_read(vp,file,iov,segs,offset,ioflags,cr) \ |
254 | VOP(vop_read, vp)(VNHEAD(vp),file,iov,segs,offset,ioflags,cr) | 245 | VOP(vop_read, vp)(VNHEAD(vp),file,iov,segs,offset,ioflags,cr) |
255 | #define bhv_vop_write(vp,file,iov,segs,offset,ioflags,cr) \ | 246 | #define bhv_vop_write(vp,file,iov,segs,offset,ioflags,cr) \ |
256 | VOP(vop_write, vp)(VNHEAD(vp),file,iov,segs,offset,ioflags,cr) | 247 | VOP(vop_write, vp)(VNHEAD(vp),file,iov,segs,offset,ioflags,cr) |
257 | #define bhv_vop_sendfile(vp,f,off,ioflags,cnt,act,targ,cr) \ | ||
258 | VOP(vop_sendfile, vp)(VNHEAD(vp),f,off,ioflags,cnt,act,targ,cr) | ||
259 | #define bhv_vop_splice_read(vp,f,o,pipe,cnt,fl,iofl,cr) \ | 248 | #define bhv_vop_splice_read(vp,f,o,pipe,cnt,fl,iofl,cr) \ |
260 | VOP(vop_splice_read, vp)(VNHEAD(vp),f,o,pipe,cnt,fl,iofl,cr) | 249 | VOP(vop_splice_read, vp)(VNHEAD(vp),f,o,pipe,cnt,fl,iofl,cr) |
261 | #define bhv_vop_splice_write(vp,f,o,pipe,cnt,fl,iofl,cr) \ | 250 | #define bhv_vop_splice_write(vp,f,o,pipe,cnt,fl,iofl,cr) \ |