Lines Matching refs:args
45 STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args,
49 struct xfs_da_args *args, int freemap_index);
50 STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args,
67 STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args,
449 struct xfs_da_args *args,
454 if (args->namelen != namelen)
456 if (memcmp(args->name, name, namelen) != 0)
462 if (args->attr_filter !=
470 struct xfs_da_args *args,
477 if (!args->valuelen) {
478 args->valuelen = valuelen;
485 if (args->valuelen < valuelen) {
486 args->valuelen = valuelen;
490 if (!args->value) {
491 args->value = kmem_alloc_large(valuelen, KM_NOLOCKDEP);
492 if (!args->value)
495 args->valuelen = valuelen;
498 if (args->rmtblkno)
499 return xfs_attr_rmtval_get(args);
509 memcpy(args->value, value, valuelen);
645 struct xfs_da_args *args)
647 struct xfs_inode *dp = args->dp;
651 trace_xfs_attr_sf_create(args);
665 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
670 * args: args containing attribute name and namelen
679 struct xfs_da_args *args,
690 sf = (struct xfs_attr_shortform *)args->dp->i_afp->if_u1.if_data;
696 if (!xfs_attr_match(args, sfe->namelen, sfe->nameval,
719 struct xfs_da_args *args,
729 trace_xfs_attr_sf_add(args);
731 dp = args->dp;
738 if (xfs_attr_sf_findname(args, &sfe, NULL) == -EEXIST)
742 size = xfs_attr_sf_entsize_byname(args->namelen, args->valuelen);
747 sfe->namelen = args->namelen;
748 sfe->valuelen = args->valuelen;
749 sfe->flags = args->attr_filter;
750 memcpy(sfe->nameval, args->name, args->namelen);
751 memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen);
754 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
756 xfs_sbversion_add_attr2(mp, args->trans);
782 struct xfs_da_args *args)
792 trace_xfs_attr_sf_remove(args);
794 dp = args->dp;
798 error = xfs_attr_sf_findname(args, &sfe, &base);
820 !(args->op_flags & XFS_DA_OP_ADDNAME)) {
821 xfs_attr_fork_remove(dp, args->trans);
827 (args->op_flags & XFS_DA_OP_ADDNAME) ||
830 xfs_trans_log_inode(args->trans, dp,
834 xfs_sbversion_add_attr2(mp, args->trans);
844 xfs_attr_shortform_lookup(xfs_da_args_t *args)
851 trace_xfs_attr_sf_lookup(args);
853 ifp = args->dp->i_afp;
859 if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
869 * If args->valuelen is zero, only the length needs to be returned. Unlike a
875 struct xfs_da_args *args)
881 ASSERT(args->dp->i_afp->if_flags == XFS_IFINLINE);
882 sf = (struct xfs_attr_shortform *)args->dp->i_afp->if_u1.if_data;
886 if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
888 return xfs_attr_copy_value(args,
889 &sfe->nameval[args->namelen], sfe->valuelen);
900 struct xfs_da_args *args,
913 trace_xfs_attr_sf_to_leaf(args);
915 dp = args->dp;
925 xfs_bmap_local_to_extents_empty(args->trans, dp, XFS_ATTR_FORK);
928 error = xfs_da_grow_inode(args, &blkno);
933 error = xfs_attr3_leaf_create(args, blkno, &bp);
939 nargs.geo = args->geo;
940 nargs.total = args->total;
942 nargs.trans = args->trans;
1093 struct xfs_da_args *args,
1101 struct xfs_inode *dp = args->dp;
1106 trace_xfs_attr_leaf_to_sf(args);
1108 tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1112 memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1115 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1119 memset(bp->b_addr, 0, args->geo->blksize);
1124 error = xfs_da_shrink_inode(args, 0, bp);
1131 xfs_attr_fork_remove(dp, args->trans);
1135 xfs_attr_shortform_create(args);
1141 nargs.geo = args->geo;
1143 nargs.total = args->total;
1145 nargs.trans = args->trans;
1175 struct xfs_da_args *args)
1182 struct xfs_inode *dp = args->dp;
1189 trace_xfs_attr_leaf_to_node(args);
1191 error = xfs_da_grow_inode(args, &blkno);
1194 error = xfs_attr3_leaf_read(args->trans, dp, 0, &bp1);
1198 error = xfs_da_get_buf(args->trans, dp, blkno, &bp2, XFS_ATTR_FORK);
1203 xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF);
1205 memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize);
1210 xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1);
1215 error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK);
1222 xfs_attr3_leaf_hdr_from_disk(args->geo, &icleafhdr, leaf);
1230 xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1);
1246 struct xfs_da_args *args,
1252 struct xfs_inode *dp = args->dp;
1257 trace_xfs_attr_leaf_create(args);
1259 error = xfs_da_get_buf(args->trans, args->dp, blkno, &bp,
1264 xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF);
1266 memset(leaf, 0, args->geo->blksize);
1269 ichdr.firstused = args->geo->blksize;
1287 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1288 xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1);
1306 trace_xfs_attr_leaf_split(state->args);
1312 error = xfs_da_grow_inode(state->args, &blkno);
1315 error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp);
1338 trace_xfs_attr_leaf_add_old(state->args);
1339 error = xfs_attr3_leaf_add(oldblk->bp, state->args);
1341 trace_xfs_attr_leaf_add_new(state->args);
1342 error = xfs_attr3_leaf_add(newblk->bp, state->args);
1359 struct xfs_da_args *args)
1369 trace_xfs_attr_leaf_add(args);
1372 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1373 ASSERT(args->index >= 0 && args->index <= ichdr.count);
1374 entsize = xfs_attr_leaf_newentsize(args, NULL);
1393 tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, i);
1411 xfs_attr3_leaf_compact(args, &ichdr, bp);
1422 tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0);
1425 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1426 xfs_trans_log_buf(args->trans, bp,
1439 struct xfs_da_args *args,
1450 trace_xfs_attr_leaf_add_work(args);
1454 ASSERT(args->index >= 0 && args->index <= ichdr->count);
1459 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
1460 if (args->index < ichdr->count) {
1461 tmp = ichdr->count - args->index;
1464 xfs_trans_log_buf(args->trans, bp,
1472 mp = args->trans->t_mountp;
1473 ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize);
1476 xfs_attr_leaf_newentsize(args, NULL));
1477 ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize);
1480 ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp);
1484 entry->hashval = cpu_to_be32(args->hashval);
1485 entry->flags = args->attr_filter;
1488 if (args->op_flags & XFS_DA_OP_RENAME) {
1490 if ((args->blkno2 == args->blkno) &&
1491 (args->index2 <= args->index)) {
1492 args->index2++;
1495 xfs_trans_log_buf(args->trans, bp,
1497 ASSERT((args->index == 0) ||
1499 ASSERT((args->index == ichdr->count - 1) ||
1510 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
1511 name_loc->namelen = args->namelen;
1512 name_loc->valuelen = cpu_to_be16(args->valuelen);
1513 memcpy((char *)name_loc->nameval, args->name, args->namelen);
1514 memcpy((char *)&name_loc->nameval[args->namelen], args->value,
1517 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
1518 name_rmt->namelen = args->namelen;
1519 memcpy((char *)name_rmt->name, args->name, args->namelen);
1524 args->rmtblkno = 1;
1525 args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);
1526 args->rmtvaluelen = args->valuelen;
1528 xfs_trans_log_buf(args->trans, bp,
1529 XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
1530 xfs_attr_leaf_entsize(leaf, args->index)));
1551 ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index);
1560 struct xfs_da_args *args,
1567 struct xfs_trans *trans = args->trans;
1570 trace_xfs_attr_leaf_compact(args);
1572 tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1573 memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1574 memset(bp->b_addr, 0, args->geo->blksize);
1587 ichdr_dst->firstused = args->geo->blksize;
1596 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf_dst, ichdr_dst);
1602 xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0,
1608 xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1);
1660 * This code adjusts the args->index/blkno and args->index2/blkno2 fields
1671 struct xfs_da_args *args;
1691 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr1, leaf1);
1692 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, leaf2);
1694 args = state->args;
1696 trace_xfs_attr_leaf_rebalance(args);
1748 xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp);
1753 xfs_attr3_leaf_moveents(args, leaf1, &ichdr1,
1777 xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp);
1782 xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1,
1786 xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf1, &ichdr1);
1787 xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf2, &ichdr2);
1788 xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1);
1789 xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1);
1814 args->index = args->index2 = blk2->index;
1815 args->blkno = args->blkno2 = blk2->blkno;
1818 args->index = blk1->index;
1819 args->blkno = blk1->blkno;
1820 args->index2 = 0;
1821 args->blkno2 = blk2->blkno;
1829 args->index = blk2->index;
1830 args->blkno = blk2->blkno;
1837 args->index2 = blk2->index;
1838 args->blkno2 = blk2->blkno;
1843 args->index = args->index2 = blk1->index;
1844 args->blkno = args->blkno2 = blk1->blkno;
1884 xfs_attr_leaf_newentsize(state->args, NULL);
1886 lastdelta = state->args->geo->blksize;
1896 xfs_attr_leaf_newentsize(state->args, NULL);
1932 xfs_attr_leaf_newentsize(state->args, NULL);
1971 trace_xfs_attr_leaf_toosmall(state->args);
1980 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr, leaf);
1984 if (bytes > (state->args->geo->blksize >> 1)) {
2031 error = xfs_attr3_leaf_read(state->args->trans, state->args->dp,
2036 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, bp->b_addr);
2038 bytes = state->args->geo->blksize -
2039 (state->args->geo->blksize >> 2) -
2045 xfs_trans_brelse(state->args->trans, bp);
2085 struct xfs_da_args *args)
2098 trace_xfs_attr_leaf_remove(args);
2101 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2103 ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8);
2104 ASSERT(args->index >= 0 && args->index < ichdr.count);
2108 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2111 ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2124 entsize = xfs_attr_leaf_entsize(leaf, args->index);
2126 ASSERT(ichdr.freemap[i].base < args->geo->blksize);
2127 ASSERT(ichdr.freemap[i].size < args->geo->blksize);
2182 memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize);
2184 xfs_trans_log_buf(args->trans, bp,
2185 XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
2188 tmp = (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t);
2191 xfs_trans_log_buf(args->trans, bp,
2204 tmp = args->geo->blksize;
2208 ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2218 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
2219 xfs_trans_log_buf(args->trans, bp,
2230 return tmp < args->geo->magicpct; /* leaf is < 37% full */
2248 trace_xfs_attr_leaf_unbalance(state->args);
2252 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &drophdr, drop_leaf);
2253 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &savehdr, save_leaf);
2273 xfs_attr3_leaf_moveents(state->args,
2278 xfs_attr3_leaf_moveents(state->args,
2291 tmp_leaf = kmem_zalloc(state->args->geo->blksize, 0);
2304 tmphdr.firstused = state->args->geo->blksize;
2307 xfs_attr3_leaf_hdr_to_disk(state->args->geo, tmp_leaf, &tmphdr);
2311 xfs_attr3_leaf_moveents(state->args,
2315 xfs_attr3_leaf_moveents(state->args,
2320 xfs_attr3_leaf_moveents(state->args,
2324 xfs_attr3_leaf_moveents(state->args,
2329 memcpy(save_leaf, tmp_leaf, state->args->geo->blksize);
2334 xfs_attr3_leaf_hdr_to_disk(state->args->geo, save_leaf, &savehdr);
2335 xfs_trans_log_buf(state->args->trans, save_blk->bp, 0,
2336 state->args->geo->blksize - 1);
2356 * Return in args->index the index into the entry[] array of either
2360 * Don't change the args->value unless we find the attribute.
2365 struct xfs_da_args *args)
2377 trace_xfs_attr_leaf_lookup(args);
2380 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2382 if (ichdr.count >= args->geo->blksize / 8) {
2390 hashval = args->hashval;
2424 args->index = probe;
2438 if (!xfs_attr_match(args, name_loc->namelen,
2441 args->index = probe;
2445 if (!xfs_attr_match(args, name_rmt->namelen,
2448 args->index = probe;
2449 args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2450 args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2451 args->rmtblkcnt = xfs_attr3_rmt_blocks(
2452 args->dp->i_mount,
2453 args->rmtvaluelen);
2457 args->index = probe;
2465 * If args->valuelen is zero, only the length needs to be returned. Unlike a
2472 struct xfs_da_args *args)
2481 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2482 ASSERT(ichdr.count < args->geo->blksize / 8);
2483 ASSERT(args->index < ichdr.count);
2485 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2487 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2488 ASSERT(name_loc->namelen == args->namelen);
2489 ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0);
2490 return xfs_attr_copy_value(args,
2491 &name_loc->nameval[args->namelen],
2495 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2496 ASSERT(name_rmt->namelen == args->namelen);
2497 ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0);
2498 args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2499 args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2500 args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount,
2501 args->rmtvaluelen);
2502 return xfs_attr_copy_value(args, NULL, args->rmtvaluelen);
2516 struct xfs_da_args *args,
2543 ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8);
2546 ASSERT(ichdr_d->count < args->geo->blksize / 8);
2598 <= args->geo->blksize);
2602 <= args->geo->blksize);
2623 ((char *)leaf_s + args->geo->blksize));
2638 ((char *)leaf_s + args->geo->blksize));
2708 struct xfs_da_args *args,
2713 size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen);
2714 if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) {
2721 return xfs_attr_leaf_entsize_remote(args->namelen);
2734 struct xfs_da_args *args)
2748 trace_xfs_attr_leaf_clearflag(args);
2752 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2757 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2761 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2762 ASSERT(args->index < ichdr.count);
2763 ASSERT(args->index >= 0);
2766 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2770 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2774 ASSERT(be32_to_cpu(entry->hashval) == args->hashval);
2775 ASSERT(namelen == args->namelen);
2776 ASSERT(memcmp(name, args->name, namelen) == 0);
2780 xfs_trans_log_buf(args->trans, bp,
2783 if (args->rmtblkno) {
2785 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2786 name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2787 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2788 xfs_trans_log_buf(args->trans, bp,
2800 struct xfs_da_args *args)
2811 trace_xfs_attr_leaf_setflag(args);
2816 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2822 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2823 ASSERT(args->index < ichdr.count);
2824 ASSERT(args->index >= 0);
2826 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2830 xfs_trans_log_buf(args->trans, bp,
2833 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2836 xfs_trans_log_buf(args->trans, bp,
2845 * given by args->blkno/index and set the INCOMPLETE flag on the leaf
2846 * entry given by args->blkno2/index2.
2852 struct xfs_da_args *args)
2870 trace_xfs_attr_leaf_flipflags(args);
2875 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp1);
2882 if (args->blkno2 != args->blkno) {
2883 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2,
2892 entry1 = &xfs_attr3_leaf_entryp(leaf1)[args->index];
2895 entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2];
2898 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr1, leaf1);
2899 ASSERT(args->index < ichdr1.count);
2900 ASSERT(args->index >= 0);
2902 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr2, leaf2);
2903 ASSERT(args->index2 < ichdr2.count);
2904 ASSERT(args->index2 >= 0);
2907 name_loc = xfs_attr3_leaf_name_local(leaf1, args->index);
2911 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2916 name_loc = xfs_attr3_leaf_name_local(leaf2, args->index2);
2920 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2933 xfs_trans_log_buf(args->trans, bp1,
2935 if (args->rmtblkno) {
2937 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2938 name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2939 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2940 xfs_trans_log_buf(args->trans, bp1,
2945 xfs_trans_log_buf(args->trans, bp2,
2948 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2951 xfs_trans_log_buf(args->trans, bp2,