diff options
Diffstat (limited to 'fs/xfs/linux-2.6')
-rw-r--r-- | fs/xfs/linux-2.6/kmem.c | 6 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/sema.h | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 12 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 8 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.h | 8 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_cred.h | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_export.c | 14 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_file.c | 13 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_fs_subr.c | 36 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 689 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 230 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_linux.h | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 79 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.h | 3 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_stats.h | 4 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 41 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.h | 8 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vfs.h | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 30 |
19 files changed, 554 insertions, 633 deletions
diff --git a/fs/xfs/linux-2.6/kmem.c b/fs/xfs/linux-2.6/kmem.c index e040f1ce1b6a..9b1bb17a0501 100644 --- a/fs/xfs/linux-2.6/kmem.c +++ b/fs/xfs/linux-2.6/kmem.c | |||
@@ -37,7 +37,7 @@ kmem_alloc(size_t size, unsigned int __nocast flags) | |||
37 | #ifdef DEBUG | 37 | #ifdef DEBUG |
38 | if (unlikely(!(flags & KM_LARGE) && (size > PAGE_SIZE))) { | 38 | if (unlikely(!(flags & KM_LARGE) && (size > PAGE_SIZE))) { |
39 | printk(KERN_WARNING "Large %s attempt, size=%ld\n", | 39 | printk(KERN_WARNING "Large %s attempt, size=%ld\n", |
40 | __FUNCTION__, (long)size); | 40 | __func__, (long)size); |
41 | dump_stack(); | 41 | dump_stack(); |
42 | } | 42 | } |
43 | #endif | 43 | #endif |
@@ -52,7 +52,7 @@ kmem_alloc(size_t size, unsigned int __nocast flags) | |||
52 | if (!(++retries % 100)) | 52 | if (!(++retries % 100)) |
53 | printk(KERN_ERR "XFS: possible memory allocation " | 53 | printk(KERN_ERR "XFS: possible memory allocation " |
54 | "deadlock in %s (mode:0x%x)\n", | 54 | "deadlock in %s (mode:0x%x)\n", |
55 | __FUNCTION__, lflags); | 55 | __func__, lflags); |
56 | congestion_wait(WRITE, HZ/50); | 56 | congestion_wait(WRITE, HZ/50); |
57 | } while (1); | 57 | } while (1); |
58 | } | 58 | } |
@@ -129,7 +129,7 @@ kmem_zone_alloc(kmem_zone_t *zone, unsigned int __nocast flags) | |||
129 | if (!(++retries % 100)) | 129 | if (!(++retries % 100)) |
130 | printk(KERN_ERR "XFS: possible memory allocation " | 130 | printk(KERN_ERR "XFS: possible memory allocation " |
131 | "deadlock in %s (mode:0x%x)\n", | 131 | "deadlock in %s (mode:0x%x)\n", |
132 | __FUNCTION__, lflags); | 132 | __func__, lflags); |
133 | congestion_wait(WRITE, HZ/50); | 133 | congestion_wait(WRITE, HZ/50); |
134 | } while (1); | 134 | } while (1); |
135 | } | 135 | } |
diff --git a/fs/xfs/linux-2.6/sema.h b/fs/xfs/linux-2.6/sema.h index 2009e6d922ce..3abe7e9ceb33 100644 --- a/fs/xfs/linux-2.6/sema.h +++ b/fs/xfs/linux-2.6/sema.h | |||
@@ -20,8 +20,8 @@ | |||
20 | 20 | ||
21 | #include <linux/time.h> | 21 | #include <linux/time.h> |
22 | #include <linux/wait.h> | 22 | #include <linux/wait.h> |
23 | #include <linux/semaphore.h> | ||
23 | #include <asm/atomic.h> | 24 | #include <asm/atomic.h> |
24 | #include <asm/semaphore.h> | ||
25 | 25 | ||
26 | /* | 26 | /* |
27 | * sema_t structure just maps to struct semaphore in Linux kernel. | 27 | * sema_t structure just maps to struct semaphore in Linux kernel. |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index e0519529c26c..a55c3b26d840 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -243,8 +243,12 @@ xfs_end_bio_unwritten( | |||
243 | size_t size = ioend->io_size; | 243 | size_t size = ioend->io_size; |
244 | 244 | ||
245 | if (likely(!ioend->io_error)) { | 245 | if (likely(!ioend->io_error)) { |
246 | if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) | 246 | if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { |
247 | xfs_iomap_write_unwritten(ip, offset, size); | 247 | int error; |
248 | error = xfs_iomap_write_unwritten(ip, offset, size); | ||
249 | if (error) | ||
250 | ioend->io_error = error; | ||
251 | } | ||
248 | xfs_setfilesize(ioend); | 252 | xfs_setfilesize(ioend); |
249 | } | 253 | } |
250 | xfs_destroy_ioend(ioend); | 254 | xfs_destroy_ioend(ioend); |
@@ -1532,9 +1536,9 @@ xfs_vm_bmap( | |||
1532 | struct xfs_inode *ip = XFS_I(inode); | 1536 | struct xfs_inode *ip = XFS_I(inode); |
1533 | 1537 | ||
1534 | xfs_itrace_entry(XFS_I(inode)); | 1538 | xfs_itrace_entry(XFS_I(inode)); |
1535 | xfs_rwlock(ip, VRWLOCK_READ); | 1539 | xfs_ilock(ip, XFS_IOLOCK_SHARED); |
1536 | xfs_flush_pages(ip, (xfs_off_t)0, -1, 0, FI_REMAPF); | 1540 | xfs_flush_pages(ip, (xfs_off_t)0, -1, 0, FI_REMAPF); |
1537 | xfs_rwunlock(ip, VRWLOCK_READ); | 1541 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
1538 | return generic_block_bmap(mapping, block, xfs_get_blocks); | 1542 | return generic_block_bmap(mapping, block, xfs_get_blocks); |
1539 | } | 1543 | } |
1540 | 1544 | ||
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index e347bfd47c91..52f6846101d5 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
@@ -400,7 +400,7 @@ _xfs_buf_lookup_pages( | |||
400 | printk(KERN_ERR | 400 | printk(KERN_ERR |
401 | "XFS: possible memory allocation " | 401 | "XFS: possible memory allocation " |
402 | "deadlock in %s (mode:0x%x)\n", | 402 | "deadlock in %s (mode:0x%x)\n", |
403 | __FUNCTION__, gfp_mask); | 403 | __func__, gfp_mask); |
404 | 404 | ||
405 | XFS_STATS_INC(xb_page_retries); | 405 | XFS_STATS_INC(xb_page_retries); |
406 | xfsbufd_wakeup(0, gfp_mask); | 406 | xfsbufd_wakeup(0, gfp_mask); |
@@ -598,7 +598,7 @@ xfs_buf_get_flags( | |||
598 | error = _xfs_buf_map_pages(bp, flags); | 598 | error = _xfs_buf_map_pages(bp, flags); |
599 | if (unlikely(error)) { | 599 | if (unlikely(error)) { |
600 | printk(KERN_WARNING "%s: failed to map pages\n", | 600 | printk(KERN_WARNING "%s: failed to map pages\n", |
601 | __FUNCTION__); | 601 | __func__); |
602 | goto no_buffer; | 602 | goto no_buffer; |
603 | } | 603 | } |
604 | } | 604 | } |
@@ -778,7 +778,7 @@ xfs_buf_get_noaddr( | |||
778 | error = _xfs_buf_map_pages(bp, XBF_MAPPED); | 778 | error = _xfs_buf_map_pages(bp, XBF_MAPPED); |
779 | if (unlikely(error)) { | 779 | if (unlikely(error)) { |
780 | printk(KERN_WARNING "%s: failed to map pages\n", | 780 | printk(KERN_WARNING "%s: failed to map pages\n", |
781 | __FUNCTION__); | 781 | __func__); |
782 | goto fail_free_mem; | 782 | goto fail_free_mem; |
783 | } | 783 | } |
784 | 784 | ||
@@ -1060,7 +1060,7 @@ xfs_buf_iostart( | |||
1060 | bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC); | 1060 | bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC); |
1061 | bp->b_flags |= flags & (XBF_DELWRI | XBF_ASYNC); | 1061 | bp->b_flags |= flags & (XBF_DELWRI | XBF_ASYNC); |
1062 | xfs_buf_delwri_queue(bp, 1); | 1062 | xfs_buf_delwri_queue(bp, 1); |
1063 | return status; | 1063 | return 0; |
1064 | } | 1064 | } |
1065 | 1065 | ||
1066 | bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC | XBF_DELWRI | \ | 1066 | bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC | XBF_DELWRI | \ |
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index a3d207de48b8..841d7883528d 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h | |||
@@ -387,11 +387,15 @@ static inline int XFS_bwrite(xfs_buf_t *bp) | |||
387 | return error; | 387 | return error; |
388 | } | 388 | } |
389 | 389 | ||
390 | static inline int xfs_bdwrite(void *mp, xfs_buf_t *bp) | 390 | /* |
391 | * No error can be returned from xfs_buf_iostart for delwri | ||
392 | * buffers as they are queued and no I/O is issued. | ||
393 | */ | ||
394 | static inline void xfs_bdwrite(void *mp, xfs_buf_t *bp) | ||
391 | { | 395 | { |
392 | bp->b_strat = xfs_bdstrat_cb; | 396 | bp->b_strat = xfs_bdstrat_cb; |
393 | bp->b_fspriv3 = mp; | 397 | bp->b_fspriv3 = mp; |
394 | return xfs_buf_iostart(bp, XBF_DELWRI | XBF_ASYNC); | 398 | (void)xfs_buf_iostart(bp, XBF_DELWRI | XBF_ASYNC); |
395 | } | 399 | } |
396 | 400 | ||
397 | #define XFS_bdstrat(bp) xfs_buf_iorequest(bp) | 401 | #define XFS_bdstrat(bp) xfs_buf_iorequest(bp) |
diff --git a/fs/xfs/linux-2.6/xfs_cred.h b/fs/xfs/linux-2.6/xfs_cred.h index e7f3da61c6c3..652721ce0ea5 100644 --- a/fs/xfs/linux-2.6/xfs_cred.h +++ b/fs/xfs/linux-2.6/xfs_cred.h | |||
@@ -30,7 +30,7 @@ typedef struct cred { | |||
30 | extern struct cred *sys_cred; | 30 | extern struct cred *sys_cred; |
31 | 31 | ||
32 | /* this is a hack.. (assumes sys_cred is the only cred_t in the system) */ | 32 | /* this is a hack.. (assumes sys_cred is the only cred_t in the system) */ |
33 | static __inline int capable_cred(cred_t *cr, int cid) | 33 | static inline int capable_cred(cred_t *cr, int cid) |
34 | { | 34 | { |
35 | return (cr == sys_cred) ? 1 : capable(cid); | 35 | return (cr == sys_cred) ? 1 : capable(cid); |
36 | } | 36 | } |
diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index ca4f66c4de16..265f0168ab76 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include "xfs_trans.h" | 22 | #include "xfs_trans.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" | ||
25 | #include "xfs_dmapi.h" | 26 | #include "xfs_dmapi.h" |
26 | #include "xfs_mount.h" | 27 | #include "xfs_mount.h" |
27 | #include "xfs_export.h" | 28 | #include "xfs_export.h" |
@@ -30,8 +31,6 @@ | |||
30 | #include "xfs_inode.h" | 31 | #include "xfs_inode.h" |
31 | #include "xfs_vfsops.h" | 32 | #include "xfs_vfsops.h" |
32 | 33 | ||
33 | static struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, }; | ||
34 | |||
35 | /* | 34 | /* |
36 | * Note that we only accept fileids which are long enough rather than allow | 35 | * Note that we only accept fileids which are long enough rather than allow |
37 | * the parent generation number to default to zero. XFS considers zero a | 36 | * the parent generation number to default to zero. XFS considers zero a |
@@ -66,7 +65,7 @@ xfs_fs_encode_fh( | |||
66 | int len; | 65 | int len; |
67 | 66 | ||
68 | /* Directories don't need their parent encoded, they have ".." */ | 67 | /* Directories don't need their parent encoded, they have ".." */ |
69 | if (S_ISDIR(inode->i_mode)) | 68 | if (S_ISDIR(inode->i_mode) || !connectable) |
70 | fileid_type = FILEID_INO32_GEN; | 69 | fileid_type = FILEID_INO32_GEN; |
71 | else | 70 | else |
72 | fileid_type = FILEID_INO32_GEN_PARENT; | 71 | fileid_type = FILEID_INO32_GEN_PARENT; |
@@ -213,17 +212,16 @@ xfs_fs_get_parent( | |||
213 | struct dentry *child) | 212 | struct dentry *child) |
214 | { | 213 | { |
215 | int error; | 214 | int error; |
216 | bhv_vnode_t *cvp; | 215 | struct xfs_inode *cip; |
217 | struct dentry *parent; | 216 | struct dentry *parent; |
218 | 217 | ||
219 | cvp = NULL; | 218 | error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip); |
220 | error = xfs_lookup(XFS_I(child->d_inode), &dotdot, &cvp); | ||
221 | if (unlikely(error)) | 219 | if (unlikely(error)) |
222 | return ERR_PTR(-error); | 220 | return ERR_PTR(-error); |
223 | 221 | ||
224 | parent = d_alloc_anon(vn_to_inode(cvp)); | 222 | parent = d_alloc_anon(cip->i_vnode); |
225 | if (unlikely(!parent)) { | 223 | if (unlikely(!parent)) { |
226 | VN_RELE(cvp); | 224 | iput(cip->i_vnode); |
227 | return ERR_PTR(-ENOMEM); | 225 | return ERR_PTR(-ENOMEM); |
228 | } | 226 | } |
229 | return parent; | 227 | return parent; |
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index edab1ffbb163..05905246434d 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
@@ -469,16 +469,11 @@ xfs_file_open_exec( | |||
469 | struct inode *inode) | 469 | struct inode *inode) |
470 | { | 470 | { |
471 | struct xfs_mount *mp = XFS_M(inode->i_sb); | 471 | struct xfs_mount *mp = XFS_M(inode->i_sb); |
472 | struct xfs_inode *ip = XFS_I(inode); | ||
472 | 473 | ||
473 | if (unlikely(mp->m_flags & XFS_MOUNT_DMAPI)) { | 474 | if (unlikely(mp->m_flags & XFS_MOUNT_DMAPI) && |
474 | if (DM_EVENT_ENABLED(XFS_I(inode), DM_EVENT_READ)) { | 475 | DM_EVENT_ENABLED(ip, DM_EVENT_READ)) |
475 | bhv_vnode_t *vp = vn_from_inode(inode); | 476 | return -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, 0, 0, 0, NULL); |
476 | |||
477 | return -XFS_SEND_DATA(mp, DM_EVENT_READ, | ||
478 | vp, 0, 0, 0, NULL); | ||
479 | } | ||
480 | } | ||
481 | |||
482 | return 0; | 477 | return 0; |
483 | } | 478 | } |
484 | #endif /* HAVE_FOP_OPEN_EXEC */ | 479 | #endif /* HAVE_FOP_OPEN_EXEC */ |
diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.c b/fs/xfs/linux-2.6/xfs_fs_subr.c index ac6d34cc355d..1eefe61f0e10 100644 --- a/fs/xfs/linux-2.6/xfs_fs_subr.c +++ b/fs/xfs/linux-2.6/xfs_fs_subr.c | |||
@@ -17,18 +17,7 @@ | |||
17 | */ | 17 | */ |
18 | #include "xfs.h" | 18 | #include "xfs.h" |
19 | #include "xfs_vnodeops.h" | 19 | #include "xfs_vnodeops.h" |
20 | |||
21 | /* | ||
22 | * The following six includes are needed so that we can include | ||
23 | * xfs_inode.h. What a mess.. | ||
24 | */ | ||
25 | #include "xfs_bmap_btree.h" | 20 | #include "xfs_bmap_btree.h" |
26 | #include "xfs_inum.h" | ||
27 | #include "xfs_dir2.h" | ||
28 | #include "xfs_dir2_sf.h" | ||
29 | #include "xfs_attr_sf.h" | ||
30 | #include "xfs_dinode.h" | ||
31 | |||
32 | #include "xfs_inode.h" | 21 | #include "xfs_inode.h" |
33 | 22 | ||
34 | int fs_noerr(void) { return 0; } | 23 | int fs_noerr(void) { return 0; } |
@@ -42,11 +31,10 @@ xfs_tosspages( | |||
42 | xfs_off_t last, | 31 | xfs_off_t last, |
43 | int fiopt) | 32 | int fiopt) |
44 | { | 33 | { |
45 | bhv_vnode_t *vp = XFS_ITOV(ip); | 34 | struct address_space *mapping = ip->i_vnode->i_mapping; |
46 | struct inode *inode = vn_to_inode(vp); | ||
47 | 35 | ||
48 | if (VN_CACHED(vp)) | 36 | if (mapping->nrpages) |
49 | truncate_inode_pages(inode->i_mapping, first); | 37 | truncate_inode_pages(mapping, first); |
50 | } | 38 | } |
51 | 39 | ||
52 | int | 40 | int |
@@ -56,15 +44,14 @@ xfs_flushinval_pages( | |||
56 | xfs_off_t last, | 44 | xfs_off_t last, |
57 | int fiopt) | 45 | int fiopt) |
58 | { | 46 | { |
59 | bhv_vnode_t *vp = XFS_ITOV(ip); | 47 | struct address_space *mapping = ip->i_vnode->i_mapping; |
60 | struct inode *inode = vn_to_inode(vp); | ||
61 | int ret = 0; | 48 | int ret = 0; |
62 | 49 | ||
63 | if (VN_CACHED(vp)) { | 50 | if (mapping->nrpages) { |
64 | xfs_iflags_clear(ip, XFS_ITRUNCATED); | 51 | xfs_iflags_clear(ip, XFS_ITRUNCATED); |
65 | ret = filemap_write_and_wait(inode->i_mapping); | 52 | ret = filemap_write_and_wait(mapping); |
66 | if (!ret) | 53 | if (!ret) |
67 | truncate_inode_pages(inode->i_mapping, first); | 54 | truncate_inode_pages(mapping, first); |
68 | } | 55 | } |
69 | return ret; | 56 | return ret; |
70 | } | 57 | } |
@@ -77,17 +64,16 @@ xfs_flush_pages( | |||
77 | uint64_t flags, | 64 | uint64_t flags, |
78 | int fiopt) | 65 | int fiopt) |
79 | { | 66 | { |
80 | bhv_vnode_t *vp = XFS_ITOV(ip); | 67 | struct address_space *mapping = ip->i_vnode->i_mapping; |
81 | struct inode *inode = vn_to_inode(vp); | ||
82 | int ret = 0; | 68 | int ret = 0; |
83 | int ret2; | 69 | int ret2; |
84 | 70 | ||
85 | if (VN_DIRTY(vp)) { | 71 | if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { |
86 | xfs_iflags_clear(ip, XFS_ITRUNCATED); | 72 | xfs_iflags_clear(ip, XFS_ITRUNCATED); |
87 | ret = filemap_fdatawrite(inode->i_mapping); | 73 | ret = filemap_fdatawrite(mapping); |
88 | if (flags & XFS_B_ASYNC) | 74 | if (flags & XFS_B_ASYNC) |
89 | return ret; | 75 | return ret; |
90 | ret2 = filemap_fdatawait(inode->i_mapping); | 76 | ret2 = filemap_fdatawait(mapping); |
91 | if (!ret) | 77 | if (!ret) |
92 | ret = ret2; | 78 | ret = ret2; |
93 | } | 79 | } |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index a9952e490ac9..4ddb86b73c6b 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
@@ -535,8 +535,6 @@ xfs_attrmulti_attr_set( | |||
535 | char *kbuf; | 535 | char *kbuf; |
536 | int error = EFAULT; | 536 | int error = EFAULT; |
537 | 537 | ||
538 | if (IS_RDONLY(inode)) | ||
539 | return -EROFS; | ||
540 | if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) | 538 | if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) |
541 | return EPERM; | 539 | return EPERM; |
542 | if (len > XATTR_SIZE_MAX) | 540 | if (len > XATTR_SIZE_MAX) |
@@ -562,8 +560,6 @@ xfs_attrmulti_attr_remove( | |||
562 | char *name, | 560 | char *name, |
563 | __uint32_t flags) | 561 | __uint32_t flags) |
564 | { | 562 | { |
565 | if (IS_RDONLY(inode)) | ||
566 | return -EROFS; | ||
567 | if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) | 563 | if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) |
568 | return EPERM; | 564 | return EPERM; |
569 | return xfs_attr_remove(XFS_I(inode), name, flags); | 565 | return xfs_attr_remove(XFS_I(inode), name, flags); |
@@ -573,6 +569,7 @@ STATIC int | |||
573 | xfs_attrmulti_by_handle( | 569 | xfs_attrmulti_by_handle( |
574 | xfs_mount_t *mp, | 570 | xfs_mount_t *mp, |
575 | void __user *arg, | 571 | void __user *arg, |
572 | struct file *parfilp, | ||
576 | struct inode *parinode) | 573 | struct inode *parinode) |
577 | { | 574 | { |
578 | int error; | 575 | int error; |
@@ -626,13 +623,21 @@ xfs_attrmulti_by_handle( | |||
626 | &ops[i].am_length, ops[i].am_flags); | 623 | &ops[i].am_length, ops[i].am_flags); |
627 | break; | 624 | break; |
628 | case ATTR_OP_SET: | 625 | case ATTR_OP_SET: |
626 | ops[i].am_error = mnt_want_write(parfilp->f_path.mnt); | ||
627 | if (ops[i].am_error) | ||
628 | break; | ||
629 | ops[i].am_error = xfs_attrmulti_attr_set(inode, | 629 | ops[i].am_error = xfs_attrmulti_attr_set(inode, |
630 | attr_name, ops[i].am_attrvalue, | 630 | attr_name, ops[i].am_attrvalue, |
631 | ops[i].am_length, ops[i].am_flags); | 631 | ops[i].am_length, ops[i].am_flags); |
632 | mnt_drop_write(parfilp->f_path.mnt); | ||
632 | break; | 633 | break; |
633 | case ATTR_OP_REMOVE: | 634 | case ATTR_OP_REMOVE: |
635 | ops[i].am_error = mnt_want_write(parfilp->f_path.mnt); | ||
636 | if (ops[i].am_error) | ||
637 | break; | ||
634 | ops[i].am_error = xfs_attrmulti_attr_remove(inode, | 638 | ops[i].am_error = xfs_attrmulti_attr_remove(inode, |
635 | attr_name, ops[i].am_flags); | 639 | attr_name, ops[i].am_flags); |
640 | mnt_drop_write(parfilp->f_path.mnt); | ||
636 | break; | 641 | break; |
637 | default: | 642 | default: |
638 | ops[i].am_error = EINVAL; | 643 | ops[i].am_error = EINVAL; |
@@ -651,314 +656,6 @@ xfs_attrmulti_by_handle( | |||
651 | return -error; | 656 | return -error; |
652 | } | 657 | } |
653 | 658 | ||
654 | /* prototypes for a few of the stack-hungry cases that have | ||
655 | * their own functions. Functions are defined after their use | ||
656 | * so gcc doesn't get fancy and inline them with -03 */ | ||
657 | |||
658 | STATIC int | ||
659 | xfs_ioc_space( | ||
660 | struct xfs_inode *ip, | ||
661 | struct inode *inode, | ||
662 | struct file *filp, | ||
663 | int flags, | ||
664 | unsigned int cmd, | ||
665 | void __user *arg); | ||
666 | |||
667 | STATIC int | ||
668 | xfs_ioc_bulkstat( | ||
669 | xfs_mount_t *mp, | ||
670 | unsigned int cmd, | ||
671 | void __user *arg); | ||
672 | |||
673 | STATIC int | ||
674 | xfs_ioc_fsgeometry_v1( | ||
675 | xfs_mount_t *mp, | ||
676 | void __user *arg); | ||
677 | |||
678 | STATIC int | ||
679 | xfs_ioc_fsgeometry( | ||
680 | xfs_mount_t *mp, | ||
681 | void __user *arg); | ||
682 | |||
683 | STATIC int | ||
684 | xfs_ioc_xattr( | ||
685 | xfs_inode_t *ip, | ||
686 | struct file *filp, | ||
687 | unsigned int cmd, | ||
688 | void __user *arg); | ||
689 | |||
690 | STATIC int | ||
691 | xfs_ioc_fsgetxattr( | ||
692 | xfs_inode_t *ip, | ||
693 | int attr, | ||
694 | void __user *arg); | ||
695 | |||
696 | STATIC int | ||
697 | xfs_ioc_getbmap( | ||
698 | struct xfs_inode *ip, | ||
699 | int flags, | ||
700 | unsigned int cmd, | ||
701 | void __user *arg); | ||
702 | |||
703 | STATIC int | ||
704 | xfs_ioc_getbmapx( | ||
705 | struct xfs_inode *ip, | ||
706 | void __user *arg); | ||
707 | |||
708 | int | ||
709 | xfs_ioctl( | ||
710 | xfs_inode_t *ip, | ||
711 | struct file *filp, | ||
712 | int ioflags, | ||
713 | unsigned int cmd, | ||
714 | void __user *arg) | ||
715 | { | ||
716 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
717 | xfs_mount_t *mp = ip->i_mount; | ||
718 | int error; | ||
719 | |||
720 | xfs_itrace_entry(XFS_I(inode)); | ||
721 | switch (cmd) { | ||
722 | |||
723 | case XFS_IOC_ALLOCSP: | ||
724 | case XFS_IOC_FREESP: | ||
725 | case XFS_IOC_RESVSP: | ||
726 | case XFS_IOC_UNRESVSP: | ||
727 | case XFS_IOC_ALLOCSP64: | ||
728 | case XFS_IOC_FREESP64: | ||
729 | case XFS_IOC_RESVSP64: | ||
730 | case XFS_IOC_UNRESVSP64: | ||
731 | /* | ||
732 | * Only allow the sys admin to reserve space unless | ||
733 | * unwritten extents are enabled. | ||
734 | */ | ||
735 | if (!XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb) && | ||
736 | !capable(CAP_SYS_ADMIN)) | ||
737 | return -EPERM; | ||
738 | |||
739 | return xfs_ioc_space(ip, inode, filp, ioflags, cmd, arg); | ||
740 | |||
741 | case XFS_IOC_DIOINFO: { | ||
742 | struct dioattr da; | ||
743 | xfs_buftarg_t *target = | ||
744 | XFS_IS_REALTIME_INODE(ip) ? | ||
745 | mp->m_rtdev_targp : mp->m_ddev_targp; | ||
746 | |||
747 | da.d_mem = da.d_miniosz = 1 << target->bt_sshift; | ||
748 | da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); | ||
749 | |||
750 | if (copy_to_user(arg, &da, sizeof(da))) | ||
751 | return -XFS_ERROR(EFAULT); | ||
752 | return 0; | ||
753 | } | ||
754 | |||
755 | case XFS_IOC_FSBULKSTAT_SINGLE: | ||
756 | case XFS_IOC_FSBULKSTAT: | ||
757 | case XFS_IOC_FSINUMBERS: | ||
758 | return xfs_ioc_bulkstat(mp, cmd, arg); | ||
759 | |||
760 | case XFS_IOC_FSGEOMETRY_V1: | ||
761 | return xfs_ioc_fsgeometry_v1(mp, arg); | ||
762 | |||
763 | case XFS_IOC_FSGEOMETRY: | ||
764 | return xfs_ioc_fsgeometry(mp, arg); | ||
765 | |||
766 | case XFS_IOC_GETVERSION: | ||
767 | return put_user(inode->i_generation, (int __user *)arg); | ||
768 | |||
769 | case XFS_IOC_FSGETXATTR: | ||
770 | return xfs_ioc_fsgetxattr(ip, 0, arg); | ||
771 | case XFS_IOC_FSGETXATTRA: | ||
772 | return xfs_ioc_fsgetxattr(ip, 1, arg); | ||
773 | case XFS_IOC_GETXFLAGS: | ||
774 | case XFS_IOC_SETXFLAGS: | ||
775 | case XFS_IOC_FSSETXATTR: | ||
776 | return xfs_ioc_xattr(ip, filp, cmd, arg); | ||
777 | |||
778 | case XFS_IOC_FSSETDM: { | ||
779 | struct fsdmidata dmi; | ||
780 | |||
781 | if (copy_from_user(&dmi, arg, sizeof(dmi))) | ||
782 | return -XFS_ERROR(EFAULT); | ||
783 | |||
784 | error = xfs_set_dmattrs(ip, dmi.fsd_dmevmask, | ||
785 | dmi.fsd_dmstate); | ||
786 | return -error; | ||
787 | } | ||
788 | |||
789 | case XFS_IOC_GETBMAP: | ||
790 | case XFS_IOC_GETBMAPA: | ||
791 | return xfs_ioc_getbmap(ip, ioflags, cmd, arg); | ||
792 | |||
793 | case XFS_IOC_GETBMAPX: | ||
794 | return xfs_ioc_getbmapx(ip, arg); | ||
795 | |||
796 | case XFS_IOC_FD_TO_HANDLE: | ||
797 | case XFS_IOC_PATH_TO_HANDLE: | ||
798 | case XFS_IOC_PATH_TO_FSHANDLE: | ||
799 | return xfs_find_handle(cmd, arg); | ||
800 | |||
801 | case XFS_IOC_OPEN_BY_HANDLE: | ||
802 | return xfs_open_by_handle(mp, arg, filp, inode); | ||
803 | |||
804 | case XFS_IOC_FSSETDM_BY_HANDLE: | ||
805 | return xfs_fssetdm_by_handle(mp, arg, inode); | ||
806 | |||
807 | case XFS_IOC_READLINK_BY_HANDLE: | ||
808 | return xfs_readlink_by_handle(mp, arg, inode); | ||
809 | |||
810 | case XFS_IOC_ATTRLIST_BY_HANDLE: | ||
811 | return xfs_attrlist_by_handle(mp, arg, inode); | ||
812 | |||
813 | case XFS_IOC_ATTRMULTI_BY_HANDLE: | ||
814 | return xfs_attrmulti_by_handle(mp, arg, inode); | ||
815 | |||
816 | case XFS_IOC_SWAPEXT: { | ||
817 | error = xfs_swapext((struct xfs_swapext __user *)arg); | ||
818 | return -error; | ||
819 | } | ||
820 | |||
821 | case XFS_IOC_FSCOUNTS: { | ||
822 | xfs_fsop_counts_t out; | ||
823 | |||
824 | error = xfs_fs_counts(mp, &out); | ||
825 | if (error) | ||
826 | return -error; | ||
827 | |||
828 | if (copy_to_user(arg, &out, sizeof(out))) | ||
829 | return -XFS_ERROR(EFAULT); | ||
830 | return 0; | ||
831 | } | ||
832 | |||
833 | case XFS_IOC_SET_RESBLKS: { | ||
834 | xfs_fsop_resblks_t inout; | ||
835 | __uint64_t in; | ||
836 | |||
837 | if (!capable(CAP_SYS_ADMIN)) | ||
838 | return -EPERM; | ||
839 | |||
840 | if (copy_from_user(&inout, arg, sizeof(inout))) | ||
841 | return -XFS_ERROR(EFAULT); | ||
842 | |||
843 | /* input parameter is passed in resblks field of structure */ | ||
844 | in = inout.resblks; | ||
845 | error = xfs_reserve_blocks(mp, &in, &inout); | ||
846 | if (error) | ||
847 | return -error; | ||
848 | |||
849 | if (copy_to_user(arg, &inout, sizeof(inout))) | ||
850 | return -XFS_ERROR(EFAULT); | ||
851 | return 0; | ||
852 | } | ||
853 | |||
854 | case XFS_IOC_GET_RESBLKS: { | ||
855 | xfs_fsop_resblks_t out; | ||
856 | |||
857 | if (!capable(CAP_SYS_ADMIN)) | ||
858 | return -EPERM; | ||
859 | |||
860 | error = xfs_reserve_blocks(mp, NULL, &out); | ||
861 | if (error) | ||
862 | return -error; | ||
863 | |||
864 | if (copy_to_user(arg, &out, sizeof(out))) | ||
865 | return -XFS_ERROR(EFAULT); | ||
866 | |||
867 | return 0; | ||
868 | } | ||
869 | |||
870 | case XFS_IOC_FSGROWFSDATA: { | ||
871 | xfs_growfs_data_t in; | ||
872 | |||
873 | if (!capable(CAP_SYS_ADMIN)) | ||
874 | return -EPERM; | ||
875 | |||
876 | if (copy_from_user(&in, arg, sizeof(in))) | ||
877 | return -XFS_ERROR(EFAULT); | ||
878 | |||
879 | error = xfs_growfs_data(mp, &in); | ||
880 | return -error; | ||
881 | } | ||
882 | |||
883 | case XFS_IOC_FSGROWFSLOG: { | ||
884 | xfs_growfs_log_t in; | ||
885 | |||
886 | if (!capable(CAP_SYS_ADMIN)) | ||
887 | return -EPERM; | ||
888 | |||
889 | if (copy_from_user(&in, arg, sizeof(in))) | ||
890 | return -XFS_ERROR(EFAULT); | ||
891 | |||
892 | error = xfs_growfs_log(mp, &in); | ||
893 | return -error; | ||
894 | } | ||
895 | |||
896 | case XFS_IOC_FSGROWFSRT: { | ||
897 | xfs_growfs_rt_t in; | ||
898 | |||
899 | if (!capable(CAP_SYS_ADMIN)) | ||
900 | return -EPERM; | ||
901 | |||
902 | if (copy_from_user(&in, arg, sizeof(in))) | ||
903 | return -XFS_ERROR(EFAULT); | ||
904 | |||
905 | error = xfs_growfs_rt(mp, &in); | ||
906 | return -error; | ||
907 | } | ||
908 | |||
909 | case XFS_IOC_FREEZE: | ||
910 | if (!capable(CAP_SYS_ADMIN)) | ||
911 | return -EPERM; | ||
912 | |||
913 | if (inode->i_sb->s_frozen == SB_UNFROZEN) | ||
914 | freeze_bdev(inode->i_sb->s_bdev); | ||
915 | return 0; | ||
916 | |||
917 | case XFS_IOC_THAW: | ||
918 | if (!capable(CAP_SYS_ADMIN)) | ||
919 | return -EPERM; | ||
920 | if (inode->i_sb->s_frozen != SB_UNFROZEN) | ||
921 | thaw_bdev(inode->i_sb->s_bdev, inode->i_sb); | ||
922 | return 0; | ||
923 | |||
924 | case XFS_IOC_GOINGDOWN: { | ||
925 | __uint32_t in; | ||
926 | |||
927 | if (!capable(CAP_SYS_ADMIN)) | ||
928 | return -EPERM; | ||
929 | |||
930 | if (get_user(in, (__uint32_t __user *)arg)) | ||
931 | return -XFS_ERROR(EFAULT); | ||
932 | |||
933 | error = xfs_fs_goingdown(mp, in); | ||
934 | return -error; | ||
935 | } | ||
936 | |||
937 | case XFS_IOC_ERROR_INJECTION: { | ||
938 | xfs_error_injection_t in; | ||
939 | |||
940 | if (!capable(CAP_SYS_ADMIN)) | ||
941 | return -EPERM; | ||
942 | |||
943 | if (copy_from_user(&in, arg, sizeof(in))) | ||
944 | return -XFS_ERROR(EFAULT); | ||
945 | |||
946 | error = xfs_errortag_add(in.errtag, mp); | ||
947 | return -error; | ||
948 | } | ||
949 | |||
950 | case XFS_IOC_ERROR_CLEARALL: | ||
951 | if (!capable(CAP_SYS_ADMIN)) | ||
952 | return -EPERM; | ||
953 | |||
954 | error = xfs_errortag_clearall(mp, 1); | ||
955 | return -error; | ||
956 | |||
957 | default: | ||
958 | return -ENOTTY; | ||
959 | } | ||
960 | } | ||
961 | |||
962 | STATIC int | 659 | STATIC int |
963 | xfs_ioc_space( | 660 | xfs_ioc_space( |
964 | struct xfs_inode *ip, | 661 | struct xfs_inode *ip, |
@@ -1179,85 +876,85 @@ xfs_ioc_fsgetxattr( | |||
1179 | } | 876 | } |
1180 | 877 | ||
1181 | STATIC int | 878 | STATIC int |
1182 | xfs_ioc_xattr( | 879 | xfs_ioc_fssetxattr( |
1183 | xfs_inode_t *ip, | 880 | xfs_inode_t *ip, |
1184 | struct file *filp, | 881 | struct file *filp, |
1185 | unsigned int cmd, | ||
1186 | void __user *arg) | 882 | void __user *arg) |
1187 | { | 883 | { |
1188 | struct fsxattr fa; | 884 | struct fsxattr fa; |
1189 | struct bhv_vattr *vattr; | 885 | struct bhv_vattr *vattr; |
1190 | int error = 0; | 886 | int error; |
1191 | int attr_flags; | 887 | int attr_flags; |
1192 | unsigned int flags; | 888 | |
889 | if (copy_from_user(&fa, arg, sizeof(fa))) | ||
890 | return -EFAULT; | ||
1193 | 891 | ||
1194 | vattr = kmalloc(sizeof(*vattr), GFP_KERNEL); | 892 | vattr = kmalloc(sizeof(*vattr), GFP_KERNEL); |
1195 | if (unlikely(!vattr)) | 893 | if (unlikely(!vattr)) |
1196 | return -ENOMEM; | 894 | return -ENOMEM; |
1197 | 895 | ||
1198 | switch (cmd) { | 896 | attr_flags = 0; |
1199 | case XFS_IOC_FSSETXATTR: { | 897 | if (filp->f_flags & (O_NDELAY|O_NONBLOCK)) |
1200 | if (copy_from_user(&fa, arg, sizeof(fa))) { | 898 | attr_flags |= ATTR_NONBLOCK; |
1201 | error = -EFAULT; | ||
1202 | break; | ||
1203 | } | ||
1204 | 899 | ||
1205 | attr_flags = 0; | 900 | vattr->va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | XFS_AT_PROJID; |
1206 | if (filp->f_flags & (O_NDELAY|O_NONBLOCK)) | 901 | vattr->va_xflags = fa.fsx_xflags; |
1207 | attr_flags |= ATTR_NONBLOCK; | 902 | vattr->va_extsize = fa.fsx_extsize; |
903 | vattr->va_projid = fa.fsx_projid; | ||
1208 | 904 | ||
1209 | vattr->va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | XFS_AT_PROJID; | 905 | error = -xfs_setattr(ip, vattr, attr_flags, NULL); |
1210 | vattr->va_xflags = fa.fsx_xflags; | 906 | if (!error) |
1211 | vattr->va_extsize = fa.fsx_extsize; | 907 | vn_revalidate(XFS_ITOV(ip)); /* update flags */ |
1212 | vattr->va_projid = fa.fsx_projid; | 908 | kfree(vattr); |
909 | return 0; | ||
910 | } | ||
1213 | 911 | ||
1214 | error = xfs_setattr(ip, vattr, attr_flags, NULL); | 912 | STATIC int |
1215 | if (likely(!error)) | 913 | xfs_ioc_getxflags( |
1216 | vn_revalidate(XFS_ITOV(ip)); /* update flags */ | 914 | xfs_inode_t *ip, |
1217 | error = -error; | 915 | void __user *arg) |
1218 | break; | 916 | { |
1219 | } | 917 | unsigned int flags; |
1220 | 918 | ||
1221 | case XFS_IOC_GETXFLAGS: { | 919 | flags = xfs_di2lxflags(ip->i_d.di_flags); |
1222 | flags = xfs_di2lxflags(ip->i_d.di_flags); | 920 | if (copy_to_user(arg, &flags, sizeof(flags))) |
1223 | if (copy_to_user(arg, &flags, sizeof(flags))) | 921 | return -EFAULT; |
1224 | error = -EFAULT; | 922 | return 0; |
1225 | break; | 923 | } |
1226 | } | ||
1227 | 924 | ||
1228 | case XFS_IOC_SETXFLAGS: { | 925 | STATIC int |
1229 | if (copy_from_user(&flags, arg, sizeof(flags))) { | 926 | xfs_ioc_setxflags( |
1230 | error = -EFAULT; | 927 | xfs_inode_t *ip, |
1231 | break; | 928 | struct file *filp, |
1232 | } | 929 | void __user *arg) |
930 | { | ||
931 | struct bhv_vattr *vattr; | ||
932 | unsigned int flags; | ||
933 | int attr_flags; | ||
934 | int error; | ||
1233 | 935 | ||
1234 | if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \ | 936 | if (copy_from_user(&flags, arg, sizeof(flags))) |
1235 | FS_NOATIME_FL | FS_NODUMP_FL | \ | 937 | return -EFAULT; |
1236 | FS_SYNC_FL)) { | ||
1237 | error = -EOPNOTSUPP; | ||
1238 | break; | ||
1239 | } | ||
1240 | 938 | ||
1241 | attr_flags = 0; | 939 | if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \ |
1242 | if (filp->f_flags & (O_NDELAY|O_NONBLOCK)) | 940 | FS_NOATIME_FL | FS_NODUMP_FL | \ |
1243 | attr_flags |= ATTR_NONBLOCK; | 941 | FS_SYNC_FL)) |
942 | return -EOPNOTSUPP; | ||
1244 | 943 | ||
1245 | vattr->va_mask = XFS_AT_XFLAGS; | 944 | vattr = kmalloc(sizeof(*vattr), GFP_KERNEL); |
1246 | vattr->va_xflags = xfs_merge_ioc_xflags(flags, | 945 | if (unlikely(!vattr)) |
1247 | xfs_ip2xflags(ip)); | 946 | return -ENOMEM; |
1248 | 947 | ||
1249 | error = xfs_setattr(ip, vattr, attr_flags, NULL); | 948 | attr_flags = 0; |
1250 | if (likely(!error)) | 949 | if (filp->f_flags & (O_NDELAY|O_NONBLOCK)) |
1251 | vn_revalidate(XFS_ITOV(ip)); /* update flags */ | 950 | attr_flags |= ATTR_NONBLOCK; |
1252 | error = -error; | ||
1253 | break; | ||
1254 | } | ||
1255 | 951 | ||
1256 | default: | 952 | vattr->va_mask = XFS_AT_XFLAGS; |
1257 | error = -ENOTTY; | 953 | vattr->va_xflags = xfs_merge_ioc_xflags(flags, xfs_ip2xflags(ip)); |
1258 | break; | ||
1259 | } | ||
1260 | 954 | ||
955 | error = -xfs_setattr(ip, vattr, attr_flags, NULL); | ||
956 | if (likely(!error)) | ||
957 | vn_revalidate(XFS_ITOV(ip)); /* update flags */ | ||
1261 | kfree(vattr); | 958 | kfree(vattr); |
1262 | return error; | 959 | return error; |
1263 | } | 960 | } |
@@ -1332,3 +1029,259 @@ xfs_ioc_getbmapx( | |||
1332 | 1029 | ||
1333 | return 0; | 1030 | return 0; |
1334 | } | 1031 | } |
1032 | |||
1033 | int | ||
1034 | xfs_ioctl( | ||
1035 | xfs_inode_t *ip, | ||
1036 | struct file *filp, | ||
1037 | int ioflags, | ||
1038 | unsigned int cmd, | ||
1039 | void __user *arg) | ||
1040 | { | ||
1041 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
1042 | xfs_mount_t *mp = ip->i_mount; | ||
1043 | int error; | ||
1044 | |||
1045 | xfs_itrace_entry(XFS_I(inode)); | ||
1046 | switch (cmd) { | ||
1047 | |||
1048 | case XFS_IOC_ALLOCSP: | ||
1049 | case XFS_IOC_FREESP: | ||
1050 | case XFS_IOC_RESVSP: | ||
1051 | case XFS_IOC_UNRESVSP: | ||
1052 | case XFS_IOC_ALLOCSP64: | ||
1053 | case XFS_IOC_FREESP64: | ||
1054 | case XFS_IOC_RESVSP64: | ||
1055 | case XFS_IOC_UNRESVSP64: | ||
1056 | /* | ||
1057 | * Only allow the sys admin to reserve space unless | ||
1058 | * unwritten extents are enabled. | ||
1059 | */ | ||
1060 | if (!xfs_sb_version_hasextflgbit(&mp->m_sb) && | ||
1061 | !capable(CAP_SYS_ADMIN)) | ||
1062 | return -EPERM; | ||
1063 | |||
1064 | return xfs_ioc_space(ip, inode, filp, ioflags, cmd, arg); | ||
1065 | |||
1066 | case XFS_IOC_DIOINFO: { | ||
1067 | struct dioattr da; | ||
1068 | xfs_buftarg_t *target = | ||
1069 | XFS_IS_REALTIME_INODE(ip) ? | ||
1070 | mp->m_rtdev_targp : mp->m_ddev_targp; | ||
1071 | |||
1072 | da.d_mem = da.d_miniosz = 1 << target->bt_sshift; | ||
1073 | da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); | ||
1074 | |||
1075 | if (copy_to_user(arg, &da, sizeof(da))) | ||
1076 | return -XFS_ERROR(EFAULT); | ||
1077 | return 0; | ||
1078 | } | ||
1079 | |||
1080 | case XFS_IOC_FSBULKSTAT_SINGLE: | ||
1081 | case XFS_IOC_FSBULKSTAT: | ||
1082 | case XFS_IOC_FSINUMBERS: | ||
1083 | return xfs_ioc_bulkstat(mp, cmd, arg); | ||
1084 | |||
1085 | case XFS_IOC_FSGEOMETRY_V1: | ||
1086 | return xfs_ioc_fsgeometry_v1(mp, arg); | ||
1087 | |||
1088 | case XFS_IOC_FSGEOMETRY: | ||
1089 | return xfs_ioc_fsgeometry(mp, arg); | ||
1090 | |||
1091 | case XFS_IOC_GETVERSION: | ||
1092 | return put_user(inode->i_generation, (int __user *)arg); | ||
1093 | |||
1094 | case XFS_IOC_FSGETXATTR: | ||
1095 | return xfs_ioc_fsgetxattr(ip, 0, arg); | ||
1096 | case XFS_IOC_FSGETXATTRA: | ||
1097 | return xfs_ioc_fsgetxattr(ip, 1, arg); | ||
1098 | case XFS_IOC_FSSETXATTR: | ||
1099 | return xfs_ioc_fssetxattr(ip, filp, arg); | ||
1100 | case XFS_IOC_GETXFLAGS: | ||
1101 | return xfs_ioc_getxflags(ip, arg); | ||
1102 | case XFS_IOC_SETXFLAGS: | ||
1103 | return xfs_ioc_setxflags(ip, filp, arg); | ||
1104 | |||
1105 | case XFS_IOC_FSSETDM: { | ||
1106 | struct fsdmidata dmi; | ||
1107 | |||
1108 | if (copy_from_user(&dmi, arg, sizeof(dmi))) | ||
1109 | return -XFS_ERROR(EFAULT); | ||
1110 | |||
1111 | error = xfs_set_dmattrs(ip, dmi.fsd_dmevmask, | ||
1112 | dmi.fsd_dmstate); | ||
1113 | return -error; | ||
1114 | } | ||
1115 | |||
1116 | case XFS_IOC_GETBMAP: | ||
1117 | case XFS_IOC_GETBMAPA: | ||
1118 | return xfs_ioc_getbmap(ip, ioflags, cmd, arg); | ||
1119 | |||
1120 | case XFS_IOC_GETBMAPX: | ||
1121 | return xfs_ioc_getbmapx(ip, arg); | ||
1122 | |||
1123 | case XFS_IOC_FD_TO_HANDLE: | ||
1124 | case XFS_IOC_PATH_TO_HANDLE: | ||
1125 | case XFS_IOC_PATH_TO_FSHANDLE: | ||
1126 | return xfs_find_handle(cmd, arg); | ||
1127 | |||
1128 | case XFS_IOC_OPEN_BY_HANDLE: | ||
1129 | return xfs_open_by_handle(mp, arg, filp, inode); | ||
1130 | |||
1131 | case XFS_IOC_FSSETDM_BY_HANDLE: | ||
1132 | return xfs_fssetdm_by_handle(mp, arg, inode); | ||
1133 | |||
1134 | case XFS_IOC_READLINK_BY_HANDLE: | ||
1135 | return xfs_readlink_by_handle(mp, arg, inode); | ||
1136 | |||
1137 | case XFS_IOC_ATTRLIST_BY_HANDLE: | ||
1138 | return xfs_attrlist_by_handle(mp, arg, inode); | ||
1139 | |||
1140 | case XFS_IOC_ATTRMULTI_BY_HANDLE: | ||
1141 | return xfs_attrmulti_by_handle(mp, arg, filp, inode); | ||
1142 | |||
1143 | case XFS_IOC_SWAPEXT: { | ||
1144 | error = xfs_swapext((struct xfs_swapext __user *)arg); | ||
1145 | return -error; | ||
1146 | } | ||
1147 | |||
1148 | case XFS_IOC_FSCOUNTS: { | ||
1149 | xfs_fsop_counts_t out; | ||
1150 | |||
1151 | error = xfs_fs_counts(mp, &out); | ||
1152 | if (error) | ||
1153 | return -error; | ||
1154 | |||
1155 | if (copy_to_user(arg, &out, sizeof(out))) | ||
1156 | return -XFS_ERROR(EFAULT); | ||
1157 | return 0; | ||
1158 | } | ||
1159 | |||
1160 | case XFS_IOC_SET_RESBLKS: { | ||
1161 | xfs_fsop_resblks_t inout; | ||
1162 | __uint64_t in; | ||
1163 | |||
1164 | if (!capable(CAP_SYS_ADMIN)) | ||
1165 | return -EPERM; | ||
1166 | |||
1167 | if (copy_from_user(&inout, arg, sizeof(inout))) | ||
1168 | return -XFS_ERROR(EFAULT); | ||
1169 | |||
1170 | /* input parameter is passed in resblks field of structure */ | ||
1171 | in = inout.resblks; | ||
1172 | error = xfs_reserve_blocks(mp, &in, &inout); | ||
1173 | if (error) | ||
1174 | return -error; | ||
1175 | |||
1176 | if (copy_to_user(arg, &inout, sizeof(inout))) | ||
1177 | return -XFS_ERROR(EFAULT); | ||
1178 | return 0; | ||
1179 | } | ||
1180 | |||
1181 | case XFS_IOC_GET_RESBLKS: { | ||
1182 | xfs_fsop_resblks_t out; | ||
1183 | |||
1184 | if (!capable(CAP_SYS_ADMIN)) | ||
1185 | return -EPERM; | ||
1186 | |||
1187 | error = xfs_reserve_blocks(mp, NULL, &out); | ||
1188 | if (error) | ||
1189 | return -error; | ||
1190 | |||
1191 | if (copy_to_user(arg, &out, sizeof(out))) | ||
1192 | return -XFS_ERROR(EFAULT); | ||
1193 | |||
1194 | return 0; | ||
1195 | } | ||
1196 | |||
1197 | case XFS_IOC_FSGROWFSDATA: { | ||
1198 | xfs_growfs_data_t in; | ||
1199 | |||
1200 | if (!capable(CAP_SYS_ADMIN)) | ||
1201 | return -EPERM; | ||
1202 | |||
1203 | if (copy_from_user(&in, arg, sizeof(in))) | ||
1204 | return -XFS_ERROR(EFAULT); | ||
1205 | |||
1206 | error = xfs_growfs_data(mp, &in); | ||
1207 | return -error; | ||
1208 | } | ||
1209 | |||
1210 | case XFS_IOC_FSGROWFSLOG: { | ||
1211 | xfs_growfs_log_t in; | ||
1212 | |||
1213 | if (!capable(CAP_SYS_ADMIN)) | ||
1214 | return -EPERM; | ||
1215 | |||
1216 | if (copy_from_user(&in, arg, sizeof(in))) | ||
1217 | return -XFS_ERROR(EFAULT); | ||
1218 | |||
1219 | error = xfs_growfs_log(mp, &in); | ||
1220 | return -error; | ||
1221 | } | ||
1222 | |||
1223 | case XFS_IOC_FSGROWFSRT: { | ||
1224 | xfs_growfs_rt_t in; | ||
1225 | |||
1226 | if (!capable(CAP_SYS_ADMIN)) | ||
1227 | return -EPERM; | ||
1228 | |||
1229 | if (copy_from_user(&in, arg, sizeof(in))) | ||
1230 | return -XFS_ERROR(EFAULT); | ||
1231 | |||
1232 | error = xfs_growfs_rt(mp, &in); | ||
1233 | return -error; | ||
1234 | } | ||
1235 | |||
1236 | case XFS_IOC_FREEZE: | ||
1237 | if (!capable(CAP_SYS_ADMIN)) | ||
1238 | return -EPERM; | ||
1239 | |||
1240 | if (inode->i_sb->s_frozen == SB_UNFROZEN) | ||
1241 | freeze_bdev(inode->i_sb->s_bdev); | ||
1242 | return 0; | ||
1243 | |||
1244 | case XFS_IOC_THAW: | ||
1245 | if (!capable(CAP_SYS_ADMIN)) | ||
1246 | return -EPERM; | ||
1247 | if (inode->i_sb->s_frozen != SB_UNFROZEN) | ||
1248 | thaw_bdev(inode->i_sb->s_bdev, inode->i_sb); | ||
1249 | return 0; | ||
1250 | |||
1251 | case XFS_IOC_GOINGDOWN: { | ||
1252 | __uint32_t in; | ||
1253 | |||
1254 | if (!capable(CAP_SYS_ADMIN)) | ||
1255 | return -EPERM; | ||
1256 | |||
1257 | if (get_user(in, (__uint32_t __user *)arg)) | ||
1258 | return -XFS_ERROR(EFAULT); | ||
1259 | |||
1260 | error = xfs_fs_goingdown(mp, in); | ||
1261 | return -error; | ||
1262 | } | ||
1263 | |||
1264 | case XFS_IOC_ERROR_INJECTION: { | ||
1265 | xfs_error_injection_t in; | ||
1266 | |||
1267 | if (!capable(CAP_SYS_ADMIN)) | ||
1268 | return -EPERM; | ||
1269 | |||
1270 | if (copy_from_user(&in, arg, sizeof(in))) | ||
1271 | return -XFS_ERROR(EFAULT); | ||
1272 | |||
1273 | error = xfs_errortag_add(in.errtag, mp); | ||
1274 | return -error; | ||
1275 | } | ||
1276 | |||
1277 | case XFS_IOC_ERROR_CLEARALL: | ||
1278 | if (!capable(CAP_SYS_ADMIN)) | ||
1279 | return -EPERM; | ||
1280 | |||
1281 | error = xfs_errortag_clearall(mp, 1); | ||
1282 | return -error; | ||
1283 | |||
1284 | default: | ||
1285 | return -ENOTTY; | ||
1286 | } | ||
1287 | } | ||
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index cc4abd3daa49..a1237dad6430 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
@@ -62,12 +62,11 @@ void | |||
62 | xfs_synchronize_atime( | 62 | xfs_synchronize_atime( |
63 | xfs_inode_t *ip) | 63 | xfs_inode_t *ip) |
64 | { | 64 | { |
65 | bhv_vnode_t *vp; | 65 | struct inode *inode = ip->i_vnode; |
66 | 66 | ||
67 | vp = XFS_ITOV_NULL(ip); | 67 | if (inode) { |
68 | if (vp) { | 68 | ip->i_d.di_atime.t_sec = (__int32_t)inode->i_atime.tv_sec; |
69 | ip->i_d.di_atime.t_sec = (__int32_t)vp->i_atime.tv_sec; | 69 | ip->i_d.di_atime.t_nsec = (__int32_t)inode->i_atime.tv_nsec; |
70 | ip->i_d.di_atime.t_nsec = (__int32_t)vp->i_atime.tv_nsec; | ||
71 | } | 70 | } |
72 | } | 71 | } |
73 | 72 | ||
@@ -80,11 +79,10 @@ void | |||
80 | xfs_mark_inode_dirty_sync( | 79 | xfs_mark_inode_dirty_sync( |
81 | xfs_inode_t *ip) | 80 | xfs_inode_t *ip) |
82 | { | 81 | { |
83 | bhv_vnode_t *vp; | 82 | struct inode *inode = ip->i_vnode; |
84 | 83 | ||
85 | vp = XFS_ITOV_NULL(ip); | 84 | if (inode) |
86 | if (vp) | 85 | mark_inode_dirty_sync(inode); |
87 | mark_inode_dirty_sync(vn_to_inode(vp)); | ||
88 | } | 86 | } |
89 | 87 | ||
90 | /* | 88 | /* |
@@ -157,13 +155,6 @@ xfs_ichgtime_fast( | |||
157 | */ | 155 | */ |
158 | ASSERT((flags & XFS_ICHGTIME_ACC) == 0); | 156 | ASSERT((flags & XFS_ICHGTIME_ACC) == 0); |
159 | 157 | ||
160 | /* | ||
161 | * We're not supposed to change timestamps in readonly-mounted | ||
162 | * filesystems. Throw it away if anyone asks us. | ||
163 | */ | ||
164 | if (unlikely(IS_RDONLY(inode))) | ||
165 | return; | ||
166 | |||
167 | if (flags & XFS_ICHGTIME_MOD) { | 158 | if (flags & XFS_ICHGTIME_MOD) { |
168 | tvp = &inode->i_mtime; | 159 | tvp = &inode->i_mtime; |
169 | ip->i_d.di_mtime.t_sec = (__int32_t)tvp->tv_sec; | 160 | ip->i_d.di_mtime.t_sec = (__int32_t)tvp->tv_sec; |
@@ -215,66 +206,62 @@ xfs_validate_fields( | |||
215 | */ | 206 | */ |
216 | STATIC int | 207 | STATIC int |
217 | xfs_init_security( | 208 | xfs_init_security( |
218 | bhv_vnode_t *vp, | 209 | struct inode *inode, |
219 | struct inode *dir) | 210 | struct inode *dir) |
220 | { | 211 | { |
221 | struct inode *ip = vn_to_inode(vp); | 212 | struct xfs_inode *ip = XFS_I(inode); |
222 | size_t length; | 213 | size_t length; |
223 | void *value; | 214 | void *value; |
224 | char *name; | 215 | char *name; |
225 | int error; | 216 | int error; |
226 | 217 | ||
227 | error = security_inode_init_security(ip, dir, &name, &value, &length); | 218 | error = security_inode_init_security(inode, dir, &name, |
219 | &value, &length); | ||
228 | if (error) { | 220 | if (error) { |
229 | if (error == -EOPNOTSUPP) | 221 | if (error == -EOPNOTSUPP) |
230 | return 0; | 222 | return 0; |
231 | return -error; | 223 | return -error; |
232 | } | 224 | } |
233 | 225 | ||
234 | error = xfs_attr_set(XFS_I(ip), name, value, | 226 | error = xfs_attr_set(ip, name, value, length, ATTR_SECURE); |
235 | length, ATTR_SECURE); | ||
236 | if (!error) | 227 | if (!error) |
237 | xfs_iflags_set(XFS_I(ip), XFS_IMODIFIED); | 228 | xfs_iflags_set(ip, XFS_IMODIFIED); |
238 | 229 | ||
239 | kfree(name); | 230 | kfree(name); |
240 | kfree(value); | 231 | kfree(value); |
241 | return error; | 232 | return error; |
242 | } | 233 | } |
243 | 234 | ||
244 | /* | 235 | static void |
245 | * Determine whether a process has a valid fs_struct (kernel daemons | 236 | xfs_dentry_to_name( |
246 | * like knfsd don't have an fs_struct). | 237 | struct xfs_name *namep, |
247 | * | 238 | struct dentry *dentry) |
248 | * XXX(hch): nfsd is broken, better fix it instead. | ||
249 | */ | ||
250 | STATIC_INLINE int | ||
251 | xfs_has_fs_struct(struct task_struct *task) | ||
252 | { | 239 | { |
253 | return (task->fs != init_task.fs); | 240 | namep->name = dentry->d_name.name; |
241 | namep->len = dentry->d_name.len; | ||
254 | } | 242 | } |
255 | 243 | ||
256 | STATIC void | 244 | STATIC void |
257 | xfs_cleanup_inode( | 245 | xfs_cleanup_inode( |
258 | struct inode *dir, | 246 | struct inode *dir, |
259 | bhv_vnode_t *vp, | 247 | struct inode *inode, |
260 | struct dentry *dentry, | 248 | struct dentry *dentry, |
261 | int mode) | 249 | int mode) |
262 | { | 250 | { |
263 | struct dentry teardown = {}; | 251 | struct xfs_name teardown; |
264 | 252 | ||
265 | /* Oh, the horror. | 253 | /* Oh, the horror. |
266 | * If we can't add the ACL or we fail in | 254 | * If we can't add the ACL or we fail in |
267 | * xfs_init_security we must back out. | 255 | * xfs_init_security we must back out. |
268 | * ENOSPC can hit here, among other things. | 256 | * ENOSPC can hit here, among other things. |
269 | */ | 257 | */ |
270 | teardown.d_inode = vn_to_inode(vp); | 258 | xfs_dentry_to_name(&teardown, dentry); |
271 | teardown.d_name = dentry->d_name; | ||
272 | 259 | ||
273 | if (S_ISDIR(mode)) | 260 | if (S_ISDIR(mode)) |
274 | xfs_rmdir(XFS_I(dir), &teardown); | 261 | xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode)); |
275 | else | 262 | else |
276 | xfs_remove(XFS_I(dir), &teardown); | 263 | xfs_remove(XFS_I(dir), &teardown, XFS_I(inode)); |
277 | VN_RELE(vp); | 264 | iput(inode); |
278 | } | 265 | } |
279 | 266 | ||
280 | STATIC int | 267 | STATIC int |
@@ -284,9 +271,10 @@ xfs_vn_mknod( | |||
284 | int mode, | 271 | int mode, |
285 | dev_t rdev) | 272 | dev_t rdev) |
286 | { | 273 | { |
287 | struct inode *ip; | 274 | struct inode *inode; |
288 | bhv_vnode_t *vp = NULL, *dvp = vn_from_inode(dir); | 275 | struct xfs_inode *ip = NULL; |
289 | xfs_acl_t *default_acl = NULL; | 276 | xfs_acl_t *default_acl = NULL; |
277 | struct xfs_name name; | ||
290 | attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS; | 278 | attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS; |
291 | int error; | 279 | int error; |
292 | 280 | ||
@@ -297,59 +285,67 @@ xfs_vn_mknod( | |||
297 | if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff)) | 285 | if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff)) |
298 | return -EINVAL; | 286 | return -EINVAL; |
299 | 287 | ||
300 | if (unlikely(test_default_acl && test_default_acl(dvp))) { | 288 | if (test_default_acl && test_default_acl(dir)) { |
301 | if (!_ACL_ALLOC(default_acl)) { | 289 | if (!_ACL_ALLOC(default_acl)) { |
302 | return -ENOMEM; | 290 | return -ENOMEM; |
303 | } | 291 | } |
304 | if (!_ACL_GET_DEFAULT(dvp, default_acl)) { | 292 | if (!_ACL_GET_DEFAULT(dir, default_acl)) { |
305 | _ACL_FREE(default_acl); | 293 | _ACL_FREE(default_acl); |
306 | default_acl = NULL; | 294 | default_acl = NULL; |
307 | } | 295 | } |
308 | } | 296 | } |
309 | 297 | ||
310 | if (IS_POSIXACL(dir) && !default_acl && xfs_has_fs_struct(current)) | 298 | xfs_dentry_to_name(&name, dentry); |
299 | |||
300 | if (IS_POSIXACL(dir) && !default_acl) | ||
311 | mode &= ~current->fs->umask; | 301 | mode &= ~current->fs->umask; |
312 | 302 | ||
313 | switch (mode & S_IFMT) { | 303 | switch (mode & S_IFMT) { |
314 | case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK: | 304 | case S_IFCHR: |
305 | case S_IFBLK: | ||
306 | case S_IFIFO: | ||
307 | case S_IFSOCK: | ||
315 | rdev = sysv_encode_dev(rdev); | 308 | rdev = sysv_encode_dev(rdev); |
316 | case S_IFREG: | 309 | case S_IFREG: |
317 | error = xfs_create(XFS_I(dir), dentry, mode, rdev, &vp, NULL); | 310 | error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL); |
318 | break; | 311 | break; |
319 | case S_IFDIR: | 312 | case S_IFDIR: |
320 | error = xfs_mkdir(XFS_I(dir), dentry, mode, &vp, NULL); | 313 | error = xfs_mkdir(XFS_I(dir), &name, mode, &ip, NULL); |
321 | break; | 314 | break; |
322 | default: | 315 | default: |
323 | error = EINVAL; | 316 | error = EINVAL; |
324 | break; | 317 | break; |
325 | } | 318 | } |
326 | 319 | ||
327 | if (unlikely(!error)) { | 320 | if (unlikely(error)) |
328 | error = xfs_init_security(vp, dir); | 321 | goto out_free_acl; |
329 | if (error) | ||
330 | xfs_cleanup_inode(dir, vp, dentry, mode); | ||
331 | } | ||
332 | 322 | ||
333 | if (unlikely(default_acl)) { | 323 | inode = ip->i_vnode; |
334 | if (!error) { | 324 | |
335 | error = _ACL_INHERIT(vp, mode, default_acl); | 325 | error = xfs_init_security(inode, dir); |
336 | if (!error) | 326 | if (unlikely(error)) |
337 | xfs_iflags_set(XFS_I(vp), XFS_IMODIFIED); | 327 | goto out_cleanup_inode; |
338 | else | 328 | |
339 | xfs_cleanup_inode(dir, vp, dentry, mode); | 329 | if (default_acl) { |
340 | } | 330 | error = _ACL_INHERIT(inode, mode, default_acl); |
331 | if (unlikely(error)) | ||
332 | goto out_cleanup_inode; | ||
333 | xfs_iflags_set(ip, XFS_IMODIFIED); | ||
341 | _ACL_FREE(default_acl); | 334 | _ACL_FREE(default_acl); |
342 | } | 335 | } |
343 | 336 | ||
344 | if (likely(!error)) { | ||
345 | ASSERT(vp); | ||
346 | ip = vn_to_inode(vp); | ||
347 | 337 | ||
348 | if (S_ISDIR(mode)) | 338 | if (S_ISDIR(mode)) |
349 | xfs_validate_fields(ip); | 339 | xfs_validate_fields(inode); |
350 | d_instantiate(dentry, ip); | 340 | d_instantiate(dentry, inode); |
351 | xfs_validate_fields(dir); | 341 | xfs_validate_fields(dir); |
352 | } | 342 | return -error; |
343 | |||
344 | out_cleanup_inode: | ||
345 | xfs_cleanup_inode(dir, inode, dentry, mode); | ||
346 | out_free_acl: | ||
347 | if (default_acl) | ||
348 | _ACL_FREE(default_acl); | ||
353 | return -error; | 349 | return -error; |
354 | } | 350 | } |
355 | 351 | ||
@@ -378,13 +374,15 @@ xfs_vn_lookup( | |||
378 | struct dentry *dentry, | 374 | struct dentry *dentry, |
379 | struct nameidata *nd) | 375 | struct nameidata *nd) |
380 | { | 376 | { |
381 | bhv_vnode_t *cvp; | 377 | struct xfs_inode *cip; |
378 | struct xfs_name name; | ||
382 | int error; | 379 | int error; |
383 | 380 | ||
384 | if (dentry->d_name.len >= MAXNAMELEN) | 381 | if (dentry->d_name.len >= MAXNAMELEN) |
385 | return ERR_PTR(-ENAMETOOLONG); | 382 | return ERR_PTR(-ENAMETOOLONG); |
386 | 383 | ||
387 | error = xfs_lookup(XFS_I(dir), dentry, &cvp); | 384 | xfs_dentry_to_name(&name, dentry); |
385 | error = xfs_lookup(XFS_I(dir), &name, &cip); | ||
388 | if (unlikely(error)) { | 386 | if (unlikely(error)) { |
389 | if (unlikely(error != ENOENT)) | 387 | if (unlikely(error != ENOENT)) |
390 | return ERR_PTR(-error); | 388 | return ERR_PTR(-error); |
@@ -392,7 +390,7 @@ xfs_vn_lookup( | |||
392 | return NULL; | 390 | return NULL; |
393 | } | 391 | } |
394 | 392 | ||
395 | return d_splice_alias(vn_to_inode(cvp), dentry); | 393 | return d_splice_alias(cip->i_vnode, dentry); |
396 | } | 394 | } |
397 | 395 | ||
398 | STATIC int | 396 | STATIC int |
@@ -401,23 +399,24 @@ xfs_vn_link( | |||
401 | struct inode *dir, | 399 | struct inode *dir, |
402 | struct dentry *dentry) | 400 | struct dentry *dentry) |
403 | { | 401 | { |
404 | struct inode *ip; /* inode of guy being linked to */ | 402 | struct inode *inode; /* inode of guy being linked to */ |
405 | bhv_vnode_t *vp; /* vp of name being linked */ | 403 | struct xfs_name name; |
406 | int error; | 404 | int error; |
407 | 405 | ||
408 | ip = old_dentry->d_inode; /* inode being linked to */ | 406 | inode = old_dentry->d_inode; |
409 | vp = vn_from_inode(ip); | 407 | xfs_dentry_to_name(&name, dentry); |
410 | 408 | ||
411 | VN_HOLD(vp); | 409 | igrab(inode); |
412 | error = xfs_link(XFS_I(dir), vp, dentry); | 410 | error = xfs_link(XFS_I(dir), XFS_I(inode), &name); |
413 | if (unlikely(error)) { | 411 | if (unlikely(error)) { |
414 | VN_RELE(vp); | 412 | iput(inode); |
415 | } else { | 413 | return -error; |
416 | xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED); | ||
417 | xfs_validate_fields(ip); | ||
418 | d_instantiate(dentry, ip); | ||
419 | } | 414 | } |
420 | return -error; | 415 | |
416 | xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED); | ||
417 | xfs_validate_fields(inode); | ||
418 | d_instantiate(dentry, inode); | ||
419 | return 0; | ||
421 | } | 420 | } |
422 | 421 | ||
423 | STATIC int | 422 | STATIC int |
@@ -426,11 +425,13 @@ xfs_vn_unlink( | |||
426 | struct dentry *dentry) | 425 | struct dentry *dentry) |
427 | { | 426 | { |
428 | struct inode *inode; | 427 | struct inode *inode; |
428 | struct xfs_name name; | ||
429 | int error; | 429 | int error; |
430 | 430 | ||
431 | inode = dentry->d_inode; | 431 | inode = dentry->d_inode; |
432 | xfs_dentry_to_name(&name, dentry); | ||
432 | 433 | ||
433 | error = xfs_remove(XFS_I(dir), dentry); | 434 | error = xfs_remove(XFS_I(dir), &name, XFS_I(inode)); |
434 | if (likely(!error)) { | 435 | if (likely(!error)) { |
435 | xfs_validate_fields(dir); /* size needs update */ | 436 | xfs_validate_fields(dir); /* size needs update */ |
436 | xfs_validate_fields(inode); | 437 | xfs_validate_fields(inode); |
@@ -444,29 +445,34 @@ xfs_vn_symlink( | |||
444 | struct dentry *dentry, | 445 | struct dentry *dentry, |
445 | const char *symname) | 446 | const char *symname) |
446 | { | 447 | { |
447 | struct inode *ip; | 448 | struct inode *inode; |
448 | bhv_vnode_t *cvp; /* used to lookup symlink to put in dentry */ | 449 | struct xfs_inode *cip = NULL; |
450 | struct xfs_name name; | ||
449 | int error; | 451 | int error; |
450 | mode_t mode; | 452 | mode_t mode; |
451 | 453 | ||
452 | cvp = NULL; | ||
453 | |||
454 | mode = S_IFLNK | | 454 | mode = S_IFLNK | |
455 | (irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO); | 455 | (irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO); |
456 | xfs_dentry_to_name(&name, dentry); | ||
456 | 457 | ||
457 | error = xfs_symlink(XFS_I(dir), dentry, (char *)symname, mode, | 458 | error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip, NULL); |
458 | &cvp, NULL); | 459 | if (unlikely(error)) |
459 | if (likely(!error && cvp)) { | 460 | goto out; |
460 | error = xfs_init_security(cvp, dir); | 461 | |
461 | if (likely(!error)) { | 462 | inode = cip->i_vnode; |
462 | ip = vn_to_inode(cvp); | 463 | |
463 | d_instantiate(dentry, ip); | 464 | error = xfs_init_security(inode, dir); |
464 | xfs_validate_fields(dir); | 465 | if (unlikely(error)) |
465 | xfs_validate_fields(ip); | 466 | goto out_cleanup_inode; |
466 | } else { | 467 | |
467 | xfs_cleanup_inode(dir, cvp, dentry, 0); | 468 | d_instantiate(dentry, inode); |
468 | } | 469 | xfs_validate_fields(dir); |
469 | } | 470 | xfs_validate_fields(inode); |
471 | return 0; | ||
472 | |||
473 | out_cleanup_inode: | ||
474 | xfs_cleanup_inode(dir, inode, dentry, 0); | ||
475 | out: | ||
470 | return -error; | 476 | return -error; |
471 | } | 477 | } |
472 | 478 | ||
@@ -476,9 +482,12 @@ xfs_vn_rmdir( | |||
476 | struct dentry *dentry) | 482 | struct dentry *dentry) |
477 | { | 483 | { |
478 | struct inode *inode = dentry->d_inode; | 484 | struct inode *inode = dentry->d_inode; |
485 | struct xfs_name name; | ||
479 | int error; | 486 | int error; |
480 | 487 | ||
481 | error = xfs_rmdir(XFS_I(dir), dentry); | 488 | xfs_dentry_to_name(&name, dentry); |
489 | |||
490 | error = xfs_rmdir(XFS_I(dir), &name, XFS_I(inode)); | ||
482 | if (likely(!error)) { | 491 | if (likely(!error)) { |
483 | xfs_validate_fields(inode); | 492 | xfs_validate_fields(inode); |
484 | xfs_validate_fields(dir); | 493 | xfs_validate_fields(dir); |
@@ -494,12 +503,15 @@ xfs_vn_rename( | |||
494 | struct dentry *ndentry) | 503 | struct dentry *ndentry) |
495 | { | 504 | { |
496 | struct inode *new_inode = ndentry->d_inode; | 505 | struct inode *new_inode = ndentry->d_inode; |
497 | bhv_vnode_t *tvp; /* target directory */ | 506 | struct xfs_name oname; |
507 | struct xfs_name nname; | ||
498 | int error; | 508 | int error; |
499 | 509 | ||
500 | tvp = vn_from_inode(ndir); | 510 | xfs_dentry_to_name(&oname, odentry); |
511 | xfs_dentry_to_name(&nname, ndentry); | ||
501 | 512 | ||
502 | error = xfs_rename(XFS_I(odir), odentry, tvp, ndentry); | 513 | error = xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), |
514 | XFS_I(ndir), &nname); | ||
503 | if (likely(!error)) { | 515 | if (likely(!error)) { |
504 | if (new_inode) | 516 | if (new_inode) |
505 | xfs_validate_fields(new_inode); | 517 | xfs_validate_fields(new_inode); |
@@ -700,11 +712,19 @@ xfs_vn_setattr( | |||
700 | return -error; | 712 | return -error; |
701 | } | 713 | } |
702 | 714 | ||
715 | /* | ||
716 | * block_truncate_page can return an error, but we can't propagate it | ||
717 | * at all here. Leave a complaint + stack trace in the syslog because | ||
718 | * this could be bad. If it is bad, we need to propagate the error further. | ||
719 | */ | ||
703 | STATIC void | 720 | STATIC void |
704 | xfs_vn_truncate( | 721 | xfs_vn_truncate( |
705 | struct inode *inode) | 722 | struct inode *inode) |
706 | { | 723 | { |
707 | block_truncate_page(inode->i_mapping, inode->i_size, xfs_get_blocks); | 724 | int error; |
725 | error = block_truncate_page(inode->i_mapping, inode->i_size, | ||
726 | xfs_get_blocks); | ||
727 | WARN_ON(error); | ||
708 | } | 728 | } |
709 | 729 | ||
710 | STATIC int | 730 | STATIC int |
diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 3ca39c4e5d2a..e5143323e71f 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h | |||
@@ -99,7 +99,6 @@ | |||
99 | /* | 99 | /* |
100 | * Feature macros (disable/enable) | 100 | * Feature macros (disable/enable) |
101 | */ | 101 | */ |
102 | #undef HAVE_REFCACHE /* reference cache not needed for NFS in 2.6 */ | ||
103 | #define HAVE_SPLICE /* a splice(2) exists in 2.6, but not in 2.4 */ | 102 | #define HAVE_SPLICE /* a splice(2) exists in 2.6, but not in 2.4 */ |
104 | #ifdef CONFIG_SMP | 103 | #ifdef CONFIG_SMP |
105 | #define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ | 104 | #define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 166353388490..1ebd8004469c 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include "xfs_vnodeops.h" | 51 | #include "xfs_vnodeops.h" |
52 | 52 | ||
53 | #include <linux/capability.h> | 53 | #include <linux/capability.h> |
54 | #include <linux/mount.h> | ||
54 | #include <linux/writeback.h> | 55 | #include <linux/writeback.h> |
55 | 56 | ||
56 | 57 | ||
@@ -176,7 +177,6 @@ xfs_read( | |||
176 | { | 177 | { |
177 | struct file *file = iocb->ki_filp; | 178 | struct file *file = iocb->ki_filp; |
178 | struct inode *inode = file->f_mapping->host; | 179 | struct inode *inode = file->f_mapping->host; |
179 | bhv_vnode_t *vp = XFS_ITOV(ip); | ||
180 | xfs_mount_t *mp = ip->i_mount; | 180 | xfs_mount_t *mp = ip->i_mount; |
181 | size_t size = 0; | 181 | size_t size = 0; |
182 | ssize_t ret = 0; | 182 | ssize_t ret = 0; |
@@ -228,11 +228,11 @@ xfs_read( | |||
228 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | 228 | xfs_ilock(ip, XFS_IOLOCK_SHARED); |
229 | 229 | ||
230 | if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { | 230 | if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { |
231 | bhv_vrwlock_t locktype = VRWLOCK_READ; | ||
232 | int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); | 231 | int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); |
232 | int iolock = XFS_IOLOCK_SHARED; | ||
233 | 233 | ||
234 | ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, vp, *offset, size, | 234 | ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *offset, size, |
235 | dmflags, &locktype); | 235 | dmflags, &iolock); |
236 | if (ret) { | 236 | if (ret) { |
237 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 237 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
238 | if (unlikely(ioflags & IO_ISDIRECT)) | 238 | if (unlikely(ioflags & IO_ISDIRECT)) |
@@ -242,7 +242,7 @@ xfs_read( | |||
242 | } | 242 | } |
243 | 243 | ||
244 | if (unlikely(ioflags & IO_ISDIRECT)) { | 244 | if (unlikely(ioflags & IO_ISDIRECT)) { |
245 | if (VN_CACHED(vp)) | 245 | if (inode->i_mapping->nrpages) |
246 | ret = xfs_flushinval_pages(ip, (*offset & PAGE_CACHE_MASK), | 246 | ret = xfs_flushinval_pages(ip, (*offset & PAGE_CACHE_MASK), |
247 | -1, FI_REMAPF_LOCKED); | 247 | -1, FI_REMAPF_LOCKED); |
248 | mutex_unlock(&inode->i_mutex); | 248 | mutex_unlock(&inode->i_mutex); |
@@ -276,7 +276,6 @@ xfs_splice_read( | |||
276 | int flags, | 276 | int flags, |
277 | int ioflags) | 277 | int ioflags) |
278 | { | 278 | { |
279 | bhv_vnode_t *vp = XFS_ITOV(ip); | ||
280 | xfs_mount_t *mp = ip->i_mount; | 279 | xfs_mount_t *mp = ip->i_mount; |
281 | ssize_t ret; | 280 | ssize_t ret; |
282 | 281 | ||
@@ -287,11 +286,11 @@ xfs_splice_read( | |||
287 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | 286 | xfs_ilock(ip, XFS_IOLOCK_SHARED); |
288 | 287 | ||
289 | if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { | 288 | if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { |
290 | bhv_vrwlock_t locktype = VRWLOCK_READ; | 289 | int iolock = XFS_IOLOCK_SHARED; |
291 | int error; | 290 | int error; |
292 | 291 | ||
293 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, vp, *ppos, count, | 292 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *ppos, count, |
294 | FILP_DELAY_FLAG(infilp), &locktype); | 293 | FILP_DELAY_FLAG(infilp), &iolock); |
295 | if (error) { | 294 | if (error) { |
296 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 295 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
297 | return -error; | 296 | return -error; |
@@ -317,7 +316,6 @@ xfs_splice_write( | |||
317 | int flags, | 316 | int flags, |
318 | int ioflags) | 317 | int ioflags) |
319 | { | 318 | { |
320 | bhv_vnode_t *vp = XFS_ITOV(ip); | ||
321 | xfs_mount_t *mp = ip->i_mount; | 319 | xfs_mount_t *mp = ip->i_mount; |
322 | ssize_t ret; | 320 | ssize_t ret; |
323 | struct inode *inode = outfilp->f_mapping->host; | 321 | struct inode *inode = outfilp->f_mapping->host; |
@@ -330,11 +328,11 @@ xfs_splice_write( | |||
330 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | 328 | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
331 | 329 | ||
332 | if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) { | 330 | if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) { |
333 | bhv_vrwlock_t locktype = VRWLOCK_WRITE; | 331 | int iolock = XFS_IOLOCK_EXCL; |
334 | int error; | 332 | int error; |
335 | 333 | ||
336 | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, vp, *ppos, count, | 334 | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, *ppos, count, |
337 | FILP_DELAY_FLAG(outfilp), &locktype); | 335 | FILP_DELAY_FLAG(outfilp), &iolock); |
338 | if (error) { | 336 | if (error) { |
339 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | 337 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); |
340 | return -error; | 338 | return -error; |
@@ -573,14 +571,12 @@ xfs_write( | |||
573 | struct file *file = iocb->ki_filp; | 571 | struct file *file = iocb->ki_filp; |
574 | struct address_space *mapping = file->f_mapping; | 572 | struct address_space *mapping = file->f_mapping; |
575 | struct inode *inode = mapping->host; | 573 | struct inode *inode = mapping->host; |
576 | bhv_vnode_t *vp = XFS_ITOV(xip); | ||
577 | unsigned long segs = nsegs; | 574 | unsigned long segs = nsegs; |
578 | xfs_mount_t *mp; | 575 | xfs_mount_t *mp; |
579 | ssize_t ret = 0, error = 0; | 576 | ssize_t ret = 0, error = 0; |
580 | xfs_fsize_t isize, new_size; | 577 | xfs_fsize_t isize, new_size; |
581 | int iolock; | 578 | int iolock; |
582 | int eventsent = 0; | 579 | int eventsent = 0; |
583 | bhv_vrwlock_t locktype; | ||
584 | size_t ocount = 0, count; | 580 | size_t ocount = 0, count; |
585 | loff_t pos; | 581 | loff_t pos; |
586 | int need_i_mutex; | 582 | int need_i_mutex; |
@@ -607,11 +603,9 @@ xfs_write( | |||
607 | relock: | 603 | relock: |
608 | if (ioflags & IO_ISDIRECT) { | 604 | if (ioflags & IO_ISDIRECT) { |
609 | iolock = XFS_IOLOCK_SHARED; | 605 | iolock = XFS_IOLOCK_SHARED; |
610 | locktype = VRWLOCK_WRITE_DIRECT; | ||
611 | need_i_mutex = 0; | 606 | need_i_mutex = 0; |
612 | } else { | 607 | } else { |
613 | iolock = XFS_IOLOCK_EXCL; | 608 | iolock = XFS_IOLOCK_EXCL; |
614 | locktype = VRWLOCK_WRITE; | ||
615 | need_i_mutex = 1; | 609 | need_i_mutex = 1; |
616 | mutex_lock(&inode->i_mutex); | 610 | mutex_lock(&inode->i_mutex); |
617 | } | 611 | } |
@@ -634,9 +628,8 @@ start: | |||
634 | dmflags |= DM_FLAGS_IMUX; | 628 | dmflags |= DM_FLAGS_IMUX; |
635 | 629 | ||
636 | xfs_iunlock(xip, XFS_ILOCK_EXCL); | 630 | xfs_iunlock(xip, XFS_ILOCK_EXCL); |
637 | error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, vp, | 631 | error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, xip, |
638 | pos, count, | 632 | pos, count, dmflags, &iolock); |
639 | dmflags, &locktype); | ||
640 | if (error) { | 633 | if (error) { |
641 | goto out_unlock_internal; | 634 | goto out_unlock_internal; |
642 | } | 635 | } |
@@ -664,10 +657,9 @@ start: | |||
664 | return XFS_ERROR(-EINVAL); | 657 | return XFS_ERROR(-EINVAL); |
665 | } | 658 | } |
666 | 659 | ||
667 | if (!need_i_mutex && (VN_CACHED(vp) || pos > xip->i_size)) { | 660 | if (!need_i_mutex && (mapping->nrpages || pos > xip->i_size)) { |
668 | xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); | 661 | xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); |
669 | iolock = XFS_IOLOCK_EXCL; | 662 | iolock = XFS_IOLOCK_EXCL; |
670 | locktype = VRWLOCK_WRITE; | ||
671 | need_i_mutex = 1; | 663 | need_i_mutex = 1; |
672 | mutex_lock(&inode->i_mutex); | 664 | mutex_lock(&inode->i_mutex); |
673 | xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); | 665 | xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); |
@@ -679,10 +671,16 @@ start: | |||
679 | if (new_size > xip->i_size) | 671 | if (new_size > xip->i_size) |
680 | xip->i_new_size = new_size; | 672 | xip->i_new_size = new_size; |
681 | 673 | ||
682 | if (likely(!(ioflags & IO_INVIS))) { | 674 | /* |
675 | * We're not supposed to change timestamps in readonly-mounted | ||
676 | * filesystems. Throw it away if anyone asks us. | ||
677 | */ | ||
678 | if (likely(!(ioflags & IO_INVIS) && | ||
679 | !mnt_want_write(file->f_path.mnt))) { | ||
683 | file_update_time(file); | 680 | file_update_time(file); |
684 | xfs_ichgtime_fast(xip, inode, | 681 | xfs_ichgtime_fast(xip, inode, |
685 | XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 682 | XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
683 | mnt_drop_write(file->f_path.mnt); | ||
686 | } | 684 | } |
687 | 685 | ||
688 | /* | 686 | /* |
@@ -727,7 +725,7 @@ retry: | |||
727 | current->backing_dev_info = mapping->backing_dev_info; | 725 | current->backing_dev_info = mapping->backing_dev_info; |
728 | 726 | ||
729 | if ((ioflags & IO_ISDIRECT)) { | 727 | if ((ioflags & IO_ISDIRECT)) { |
730 | if (VN_CACHED(vp)) { | 728 | if (mapping->nrpages) { |
731 | WARN_ON(need_i_mutex == 0); | 729 | WARN_ON(need_i_mutex == 0); |
732 | xfs_inval_cached_trace(xip, pos, -1, | 730 | xfs_inval_cached_trace(xip, pos, -1, |
733 | (pos & PAGE_CACHE_MASK), -1); | 731 | (pos & PAGE_CACHE_MASK), -1); |
@@ -744,7 +742,6 @@ retry: | |||
744 | mutex_unlock(&inode->i_mutex); | 742 | mutex_unlock(&inode->i_mutex); |
745 | 743 | ||
746 | iolock = XFS_IOLOCK_SHARED; | 744 | iolock = XFS_IOLOCK_SHARED; |
747 | locktype = VRWLOCK_WRITE_DIRECT; | ||
748 | need_i_mutex = 0; | 745 | need_i_mutex = 0; |
749 | } | 746 | } |
750 | 747 | ||
@@ -781,15 +778,15 @@ retry: | |||
781 | 778 | ||
782 | if (ret == -ENOSPC && | 779 | if (ret == -ENOSPC && |
783 | DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { | 780 | DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { |
784 | xfs_rwunlock(xip, locktype); | 781 | xfs_iunlock(xip, iolock); |
785 | if (need_i_mutex) | 782 | if (need_i_mutex) |
786 | mutex_unlock(&inode->i_mutex); | 783 | mutex_unlock(&inode->i_mutex); |
787 | error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp, | 784 | error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, xip, |
788 | DM_RIGHT_NULL, vp, DM_RIGHT_NULL, NULL, NULL, | 785 | DM_RIGHT_NULL, xip, DM_RIGHT_NULL, NULL, NULL, |
789 | 0, 0, 0); /* Delay flag intentionally unused */ | 786 | 0, 0, 0); /* Delay flag intentionally unused */ |
790 | if (need_i_mutex) | 787 | if (need_i_mutex) |
791 | mutex_lock(&inode->i_mutex); | 788 | mutex_lock(&inode->i_mutex); |
792 | xfs_rwlock(xip, locktype); | 789 | xfs_ilock(xip, iolock); |
793 | if (error) | 790 | if (error) |
794 | goto out_unlock_internal; | 791 | goto out_unlock_internal; |
795 | pos = xip->i_size; | 792 | pos = xip->i_size; |
@@ -817,7 +814,8 @@ retry: | |||
817 | /* Handle various SYNC-type writes */ | 814 | /* Handle various SYNC-type writes */ |
818 | if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) { | 815 | if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) { |
819 | int error2; | 816 | int error2; |
820 | xfs_rwunlock(xip, locktype); | 817 | |
818 | xfs_iunlock(xip, iolock); | ||
821 | if (need_i_mutex) | 819 | if (need_i_mutex) |
822 | mutex_unlock(&inode->i_mutex); | 820 | mutex_unlock(&inode->i_mutex); |
823 | error2 = sync_page_range(inode, mapping, pos, ret); | 821 | error2 = sync_page_range(inode, mapping, pos, ret); |
@@ -825,7 +823,7 @@ retry: | |||
825 | error = error2; | 823 | error = error2; |
826 | if (need_i_mutex) | 824 | if (need_i_mutex) |
827 | mutex_lock(&inode->i_mutex); | 825 | mutex_lock(&inode->i_mutex); |
828 | xfs_rwlock(xip, locktype); | 826 | xfs_ilock(xip, iolock); |
829 | error2 = xfs_write_sync_logforce(mp, xip); | 827 | error2 = xfs_write_sync_logforce(mp, xip); |
830 | if (!error) | 828 | if (!error) |
831 | error = error2; | 829 | error = error2; |
@@ -846,7 +844,7 @@ retry: | |||
846 | xip->i_d.di_size = xip->i_size; | 844 | xip->i_d.di_size = xip->i_size; |
847 | xfs_iunlock(xip, XFS_ILOCK_EXCL); | 845 | xfs_iunlock(xip, XFS_ILOCK_EXCL); |
848 | } | 846 | } |
849 | xfs_rwunlock(xip, locktype); | 847 | xfs_iunlock(xip, iolock); |
850 | out_unlock_mutex: | 848 | out_unlock_mutex: |
851 | if (need_i_mutex) | 849 | if (need_i_mutex) |
852 | mutex_unlock(&inode->i_mutex); | 850 | mutex_unlock(&inode->i_mutex); |
@@ -884,28 +882,23 @@ xfs_bdstrat_cb(struct xfs_buf *bp) | |||
884 | } | 882 | } |
885 | 883 | ||
886 | /* | 884 | /* |
887 | * Wrapper around bdstrat so that we can stop data | 885 | * Wrapper around bdstrat so that we can stop data from going to disk in case |
888 | * from going to disk in case we are shutting down the filesystem. | 886 | * we are shutting down the filesystem. Typically user data goes thru this |
889 | * Typically user data goes thru this path; one of the exceptions | 887 | * path; one of the exceptions is the superblock. |
890 | * is the superblock. | ||
891 | */ | 888 | */ |
892 | int | 889 | void |
893 | xfsbdstrat( | 890 | xfsbdstrat( |
894 | struct xfs_mount *mp, | 891 | struct xfs_mount *mp, |
895 | struct xfs_buf *bp) | 892 | struct xfs_buf *bp) |
896 | { | 893 | { |
897 | ASSERT(mp); | 894 | ASSERT(mp); |
898 | if (!XFS_FORCED_SHUTDOWN(mp)) { | 895 | if (!XFS_FORCED_SHUTDOWN(mp)) { |
899 | /* Grio redirection would go here | ||
900 | * if (XFS_BUF_IS_GRIO(bp)) { | ||
901 | */ | ||
902 | |||
903 | xfs_buf_iorequest(bp); | 896 | xfs_buf_iorequest(bp); |
904 | return 0; | 897 | return; |
905 | } | 898 | } |
906 | 899 | ||
907 | xfs_buftrace("XFSBDSTRAT IOERROR", bp); | 900 | xfs_buftrace("XFSBDSTRAT IOERROR", bp); |
908 | return (xfs_bioerror_relse(bp)); | 901 | xfs_bioerror_relse(bp); |
909 | } | 902 | } |
910 | 903 | ||
911 | /* | 904 | /* |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.h b/fs/xfs/linux-2.6/xfs_lrw.h index e200253139cf..e1d498b4ba7a 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.h +++ b/fs/xfs/linux-2.6/xfs_lrw.h | |||
@@ -68,7 +68,8 @@ extern void xfs_inval_cached_trace(struct xfs_inode *, | |||
68 | #define xfs_inval_cached_trace(ip, offset, len, first, last) | 68 | #define xfs_inval_cached_trace(ip, offset, len, first, last) |
69 | #endif | 69 | #endif |
70 | 70 | ||
71 | extern int xfsbdstrat(struct xfs_mount *, struct xfs_buf *); | 71 | /* errors from xfsbdstrat() must be extracted from the buffer */ |
72 | extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *); | ||
72 | extern int xfs_bdstrat_cb(struct xfs_buf *); | 73 | extern int xfs_bdstrat_cb(struct xfs_buf *); |
73 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); | 74 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); |
74 | 75 | ||
diff --git a/fs/xfs/linux-2.6/xfs_stats.h b/fs/xfs/linux-2.6/xfs_stats.h index 8ba7a2fa6c1d..afd0b0d5fdb2 100644 --- a/fs/xfs/linux-2.6/xfs_stats.h +++ b/fs/xfs/linux-2.6/xfs_stats.h | |||
@@ -144,8 +144,8 @@ extern void xfs_cleanup_procfs(void); | |||
144 | # define XFS_STATS_DEC(count) | 144 | # define XFS_STATS_DEC(count) |
145 | # define XFS_STATS_ADD(count, inc) | 145 | # define XFS_STATS_ADD(count, inc) |
146 | 146 | ||
147 | static __inline void xfs_init_procfs(void) { }; | 147 | static inline void xfs_init_procfs(void) { }; |
148 | static __inline void xfs_cleanup_procfs(void) { }; | 148 | static inline void xfs_cleanup_procfs(void) { }; |
149 | 149 | ||
150 | #endif /* !CONFIG_PROC_FS */ | 150 | #endif /* !CONFIG_PROC_FS */ |
151 | 151 | ||
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 21dfc9da235e..865eb708aa95 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -171,7 +171,7 @@ xfs_parseargs( | |||
171 | char *this_char, *value, *eov; | 171 | char *this_char, *value, *eov; |
172 | int dsunit, dswidth, vol_dsunit, vol_dswidth; | 172 | int dsunit, dswidth, vol_dsunit, vol_dswidth; |
173 | int iosize; | 173 | int iosize; |
174 | int ikeep = 0; | 174 | int dmapi_implies_ikeep = 1; |
175 | 175 | ||
176 | args->flags |= XFSMNT_BARRIER; | 176 | args->flags |= XFSMNT_BARRIER; |
177 | args->flags2 |= XFSMNT2_COMPAT_IOSIZE; | 177 | args->flags2 |= XFSMNT2_COMPAT_IOSIZE; |
@@ -302,10 +302,10 @@ xfs_parseargs( | |||
302 | } else if (!strcmp(this_char, MNTOPT_NOBARRIER)) { | 302 | } else if (!strcmp(this_char, MNTOPT_NOBARRIER)) { |
303 | args->flags &= ~XFSMNT_BARRIER; | 303 | args->flags &= ~XFSMNT_BARRIER; |
304 | } else if (!strcmp(this_char, MNTOPT_IKEEP)) { | 304 | } else if (!strcmp(this_char, MNTOPT_IKEEP)) { |
305 | ikeep = 1; | 305 | args->flags |= XFSMNT_IKEEP; |
306 | args->flags &= ~XFSMNT_IDELETE; | ||
307 | } else if (!strcmp(this_char, MNTOPT_NOIKEEP)) { | 306 | } else if (!strcmp(this_char, MNTOPT_NOIKEEP)) { |
308 | args->flags |= XFSMNT_IDELETE; | 307 | dmapi_implies_ikeep = 0; |
308 | args->flags &= ~XFSMNT_IKEEP; | ||
309 | } else if (!strcmp(this_char, MNTOPT_LARGEIO)) { | 309 | } else if (!strcmp(this_char, MNTOPT_LARGEIO)) { |
310 | args->flags2 &= ~XFSMNT2_COMPAT_IOSIZE; | 310 | args->flags2 &= ~XFSMNT2_COMPAT_IOSIZE; |
311 | } else if (!strcmp(this_char, MNTOPT_NOLARGEIO)) { | 311 | } else if (!strcmp(this_char, MNTOPT_NOLARGEIO)) { |
@@ -410,8 +410,8 @@ xfs_parseargs( | |||
410 | * Note that if "ikeep" or "noikeep" mount options are | 410 | * Note that if "ikeep" or "noikeep" mount options are |
411 | * supplied, then they are honored. | 411 | * supplied, then they are honored. |
412 | */ | 412 | */ |
413 | if (!(args->flags & XFSMNT_DMAPI) && !ikeep) | 413 | if ((args->flags & XFSMNT_DMAPI) && dmapi_implies_ikeep) |
414 | args->flags |= XFSMNT_IDELETE; | 414 | args->flags |= XFSMNT_IKEEP; |
415 | 415 | ||
416 | if ((args->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { | 416 | if ((args->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { |
417 | if (dsunit) { | 417 | if (dsunit) { |
@@ -446,6 +446,7 @@ xfs_showargs( | |||
446 | { | 446 | { |
447 | static struct proc_xfs_info xfs_info_set[] = { | 447 | static struct proc_xfs_info xfs_info_set[] = { |
448 | /* the few simple ones we can get from the mount struct */ | 448 | /* the few simple ones we can get from the mount struct */ |
449 | { XFS_MOUNT_IKEEP, "," MNTOPT_IKEEP }, | ||
449 | { XFS_MOUNT_WSYNC, "," MNTOPT_WSYNC }, | 450 | { XFS_MOUNT_WSYNC, "," MNTOPT_WSYNC }, |
450 | { XFS_MOUNT_INO64, "," MNTOPT_INO64 }, | 451 | { XFS_MOUNT_INO64, "," MNTOPT_INO64 }, |
451 | { XFS_MOUNT_NOALIGN, "," MNTOPT_NOALIGN }, | 452 | { XFS_MOUNT_NOALIGN, "," MNTOPT_NOALIGN }, |
@@ -461,7 +462,6 @@ xfs_showargs( | |||
461 | }; | 462 | }; |
462 | static struct proc_xfs_info xfs_info_unset[] = { | 463 | static struct proc_xfs_info xfs_info_unset[] = { |
463 | /* the few simple ones we can get from the mount struct */ | 464 | /* the few simple ones we can get from the mount struct */ |
464 | { XFS_MOUNT_IDELETE, "," MNTOPT_IKEEP }, | ||
465 | { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, | 465 | { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, |
466 | { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, | 466 | { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, |
467 | { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, | 467 | { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, |
@@ -896,7 +896,8 @@ xfs_fs_write_inode( | |||
896 | struct inode *inode, | 896 | struct inode *inode, |
897 | int sync) | 897 | int sync) |
898 | { | 898 | { |
899 | int error = 0, flags = FLUSH_INODE; | 899 | int error = 0; |
900 | int flags = 0; | ||
900 | 901 | ||
901 | xfs_itrace_entry(XFS_I(inode)); | 902 | xfs_itrace_entry(XFS_I(inode)); |
902 | if (sync) { | 903 | if (sync) { |
@@ -934,7 +935,7 @@ xfs_fs_clear_inode( | |||
934 | xfs_inactive(ip); | 935 | xfs_inactive(ip); |
935 | xfs_iflags_clear(ip, XFS_IMODIFIED); | 936 | xfs_iflags_clear(ip, XFS_IMODIFIED); |
936 | if (xfs_reclaim(ip)) | 937 | if (xfs_reclaim(ip)) |
937 | panic("%s: cannot reclaim 0x%p\n", __FUNCTION__, inode); | 938 | panic("%s: cannot reclaim 0x%p\n", __func__, inode); |
938 | } | 939 | } |
939 | 940 | ||
940 | ASSERT(XFS_I(inode) == NULL); | 941 | ASSERT(XFS_I(inode) == NULL); |
@@ -1027,8 +1028,7 @@ xfs_sync_worker( | |||
1027 | int error; | 1028 | int error; |
1028 | 1029 | ||
1029 | if (!(mp->m_flags & XFS_MOUNT_RDONLY)) | 1030 | if (!(mp->m_flags & XFS_MOUNT_RDONLY)) |
1030 | error = xfs_sync(mp, SYNC_FSDATA | SYNC_BDFLUSH | SYNC_ATTR | | 1031 | error = xfs_sync(mp, SYNC_FSDATA | SYNC_BDFLUSH | SYNC_ATTR); |
1031 | SYNC_REFCACHE | SYNC_SUPER); | ||
1032 | mp->m_sync_seq++; | 1032 | mp->m_sync_seq++; |
1033 | wake_up(&mp->m_wait_single_sync_task); | 1033 | wake_up(&mp->m_wait_single_sync_task); |
1034 | } | 1034 | } |
@@ -1306,7 +1306,7 @@ xfs_fs_fill_super( | |||
1306 | void *data, | 1306 | void *data, |
1307 | int silent) | 1307 | int silent) |
1308 | { | 1308 | { |
1309 | struct inode *rootvp; | 1309 | struct inode *root; |
1310 | struct xfs_mount *mp = NULL; | 1310 | struct xfs_mount *mp = NULL; |
1311 | struct xfs_mount_args *args = xfs_args_allocate(sb, silent); | 1311 | struct xfs_mount_args *args = xfs_args_allocate(sb, silent); |
1312 | int error; | 1312 | int error; |
@@ -1344,19 +1344,18 @@ xfs_fs_fill_super( | |||
1344 | sb->s_time_gran = 1; | 1344 | sb->s_time_gran = 1; |
1345 | set_posix_acl_flag(sb); | 1345 | set_posix_acl_flag(sb); |
1346 | 1346 | ||
1347 | rootvp = igrab(mp->m_rootip->i_vnode); | 1347 | root = igrab(mp->m_rootip->i_vnode); |
1348 | if (!rootvp) { | 1348 | if (!root) { |
1349 | error = ENOENT; | 1349 | error = ENOENT; |
1350 | goto fail_unmount; | 1350 | goto fail_unmount; |
1351 | } | 1351 | } |
1352 | 1352 | if (is_bad_inode(root)) { | |
1353 | sb->s_root = d_alloc_root(vn_to_inode(rootvp)); | 1353 | error = EINVAL; |
1354 | if (!sb->s_root) { | ||
1355 | error = ENOMEM; | ||
1356 | goto fail_vnrele; | 1354 | goto fail_vnrele; |
1357 | } | 1355 | } |
1358 | if (is_bad_inode(sb->s_root->d_inode)) { | 1356 | sb->s_root = d_alloc_root(root); |
1359 | error = EINVAL; | 1357 | if (!sb->s_root) { |
1358 | error = ENOMEM; | ||
1360 | goto fail_vnrele; | 1359 | goto fail_vnrele; |
1361 | } | 1360 | } |
1362 | 1361 | ||
@@ -1378,7 +1377,7 @@ fail_vnrele: | |||
1378 | dput(sb->s_root); | 1377 | dput(sb->s_root); |
1379 | sb->s_root = NULL; | 1378 | sb->s_root = NULL; |
1380 | } else { | 1379 | } else { |
1381 | VN_RELE(rootvp); | 1380 | iput(root); |
1382 | } | 1381 | } |
1383 | 1382 | ||
1384 | fail_unmount: | 1383 | fail_unmount: |
diff --git a/fs/xfs/linux-2.6/xfs_super.h b/fs/xfs/linux-2.6/xfs_super.h index 3efcf45b14ab..3efb7c6d3303 100644 --- a/fs/xfs/linux-2.6/xfs_super.h +++ b/fs/xfs/linux-2.6/xfs_super.h | |||
@@ -50,13 +50,7 @@ extern void xfs_qm_exit(void); | |||
50 | # define set_posix_acl_flag(sb) do { } while (0) | 50 | # define set_posix_acl_flag(sb) do { } while (0) |
51 | #endif | 51 | #endif |
52 | 52 | ||
53 | #ifdef CONFIG_XFS_SECURITY | 53 | #define XFS_SECURITY_STRING "security attributes, " |
54 | # define XFS_SECURITY_STRING "security attributes, " | ||
55 | # define ENOSECURITY 0 | ||
56 | #else | ||
57 | # define XFS_SECURITY_STRING | ||
58 | # define ENOSECURITY EOPNOTSUPP | ||
59 | #endif | ||
60 | 54 | ||
61 | #ifdef CONFIG_XFS_RT | 55 | #ifdef CONFIG_XFS_RT |
62 | # define XFS_REALTIME_STRING "realtime, " | 56 | # define XFS_REALTIME_STRING "realtime, " |
diff --git a/fs/xfs/linux-2.6/xfs_vfs.h b/fs/xfs/linux-2.6/xfs_vfs.h index 4da03a4e3520..7e60c7776b1c 100644 --- a/fs/xfs/linux-2.6/xfs_vfs.h +++ b/fs/xfs/linux-2.6/xfs_vfs.h | |||
@@ -49,7 +49,6 @@ typedef struct bhv_vfs_sync_work { | |||
49 | #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ | 49 | #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ |
50 | #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ | 50 | #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ |
51 | #define SYNC_IOWAIT 0x0100 /* wait for all I/O to complete */ | 51 | #define SYNC_IOWAIT 0x0100 /* wait for all I/O to complete */ |
52 | #define SYNC_SUPER 0x0200 /* flush superblock to disk */ | ||
53 | 52 | ||
54 | /* | 53 | /* |
55 | * When remounting a filesystem read-only or freezing the filesystem, | 54 | * When remounting a filesystem read-only or freezing the filesystem, |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index b5ea418693b1..8b4d63ce8694 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
@@ -23,8 +23,6 @@ struct bhv_vattr; | |||
23 | struct xfs_iomap; | 23 | struct xfs_iomap; |
24 | struct attrlist_cursor_kern; | 24 | struct attrlist_cursor_kern; |
25 | 25 | ||
26 | typedef struct dentry bhv_vname_t; | ||
27 | typedef __u64 bhv_vnumber_t; | ||
28 | typedef struct inode bhv_vnode_t; | 26 | typedef struct inode bhv_vnode_t; |
29 | 27 | ||
30 | #define VN_ISLNK(vp) S_ISLNK((vp)->i_mode) | 28 | #define VN_ISLNK(vp) S_ISLNK((vp)->i_mode) |
@@ -46,18 +44,6 @@ static inline struct inode *vn_to_inode(bhv_vnode_t *vnode) | |||
46 | } | 44 | } |
47 | 45 | ||
48 | /* | 46 | /* |
49 | * Values for the vop_rwlock/rwunlock flags parameter. | ||
50 | */ | ||
51 | typedef enum bhv_vrwlock { | ||
52 | VRWLOCK_NONE, | ||
53 | VRWLOCK_READ, | ||
54 | VRWLOCK_WRITE, | ||
55 | VRWLOCK_WRITE_DIRECT, | ||
56 | VRWLOCK_TRY_READ, | ||
57 | VRWLOCK_TRY_WRITE | ||
58 | } bhv_vrwlock_t; | ||
59 | |||
60 | /* | ||
61 | * Return values for xfs_inactive. A return value of | 47 | * Return values for xfs_inactive. A return value of |
62 | * VN_INACTIVE_NOCACHE implies that the file system behavior | 48 | * VN_INACTIVE_NOCACHE implies that the file system behavior |
63 | * has disassociated its state and bhv_desc_t from the vnode. | 49 | * has disassociated its state and bhv_desc_t from the vnode. |
@@ -73,12 +59,9 @@ typedef enum bhv_vrwlock { | |||
73 | #define IO_INVIS 0x00020 /* don't update inode timestamps */ | 59 | #define IO_INVIS 0x00020 /* don't update inode timestamps */ |
74 | 60 | ||
75 | /* | 61 | /* |
76 | * Flags for vop_iflush call | 62 | * Flags for xfs_inode_flush |
77 | */ | 63 | */ |
78 | #define FLUSH_SYNC 1 /* wait for flush to complete */ | 64 | #define FLUSH_SYNC 1 /* wait for flush to complete */ |
79 | #define FLUSH_INODE 2 /* flush the inode itself */ | ||
80 | #define FLUSH_LOG 4 /* force the last log entry for | ||
81 | * this inode out to disk */ | ||
82 | 65 | ||
83 | /* | 66 | /* |
84 | * Flush/Invalidate options for vop_toss/flush/flushinval_pages. | 67 | * Flush/Invalidate options for vop_toss/flush/flushinval_pages. |
@@ -226,13 +209,6 @@ static inline bhv_vnode_t *vn_grab(bhv_vnode_t *vp) | |||
226 | } | 209 | } |
227 | 210 | ||
228 | /* | 211 | /* |
229 | * Vname handling macros. | ||
230 | */ | ||
231 | #define VNAME(dentry) ((char *) (dentry)->d_name.name) | ||
232 | #define VNAMELEN(dentry) ((dentry)->d_name.len) | ||
233 | #define VNAME_TO_VNODE(dentry) (vn_from_inode((dentry)->d_inode)) | ||
234 | |||
235 | /* | ||
236 | * Dealing with bad inodes | 212 | * Dealing with bad inodes |
237 | */ | 213 | */ |
238 | static inline int VN_BAD(bhv_vnode_t *vp) | 214 | static inline int VN_BAD(bhv_vnode_t *vp) |
@@ -303,9 +279,9 @@ extern void xfs_itrace_hold(struct xfs_inode *, char *, int, inst_t *); | |||
303 | extern void _xfs_itrace_ref(struct xfs_inode *, char *, int, inst_t *); | 279 | extern void _xfs_itrace_ref(struct xfs_inode *, char *, int, inst_t *); |
304 | extern void xfs_itrace_rele(struct xfs_inode *, char *, int, inst_t *); | 280 | extern void xfs_itrace_rele(struct xfs_inode *, char *, int, inst_t *); |
305 | #define xfs_itrace_entry(ip) \ | 281 | #define xfs_itrace_entry(ip) \ |
306 | _xfs_itrace_entry(ip, __FUNCTION__, (inst_t *)__return_address) | 282 | _xfs_itrace_entry(ip, __func__, (inst_t *)__return_address) |
307 | #define xfs_itrace_exit(ip) \ | 283 | #define xfs_itrace_exit(ip) \ |
308 | _xfs_itrace_exit(ip, __FUNCTION__, (inst_t *)__return_address) | 284 | _xfs_itrace_exit(ip, __func__, (inst_t *)__return_address) |
309 | #define xfs_itrace_exit_tag(ip, tag) \ | 285 | #define xfs_itrace_exit_tag(ip, tag) \ |
310 | _xfs_itrace_exit(ip, tag, (inst_t *)__return_address) | 286 | _xfs_itrace_exit(ip, tag, (inst_t *)__return_address) |
311 | #define xfs_itrace_ref(ip) \ | 287 | #define xfs_itrace_ref(ip) \ |