diff options
Diffstat (limited to 'fs/xfs/xfs_attr.c')
-rw-r--r-- | fs/xfs/xfs_attr.c | 123 |
1 files changed, 19 insertions, 104 deletions
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 4ece1906bd41..e953b6cfb2a8 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include "xfs_trans_space.h" | 47 | #include "xfs_trans_space.h" |
48 | #include "xfs_rw.h" | 48 | #include "xfs_rw.h" |
49 | #include "xfs_vnodeops.h" | 49 | #include "xfs_vnodeops.h" |
50 | #include "xfs_trace.h" | ||
50 | 51 | ||
51 | /* | 52 | /* |
52 | * xfs_attr.c | 53 | * xfs_attr.c |
@@ -89,10 +90,6 @@ STATIC int xfs_attr_rmtval_remove(xfs_da_args_t *args); | |||
89 | 90 | ||
90 | #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ | 91 | #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ |
91 | 92 | ||
92 | #if defined(XFS_ATTR_TRACE) | ||
93 | ktrace_t *xfs_attr_trace_buf; | ||
94 | #endif | ||
95 | |||
96 | STATIC int | 93 | STATIC int |
97 | xfs_attr_name_to_xname( | 94 | xfs_attr_name_to_xname( |
98 | struct xfs_name *xname, | 95 | struct xfs_name *xname, |
@@ -123,9 +120,13 @@ xfs_inode_hasattr( | |||
123 | * Overall external interface routines. | 120 | * Overall external interface routines. |
124 | *========================================================================*/ | 121 | *========================================================================*/ |
125 | 122 | ||
126 | int | 123 | STATIC int |
127 | xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, | 124 | xfs_attr_get_int( |
128 | char *value, int *valuelenp, int flags) | 125 | struct xfs_inode *ip, |
126 | struct xfs_name *name, | ||
127 | char *value, | ||
128 | int *valuelenp, | ||
129 | int flags) | ||
129 | { | 130 | { |
130 | xfs_da_args_t args; | 131 | xfs_da_args_t args; |
131 | int error; | 132 | int error; |
@@ -188,7 +189,7 @@ xfs_attr_get( | |||
188 | return error; | 189 | return error; |
189 | 190 | ||
190 | xfs_ilock(ip, XFS_ILOCK_SHARED); | 191 | xfs_ilock(ip, XFS_ILOCK_SHARED); |
191 | error = xfs_attr_fetch(ip, &xname, value, valuelenp, flags); | 192 | error = xfs_attr_get_int(ip, &xname, value, valuelenp, flags); |
192 | xfs_iunlock(ip, XFS_ILOCK_SHARED); | 193 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
193 | return(error); | 194 | return(error); |
194 | } | 195 | } |
@@ -636,7 +637,6 @@ xfs_attr_list_int(xfs_attr_list_context_t *context) | |||
636 | return EIO; | 637 | return EIO; |
637 | 638 | ||
638 | xfs_ilock(dp, XFS_ILOCK_SHARED); | 639 | xfs_ilock(dp, XFS_ILOCK_SHARED); |
639 | xfs_attr_trace_l_c("syscall start", context); | ||
640 | 640 | ||
641 | /* | 641 | /* |
642 | * Decide on what work routines to call based on the inode size. | 642 | * Decide on what work routines to call based on the inode size. |
@@ -652,7 +652,6 @@ xfs_attr_list_int(xfs_attr_list_context_t *context) | |||
652 | } | 652 | } |
653 | 653 | ||
654 | xfs_iunlock(dp, XFS_ILOCK_SHARED); | 654 | xfs_iunlock(dp, XFS_ILOCK_SHARED); |
655 | xfs_attr_trace_l_c("syscall end", context); | ||
656 | 655 | ||
657 | return error; | 656 | return error; |
658 | } | 657 | } |
@@ -698,7 +697,7 @@ xfs_attr_put_listent(xfs_attr_list_context_t *context, int flags, | |||
698 | context->count * sizeof(alist->al_offset[0]); | 697 | context->count * sizeof(alist->al_offset[0]); |
699 | context->firstu -= ATTR_ENTSIZE(namelen); | 698 | context->firstu -= ATTR_ENTSIZE(namelen); |
700 | if (context->firstu < arraytop) { | 699 | if (context->firstu < arraytop) { |
701 | xfs_attr_trace_l_c("buffer full", context); | 700 | trace_xfs_attr_list_full(context); |
702 | alist->al_more = 1; | 701 | alist->al_more = 1; |
703 | context->seen_enough = 1; | 702 | context->seen_enough = 1; |
704 | return 1; | 703 | return 1; |
@@ -710,7 +709,7 @@ xfs_attr_put_listent(xfs_attr_list_context_t *context, int flags, | |||
710 | aep->a_name[namelen] = 0; | 709 | aep->a_name[namelen] = 0; |
711 | alist->al_offset[context->count++] = context->firstu; | 710 | alist->al_offset[context->count++] = context->firstu; |
712 | alist->al_count = context->count; | 711 | alist->al_count = context->count; |
713 | xfs_attr_trace_l_c("add", context); | 712 | trace_xfs_attr_list_add(context); |
714 | return 0; | 713 | return 0; |
715 | } | 714 | } |
716 | 715 | ||
@@ -1849,7 +1848,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) | |||
1849 | node = bp->data; | 1848 | node = bp->data; |
1850 | switch (be16_to_cpu(node->hdr.info.magic)) { | 1849 | switch (be16_to_cpu(node->hdr.info.magic)) { |
1851 | case XFS_DA_NODE_MAGIC: | 1850 | case XFS_DA_NODE_MAGIC: |
1852 | xfs_attr_trace_l_cn("wrong blk", context, node); | 1851 | trace_xfs_attr_list_wrong_blk(context); |
1853 | xfs_da_brelse(NULL, bp); | 1852 | xfs_da_brelse(NULL, bp); |
1854 | bp = NULL; | 1853 | bp = NULL; |
1855 | break; | 1854 | break; |
@@ -1857,20 +1856,18 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) | |||
1857 | leaf = bp->data; | 1856 | leaf = bp->data; |
1858 | if (cursor->hashval > be32_to_cpu(leaf->entries[ | 1857 | if (cursor->hashval > be32_to_cpu(leaf->entries[ |
1859 | be16_to_cpu(leaf->hdr.count)-1].hashval)) { | 1858 | be16_to_cpu(leaf->hdr.count)-1].hashval)) { |
1860 | xfs_attr_trace_l_cl("wrong blk", | 1859 | trace_xfs_attr_list_wrong_blk(context); |
1861 | context, leaf); | ||
1862 | xfs_da_brelse(NULL, bp); | 1860 | xfs_da_brelse(NULL, bp); |
1863 | bp = NULL; | 1861 | bp = NULL; |
1864 | } else if (cursor->hashval <= | 1862 | } else if (cursor->hashval <= |
1865 | be32_to_cpu(leaf->entries[0].hashval)) { | 1863 | be32_to_cpu(leaf->entries[0].hashval)) { |
1866 | xfs_attr_trace_l_cl("maybe wrong blk", | 1864 | trace_xfs_attr_list_wrong_blk(context); |
1867 | context, leaf); | ||
1868 | xfs_da_brelse(NULL, bp); | 1865 | xfs_da_brelse(NULL, bp); |
1869 | bp = NULL; | 1866 | bp = NULL; |
1870 | } | 1867 | } |
1871 | break; | 1868 | break; |
1872 | default: | 1869 | default: |
1873 | xfs_attr_trace_l_c("wrong blk - ??", context); | 1870 | trace_xfs_attr_list_wrong_blk(context); |
1874 | xfs_da_brelse(NULL, bp); | 1871 | xfs_da_brelse(NULL, bp); |
1875 | bp = NULL; | 1872 | bp = NULL; |
1876 | } | 1873 | } |
@@ -1915,8 +1912,8 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) | |||
1915 | if (cursor->hashval | 1912 | if (cursor->hashval |
1916 | <= be32_to_cpu(btree->hashval)) { | 1913 | <= be32_to_cpu(btree->hashval)) { |
1917 | cursor->blkno = be32_to_cpu(btree->before); | 1914 | cursor->blkno = be32_to_cpu(btree->before); |
1918 | xfs_attr_trace_l_cb("descending", | 1915 | trace_xfs_attr_list_node_descend(context, |
1919 | context, btree); | 1916 | btree); |
1920 | break; | 1917 | break; |
1921 | } | 1918 | } |
1922 | } | 1919 | } |
@@ -2143,8 +2140,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) | |||
2143 | dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), | 2140 | dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), |
2144 | blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); | 2141 | blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); |
2145 | 2142 | ||
2146 | bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, blkcnt, | 2143 | bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, |
2147 | XFS_BUF_LOCK | XBF_DONT_BLOCK); | 2144 | XFS_BUF_LOCK | XBF_DONT_BLOCK); |
2148 | ASSERT(bp); | 2145 | ASSERT(bp); |
2149 | ASSERT(!XFS_BUF_GETERROR(bp)); | 2146 | ASSERT(!XFS_BUF_GETERROR(bp)); |
2150 | 2147 | ||
@@ -2266,85 +2263,3 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) | |||
2266 | } | 2263 | } |
2267 | return(0); | 2264 | return(0); |
2268 | } | 2265 | } |
2269 | |||
2270 | #if defined(XFS_ATTR_TRACE) | ||
2271 | /* | ||
2272 | * Add a trace buffer entry for an attr_list context structure. | ||
2273 | */ | ||
2274 | void | ||
2275 | xfs_attr_trace_l_c(char *where, struct xfs_attr_list_context *context) | ||
2276 | { | ||
2277 | xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_C, where, context, | ||
2278 | (__psunsigned_t)NULL, | ||
2279 | (__psunsigned_t)NULL, | ||
2280 | (__psunsigned_t)NULL); | ||
2281 | } | ||
2282 | |||
2283 | /* | ||
2284 | * Add a trace buffer entry for a context structure and a Btree node. | ||
2285 | */ | ||
2286 | void | ||
2287 | xfs_attr_trace_l_cn(char *where, struct xfs_attr_list_context *context, | ||
2288 | struct xfs_da_intnode *node) | ||
2289 | { | ||
2290 | xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_CN, where, context, | ||
2291 | (__psunsigned_t)be16_to_cpu(node->hdr.count), | ||
2292 | (__psunsigned_t)be32_to_cpu(node->btree[0].hashval), | ||
2293 | (__psunsigned_t)be32_to_cpu(node->btree[ | ||
2294 | be16_to_cpu(node->hdr.count)-1].hashval)); | ||
2295 | } | ||
2296 | |||
2297 | /* | ||
2298 | * Add a trace buffer entry for a context structure and a Btree element. | ||
2299 | */ | ||
2300 | void | ||
2301 | xfs_attr_trace_l_cb(char *where, struct xfs_attr_list_context *context, | ||
2302 | struct xfs_da_node_entry *btree) | ||
2303 | { | ||
2304 | xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_CB, where, context, | ||
2305 | (__psunsigned_t)be32_to_cpu(btree->hashval), | ||
2306 | (__psunsigned_t)be32_to_cpu(btree->before), | ||
2307 | (__psunsigned_t)NULL); | ||
2308 | } | ||
2309 | |||
2310 | /* | ||
2311 | * Add a trace buffer entry for a context structure and a leaf block. | ||
2312 | */ | ||
2313 | void | ||
2314 | xfs_attr_trace_l_cl(char *where, struct xfs_attr_list_context *context, | ||
2315 | struct xfs_attr_leafblock *leaf) | ||
2316 | { | ||
2317 | xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_CL, where, context, | ||
2318 | (__psunsigned_t)be16_to_cpu(leaf->hdr.count), | ||
2319 | (__psunsigned_t)be32_to_cpu(leaf->entries[0].hashval), | ||
2320 | (__psunsigned_t)be32_to_cpu(leaf->entries[ | ||
2321 | be16_to_cpu(leaf->hdr.count)-1].hashval)); | ||
2322 | } | ||
2323 | |||
2324 | /* | ||
2325 | * Add a trace buffer entry for the arguments given to the routine, | ||
2326 | * generic form. | ||
2327 | */ | ||
2328 | void | ||
2329 | xfs_attr_trace_enter(int type, char *where, | ||
2330 | struct xfs_attr_list_context *context, | ||
2331 | __psunsigned_t a13, __psunsigned_t a14, | ||
2332 | __psunsigned_t a15) | ||
2333 | { | ||
2334 | ASSERT(xfs_attr_trace_buf); | ||
2335 | ktrace_enter(xfs_attr_trace_buf, (void *)((__psunsigned_t)type), | ||
2336 | (void *)((__psunsigned_t)where), | ||
2337 | (void *)((__psunsigned_t)context->dp), | ||
2338 | (void *)((__psunsigned_t)context->cursor->hashval), | ||
2339 | (void *)((__psunsigned_t)context->cursor->blkno), | ||
2340 | (void *)((__psunsigned_t)context->cursor->offset), | ||
2341 | (void *)((__psunsigned_t)context->alist), | ||
2342 | (void *)((__psunsigned_t)context->bufsize), | ||
2343 | (void *)((__psunsigned_t)context->count), | ||
2344 | (void *)((__psunsigned_t)context->firstu), | ||
2345 | NULL, | ||
2346 | (void *)((__psunsigned_t)context->dupcnt), | ||
2347 | (void *)((__psunsigned_t)context->flags), | ||
2348 | (void *)a13, (void *)a14, (void *)a15); | ||
2349 | } | ||
2350 | #endif /* XFS_ATTR_TRACE */ | ||