Lines Matching refs:args

47 STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args,
51 struct xfs_da_args *args, int freemap_index);
52 STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args,
69 STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args,
472 * XFS_DA_OP_RECOVERY will be set in args->op_flags.
476 struct xfs_da_args *args,
482 if (args->namelen != namelen)
484 if (memcmp(args->name, name, namelen) != 0)
488 if ((args->op_flags & XFS_DA_OP_RECOVERY) &&
489 args->attr_filter == (flags & XFS_ATTR_NSP_ONDISK_MASK))
493 if (args->attr_filter !=
501 struct xfs_da_args *args,
508 if (!args->valuelen) {
509 args->valuelen = valuelen;
516 if (args->valuelen < valuelen) {
517 args->valuelen = valuelen;
521 if (!args->value) {
522 args->value = kvmalloc(valuelen, GFP_KERNEL | __GFP_NOLOCKDEP);
523 if (!args->value)
526 args->valuelen = valuelen;
529 if (args->rmtblkno)
530 return xfs_attr_rmtval_get(args);
540 memcpy(args->value, value, valuelen);
682 struct xfs_da_args *args)
684 struct xfs_inode *dp = args->dp;
688 trace_xfs_attr_sf_create(args);
697 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
702 * args: args containing attribute name and namelen
711 struct xfs_da_args *args,
722 sf = (struct xfs_attr_shortform *)args->dp->i_af.if_u1.if_data;
728 if (!xfs_attr_match(args, sfe->namelen, sfe->nameval,
751 struct xfs_da_args *args,
761 trace_xfs_attr_sf_add(args);
763 dp = args->dp;
770 if (xfs_attr_sf_findname(args, &sfe, NULL) == -EEXIST)
774 size = xfs_attr_sf_entsize_byname(args->namelen, args->valuelen);
779 sfe->namelen = args->namelen;
780 sfe->valuelen = args->valuelen;
781 sfe->flags = args->attr_filter;
782 memcpy(sfe->nameval, args->name, args->namelen);
783 memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen);
786 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
788 xfs_sbversion_add_attr2(mp, args->trans);
812 struct xfs_da_args *args)
822 trace_xfs_attr_sf_remove(args);
824 dp = args->dp;
828 error = xfs_attr_sf_findname(args, &sfe, &base);
835 if (error == -ENOATTR && (args->op_flags & XFS_DA_OP_RECOVERY))
857 !(args->op_flags & (XFS_DA_OP_ADDNAME | XFS_DA_OP_REPLACE))) {
858 xfs_attr_fork_remove(dp, args->trans);
864 (args->op_flags & XFS_DA_OP_ADDNAME) ||
867 xfs_trans_log_inode(args->trans, dp,
871 xfs_sbversion_add_attr2(mp, args->trans);
881 xfs_attr_shortform_lookup(xfs_da_args_t *args)
888 trace_xfs_attr_sf_lookup(args);
890 ifp = &args->dp->i_af;
896 if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
906 * If args->valuelen is zero, only the length needs to be returned. Unlike a
912 struct xfs_da_args *args)
918 ASSERT(args->dp->i_af.if_format == XFS_DINODE_FMT_LOCAL);
919 sf = (struct xfs_attr_shortform *)args->dp->i_af.if_u1.if_data;
923 if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
925 return xfs_attr_copy_value(args,
926 &sfe->nameval[args->namelen], sfe->valuelen);
934 struct xfs_da_args *args)
946 trace_xfs_attr_sf_to_leaf(args);
948 dp = args->dp;
958 xfs_bmap_local_to_extents_empty(args->trans, dp, XFS_ATTR_FORK);
961 error = xfs_da_grow_inode(args, &blkno);
966 error = xfs_attr3_leaf_create(args, blkno, &bp);
972 nargs.geo = args->geo;
973 nargs.total = args->total;
975 nargs.trans = args->trans;
1125 struct xfs_da_args *args,
1133 struct xfs_inode *dp = args->dp;
1138 trace_xfs_attr_leaf_to_sf(args);
1140 tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1144 memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1147 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1151 memset(bp->b_addr, 0, args->geo->blksize);
1156 error = xfs_da_shrink_inode(args, 0, bp);
1167 if (!(args->op_flags & XFS_DA_OP_REPLACE)) {
1170 xfs_attr_fork_remove(dp, args->trans);
1175 xfs_attr_shortform_create(args);
1181 nargs.geo = args->geo;
1183 nargs.total = args->total;
1185 nargs.trans = args->trans;
1215 struct xfs_da_args *args)
1222 struct xfs_inode *dp = args->dp;
1229 trace_xfs_attr_leaf_to_node(args);
1236 error = xfs_da_grow_inode(args, &blkno);
1239 error = xfs_attr3_leaf_read(args->trans, dp, 0, &bp1);
1243 error = xfs_da_get_buf(args->trans, dp, blkno, &bp2, XFS_ATTR_FORK);
1248 xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF);
1250 memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize);
1255 xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1);
1260 error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK);
1267 xfs_attr3_leaf_hdr_from_disk(args->geo, &icleafhdr, leaf);
1275 xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1);
1291 struct xfs_da_args *args,
1297 struct xfs_inode *dp = args->dp;
1302 trace_xfs_attr_leaf_create(args);
1304 error = xfs_da_get_buf(args->trans, args->dp, blkno, &bp,
1309 xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF);
1311 memset(leaf, 0, args->geo->blksize);
1314 ichdr.firstused = args->geo->blksize;
1332 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1333 xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1);
1351 trace_xfs_attr_leaf_split(state->args);
1357 error = xfs_da_grow_inode(state->args, &blkno);
1360 error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp);
1383 trace_xfs_attr_leaf_add_old(state->args);
1384 error = xfs_attr3_leaf_add(oldblk->bp, state->args);
1386 trace_xfs_attr_leaf_add_new(state->args);
1387 error = xfs_attr3_leaf_add(newblk->bp, state->args);
1404 struct xfs_da_args *args)
1414 trace_xfs_attr_leaf_add(args);
1417 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1418 ASSERT(args->index >= 0 && args->index <= ichdr.count);
1419 entsize = xfs_attr_leaf_newentsize(args, NULL);
1438 tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, i);
1456 xfs_attr3_leaf_compact(args, &ichdr, bp);
1467 tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0);
1470 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1471 xfs_trans_log_buf(args->trans, bp,
1484 struct xfs_da_args *args,
1495 trace_xfs_attr_leaf_add_work(args);
1499 ASSERT(args->index >= 0 && args->index <= ichdr->count);
1504 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
1505 if (args->index < ichdr->count) {
1506 tmp = ichdr->count - args->index;
1509 xfs_trans_log_buf(args->trans, bp,
1517 mp = args->trans->t_mountp;
1518 ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize);
1521 xfs_attr_leaf_newentsize(args, NULL));
1522 ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize);
1525 ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp);
1529 entry->hashval = cpu_to_be32(args->hashval);
1530 entry->flags = args->attr_filter;
1533 if (args->op_flags & XFS_DA_OP_REPLACE) {
1534 if (!(args->op_flags & XFS_DA_OP_LOGGED))
1536 if ((args->blkno2 == args->blkno) &&
1537 (args->index2 <= args->index)) {
1538 args->index2++;
1541 xfs_trans_log_buf(args->trans, bp,
1543 ASSERT((args->index == 0) ||
1545 ASSERT((args->index == ichdr->count - 1) ||
1556 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
1557 name_loc->namelen = args->namelen;
1558 name_loc->valuelen = cpu_to_be16(args->valuelen);
1559 memcpy((char *)name_loc->nameval, args->name, args->namelen);
1560 memcpy((char *)&name_loc->nameval[args->namelen], args->value,
1563 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
1564 name_rmt->namelen = args->namelen;
1565 memcpy((char *)name_rmt->name, args->name, args->namelen);
1570 args->rmtblkno = 1;
1571 args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);
1572 args->rmtvaluelen = args->valuelen;
1574 xfs_trans_log_buf(args->trans, bp,
1575 XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
1576 xfs_attr_leaf_entsize(leaf, args->index)));
1597 ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index);
1606 struct xfs_da_args *args,
1613 struct xfs_trans *trans = args->trans;
1616 trace_xfs_attr_leaf_compact(args);
1618 tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1619 memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1620 memset(bp->b_addr, 0, args->geo->blksize);
1633 ichdr_dst->firstused = args->geo->blksize;
1642 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf_dst, ichdr_dst);
1648 xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0,
1654 xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1);
1706 * This code adjusts the args->index/blkno and args->index2/blkno2 fields
1717 struct xfs_da_args *args;
1737 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr1, leaf1);
1738 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, leaf2);
1740 args = state->args;
1742 trace_xfs_attr_leaf_rebalance(args);
1794 xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp);
1799 xfs_attr3_leaf_moveents(args, leaf1, &ichdr1,
1823 xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp);
1828 xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1,
1832 xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf1, &ichdr1);
1833 xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf2, &ichdr2);
1834 xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1);
1835 xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1);
1860 args->index = args->index2 = blk2->index;
1861 args->blkno = args->blkno2 = blk2->blkno;
1864 args->index = blk1->index;
1865 args->blkno = blk1->blkno;
1866 args->index2 = 0;
1867 args->blkno2 = blk2->blkno;
1875 args->index = blk2->index;
1876 args->blkno = blk2->blkno;
1883 args->index2 = blk2->index;
1884 args->blkno2 = blk2->blkno;
1889 args->index = args->index2 = blk1->index;
1890 args->blkno = args->blkno2 = blk1->blkno;
1930 xfs_attr_leaf_newentsize(state->args, NULL);
1932 lastdelta = state->args->geo->blksize;
1942 xfs_attr_leaf_newentsize(state->args, NULL);
1978 xfs_attr_leaf_newentsize(state->args, NULL);
2017 trace_xfs_attr_leaf_toosmall(state->args);
2026 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr, leaf);
2030 if (bytes > (state->args->geo->blksize >> 1)) {
2077 error = xfs_attr3_leaf_read(state->args->trans, state->args->dp,
2082 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, bp->b_addr);
2084 bytes = state->args->geo->blksize -
2085 (state->args->geo->blksize >> 2) -
2091 xfs_trans_brelse(state->args->trans, bp);
2131 struct xfs_da_args *args)
2144 trace_xfs_attr_leaf_remove(args);
2147 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2149 ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8);
2150 ASSERT(args->index >= 0 && args->index < ichdr.count);
2154 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2157 ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2170 entsize = xfs_attr_leaf_entsize(leaf, args->index);
2172 ASSERT(ichdr.freemap[i].base < args->geo->blksize);
2173 ASSERT(ichdr.freemap[i].size < args->geo->blksize);
2228 memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize);
2230 xfs_trans_log_buf(args->trans, bp,
2231 XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
2234 tmp = (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t);
2237 xfs_trans_log_buf(args->trans, bp,
2250 tmp = args->geo->blksize;
2254 ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2264 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
2265 xfs_trans_log_buf(args->trans, bp,
2276 return tmp < args->geo->magicpct; /* leaf is < 37% full */
2294 trace_xfs_attr_leaf_unbalance(state->args);
2296 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &drophdr, drop_leaf);
2297 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &savehdr, save_leaf);
2317 xfs_attr3_leaf_moveents(state->args,
2322 xfs_attr3_leaf_moveents(state->args,
2335 tmp_leaf = kmem_zalloc(state->args->geo->blksize, 0);
2348 tmphdr.firstused = state->args->geo->blksize;
2351 xfs_attr3_leaf_hdr_to_disk(state->args->geo, tmp_leaf, &tmphdr);
2355 xfs_attr3_leaf_moveents(state->args,
2359 xfs_attr3_leaf_moveents(state->args,
2364 xfs_attr3_leaf_moveents(state->args,
2368 xfs_attr3_leaf_moveents(state->args,
2373 memcpy(save_leaf, tmp_leaf, state->args->geo->blksize);
2378 xfs_attr3_leaf_hdr_to_disk(state->args->geo, save_leaf, &savehdr);
2379 xfs_trans_log_buf(state->args->trans, save_blk->bp, 0,
2380 state->args->geo->blksize - 1);
2400 * Return in args->index the index into the entry[] array of either
2404 * Don't change the args->value unless we find the attribute.
2409 struct xfs_da_args *args)
2421 trace_xfs_attr_leaf_lookup(args);
2424 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2426 if (ichdr.count >= args->geo->blksize / 8) {
2434 hashval = args->hashval;
2468 args->index = probe;
2482 if (!xfs_attr_match(args, name_loc->namelen,
2485 args->index = probe;
2489 if (!xfs_attr_match(args, name_rmt->namelen,
2492 args->index = probe;
2493 args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2494 args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2495 args->rmtblkcnt = xfs_attr3_rmt_blocks(
2496 args->dp->i_mount,
2497 args->rmtvaluelen);
2501 args->index = probe;
2509 * If args->valuelen is zero, only the length needs to be returned. Unlike a
2516 struct xfs_da_args *args)
2525 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2526 ASSERT(ichdr.count < args->geo->blksize / 8);
2527 ASSERT(args->index < ichdr.count);
2529 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2531 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2532 ASSERT(name_loc->namelen == args->namelen);
2533 ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0);
2534 return xfs_attr_copy_value(args,
2535 &name_loc->nameval[args->namelen],
2539 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2540 ASSERT(name_rmt->namelen == args->namelen);
2541 ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0);
2542 args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2543 args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2544 args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount,
2545 args->rmtvaluelen);
2546 return xfs_attr_copy_value(args, NULL, args->rmtvaluelen);
2560 struct xfs_da_args *args,
2587 ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8);
2590 ASSERT(ichdr_d->count < args->geo->blksize / 8);
2642 <= args->geo->blksize);
2646 <= args->geo->blksize);
2667 ((char *)leaf_s + args->geo->blksize));
2682 ((char *)leaf_s + args->geo->blksize));
2752 struct xfs_da_args *args,
2757 size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen);
2758 if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) {
2765 return xfs_attr_leaf_entsize_remote(args->namelen);
2778 struct xfs_da_args *args)
2792 trace_xfs_attr_leaf_clearflag(args);
2796 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2801 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2805 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2806 ASSERT(args->index < ichdr.count);
2807 ASSERT(args->index >= 0);
2810 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2814 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2818 ASSERT(be32_to_cpu(entry->hashval) == args->hashval);
2819 ASSERT(namelen == args->namelen);
2820 ASSERT(memcmp(name, args->name, namelen) == 0);
2824 xfs_trans_log_buf(args->trans, bp,
2827 if (args->rmtblkno) {
2829 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2830 name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2831 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2832 xfs_trans_log_buf(args->trans, bp,
2844 struct xfs_da_args *args)
2855 trace_xfs_attr_leaf_setflag(args);
2860 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2866 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2867 ASSERT(args->index < ichdr.count);
2868 ASSERT(args->index >= 0);
2870 entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2874 xfs_trans_log_buf(args->trans, bp,
2877 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2880 xfs_trans_log_buf(args->trans, bp,
2889 * given by args->blkno/index and set the INCOMPLETE flag on the leaf
2890 * entry given by args->blkno2/index2.
2896 struct xfs_da_args *args)
2914 trace_xfs_attr_leaf_flipflags(args);
2919 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp1);
2926 if (args->blkno2 != args->blkno) {
2927 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2,
2936 entry1 = &xfs_attr3_leaf_entryp(leaf1)[args->index];
2939 entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2];
2942 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr1, leaf1);
2943 ASSERT(args->index < ichdr1.count);
2944 ASSERT(args->index >= 0);
2946 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr2, leaf2);
2947 ASSERT(args->index2 < ichdr2.count);
2948 ASSERT(args->index2 >= 0);
2951 name_loc = xfs_attr3_leaf_name_local(leaf1, args->index);
2955 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2960 name_loc = xfs_attr3_leaf_name_local(leaf2, args->index2);
2964 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2977 xfs_trans_log_buf(args->trans, bp1,
2979 if (args->rmtblkno) {
2981 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2982 name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2983 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2984 xfs_trans_log_buf(args->trans, bp1,
2989 xfs_trans_log_buf(args->trans, bp2,
2992 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2995 xfs_trans_log_buf(args->trans, bp2,