Merge tag 'for-linus-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
[linux-2.6-microblaze.git] / fs / xfs / libxfs / xfs_attr_leaf.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
4  * Copyright (c) 2013 Red Hat, Inc.
5  * All Rights Reserved.
6  */
7 #include "xfs.h"
8 #include "xfs_fs.h"
9 #include "xfs_shared.h"
10 #include "xfs_format.h"
11 #include "xfs_log_format.h"
12 #include "xfs_trans_resv.h"
13 #include "xfs_sb.h"
14 #include "xfs_mount.h"
15 #include "xfs_da_format.h"
16 #include "xfs_da_btree.h"
17 #include "xfs_inode.h"
18 #include "xfs_trans.h"
19 #include "xfs_bmap_btree.h"
20 #include "xfs_bmap.h"
21 #include "xfs_attr_sf.h"
22 #include "xfs_attr.h"
23 #include "xfs_attr_remote.h"
24 #include "xfs_attr_leaf.h"
25 #include "xfs_error.h"
26 #include "xfs_trace.h"
27 #include "xfs_buf_item.h"
28 #include "xfs_dir2.h"
29 #include "xfs_log.h"
30 #include "xfs_ag.h"
31
32
33 /*
34  * xfs_attr_leaf.c
35  *
36  * Routines to implement leaf blocks of attributes as Btrees of hashed names.
37  */
38
39 /*========================================================================
40  * Function prototypes for the kernel.
41  *========================================================================*/
42
43 /*
44  * Routines used for growing the Btree.
45  */
46 STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args,
47                                  xfs_dablk_t which_block, struct xfs_buf **bpp);
48 STATIC int xfs_attr3_leaf_add_work(struct xfs_buf *leaf_buffer,
49                                    struct xfs_attr3_icleaf_hdr *ichdr,
50                                    struct xfs_da_args *args, int freemap_index);
51 STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args,
52                                    struct xfs_attr3_icleaf_hdr *ichdr,
53                                    struct xfs_buf *leaf_buffer);
54 STATIC void xfs_attr3_leaf_rebalance(xfs_da_state_t *state,
55                                                    xfs_da_state_blk_t *blk1,
56                                                    xfs_da_state_blk_t *blk2);
57 STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state,
58                         xfs_da_state_blk_t *leaf_blk_1,
59                         struct xfs_attr3_icleaf_hdr *ichdr1,
60                         xfs_da_state_blk_t *leaf_blk_2,
61                         struct xfs_attr3_icleaf_hdr *ichdr2,
62                         int *number_entries_in_blk1,
63                         int *number_usedbytes_in_blk1);
64
65 /*
66  * Utility routines.
67  */
68 STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args,
69                         struct xfs_attr_leafblock *src_leaf,
70                         struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start,
71                         struct xfs_attr_leafblock *dst_leaf,
72                         struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start,
73                         int move_count);
74 STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index);
75
76 /*
77  * attr3 block 'firstused' conversion helpers.
78  *
79  * firstused refers to the offset of the first used byte of the nameval region
80  * of an attr leaf block. The region starts at the tail of the block and expands
81  * backwards towards the middle. As such, firstused is initialized to the block
82  * size for an empty leaf block and is reduced from there.
83  *
84  * The attr3 block size is pegged to the fsb size and the maximum fsb is 64k.
85  * The in-core firstused field is 32-bit and thus supports the maximum fsb size.
86  * The on-disk field is only 16-bit, however, and overflows at 64k. Since this
87  * only occurs at exactly 64k, we use zero as a magic on-disk value to represent
88  * the attr block size. The following helpers manage the conversion between the
89  * in-core and on-disk formats.
90  */
91
92 static void
93 xfs_attr3_leaf_firstused_from_disk(
94         struct xfs_da_geometry          *geo,
95         struct xfs_attr3_icleaf_hdr     *to,
96         struct xfs_attr_leafblock       *from)
97 {
98         struct xfs_attr3_leaf_hdr       *hdr3;
99
100         if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) {
101                 hdr3 = (struct xfs_attr3_leaf_hdr *) from;
102                 to->firstused = be16_to_cpu(hdr3->firstused);
103         } else {
104                 to->firstused = be16_to_cpu(from->hdr.firstused);
105         }
106
107         /*
108          * Convert from the magic fsb size value to actual blocksize. This
109          * should only occur for empty blocks when the block size overflows
110          * 16-bits.
111          */
112         if (to->firstused == XFS_ATTR3_LEAF_NULLOFF) {
113                 ASSERT(!to->count && !to->usedbytes);
114                 ASSERT(geo->blksize > USHRT_MAX);
115                 to->firstused = geo->blksize;
116         }
117 }
118
119 static void
120 xfs_attr3_leaf_firstused_to_disk(
121         struct xfs_da_geometry          *geo,
122         struct xfs_attr_leafblock       *to,
123         struct xfs_attr3_icleaf_hdr     *from)
124 {
125         struct xfs_attr3_leaf_hdr       *hdr3;
126         uint32_t                        firstused;
127
128         /* magic value should only be seen on disk */
129         ASSERT(from->firstused != XFS_ATTR3_LEAF_NULLOFF);
130
131         /*
132          * Scale down the 32-bit in-core firstused value to the 16-bit on-disk
133          * value. This only overflows at the max supported value of 64k. Use the
134          * magic on-disk value to represent block size in this case.
135          */
136         firstused = from->firstused;
137         if (firstused > USHRT_MAX) {
138                 ASSERT(from->firstused == geo->blksize);
139                 firstused = XFS_ATTR3_LEAF_NULLOFF;
140         }
141
142         if (from->magic == XFS_ATTR3_LEAF_MAGIC) {
143                 hdr3 = (struct xfs_attr3_leaf_hdr *) to;
144                 hdr3->firstused = cpu_to_be16(firstused);
145         } else {
146                 to->hdr.firstused = cpu_to_be16(firstused);
147         }
148 }
149
150 void
151 xfs_attr3_leaf_hdr_from_disk(
152         struct xfs_da_geometry          *geo,
153         struct xfs_attr3_icleaf_hdr     *to,
154         struct xfs_attr_leafblock       *from)
155 {
156         int     i;
157
158         ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
159                from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
160
161         if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) {
162                 struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)from;
163
164                 to->forw = be32_to_cpu(hdr3->info.hdr.forw);
165                 to->back = be32_to_cpu(hdr3->info.hdr.back);
166                 to->magic = be16_to_cpu(hdr3->info.hdr.magic);
167                 to->count = be16_to_cpu(hdr3->count);
168                 to->usedbytes = be16_to_cpu(hdr3->usedbytes);
169                 xfs_attr3_leaf_firstused_from_disk(geo, to, from);
170                 to->holes = hdr3->holes;
171
172                 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
173                         to->freemap[i].base = be16_to_cpu(hdr3->freemap[i].base);
174                         to->freemap[i].size = be16_to_cpu(hdr3->freemap[i].size);
175                 }
176                 return;
177         }
178         to->forw = be32_to_cpu(from->hdr.info.forw);
179         to->back = be32_to_cpu(from->hdr.info.back);
180         to->magic = be16_to_cpu(from->hdr.info.magic);
181         to->count = be16_to_cpu(from->hdr.count);
182         to->usedbytes = be16_to_cpu(from->hdr.usedbytes);
183         xfs_attr3_leaf_firstused_from_disk(geo, to, from);
184         to->holes = from->hdr.holes;
185
186         for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
187                 to->freemap[i].base = be16_to_cpu(from->hdr.freemap[i].base);
188                 to->freemap[i].size = be16_to_cpu(from->hdr.freemap[i].size);
189         }
190 }
191
192 void
193 xfs_attr3_leaf_hdr_to_disk(
194         struct xfs_da_geometry          *geo,
195         struct xfs_attr_leafblock       *to,
196         struct xfs_attr3_icleaf_hdr     *from)
197 {
198         int                             i;
199
200         ASSERT(from->magic == XFS_ATTR_LEAF_MAGIC ||
201                from->magic == XFS_ATTR3_LEAF_MAGIC);
202
203         if (from->magic == XFS_ATTR3_LEAF_MAGIC) {
204                 struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)to;
205
206                 hdr3->info.hdr.forw = cpu_to_be32(from->forw);
207                 hdr3->info.hdr.back = cpu_to_be32(from->back);
208                 hdr3->info.hdr.magic = cpu_to_be16(from->magic);
209                 hdr3->count = cpu_to_be16(from->count);
210                 hdr3->usedbytes = cpu_to_be16(from->usedbytes);
211                 xfs_attr3_leaf_firstused_to_disk(geo, to, from);
212                 hdr3->holes = from->holes;
213                 hdr3->pad1 = 0;
214
215                 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
216                         hdr3->freemap[i].base = cpu_to_be16(from->freemap[i].base);
217                         hdr3->freemap[i].size = cpu_to_be16(from->freemap[i].size);
218                 }
219                 return;
220         }
221         to->hdr.info.forw = cpu_to_be32(from->forw);
222         to->hdr.info.back = cpu_to_be32(from->back);
223         to->hdr.info.magic = cpu_to_be16(from->magic);
224         to->hdr.count = cpu_to_be16(from->count);
225         to->hdr.usedbytes = cpu_to_be16(from->usedbytes);
226         xfs_attr3_leaf_firstused_to_disk(geo, to, from);
227         to->hdr.holes = from->holes;
228         to->hdr.pad1 = 0;
229
230         for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
231                 to->hdr.freemap[i].base = cpu_to_be16(from->freemap[i].base);
232                 to->hdr.freemap[i].size = cpu_to_be16(from->freemap[i].size);
233         }
234 }
235
236 static xfs_failaddr_t
237 xfs_attr3_leaf_verify_entry(
238         struct xfs_mount                        *mp,
239         char                                    *buf_end,
240         struct xfs_attr_leafblock               *leaf,
241         struct xfs_attr3_icleaf_hdr             *leafhdr,
242         struct xfs_attr_leaf_entry              *ent,
243         int                                     idx,
244         __u32                                   *last_hashval)
245 {
246         struct xfs_attr_leaf_name_local         *lentry;
247         struct xfs_attr_leaf_name_remote        *rentry;
248         char                                    *name_end;
249         unsigned int                            nameidx;
250         unsigned int                            namesize;
251         __u32                                   hashval;
252
253         /* hash order check */
254         hashval = be32_to_cpu(ent->hashval);
255         if (hashval < *last_hashval)
256                 return __this_address;
257         *last_hashval = hashval;
258
259         nameidx = be16_to_cpu(ent->nameidx);
260         if (nameidx < leafhdr->firstused || nameidx >= mp->m_attr_geo->blksize)
261                 return __this_address;
262
263         /*
264          * Check the name information.  The namelen fields are u8 so we can't
265          * possibly exceed the maximum name length of 255 bytes.
266          */
267         if (ent->flags & XFS_ATTR_LOCAL) {
268                 lentry = xfs_attr3_leaf_name_local(leaf, idx);
269                 namesize = xfs_attr_leaf_entsize_local(lentry->namelen,
270                                 be16_to_cpu(lentry->valuelen));
271                 name_end = (char *)lentry + namesize;
272                 if (lentry->namelen == 0)
273                         return __this_address;
274         } else {
275                 rentry = xfs_attr3_leaf_name_remote(leaf, idx);
276                 namesize = xfs_attr_leaf_entsize_remote(rentry->namelen);
277                 name_end = (char *)rentry + namesize;
278                 if (rentry->namelen == 0)
279                         return __this_address;
280                 if (!(ent->flags & XFS_ATTR_INCOMPLETE) &&
281                     rentry->valueblk == 0)
282                         return __this_address;
283         }
284
285         if (name_end > buf_end)
286                 return __this_address;
287
288         return NULL;
289 }
290
291 static xfs_failaddr_t
292 xfs_attr3_leaf_verify(
293         struct xfs_buf                  *bp)
294 {
295         struct xfs_attr3_icleaf_hdr     ichdr;
296         struct xfs_mount                *mp = bp->b_mount;
297         struct xfs_attr_leafblock       *leaf = bp->b_addr;
298         struct xfs_attr_leaf_entry      *entries;
299         struct xfs_attr_leaf_entry      *ent;
300         char                            *buf_end;
301         uint32_t                        end;    /* must be 32bit - see below */
302         __u32                           last_hashval = 0;
303         int                             i;
304         xfs_failaddr_t                  fa;
305
306         xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf);
307
308         fa = xfs_da3_blkinfo_verify(bp, bp->b_addr);
309         if (fa)
310                 return fa;
311
312         /*
313          * firstused is the block offset of the first name info structure.
314          * Make sure it doesn't go off the block or crash into the header.
315          */
316         if (ichdr.firstused > mp->m_attr_geo->blksize)
317                 return __this_address;
318         if (ichdr.firstused < xfs_attr3_leaf_hdr_size(leaf))
319                 return __this_address;
320
321         /* Make sure the entries array doesn't crash into the name info. */
322         entries = xfs_attr3_leaf_entryp(bp->b_addr);
323         if ((char *)&entries[ichdr.count] >
324             (char *)bp->b_addr + ichdr.firstused)
325                 return __this_address;
326
327         /*
328          * NOTE: This verifier historically failed empty leaf buffers because
329          * we expect the fork to be in another format. Empty attr fork format
330          * conversions are possible during xattr set, however, and format
331          * conversion is not atomic with the xattr set that triggers it. We
332          * cannot assume leaf blocks are non-empty until that is addressed.
333         */
334         buf_end = (char *)bp->b_addr + mp->m_attr_geo->blksize;
335         for (i = 0, ent = entries; i < ichdr.count; ent++, i++) {
336                 fa = xfs_attr3_leaf_verify_entry(mp, buf_end, leaf, &ichdr,
337                                 ent, i, &last_hashval);
338                 if (fa)
339                         return fa;
340         }
341
342         /*
343          * Quickly check the freemap information.  Attribute data has to be
344          * aligned to 4-byte boundaries, and likewise for the free space.
345          *
346          * Note that for 64k block size filesystems, the freemap entries cannot
347          * overflow as they are only be16 fields. However, when checking end
348          * pointer of the freemap, we have to be careful to detect overflows and
349          * so use uint32_t for those checks.
350          */
351         for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
352                 if (ichdr.freemap[i].base > mp->m_attr_geo->blksize)
353                         return __this_address;
354                 if (ichdr.freemap[i].base & 0x3)
355                         return __this_address;
356                 if (ichdr.freemap[i].size > mp->m_attr_geo->blksize)
357                         return __this_address;
358                 if (ichdr.freemap[i].size & 0x3)
359                         return __this_address;
360
361                 /* be care of 16 bit overflows here */
362                 end = (uint32_t)ichdr.freemap[i].base + ichdr.freemap[i].size;
363                 if (end < ichdr.freemap[i].base)
364                         return __this_address;
365                 if (end > mp->m_attr_geo->blksize)
366                         return __this_address;
367         }
368
369         return NULL;
370 }
371
372 static void
373 xfs_attr3_leaf_write_verify(
374         struct xfs_buf  *bp)
375 {
376         struct xfs_mount        *mp = bp->b_mount;
377         struct xfs_buf_log_item *bip = bp->b_log_item;
378         struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr;
379         xfs_failaddr_t          fa;
380
381         fa = xfs_attr3_leaf_verify(bp);
382         if (fa) {
383                 xfs_verifier_error(bp, -EFSCORRUPTED, fa);
384                 return;
385         }
386
387         if (!xfs_sb_version_hascrc(&mp->m_sb))
388                 return;
389
390         if (bip)
391                 hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn);
392
393         xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF);
394 }
395
396 /*
397  * leaf/node format detection on trees is sketchy, so a node read can be done on
398  * leaf level blocks when detection identifies the tree as a node format tree
399  * incorrectly. In this case, we need to swap the verifier to match the correct
400  * format of the block being read.
401  */
402 static void
403 xfs_attr3_leaf_read_verify(
404         struct xfs_buf          *bp)
405 {
406         struct xfs_mount        *mp = bp->b_mount;
407         xfs_failaddr_t          fa;
408
409         if (xfs_sb_version_hascrc(&mp->m_sb) &&
410              !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF))
411                 xfs_verifier_error(bp, -EFSBADCRC, __this_address);
412         else {
413                 fa = xfs_attr3_leaf_verify(bp);
414                 if (fa)
415                         xfs_verifier_error(bp, -EFSCORRUPTED, fa);
416         }
417 }
418
419 const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = {
420         .name = "xfs_attr3_leaf",
421         .magic16 = { cpu_to_be16(XFS_ATTR_LEAF_MAGIC),
422                      cpu_to_be16(XFS_ATTR3_LEAF_MAGIC) },
423         .verify_read = xfs_attr3_leaf_read_verify,
424         .verify_write = xfs_attr3_leaf_write_verify,
425         .verify_struct = xfs_attr3_leaf_verify,
426 };
427
428 int
429 xfs_attr3_leaf_read(
430         struct xfs_trans        *tp,
431         struct xfs_inode        *dp,
432         xfs_dablk_t             bno,
433         struct xfs_buf          **bpp)
434 {
435         int                     err;
436
437         err = xfs_da_read_buf(tp, dp, bno, 0, bpp, XFS_ATTR_FORK,
438                         &xfs_attr3_leaf_buf_ops);
439         if (!err && tp && *bpp)
440                 xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_ATTR_LEAF_BUF);
441         return err;
442 }
443
444 /*========================================================================
445  * Namespace helper routines
446  *========================================================================*/
447
448 static bool
449 xfs_attr_match(
450         struct xfs_da_args      *args,
451         uint8_t                 namelen,
452         unsigned char           *name,
453         int                     flags)
454 {
455         if (args->namelen != namelen)
456                 return false;
457         if (memcmp(args->name, name, namelen) != 0)
458                 return false;
459         /*
460          * If we are looking for incomplete entries, show only those, else only
461          * show complete entries.
462          */
463         if (args->attr_filter !=
464             (flags & (XFS_ATTR_NSP_ONDISK_MASK | XFS_ATTR_INCOMPLETE)))
465                 return false;
466         return true;
467 }
468
469 static int
470 xfs_attr_copy_value(
471         struct xfs_da_args      *args,
472         unsigned char           *value,
473         int                     valuelen)
474 {
475         /*
476          * No copy if all we have to do is get the length
477          */
478         if (!args->valuelen) {
479                 args->valuelen = valuelen;
480                 return 0;
481         }
482
483         /*
484          * No copy if the length of the existing buffer is too small
485          */
486         if (args->valuelen < valuelen) {
487                 args->valuelen = valuelen;
488                 return -ERANGE;
489         }
490
491         if (!args->value) {
492                 args->value = kmem_alloc_large(valuelen, KM_NOLOCKDEP);
493                 if (!args->value)
494                         return -ENOMEM;
495         }
496         args->valuelen = valuelen;
497
498         /* remote block xattr requires IO for copy-in */
499         if (args->rmtblkno)
500                 return xfs_attr_rmtval_get(args);
501
502         /*
503          * This is to prevent a GCC warning because the remote xattr case
504          * doesn't have a value to pass in. In that case, we never reach here,
505          * but GCC can't work that out and so throws a "passing NULL to
506          * memcpy" warning.
507          */
508         if (!value)
509                 return -EINVAL;
510         memcpy(args->value, value, valuelen);
511         return 0;
512 }
513
514 /*========================================================================
515  * External routines when attribute fork size < XFS_LITINO(mp).
516  *========================================================================*/
517
518 /*
519  * Query whether the total requested number of attr fork bytes of extended
520  * attribute space will be able to fit inline.
521  *
522  * Returns zero if not, else the i_forkoff fork offset to be used in the
523  * literal area for attribute data once the new bytes have been added.
524  *
525  * i_forkoff must be 8 byte aligned, hence is stored as a >>3 value;
526  * special case for dev/uuid inodes, they have fixed size data forks.
527  */
528 int
529 xfs_attr_shortform_bytesfit(
530         struct xfs_inode        *dp,
531         int                     bytes)
532 {
533         struct xfs_mount        *mp = dp->i_mount;
534         int64_t                 dsize;
535         int                     minforkoff;
536         int                     maxforkoff;
537         int                     offset;
538
539         /*
540          * Check if the new size could fit at all first:
541          */
542         if (bytes > XFS_LITINO(mp))
543                 return 0;
544
545         /* rounded down */
546         offset = (XFS_LITINO(mp) - bytes) >> 3;
547
548         if (dp->i_df.if_format == XFS_DINODE_FMT_DEV) {
549                 minforkoff = roundup(sizeof(xfs_dev_t), 8) >> 3;
550                 return (offset >= minforkoff) ? minforkoff : 0;
551         }
552
553         /*
554          * If the requested numbers of bytes is smaller or equal to the
555          * current attribute fork size we can always proceed.
556          *
557          * Note that if_bytes in the data fork might actually be larger than
558          * the current data fork size is due to delalloc extents. In that
559          * case either the extent count will go down when they are converted
560          * to real extents, or the delalloc conversion will take care of the
561          * literal area rebalancing.
562          */
563         if (bytes <= XFS_IFORK_ASIZE(dp))
564                 return dp->i_forkoff;
565
566         /*
567          * For attr2 we can try to move the forkoff if there is space in the
568          * literal area, but for the old format we are done if there is no
569          * space in the fixed attribute fork.
570          */
571         if (!(mp->m_flags & XFS_MOUNT_ATTR2))
572                 return 0;
573
574         dsize = dp->i_df.if_bytes;
575
576         switch (dp->i_df.if_format) {
577         case XFS_DINODE_FMT_EXTENTS:
578                 /*
579                  * If there is no attr fork and the data fork is extents, 
580                  * determine if creating the default attr fork will result
581                  * in the extents form migrating to btree. If so, the
582                  * minimum offset only needs to be the space required for
583                  * the btree root.
584                  */
585                 if (!dp->i_forkoff && dp->i_df.if_bytes >
586                     xfs_default_attroffset(dp))
587                         dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS);
588                 break;
589         case XFS_DINODE_FMT_BTREE:
590                 /*
591                  * If we have a data btree then keep forkoff if we have one,
592                  * otherwise we are adding a new attr, so then we set
593                  * minforkoff to where the btree root can finish so we have
594                  * plenty of room for attrs
595                  */
596                 if (dp->i_forkoff) {
597                         if (offset < dp->i_forkoff)
598                                 return 0;
599                         return dp->i_forkoff;
600                 }
601                 dsize = XFS_BMAP_BROOT_SPACE(mp, dp->i_df.if_broot);
602                 break;
603         }
604
605         /*
606          * A data fork btree root must have space for at least
607          * MINDBTPTRS key/ptr pairs if the data fork is small or empty.
608          */
609         minforkoff = max_t(int64_t, dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS));
610         minforkoff = roundup(minforkoff, 8) >> 3;
611
612         /* attr fork btree root can have at least this many key/ptr pairs */
613         maxforkoff = XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS);
614         maxforkoff = maxforkoff >> 3;   /* rounded down */
615
616         if (offset >= maxforkoff)
617                 return maxforkoff;
618         if (offset >= minforkoff)
619                 return offset;
620         return 0;
621 }
622
623 /*
624  * Switch on the ATTR2 superblock bit (implies also FEATURES2)
625  */
626 STATIC void
627 xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp)
628 {
629         if ((mp->m_flags & XFS_MOUNT_ATTR2) &&
630             !(xfs_sb_version_hasattr2(&mp->m_sb))) {
631                 spin_lock(&mp->m_sb_lock);
632                 if (!xfs_sb_version_hasattr2(&mp->m_sb)) {
633                         xfs_sb_version_addattr2(&mp->m_sb);
634                         spin_unlock(&mp->m_sb_lock);
635                         xfs_log_sb(tp);
636                 } else
637                         spin_unlock(&mp->m_sb_lock);
638         }
639 }
640
641 /*
642  * Create the initial contents of a shortform attribute list.
643  */
644 void
645 xfs_attr_shortform_create(
646         struct xfs_da_args      *args)
647 {
648         struct xfs_inode        *dp = args->dp;
649         struct xfs_ifork        *ifp = dp->i_afp;
650         struct xfs_attr_sf_hdr  *hdr;
651
652         trace_xfs_attr_sf_create(args);
653
654         ASSERT(ifp->if_bytes == 0);
655         if (ifp->if_format == XFS_DINODE_FMT_EXTENTS)
656                 ifp->if_format = XFS_DINODE_FMT_LOCAL;
657         xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
658         hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data;
659         memset(hdr, 0, sizeof(*hdr));
660         hdr->totsize = cpu_to_be16(sizeof(*hdr));
661         xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
662 }
663
664 /*
665  * Return -EEXIST if attr is found, or -ENOATTR if not
666  * args:  args containing attribute name and namelen
667  * sfep:  If not null, pointer will be set to the last attr entry found on
668           -EEXIST.  On -ENOATTR pointer is left at the last entry in the list
669  * basep: If not null, pointer is set to the byte offset of the entry in the
670  *        list on -EEXIST.  On -ENOATTR, pointer is left at the byte offset of
671  *        the last entry in the list
672  */
673 int
674 xfs_attr_sf_findname(
675         struct xfs_da_args       *args,
676         struct xfs_attr_sf_entry **sfep,
677         unsigned int             *basep)
678 {
679         struct xfs_attr_shortform *sf;
680         struct xfs_attr_sf_entry *sfe;
681         unsigned int            base = sizeof(struct xfs_attr_sf_hdr);
682         int                     size = 0;
683         int                     end;
684         int                     i;
685
686         sf = (struct xfs_attr_shortform *)args->dp->i_afp->if_u1.if_data;
687         sfe = &sf->list[0];
688         end = sf->hdr.count;
689         for (i = 0; i < end; sfe = xfs_attr_sf_nextentry(sfe),
690                              base += size, i++) {
691                 size = xfs_attr_sf_entsize(sfe);
692                 if (!xfs_attr_match(args, sfe->namelen, sfe->nameval,
693                                     sfe->flags))
694                         continue;
695                 break;
696         }
697
698         if (sfep != NULL)
699                 *sfep = sfe;
700
701         if (basep != NULL)
702                 *basep = base;
703
704         if (i == end)
705                 return -ENOATTR;
706         return -EEXIST;
707 }
708
709 /*
710  * Add a name/value pair to the shortform attribute list.
711  * Overflow from the inode has already been checked for.
712  */
713 void
714 xfs_attr_shortform_add(
715         struct xfs_da_args              *args,
716         int                             forkoff)
717 {
718         struct xfs_attr_shortform       *sf;
719         struct xfs_attr_sf_entry        *sfe;
720         int                             offset, size;
721         struct xfs_mount                *mp;
722         struct xfs_inode                *dp;
723         struct xfs_ifork                *ifp;
724
725         trace_xfs_attr_sf_add(args);
726
727         dp = args->dp;
728         mp = dp->i_mount;
729         dp->i_forkoff = forkoff;
730
731         ifp = dp->i_afp;
732         ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
733         sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
734         if (xfs_attr_sf_findname(args, &sfe, NULL) == -EEXIST)
735                 ASSERT(0);
736
737         offset = (char *)sfe - (char *)sf;
738         size = xfs_attr_sf_entsize_byname(args->namelen, args->valuelen);
739         xfs_idata_realloc(dp, size, XFS_ATTR_FORK);
740         sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
741         sfe = (struct xfs_attr_sf_entry *)((char *)sf + offset);
742
743         sfe->namelen = args->namelen;
744         sfe->valuelen = args->valuelen;
745         sfe->flags = args->attr_filter;
746         memcpy(sfe->nameval, args->name, args->namelen);
747         memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen);
748         sf->hdr.count++;
749         be16_add_cpu(&sf->hdr.totsize, size);
750         xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
751
752         xfs_sbversion_add_attr2(mp, args->trans);
753 }
754
755 /*
756  * After the last attribute is removed revert to original inode format,
757  * making all literal area available to the data fork once more.
758  */
759 void
760 xfs_attr_fork_remove(
761         struct xfs_inode        *ip,
762         struct xfs_trans        *tp)
763 {
764         ASSERT(ip->i_afp->if_nextents == 0);
765
766         xfs_idestroy_fork(ip->i_afp);
767         kmem_cache_free(xfs_ifork_zone, ip->i_afp);
768         ip->i_afp = NULL;
769         ip->i_forkoff = 0;
770         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
771 }
772
773 /*
774  * Remove an attribute from the shortform attribute list structure.
775  */
776 int
777 xfs_attr_sf_removename(
778         struct xfs_da_args              *args)
779 {
780         struct xfs_attr_shortform       *sf;
781         struct xfs_attr_sf_entry        *sfe;
782         int                             size = 0, end, totsize;
783         unsigned int                    base;
784         struct xfs_mount                *mp;
785         struct xfs_inode                *dp;
786         int                             error;
787
788         trace_xfs_attr_sf_remove(args);
789
790         dp = args->dp;
791         mp = dp->i_mount;
792         sf = (struct xfs_attr_shortform *)dp->i_afp->if_u1.if_data;
793
794         error = xfs_attr_sf_findname(args, &sfe, &base);
795         if (error != -EEXIST)
796                 return error;
797         size = xfs_attr_sf_entsize(sfe);
798
799         /*
800          * Fix up the attribute fork data, covering the hole
801          */
802         end = base + size;
803         totsize = be16_to_cpu(sf->hdr.totsize);
804         if (end != totsize)
805                 memmove(&((char *)sf)[base], &((char *)sf)[end], totsize - end);
806         sf->hdr.count--;
807         be16_add_cpu(&sf->hdr.totsize, -size);
808
809         /*
810          * Fix up the start offset of the attribute fork
811          */
812         totsize -= size;
813         if (totsize == sizeof(xfs_attr_sf_hdr_t) &&
814             (mp->m_flags & XFS_MOUNT_ATTR2) &&
815             (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
816             !(args->op_flags & XFS_DA_OP_ADDNAME)) {
817                 xfs_attr_fork_remove(dp, args->trans);
818         } else {
819                 xfs_idata_realloc(dp, -size, XFS_ATTR_FORK);
820                 dp->i_forkoff = xfs_attr_shortform_bytesfit(dp, totsize);
821                 ASSERT(dp->i_forkoff);
822                 ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) ||
823                                 (args->op_flags & XFS_DA_OP_ADDNAME) ||
824                                 !(mp->m_flags & XFS_MOUNT_ATTR2) ||
825                                 dp->i_df.if_format == XFS_DINODE_FMT_BTREE);
826                 xfs_trans_log_inode(args->trans, dp,
827                                         XFS_ILOG_CORE | XFS_ILOG_ADATA);
828         }
829
830         xfs_sbversion_add_attr2(mp, args->trans);
831
832         return 0;
833 }
834
835 /*
836  * Look up a name in a shortform attribute list structure.
837  */
838 /*ARGSUSED*/
839 int
840 xfs_attr_shortform_lookup(xfs_da_args_t *args)
841 {
842         struct xfs_attr_shortform *sf;
843         struct xfs_attr_sf_entry *sfe;
844         int i;
845         struct xfs_ifork *ifp;
846
847         trace_xfs_attr_sf_lookup(args);
848
849         ifp = args->dp->i_afp;
850         ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
851         sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
852         sfe = &sf->list[0];
853         for (i = 0; i < sf->hdr.count;
854                                 sfe = xfs_attr_sf_nextentry(sfe), i++) {
855                 if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
856                                 sfe->flags))
857                         return -EEXIST;
858         }
859         return -ENOATTR;
860 }
861
862 /*
863  * Retrieve the attribute value and length.
864  *
865  * If args->valuelen is zero, only the length needs to be returned.  Unlike a
866  * lookup, we only return an error if the attribute does not exist or we can't
867  * retrieve the value.
868  */
869 int
870 xfs_attr_shortform_getvalue(
871         struct xfs_da_args      *args)
872 {
873         struct xfs_attr_shortform *sf;
874         struct xfs_attr_sf_entry *sfe;
875         int                     i;
876
877         ASSERT(args->dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL);
878         sf = (struct xfs_attr_shortform *)args->dp->i_afp->if_u1.if_data;
879         sfe = &sf->list[0];
880         for (i = 0; i < sf->hdr.count;
881                                 sfe = xfs_attr_sf_nextentry(sfe), i++) {
882                 if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
883                                 sfe->flags))
884                         return xfs_attr_copy_value(args,
885                                 &sfe->nameval[args->namelen], sfe->valuelen);
886         }
887         return -ENOATTR;
888 }
889
890 /*
891  * Convert from using the shortform to the leaf.  On success, return the
892  * buffer so that we can keep it locked until we're totally done with it.
893  */
894 int
895 xfs_attr_shortform_to_leaf(
896         struct xfs_da_args              *args,
897         struct xfs_buf                  **leaf_bp)
898 {
899         struct xfs_inode                *dp;
900         struct xfs_attr_shortform       *sf;
901         struct xfs_attr_sf_entry        *sfe;
902         struct xfs_da_args              nargs;
903         char                            *tmpbuffer;
904         int                             error, i, size;
905         xfs_dablk_t                     blkno;
906         struct xfs_buf                  *bp;
907         struct xfs_ifork                *ifp;
908
909         trace_xfs_attr_sf_to_leaf(args);
910
911         dp = args->dp;
912         ifp = dp->i_afp;
913         sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
914         size = be16_to_cpu(sf->hdr.totsize);
915         tmpbuffer = kmem_alloc(size, 0);
916         ASSERT(tmpbuffer != NULL);
917         memcpy(tmpbuffer, ifp->if_u1.if_data, size);
918         sf = (struct xfs_attr_shortform *)tmpbuffer;
919
920         xfs_idata_realloc(dp, -size, XFS_ATTR_FORK);
921         xfs_bmap_local_to_extents_empty(args->trans, dp, XFS_ATTR_FORK);
922
923         bp = NULL;
924         error = xfs_da_grow_inode(args, &blkno);
925         if (error)
926                 goto out;
927
928         ASSERT(blkno == 0);
929         error = xfs_attr3_leaf_create(args, blkno, &bp);
930         if (error)
931                 goto out;
932
933         memset((char *)&nargs, 0, sizeof(nargs));
934         nargs.dp = dp;
935         nargs.geo = args->geo;
936         nargs.total = args->total;
937         nargs.whichfork = XFS_ATTR_FORK;
938         nargs.trans = args->trans;
939         nargs.op_flags = XFS_DA_OP_OKNOENT;
940
941         sfe = &sf->list[0];
942         for (i = 0; i < sf->hdr.count; i++) {
943                 nargs.name = sfe->nameval;
944                 nargs.namelen = sfe->namelen;
945                 nargs.value = &sfe->nameval[nargs.namelen];
946                 nargs.valuelen = sfe->valuelen;
947                 nargs.hashval = xfs_da_hashname(sfe->nameval,
948                                                 sfe->namelen);
949                 nargs.attr_filter = sfe->flags & XFS_ATTR_NSP_ONDISK_MASK;
950                 error = xfs_attr3_leaf_lookup_int(bp, &nargs); /* set a->index */
951                 ASSERT(error == -ENOATTR);
952                 error = xfs_attr3_leaf_add(bp, &nargs);
953                 ASSERT(error != -ENOSPC);
954                 if (error)
955                         goto out;
956                 sfe = xfs_attr_sf_nextentry(sfe);
957         }
958         error = 0;
959         *leaf_bp = bp;
960 out:
961         kmem_free(tmpbuffer);
962         return error;
963 }
964
965 /*
966  * Check a leaf attribute block to see if all the entries would fit into
967  * a shortform attribute list.
968  */
969 int
970 xfs_attr_shortform_allfit(
971         struct xfs_buf          *bp,
972         struct xfs_inode        *dp)
973 {
974         struct xfs_attr_leafblock *leaf;
975         struct xfs_attr_leaf_entry *entry;
976         xfs_attr_leaf_name_local_t *name_loc;
977         struct xfs_attr3_icleaf_hdr leafhdr;
978         int                     bytes;
979         int                     i;
980         struct xfs_mount        *mp = bp->b_mount;
981
982         leaf = bp->b_addr;
983         xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &leafhdr, leaf);
984         entry = xfs_attr3_leaf_entryp(leaf);
985
986         bytes = sizeof(struct xfs_attr_sf_hdr);
987         for (i = 0; i < leafhdr.count; entry++, i++) {
988                 if (entry->flags & XFS_ATTR_INCOMPLETE)
989                         continue;               /* don't copy partial entries */
990                 if (!(entry->flags & XFS_ATTR_LOCAL))
991                         return 0;
992                 name_loc = xfs_attr3_leaf_name_local(leaf, i);
993                 if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX)
994                         return 0;
995                 if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX)
996                         return 0;
997                 bytes += xfs_attr_sf_entsize_byname(name_loc->namelen,
998                                         be16_to_cpu(name_loc->valuelen));
999         }
1000         if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) &&
1001             (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
1002             (bytes == sizeof(struct xfs_attr_sf_hdr)))
1003                 return -1;
1004         return xfs_attr_shortform_bytesfit(dp, bytes);
1005 }
1006
1007 /* Verify the consistency of an inline attribute fork. */
1008 xfs_failaddr_t
1009 xfs_attr_shortform_verify(
1010         struct xfs_inode                *ip)
1011 {
1012         struct xfs_attr_shortform       *sfp;
1013         struct xfs_attr_sf_entry        *sfep;
1014         struct xfs_attr_sf_entry        *next_sfep;
1015         char                            *endp;
1016         struct xfs_ifork                *ifp;
1017         int                             i;
1018         int64_t                         size;
1019
1020         ASSERT(ip->i_afp->if_format == XFS_DINODE_FMT_LOCAL);
1021         ifp = XFS_IFORK_PTR(ip, XFS_ATTR_FORK);
1022         sfp = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
1023         size = ifp->if_bytes;
1024
1025         /*
1026          * Give up if the attribute is way too short.
1027          */
1028         if (size < sizeof(struct xfs_attr_sf_hdr))
1029                 return __this_address;
1030
1031         endp = (char *)sfp + size;
1032
1033         /* Check all reported entries */
1034         sfep = &sfp->list[0];
1035         for (i = 0; i < sfp->hdr.count; i++) {
1036                 /*
1037                  * struct xfs_attr_sf_entry has a variable length.
1038                  * Check the fixed-offset parts of the structure are
1039                  * within the data buffer.
1040                  * xfs_attr_sf_entry is defined with a 1-byte variable
1041                  * array at the end, so we must subtract that off.
1042                  */
1043                 if (((char *)sfep + sizeof(*sfep)) >= endp)
1044                         return __this_address;
1045
1046                 /* Don't allow names with known bad length. */
1047                 if (sfep->namelen == 0)
1048                         return __this_address;
1049
1050                 /*
1051                  * Check that the variable-length part of the structure is
1052                  * within the data buffer.  The next entry starts after the
1053                  * name component, so nextentry is an acceptable test.
1054                  */
1055                 next_sfep = xfs_attr_sf_nextentry(sfep);
1056                 if ((char *)next_sfep > endp)
1057                         return __this_address;
1058
1059                 /*
1060                  * Check for unknown flags.  Short form doesn't support
1061                  * the incomplete or local bits, so we can use the namespace
1062                  * mask here.
1063                  */
1064                 if (sfep->flags & ~XFS_ATTR_NSP_ONDISK_MASK)
1065                         return __this_address;
1066
1067                 /*
1068                  * Check for invalid namespace combinations.  We only allow
1069                  * one namespace flag per xattr, so we can just count the
1070                  * bits (i.e. hweight) here.
1071                  */
1072                 if (hweight8(sfep->flags & XFS_ATTR_NSP_ONDISK_MASK) > 1)
1073                         return __this_address;
1074
1075                 sfep = next_sfep;
1076         }
1077         if ((void *)sfep != (void *)endp)
1078                 return __this_address;
1079
1080         return NULL;
1081 }
1082
1083 /*
1084  * Convert a leaf attribute list to shortform attribute list
1085  */
1086 int
1087 xfs_attr3_leaf_to_shortform(
1088         struct xfs_buf          *bp,
1089         struct xfs_da_args      *args,
1090         int                     forkoff)
1091 {
1092         struct xfs_attr_leafblock *leaf;
1093         struct xfs_attr3_icleaf_hdr ichdr;
1094         struct xfs_attr_leaf_entry *entry;
1095         struct xfs_attr_leaf_name_local *name_loc;
1096         struct xfs_da_args      nargs;
1097         struct xfs_inode        *dp = args->dp;
1098         char                    *tmpbuffer;
1099         int                     error;
1100         int                     i;
1101
1102         trace_xfs_attr_leaf_to_sf(args);
1103
1104         tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1105         if (!tmpbuffer)
1106                 return -ENOMEM;
1107
1108         memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1109
1110         leaf = (xfs_attr_leafblock_t *)tmpbuffer;
1111         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1112         entry = xfs_attr3_leaf_entryp(leaf);
1113
1114         /* XXX (dgc): buffer is about to be marked stale - why zero it? */
1115         memset(bp->b_addr, 0, args->geo->blksize);
1116
1117         /*
1118          * Clean out the prior contents of the attribute list.
1119          */
1120         error = xfs_da_shrink_inode(args, 0, bp);
1121         if (error)
1122                 goto out;
1123
1124         if (forkoff == -1) {
1125                 ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2);
1126                 ASSERT(dp->i_df.if_format != XFS_DINODE_FMT_BTREE);
1127                 xfs_attr_fork_remove(dp, args->trans);
1128                 goto out;
1129         }
1130
1131         xfs_attr_shortform_create(args);
1132
1133         /*
1134          * Copy the attributes
1135          */
1136         memset((char *)&nargs, 0, sizeof(nargs));
1137         nargs.geo = args->geo;
1138         nargs.dp = dp;
1139         nargs.total = args->total;
1140         nargs.whichfork = XFS_ATTR_FORK;
1141         nargs.trans = args->trans;
1142         nargs.op_flags = XFS_DA_OP_OKNOENT;
1143
1144         for (i = 0; i < ichdr.count; entry++, i++) {
1145                 if (entry->flags & XFS_ATTR_INCOMPLETE)
1146                         continue;       /* don't copy partial entries */
1147                 if (!entry->nameidx)
1148                         continue;
1149                 ASSERT(entry->flags & XFS_ATTR_LOCAL);
1150                 name_loc = xfs_attr3_leaf_name_local(leaf, i);
1151                 nargs.name = name_loc->nameval;
1152                 nargs.namelen = name_loc->namelen;
1153                 nargs.value = &name_loc->nameval[nargs.namelen];
1154                 nargs.valuelen = be16_to_cpu(name_loc->valuelen);
1155                 nargs.hashval = be32_to_cpu(entry->hashval);
1156                 nargs.attr_filter = entry->flags & XFS_ATTR_NSP_ONDISK_MASK;
1157                 xfs_attr_shortform_add(&nargs, forkoff);
1158         }
1159         error = 0;
1160
1161 out:
1162         kmem_free(tmpbuffer);
1163         return error;
1164 }
1165
1166 /*
1167  * Convert from using a single leaf to a root node and a leaf.
1168  */
1169 int
1170 xfs_attr3_leaf_to_node(
1171         struct xfs_da_args      *args)
1172 {
1173         struct xfs_attr_leafblock *leaf;
1174         struct xfs_attr3_icleaf_hdr icleafhdr;
1175         struct xfs_attr_leaf_entry *entries;
1176         struct xfs_da3_icnode_hdr icnodehdr;
1177         struct xfs_da_intnode   *node;
1178         struct xfs_inode        *dp = args->dp;
1179         struct xfs_mount        *mp = dp->i_mount;
1180         struct xfs_buf          *bp1 = NULL;
1181         struct xfs_buf          *bp2 = NULL;
1182         xfs_dablk_t             blkno;
1183         int                     error;
1184
1185         trace_xfs_attr_leaf_to_node(args);
1186
1187         error = xfs_da_grow_inode(args, &blkno);
1188         if (error)
1189                 goto out;
1190         error = xfs_attr3_leaf_read(args->trans, dp, 0, &bp1);
1191         if (error)
1192                 goto out;
1193
1194         error = xfs_da_get_buf(args->trans, dp, blkno, &bp2, XFS_ATTR_FORK);
1195         if (error)
1196                 goto out;
1197
1198         /* copy leaf to new buffer, update identifiers */
1199         xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF);
1200         bp2->b_ops = bp1->b_ops;
1201         memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize);
1202         if (xfs_sb_version_hascrc(&mp->m_sb)) {
1203                 struct xfs_da3_blkinfo *hdr3 = bp2->b_addr;
1204                 hdr3->blkno = cpu_to_be64(bp2->b_bn);
1205         }
1206         xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1);
1207
1208         /*
1209          * Set up the new root node.
1210          */
1211         error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK);
1212         if (error)
1213                 goto out;
1214         node = bp1->b_addr;
1215         xfs_da3_node_hdr_from_disk(mp, &icnodehdr, node);
1216
1217         leaf = bp2->b_addr;
1218         xfs_attr3_leaf_hdr_from_disk(args->geo, &icleafhdr, leaf);
1219         entries = xfs_attr3_leaf_entryp(leaf);
1220
1221         /* both on-disk, don't endian-flip twice */
1222         icnodehdr.btree[0].hashval = entries[icleafhdr.count - 1].hashval;
1223         icnodehdr.btree[0].before = cpu_to_be32(blkno);
1224         icnodehdr.count = 1;
1225         xfs_da3_node_hdr_to_disk(dp->i_mount, node, &icnodehdr);
1226         xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1);
1227         error = 0;
1228 out:
1229         return error;
1230 }
1231
1232 /*========================================================================
1233  * Routines used for growing the Btree.
1234  *========================================================================*/
1235
1236 /*
1237  * Create the initial contents of a leaf attribute list
1238  * or a leaf in a node attribute list.
1239  */
1240 STATIC int
1241 xfs_attr3_leaf_create(
1242         struct xfs_da_args      *args,
1243         xfs_dablk_t             blkno,
1244         struct xfs_buf          **bpp)
1245 {
1246         struct xfs_attr_leafblock *leaf;
1247         struct xfs_attr3_icleaf_hdr ichdr;
1248         struct xfs_inode        *dp = args->dp;
1249         struct xfs_mount        *mp = dp->i_mount;
1250         struct xfs_buf          *bp;
1251         int                     error;
1252
1253         trace_xfs_attr_leaf_create(args);
1254
1255         error = xfs_da_get_buf(args->trans, args->dp, blkno, &bp,
1256                                             XFS_ATTR_FORK);
1257         if (error)
1258                 return error;
1259         bp->b_ops = &xfs_attr3_leaf_buf_ops;
1260         xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF);
1261         leaf = bp->b_addr;
1262         memset(leaf, 0, args->geo->blksize);
1263
1264         memset(&ichdr, 0, sizeof(ichdr));
1265         ichdr.firstused = args->geo->blksize;
1266
1267         if (xfs_sb_version_hascrc(&mp->m_sb)) {
1268                 struct xfs_da3_blkinfo *hdr3 = bp->b_addr;
1269
1270                 ichdr.magic = XFS_ATTR3_LEAF_MAGIC;
1271
1272                 hdr3->blkno = cpu_to_be64(bp->b_bn);
1273                 hdr3->owner = cpu_to_be64(dp->i_ino);
1274                 uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
1275
1276                 ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr);
1277         } else {
1278                 ichdr.magic = XFS_ATTR_LEAF_MAGIC;
1279                 ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr);
1280         }
1281         ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base;
1282
1283         xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1284         xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1);
1285
1286         *bpp = bp;
1287         return 0;
1288 }
1289
1290 /*
1291  * Split the leaf node, rebalance, then add the new entry.
1292  */
1293 int
1294 xfs_attr3_leaf_split(
1295         struct xfs_da_state     *state,
1296         struct xfs_da_state_blk *oldblk,
1297         struct xfs_da_state_blk *newblk)
1298 {
1299         xfs_dablk_t blkno;
1300         int error;
1301
1302         trace_xfs_attr_leaf_split(state->args);
1303
1304         /*
1305          * Allocate space for a new leaf node.
1306          */
1307         ASSERT(oldblk->magic == XFS_ATTR_LEAF_MAGIC);
1308         error = xfs_da_grow_inode(state->args, &blkno);
1309         if (error)
1310                 return error;
1311         error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp);
1312         if (error)
1313                 return error;
1314         newblk->blkno = blkno;
1315         newblk->magic = XFS_ATTR_LEAF_MAGIC;
1316
1317         /*
1318          * Rebalance the entries across the two leaves.
1319          * NOTE: rebalance() currently depends on the 2nd block being empty.
1320          */
1321         xfs_attr3_leaf_rebalance(state, oldblk, newblk);
1322         error = xfs_da3_blk_link(state, oldblk, newblk);
1323         if (error)
1324                 return error;
1325
1326         /*
1327          * Save info on "old" attribute for "atomic rename" ops, leaf_add()
1328          * modifies the index/blkno/rmtblk/rmtblkcnt fields to show the
1329          * "new" attrs info.  Will need the "old" info to remove it later.
1330          *
1331          * Insert the "new" entry in the correct block.
1332          */
1333         if (state->inleaf) {
1334                 trace_xfs_attr_leaf_add_old(state->args);
1335                 error = xfs_attr3_leaf_add(oldblk->bp, state->args);
1336         } else {
1337                 trace_xfs_attr_leaf_add_new(state->args);
1338                 error = xfs_attr3_leaf_add(newblk->bp, state->args);
1339         }
1340
1341         /*
1342          * Update last hashval in each block since we added the name.
1343          */
1344         oldblk->hashval = xfs_attr_leaf_lasthash(oldblk->bp, NULL);
1345         newblk->hashval = xfs_attr_leaf_lasthash(newblk->bp, NULL);
1346         return error;
1347 }
1348
1349 /*
1350  * Add a name to the leaf attribute list structure.
1351  */
1352 int
1353 xfs_attr3_leaf_add(
1354         struct xfs_buf          *bp,
1355         struct xfs_da_args      *args)
1356 {
1357         struct xfs_attr_leafblock *leaf;
1358         struct xfs_attr3_icleaf_hdr ichdr;
1359         int                     tablesize;
1360         int                     entsize;
1361         int                     sum;
1362         int                     tmp;
1363         int                     i;
1364
1365         trace_xfs_attr_leaf_add(args);
1366
1367         leaf = bp->b_addr;
1368         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
1369         ASSERT(args->index >= 0 && args->index <= ichdr.count);
1370         entsize = xfs_attr_leaf_newentsize(args, NULL);
1371
1372         /*
1373          * Search through freemap for first-fit on new name length.
1374          * (may need to figure in size of entry struct too)
1375          */
1376         tablesize = (ichdr.count + 1) * sizeof(xfs_attr_leaf_entry_t)
1377                                         + xfs_attr3_leaf_hdr_size(leaf);
1378         for (sum = 0, i = XFS_ATTR_LEAF_MAPSIZE - 1; i >= 0; i--) {
1379                 if (tablesize > ichdr.firstused) {
1380                         sum += ichdr.freemap[i].size;
1381                         continue;
1382                 }
1383                 if (!ichdr.freemap[i].size)
1384                         continue;       /* no space in this map */
1385                 tmp = entsize;
1386                 if (ichdr.freemap[i].base < ichdr.firstused)
1387                         tmp += sizeof(xfs_attr_leaf_entry_t);
1388                 if (ichdr.freemap[i].size >= tmp) {
1389                         tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, i);
1390                         goto out_log_hdr;
1391                 }
1392                 sum += ichdr.freemap[i].size;
1393         }
1394
1395         /*
1396          * If there are no holes in the address space of the block,
1397          * and we don't have enough freespace, then compaction will do us
1398          * no good and we should just give up.
1399          */
1400         if (!ichdr.holes && sum < entsize)
1401                 return -ENOSPC;
1402
1403         /*
1404          * Compact the entries to coalesce free space.
1405          * This may change the hdr->count via dropping INCOMPLETE entries.
1406          */
1407         xfs_attr3_leaf_compact(args, &ichdr, bp);
1408
1409         /*
1410          * After compaction, the block is guaranteed to have only one
1411          * free region, in freemap[0].  If it is not big enough, give up.
1412          */
1413         if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) {
1414                 tmp = -ENOSPC;
1415                 goto out_log_hdr;
1416         }
1417
1418         tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0);
1419
1420 out_log_hdr:
1421         xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
1422         xfs_trans_log_buf(args->trans, bp,
1423                 XFS_DA_LOGRANGE(leaf, &leaf->hdr,
1424                                 xfs_attr3_leaf_hdr_size(leaf)));
1425         return tmp;
1426 }
1427
1428 /*
1429  * Add a name to a leaf attribute list structure.
1430  */
1431 STATIC int
1432 xfs_attr3_leaf_add_work(
1433         struct xfs_buf          *bp,
1434         struct xfs_attr3_icleaf_hdr *ichdr,
1435         struct xfs_da_args      *args,
1436         int                     mapindex)
1437 {
1438         struct xfs_attr_leafblock *leaf;
1439         struct xfs_attr_leaf_entry *entry;
1440         struct xfs_attr_leaf_name_local *name_loc;
1441         struct xfs_attr_leaf_name_remote *name_rmt;
1442         struct xfs_mount        *mp;
1443         int                     tmp;
1444         int                     i;
1445
1446         trace_xfs_attr_leaf_add_work(args);
1447
1448         leaf = bp->b_addr;
1449         ASSERT(mapindex >= 0 && mapindex < XFS_ATTR_LEAF_MAPSIZE);
1450         ASSERT(args->index >= 0 && args->index <= ichdr->count);
1451
1452         /*
1453          * Force open some space in the entry array and fill it in.
1454          */
1455         entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
1456         if (args->index < ichdr->count) {
1457                 tmp  = ichdr->count - args->index;
1458                 tmp *= sizeof(xfs_attr_leaf_entry_t);
1459                 memmove(entry + 1, entry, tmp);
1460                 xfs_trans_log_buf(args->trans, bp,
1461                     XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry)));
1462         }
1463         ichdr->count++;
1464
1465         /*
1466          * Allocate space for the new string (at the end of the run).
1467          */
1468         mp = args->trans->t_mountp;
1469         ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize);
1470         ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0);
1471         ASSERT(ichdr->freemap[mapindex].size >=
1472                 xfs_attr_leaf_newentsize(args, NULL));
1473         ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize);
1474         ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0);
1475
1476         ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp);
1477
1478         entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base +
1479                                      ichdr->freemap[mapindex].size);
1480         entry->hashval = cpu_to_be32(args->hashval);
1481         entry->flags = args->attr_filter;
1482         if (tmp)
1483                 entry->flags |= XFS_ATTR_LOCAL;
1484         if (args->op_flags & XFS_DA_OP_RENAME) {
1485                 entry->flags |= XFS_ATTR_INCOMPLETE;
1486                 if ((args->blkno2 == args->blkno) &&
1487                     (args->index2 <= args->index)) {
1488                         args->index2++;
1489                 }
1490         }
1491         xfs_trans_log_buf(args->trans, bp,
1492                           XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry)));
1493         ASSERT((args->index == 0) ||
1494                (be32_to_cpu(entry->hashval) >= be32_to_cpu((entry-1)->hashval)));
1495         ASSERT((args->index == ichdr->count - 1) ||
1496                (be32_to_cpu(entry->hashval) <= be32_to_cpu((entry+1)->hashval)));
1497
1498         /*
1499          * For "remote" attribute values, simply note that we need to
1500          * allocate space for the "remote" value.  We can't actually
1501          * allocate the extents in this transaction, and we can't decide
1502          * which blocks they should be as we might allocate more blocks
1503          * as part of this transaction (a split operation for example).
1504          */
1505         if (entry->flags & XFS_ATTR_LOCAL) {
1506                 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
1507                 name_loc->namelen = args->namelen;
1508                 name_loc->valuelen = cpu_to_be16(args->valuelen);
1509                 memcpy((char *)name_loc->nameval, args->name, args->namelen);
1510                 memcpy((char *)&name_loc->nameval[args->namelen], args->value,
1511                                    be16_to_cpu(name_loc->valuelen));
1512         } else {
1513                 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
1514                 name_rmt->namelen = args->namelen;
1515                 memcpy((char *)name_rmt->name, args->name, args->namelen);
1516                 entry->flags |= XFS_ATTR_INCOMPLETE;
1517                 /* just in case */
1518                 name_rmt->valuelen = 0;
1519                 name_rmt->valueblk = 0;
1520                 args->rmtblkno = 1;
1521                 args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);
1522                 args->rmtvaluelen = args->valuelen;
1523         }
1524         xfs_trans_log_buf(args->trans, bp,
1525              XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
1526                                    xfs_attr_leaf_entsize(leaf, args->index)));
1527
1528         /*
1529          * Update the control info for this leaf node
1530          */
1531         if (be16_to_cpu(entry->nameidx) < ichdr->firstused)
1532                 ichdr->firstused = be16_to_cpu(entry->nameidx);
1533
1534         ASSERT(ichdr->firstused >= ichdr->count * sizeof(xfs_attr_leaf_entry_t)
1535                                         + xfs_attr3_leaf_hdr_size(leaf));
1536         tmp = (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t)
1537                                         + xfs_attr3_leaf_hdr_size(leaf);
1538
1539         for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
1540                 if (ichdr->freemap[i].base == tmp) {
1541                         ichdr->freemap[i].base += sizeof(xfs_attr_leaf_entry_t);
1542                         ichdr->freemap[i].size -=
1543                                 min_t(uint16_t, ichdr->freemap[i].size,
1544                                                 sizeof(xfs_attr_leaf_entry_t));
1545                 }
1546         }
1547         ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index);
1548         return 0;
1549 }
1550
1551 /*
1552  * Garbage collect a leaf attribute list block by copying it to a new buffer.
1553  */
1554 STATIC void
1555 xfs_attr3_leaf_compact(
1556         struct xfs_da_args      *args,
1557         struct xfs_attr3_icleaf_hdr *ichdr_dst,
1558         struct xfs_buf          *bp)
1559 {
1560         struct xfs_attr_leafblock *leaf_src;
1561         struct xfs_attr_leafblock *leaf_dst;
1562         struct xfs_attr3_icleaf_hdr ichdr_src;
1563         struct xfs_trans        *trans = args->trans;
1564         char                    *tmpbuffer;
1565
1566         trace_xfs_attr_leaf_compact(args);
1567
1568         tmpbuffer = kmem_alloc(args->geo->blksize, 0);
1569         memcpy(tmpbuffer, bp->b_addr, args->geo->blksize);
1570         memset(bp->b_addr, 0, args->geo->blksize);
1571         leaf_src = (xfs_attr_leafblock_t *)tmpbuffer;
1572         leaf_dst = bp->b_addr;
1573
1574         /*
1575          * Copy the on-disk header back into the destination buffer to ensure
1576          * all the information in the header that is not part of the incore
1577          * header structure is preserved.
1578          */
1579         memcpy(bp->b_addr, tmpbuffer, xfs_attr3_leaf_hdr_size(leaf_src));
1580
1581         /* Initialise the incore headers */
1582         ichdr_src = *ichdr_dst; /* struct copy */
1583         ichdr_dst->firstused = args->geo->blksize;
1584         ichdr_dst->usedbytes = 0;
1585         ichdr_dst->count = 0;
1586         ichdr_dst->holes = 0;
1587         ichdr_dst->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_src);
1588         ichdr_dst->freemap[0].size = ichdr_dst->firstused -
1589                                                 ichdr_dst->freemap[0].base;
1590
1591         /* write the header back to initialise the underlying buffer */
1592         xfs_attr3_leaf_hdr_to_disk(args->geo, leaf_dst, ichdr_dst);
1593
1594         /*
1595          * Copy all entry's in the same (sorted) order,
1596          * but allocate name/value pairs packed and in sequence.
1597          */
1598         xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0,
1599                                 leaf_dst, ichdr_dst, 0, ichdr_src.count);
1600         /*
1601          * this logs the entire buffer, but the caller must write the header
1602          * back to the buffer when it is finished modifying it.
1603          */
1604         xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1);
1605
1606         kmem_free(tmpbuffer);
1607 }
1608
1609 /*
1610  * Compare two leaf blocks "order".
1611  * Return 0 unless leaf2 should go before leaf1.
1612  */
1613 static int
1614 xfs_attr3_leaf_order(
1615         struct xfs_buf  *leaf1_bp,
1616         struct xfs_attr3_icleaf_hdr *leaf1hdr,
1617         struct xfs_buf  *leaf2_bp,
1618         struct xfs_attr3_icleaf_hdr *leaf2hdr)
1619 {
1620         struct xfs_attr_leaf_entry *entries1;
1621         struct xfs_attr_leaf_entry *entries2;
1622
1623         entries1 = xfs_attr3_leaf_entryp(leaf1_bp->b_addr);
1624         entries2 = xfs_attr3_leaf_entryp(leaf2_bp->b_addr);
1625         if (leaf1hdr->count > 0 && leaf2hdr->count > 0 &&
1626             ((be32_to_cpu(entries2[0].hashval) <
1627               be32_to_cpu(entries1[0].hashval)) ||
1628              (be32_to_cpu(entries2[leaf2hdr->count - 1].hashval) <
1629               be32_to_cpu(entries1[leaf1hdr->count - 1].hashval)))) {
1630                 return 1;
1631         }
1632         return 0;
1633 }
1634
1635 int
1636 xfs_attr_leaf_order(
1637         struct xfs_buf  *leaf1_bp,
1638         struct xfs_buf  *leaf2_bp)
1639 {
1640         struct xfs_attr3_icleaf_hdr ichdr1;
1641         struct xfs_attr3_icleaf_hdr ichdr2;
1642         struct xfs_mount *mp = leaf1_bp->b_mount;
1643
1644         xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr1, leaf1_bp->b_addr);
1645         xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr2, leaf2_bp->b_addr);
1646         return xfs_attr3_leaf_order(leaf1_bp, &ichdr1, leaf2_bp, &ichdr2);
1647 }
1648
1649 /*
1650  * Redistribute the attribute list entries between two leaf nodes,
1651  * taking into account the size of the new entry.
1652  *
1653  * NOTE: if new block is empty, then it will get the upper half of the
1654  * old block.  At present, all (one) callers pass in an empty second block.
1655  *
1656  * This code adjusts the args->index/blkno and args->index2/blkno2 fields
1657  * to match what it is doing in splitting the attribute leaf block.  Those
1658  * values are used in "atomic rename" operations on attributes.  Note that
1659  * the "new" and "old" values can end up in different blocks.
1660  */
1661 STATIC void
1662 xfs_attr3_leaf_rebalance(
1663         struct xfs_da_state     *state,
1664         struct xfs_da_state_blk *blk1,
1665         struct xfs_da_state_blk *blk2)
1666 {
1667         struct xfs_da_args      *args;
1668         struct xfs_attr_leafblock *leaf1;
1669         struct xfs_attr_leafblock *leaf2;
1670         struct xfs_attr3_icleaf_hdr ichdr1;
1671         struct xfs_attr3_icleaf_hdr ichdr2;
1672         struct xfs_attr_leaf_entry *entries1;
1673         struct xfs_attr_leaf_entry *entries2;
1674         int                     count;
1675         int                     totallen;
1676         int                     max;
1677         int                     space;
1678         int                     swap;
1679
1680         /*
1681          * Set up environment.
1682          */
1683         ASSERT(blk1->magic == XFS_ATTR_LEAF_MAGIC);
1684         ASSERT(blk2->magic == XFS_ATTR_LEAF_MAGIC);
1685         leaf1 = blk1->bp->b_addr;
1686         leaf2 = blk2->bp->b_addr;
1687         xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr1, leaf1);
1688         xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, leaf2);
1689         ASSERT(ichdr2.count == 0);
1690         args = state->args;
1691
1692         trace_xfs_attr_leaf_rebalance(args);
1693
1694         /*
1695          * Check ordering of blocks, reverse if it makes things simpler.
1696          *
1697          * NOTE: Given that all (current) callers pass in an empty
1698          * second block, this code should never set "swap".
1699          */
1700         swap = 0;
1701         if (xfs_attr3_leaf_order(blk1->bp, &ichdr1, blk2->bp, &ichdr2)) {
1702                 swap(blk1, blk2);
1703
1704                 /* swap structures rather than reconverting them */
1705                 swap(ichdr1, ichdr2);
1706
1707                 leaf1 = blk1->bp->b_addr;
1708                 leaf2 = blk2->bp->b_addr;
1709                 swap = 1;
1710         }
1711
1712         /*
1713          * Examine entries until we reduce the absolute difference in
1714          * byte usage between the two blocks to a minimum.  Then get
1715          * the direction to copy and the number of elements to move.
1716          *
1717          * "inleaf" is true if the new entry should be inserted into blk1.
1718          * If "swap" is also true, then reverse the sense of "inleaf".
1719          */
1720         state->inleaf = xfs_attr3_leaf_figure_balance(state, blk1, &ichdr1,
1721                                                       blk2, &ichdr2,
1722                                                       &count, &totallen);
1723         if (swap)
1724                 state->inleaf = !state->inleaf;
1725
1726         /*
1727          * Move any entries required from leaf to leaf:
1728          */
1729         if (count < ichdr1.count) {
1730                 /*
1731                  * Figure the total bytes to be added to the destination leaf.
1732                  */
1733                 /* number entries being moved */
1734                 count = ichdr1.count - count;
1735                 space  = ichdr1.usedbytes - totallen;
1736                 space += count * sizeof(xfs_attr_leaf_entry_t);
1737
1738                 /*
1739                  * leaf2 is the destination, compact it if it looks tight.
1740                  */
1741                 max  = ichdr2.firstused - xfs_attr3_leaf_hdr_size(leaf1);
1742                 max -= ichdr2.count * sizeof(xfs_attr_leaf_entry_t);
1743                 if (space > max)
1744                         xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp);
1745
1746                 /*
1747                  * Move high entries from leaf1 to low end of leaf2.
1748                  */
1749                 xfs_attr3_leaf_moveents(args, leaf1, &ichdr1,
1750                                 ichdr1.count - count, leaf2, &ichdr2, 0, count);
1751
1752         } else if (count > ichdr1.count) {
1753                 /*
1754                  * I assert that since all callers pass in an empty
1755                  * second buffer, this code should never execute.
1756                  */
1757                 ASSERT(0);
1758
1759                 /*
1760                  * Figure the total bytes to be added to the destination leaf.
1761                  */
1762                 /* number entries being moved */
1763                 count -= ichdr1.count;
1764                 space  = totallen - ichdr1.usedbytes;
1765                 space += count * sizeof(xfs_attr_leaf_entry_t);
1766
1767                 /*
1768                  * leaf1 is the destination, compact it if it looks tight.
1769                  */
1770                 max  = ichdr1.firstused - xfs_attr3_leaf_hdr_size(leaf1);
1771                 max -= ichdr1.count * sizeof(xfs_attr_leaf_entry_t);
1772                 if (space > max)
1773                         xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp);
1774
1775                 /*
1776                  * Move low entries from leaf2 to high end of leaf1.
1777                  */
1778                 xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1,
1779                                         ichdr1.count, count);
1780         }
1781
1782         xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf1, &ichdr1);
1783         xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf2, &ichdr2);
1784         xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1);
1785         xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1);
1786
1787         /*
1788          * Copy out last hashval in each block for B-tree code.
1789          */
1790         entries1 = xfs_attr3_leaf_entryp(leaf1);
1791         entries2 = xfs_attr3_leaf_entryp(leaf2);
1792         blk1->hashval = be32_to_cpu(entries1[ichdr1.count - 1].hashval);
1793         blk2->hashval = be32_to_cpu(entries2[ichdr2.count - 1].hashval);
1794
1795         /*
1796          * Adjust the expected index for insertion.
1797          * NOTE: this code depends on the (current) situation that the
1798          * second block was originally empty.
1799          *
1800          * If the insertion point moved to the 2nd block, we must adjust
1801          * the index.  We must also track the entry just following the
1802          * new entry for use in an "atomic rename" operation, that entry
1803          * is always the "old" entry and the "new" entry is what we are
1804          * inserting.  The index/blkno fields refer to the "old" entry,
1805          * while the index2/blkno2 fields refer to the "new" entry.
1806          */
1807         if (blk1->index > ichdr1.count) {
1808                 ASSERT(state->inleaf == 0);
1809                 blk2->index = blk1->index - ichdr1.count;
1810                 args->index = args->index2 = blk2->index;
1811                 args->blkno = args->blkno2 = blk2->blkno;
1812         } else if (blk1->index == ichdr1.count) {
1813                 if (state->inleaf) {
1814                         args->index = blk1->index;
1815                         args->blkno = blk1->blkno;
1816                         args->index2 = 0;
1817                         args->blkno2 = blk2->blkno;
1818                 } else {
1819                         /*
1820                          * On a double leaf split, the original attr location
1821                          * is already stored in blkno2/index2, so don't
1822                          * overwrite it overwise we corrupt the tree.
1823                          */
1824                         blk2->index = blk1->index - ichdr1.count;
1825                         args->index = blk2->index;
1826                         args->blkno = blk2->blkno;
1827                         if (!state->extravalid) {
1828                                 /*
1829                                  * set the new attr location to match the old
1830                                  * one and let the higher level split code
1831                                  * decide where in the leaf to place it.
1832                                  */
1833                                 args->index2 = blk2->index;
1834                                 args->blkno2 = blk2->blkno;
1835                         }
1836                 }
1837         } else {
1838                 ASSERT(state->inleaf == 1);
1839                 args->index = args->index2 = blk1->index;
1840                 args->blkno = args->blkno2 = blk1->blkno;
1841         }
1842 }
1843
1844 /*
1845  * Examine entries until we reduce the absolute difference in
1846  * byte usage between the two blocks to a minimum.
1847  * GROT: Is this really necessary?  With other than a 512 byte blocksize,
1848  * GROT: there will always be enough room in either block for a new entry.
1849  * GROT: Do a double-split for this case?
1850  */
1851 STATIC int
1852 xfs_attr3_leaf_figure_balance(
1853         struct xfs_da_state             *state,
1854         struct xfs_da_state_blk         *blk1,
1855         struct xfs_attr3_icleaf_hdr     *ichdr1,
1856         struct xfs_da_state_blk         *blk2,
1857         struct xfs_attr3_icleaf_hdr     *ichdr2,
1858         int                             *countarg,
1859         int                             *usedbytesarg)
1860 {
1861         struct xfs_attr_leafblock       *leaf1 = blk1->bp->b_addr;
1862         struct xfs_attr_leafblock       *leaf2 = blk2->bp->b_addr;
1863         struct xfs_attr_leaf_entry      *entry;
1864         int                             count;
1865         int                             max;
1866         int                             index;
1867         int                             totallen = 0;
1868         int                             half;
1869         int                             lastdelta;
1870         int                             foundit = 0;
1871         int                             tmp;
1872
1873         /*
1874          * Examine entries until we reduce the absolute difference in
1875          * byte usage between the two blocks to a minimum.
1876          */
1877         max = ichdr1->count + ichdr2->count;
1878         half = (max + 1) * sizeof(*entry);
1879         half += ichdr1->usedbytes + ichdr2->usedbytes +
1880                         xfs_attr_leaf_newentsize(state->args, NULL);
1881         half /= 2;
1882         lastdelta = state->args->geo->blksize;
1883         entry = xfs_attr3_leaf_entryp(leaf1);
1884         for (count = index = 0; count < max; entry++, index++, count++) {
1885
1886 #define XFS_ATTR_ABS(A) (((A) < 0) ? -(A) : (A))
1887                 /*
1888                  * The new entry is in the first block, account for it.
1889                  */
1890                 if (count == blk1->index) {
1891                         tmp = totallen + sizeof(*entry) +
1892                                 xfs_attr_leaf_newentsize(state->args, NULL);
1893                         if (XFS_ATTR_ABS(half - tmp) > lastdelta)
1894                                 break;
1895                         lastdelta = XFS_ATTR_ABS(half - tmp);
1896                         totallen = tmp;
1897                         foundit = 1;
1898                 }
1899
1900                 /*
1901                  * Wrap around into the second block if necessary.
1902                  */
1903                 if (count == ichdr1->count) {
1904                         leaf1 = leaf2;
1905                         entry = xfs_attr3_leaf_entryp(leaf1);
1906                         index = 0;
1907                 }
1908
1909                 /*
1910                  * Figure out if next leaf entry would be too much.
1911                  */
1912                 tmp = totallen + sizeof(*entry) + xfs_attr_leaf_entsize(leaf1,
1913                                                                         index);
1914                 if (XFS_ATTR_ABS(half - tmp) > lastdelta)
1915                         break;
1916                 lastdelta = XFS_ATTR_ABS(half - tmp);
1917                 totallen = tmp;
1918 #undef XFS_ATTR_ABS
1919         }
1920
1921         /*
1922          * Calculate the number of usedbytes that will end up in lower block.
1923          * If new entry not in lower block, fix up the count.
1924          */
1925         totallen -= count * sizeof(*entry);
1926         if (foundit) {
1927                 totallen -= sizeof(*entry) +
1928                                 xfs_attr_leaf_newentsize(state->args, NULL);
1929         }
1930
1931         *countarg = count;
1932         *usedbytesarg = totallen;
1933         return foundit;
1934 }
1935
1936 /*========================================================================
1937  * Routines used for shrinking the Btree.
1938  *========================================================================*/
1939
1940 /*
1941  * Check a leaf block and its neighbors to see if the block should be
1942  * collapsed into one or the other neighbor.  Always keep the block
1943  * with the smaller block number.
1944  * If the current block is over 50% full, don't try to join it, return 0.
1945  * If the block is empty, fill in the state structure and return 2.
1946  * If it can be collapsed, fill in the state structure and return 1.
1947  * If nothing can be done, return 0.
1948  *
1949  * GROT: allow for INCOMPLETE entries in calculation.
1950  */
1951 int
1952 xfs_attr3_leaf_toosmall(
1953         struct xfs_da_state     *state,
1954         int                     *action)
1955 {
1956         struct xfs_attr_leafblock *leaf;
1957         struct xfs_da_state_blk *blk;
1958         struct xfs_attr3_icleaf_hdr ichdr;
1959         struct xfs_buf          *bp;
1960         xfs_dablk_t             blkno;
1961         int                     bytes;
1962         int                     forward;
1963         int                     error;
1964         int                     retval;
1965         int                     i;
1966
1967         trace_xfs_attr_leaf_toosmall(state->args);
1968
1969         /*
1970          * Check for the degenerate case of the block being over 50% full.
1971          * If so, it's not worth even looking to see if we might be able
1972          * to coalesce with a sibling.
1973          */
1974         blk = &state->path.blk[ state->path.active-1 ];
1975         leaf = blk->bp->b_addr;
1976         xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr, leaf);
1977         bytes = xfs_attr3_leaf_hdr_size(leaf) +
1978                 ichdr.count * sizeof(xfs_attr_leaf_entry_t) +
1979                 ichdr.usedbytes;
1980         if (bytes > (state->args->geo->blksize >> 1)) {
1981                 *action = 0;    /* blk over 50%, don't try to join */
1982                 return 0;
1983         }
1984
1985         /*
1986          * Check for the degenerate case of the block being empty.
1987          * If the block is empty, we'll simply delete it, no need to
1988          * coalesce it with a sibling block.  We choose (arbitrarily)
1989          * to merge with the forward block unless it is NULL.
1990          */
1991         if (ichdr.count == 0) {
1992                 /*
1993                  * Make altpath point to the block we want to keep and
1994                  * path point to the block we want to drop (this one).
1995                  */
1996                 forward = (ichdr.forw != 0);
1997                 memcpy(&state->altpath, &state->path, sizeof(state->path));
1998                 error = xfs_da3_path_shift(state, &state->altpath, forward,
1999                                                  0, &retval);
2000                 if (error)
2001                         return error;
2002                 if (retval) {
2003                         *action = 0;
2004                 } else {
2005                         *action = 2;
2006                 }
2007                 return 0;
2008         }
2009
2010         /*
2011          * Examine each sibling block to see if we can coalesce with
2012          * at least 25% free space to spare.  We need to figure out
2013          * whether to merge with the forward or the backward block.
2014          * We prefer coalescing with the lower numbered sibling so as
2015          * to shrink an attribute list over time.
2016          */
2017         /* start with smaller blk num */
2018         forward = ichdr.forw < ichdr.back;
2019         for (i = 0; i < 2; forward = !forward, i++) {
2020                 struct xfs_attr3_icleaf_hdr ichdr2;
2021                 if (forward)
2022                         blkno = ichdr.forw;
2023                 else
2024                         blkno = ichdr.back;
2025                 if (blkno == 0)
2026                         continue;
2027                 error = xfs_attr3_leaf_read(state->args->trans, state->args->dp,
2028                                         blkno, &bp);
2029                 if (error)
2030                         return error;
2031
2032                 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, bp->b_addr);
2033
2034                 bytes = state->args->geo->blksize -
2035                         (state->args->geo->blksize >> 2) -
2036                         ichdr.usedbytes - ichdr2.usedbytes -
2037                         ((ichdr.count + ichdr2.count) *
2038                                         sizeof(xfs_attr_leaf_entry_t)) -
2039                         xfs_attr3_leaf_hdr_size(leaf);
2040
2041                 xfs_trans_brelse(state->args->trans, bp);
2042                 if (bytes >= 0)
2043                         break;  /* fits with at least 25% to spare */
2044         }
2045         if (i >= 2) {
2046                 *action = 0;
2047                 return 0;
2048         }
2049
2050         /*
2051          * Make altpath point to the block we want to keep (the lower
2052          * numbered block) and path point to the block we want to drop.
2053          */
2054         memcpy(&state->altpath, &state->path, sizeof(state->path));
2055         if (blkno < blk->blkno) {
2056                 error = xfs_da3_path_shift(state, &state->altpath, forward,
2057                                                  0, &retval);
2058         } else {
2059                 error = xfs_da3_path_shift(state, &state->path, forward,
2060                                                  0, &retval);
2061         }
2062         if (error)
2063                 return error;
2064         if (retval) {
2065                 *action = 0;
2066         } else {
2067                 *action = 1;
2068         }
2069         return 0;
2070 }
2071
2072 /*
2073  * Remove a name from the leaf attribute list structure.
2074  *
2075  * Return 1 if leaf is less than 37% full, 0 if >= 37% full.
2076  * If two leaves are 37% full, when combined they will leave 25% free.
2077  */
2078 int
2079 xfs_attr3_leaf_remove(
2080         struct xfs_buf          *bp,
2081         struct xfs_da_args      *args)
2082 {
2083         struct xfs_attr_leafblock *leaf;
2084         struct xfs_attr3_icleaf_hdr ichdr;
2085         struct xfs_attr_leaf_entry *entry;
2086         int                     before;
2087         int                     after;
2088         int                     smallest;
2089         int                     entsize;
2090         int                     tablesize;
2091         int                     tmp;
2092         int                     i;
2093
2094         trace_xfs_attr_leaf_remove(args);
2095
2096         leaf = bp->b_addr;
2097         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2098
2099         ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8);
2100         ASSERT(args->index >= 0 && args->index < ichdr.count);
2101         ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) +
2102                                         xfs_attr3_leaf_hdr_size(leaf));
2103
2104         entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2105
2106         ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused);
2107         ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2108
2109         /*
2110          * Scan through free region table:
2111          *    check for adjacency of free'd entry with an existing one,
2112          *    find smallest free region in case we need to replace it,
2113          *    adjust any map that borders the entry table,
2114          */
2115         tablesize = ichdr.count * sizeof(xfs_attr_leaf_entry_t)
2116                                         + xfs_attr3_leaf_hdr_size(leaf);
2117         tmp = ichdr.freemap[0].size;
2118         before = after = -1;
2119         smallest = XFS_ATTR_LEAF_MAPSIZE - 1;
2120         entsize = xfs_attr_leaf_entsize(leaf, args->index);
2121         for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
2122                 ASSERT(ichdr.freemap[i].base < args->geo->blksize);
2123                 ASSERT(ichdr.freemap[i].size < args->geo->blksize);
2124                 if (ichdr.freemap[i].base == tablesize) {
2125                         ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t);
2126                         ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t);
2127                 }
2128
2129                 if (ichdr.freemap[i].base + ichdr.freemap[i].size ==
2130                                 be16_to_cpu(entry->nameidx)) {
2131                         before = i;
2132                 } else if (ichdr.freemap[i].base ==
2133                                 (be16_to_cpu(entry->nameidx) + entsize)) {
2134                         after = i;
2135                 } else if (ichdr.freemap[i].size < tmp) {
2136                         tmp = ichdr.freemap[i].size;
2137                         smallest = i;
2138                 }
2139         }
2140
2141         /*
2142          * Coalesce adjacent freemap regions,
2143          * or replace the smallest region.
2144          */
2145         if ((before >= 0) || (after >= 0)) {
2146                 if ((before >= 0) && (after >= 0)) {
2147                         ichdr.freemap[before].size += entsize;
2148                         ichdr.freemap[before].size += ichdr.freemap[after].size;
2149                         ichdr.freemap[after].base = 0;
2150                         ichdr.freemap[after].size = 0;
2151                 } else if (before >= 0) {
2152                         ichdr.freemap[before].size += entsize;
2153                 } else {
2154                         ichdr.freemap[after].base = be16_to_cpu(entry->nameidx);
2155                         ichdr.freemap[after].size += entsize;
2156                 }
2157         } else {
2158                 /*
2159                  * Replace smallest region (if it is smaller than free'd entry)
2160                  */
2161                 if (ichdr.freemap[smallest].size < entsize) {
2162                         ichdr.freemap[smallest].base = be16_to_cpu(entry->nameidx);
2163                         ichdr.freemap[smallest].size = entsize;
2164                 }
2165         }
2166
2167         /*
2168          * Did we remove the first entry?
2169          */
2170         if (be16_to_cpu(entry->nameidx) == ichdr.firstused)
2171                 smallest = 1;
2172         else
2173                 smallest = 0;
2174
2175         /*
2176          * Compress the remaining entries and zero out the removed stuff.
2177          */
2178         memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize);
2179         ichdr.usedbytes -= entsize;
2180         xfs_trans_log_buf(args->trans, bp,
2181              XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
2182                                    entsize));
2183
2184         tmp = (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t);
2185         memmove(entry, entry + 1, tmp);
2186         ichdr.count--;
2187         xfs_trans_log_buf(args->trans, bp,
2188             XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(xfs_attr_leaf_entry_t)));
2189
2190         entry = &xfs_attr3_leaf_entryp(leaf)[ichdr.count];
2191         memset(entry, 0, sizeof(xfs_attr_leaf_entry_t));
2192
2193         /*
2194          * If we removed the first entry, re-find the first used byte
2195          * in the name area.  Note that if the entry was the "firstused",
2196          * then we don't have a "hole" in our block resulting from
2197          * removing the name.
2198          */
2199         if (smallest) {
2200                 tmp = args->geo->blksize;
2201                 entry = xfs_attr3_leaf_entryp(leaf);
2202                 for (i = ichdr.count - 1; i >= 0; entry++, i--) {
2203                         ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused);
2204                         ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize);
2205
2206                         if (be16_to_cpu(entry->nameidx) < tmp)
2207                                 tmp = be16_to_cpu(entry->nameidx);
2208                 }
2209                 ichdr.firstused = tmp;
2210                 ASSERT(ichdr.firstused != 0);
2211         } else {
2212                 ichdr.holes = 1;        /* mark as needing compaction */
2213         }
2214         xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr);
2215         xfs_trans_log_buf(args->trans, bp,
2216                           XFS_DA_LOGRANGE(leaf, &leaf->hdr,
2217                                           xfs_attr3_leaf_hdr_size(leaf)));
2218
2219         /*
2220          * Check if leaf is less than 50% full, caller may want to
2221          * "join" the leaf with a sibling if so.
2222          */
2223         tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) +
2224               ichdr.count * sizeof(xfs_attr_leaf_entry_t);
2225
2226         return tmp < args->geo->magicpct; /* leaf is < 37% full */
2227 }
2228
2229 /*
2230  * Move all the attribute list entries from drop_leaf into save_leaf.
2231  */
2232 void
2233 xfs_attr3_leaf_unbalance(
2234         struct xfs_da_state     *state,
2235         struct xfs_da_state_blk *drop_blk,
2236         struct xfs_da_state_blk *save_blk)
2237 {
2238         struct xfs_attr_leafblock *drop_leaf = drop_blk->bp->b_addr;
2239         struct xfs_attr_leafblock *save_leaf = save_blk->bp->b_addr;
2240         struct xfs_attr3_icleaf_hdr drophdr;
2241         struct xfs_attr3_icleaf_hdr savehdr;
2242         struct xfs_attr_leaf_entry *entry;
2243
2244         trace_xfs_attr_leaf_unbalance(state->args);
2245
2246         drop_leaf = drop_blk->bp->b_addr;
2247         save_leaf = save_blk->bp->b_addr;
2248         xfs_attr3_leaf_hdr_from_disk(state->args->geo, &drophdr, drop_leaf);
2249         xfs_attr3_leaf_hdr_from_disk(state->args->geo, &savehdr, save_leaf);
2250         entry = xfs_attr3_leaf_entryp(drop_leaf);
2251
2252         /*
2253          * Save last hashval from dying block for later Btree fixup.
2254          */
2255         drop_blk->hashval = be32_to_cpu(entry[drophdr.count - 1].hashval);
2256
2257         /*
2258          * Check if we need a temp buffer, or can we do it in place.
2259          * Note that we don't check "leaf" for holes because we will
2260          * always be dropping it, toosmall() decided that for us already.
2261          */
2262         if (savehdr.holes == 0) {
2263                 /*
2264                  * dest leaf has no holes, so we add there.  May need
2265                  * to make some room in the entry array.
2266                  */
2267                 if (xfs_attr3_leaf_order(save_blk->bp, &savehdr,
2268                                          drop_blk->bp, &drophdr)) {
2269                         xfs_attr3_leaf_moveents(state->args,
2270                                                 drop_leaf, &drophdr, 0,
2271                                                 save_leaf, &savehdr, 0,
2272                                                 drophdr.count);
2273                 } else {
2274                         xfs_attr3_leaf_moveents(state->args,
2275                                                 drop_leaf, &drophdr, 0,
2276                                                 save_leaf, &savehdr,
2277                                                 savehdr.count, drophdr.count);
2278                 }
2279         } else {
2280                 /*
2281                  * Destination has holes, so we make a temporary copy
2282                  * of the leaf and add them both to that.
2283                  */
2284                 struct xfs_attr_leafblock *tmp_leaf;
2285                 struct xfs_attr3_icleaf_hdr tmphdr;
2286
2287                 tmp_leaf = kmem_zalloc(state->args->geo->blksize, 0);
2288
2289                 /*
2290                  * Copy the header into the temp leaf so that all the stuff
2291                  * not in the incore header is present and gets copied back in
2292                  * once we've moved all the entries.
2293                  */
2294                 memcpy(tmp_leaf, save_leaf, xfs_attr3_leaf_hdr_size(save_leaf));
2295
2296                 memset(&tmphdr, 0, sizeof(tmphdr));
2297                 tmphdr.magic = savehdr.magic;
2298                 tmphdr.forw = savehdr.forw;
2299                 tmphdr.back = savehdr.back;
2300                 tmphdr.firstused = state->args->geo->blksize;
2301
2302                 /* write the header to the temp buffer to initialise it */
2303                 xfs_attr3_leaf_hdr_to_disk(state->args->geo, tmp_leaf, &tmphdr);
2304
2305                 if (xfs_attr3_leaf_order(save_blk->bp, &savehdr,
2306                                          drop_blk->bp, &drophdr)) {
2307                         xfs_attr3_leaf_moveents(state->args,
2308                                                 drop_leaf, &drophdr, 0,
2309                                                 tmp_leaf, &tmphdr, 0,
2310                                                 drophdr.count);
2311                         xfs_attr3_leaf_moveents(state->args,
2312                                                 save_leaf, &savehdr, 0,
2313                                                 tmp_leaf, &tmphdr, tmphdr.count,
2314                                                 savehdr.count);
2315                 } else {
2316                         xfs_attr3_leaf_moveents(state->args,
2317                                                 save_leaf, &savehdr, 0,
2318                                                 tmp_leaf, &tmphdr, 0,
2319                                                 savehdr.count);
2320                         xfs_attr3_leaf_moveents(state->args,
2321                                                 drop_leaf, &drophdr, 0,
2322                                                 tmp_leaf, &tmphdr, tmphdr.count,
2323                                                 drophdr.count);
2324                 }
2325                 memcpy(save_leaf, tmp_leaf, state->args->geo->blksize);
2326                 savehdr = tmphdr; /* struct copy */
2327                 kmem_free(tmp_leaf);
2328         }
2329
2330         xfs_attr3_leaf_hdr_to_disk(state->args->geo, save_leaf, &savehdr);
2331         xfs_trans_log_buf(state->args->trans, save_blk->bp, 0,
2332                                            state->args->geo->blksize - 1);
2333
2334         /*
2335          * Copy out last hashval in each block for B-tree code.
2336          */
2337         entry = xfs_attr3_leaf_entryp(save_leaf);
2338         save_blk->hashval = be32_to_cpu(entry[savehdr.count - 1].hashval);
2339 }
2340
2341 /*========================================================================
2342  * Routines used for finding things in the Btree.
2343  *========================================================================*/
2344
2345 /*
2346  * Look up a name in a leaf attribute list structure.
2347  * This is the internal routine, it uses the caller's buffer.
2348  *
2349  * Note that duplicate keys are allowed, but only check within the
2350  * current leaf node.  The Btree code must check in adjacent leaf nodes.
2351  *
2352  * Return in args->index the index into the entry[] array of either
2353  * the found entry, or where the entry should have been (insert before
2354  * that entry).
2355  *
2356  * Don't change the args->value unless we find the attribute.
2357  */
2358 int
2359 xfs_attr3_leaf_lookup_int(
2360         struct xfs_buf          *bp,
2361         struct xfs_da_args      *args)
2362 {
2363         struct xfs_attr_leafblock *leaf;
2364         struct xfs_attr3_icleaf_hdr ichdr;
2365         struct xfs_attr_leaf_entry *entry;
2366         struct xfs_attr_leaf_entry *entries;
2367         struct xfs_attr_leaf_name_local *name_loc;
2368         struct xfs_attr_leaf_name_remote *name_rmt;
2369         xfs_dahash_t            hashval;
2370         int                     probe;
2371         int                     span;
2372
2373         trace_xfs_attr_leaf_lookup(args);
2374
2375         leaf = bp->b_addr;
2376         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2377         entries = xfs_attr3_leaf_entryp(leaf);
2378         if (ichdr.count >= args->geo->blksize / 8) {
2379                 xfs_buf_mark_corrupt(bp);
2380                 return -EFSCORRUPTED;
2381         }
2382
2383         /*
2384          * Binary search.  (note: small blocks will skip this loop)
2385          */
2386         hashval = args->hashval;
2387         probe = span = ichdr.count / 2;
2388         for (entry = &entries[probe]; span > 4; entry = &entries[probe]) {
2389                 span /= 2;
2390                 if (be32_to_cpu(entry->hashval) < hashval)
2391                         probe += span;
2392                 else if (be32_to_cpu(entry->hashval) > hashval)
2393                         probe -= span;
2394                 else
2395                         break;
2396         }
2397         if (!(probe >= 0 && (!ichdr.count || probe < ichdr.count))) {
2398                 xfs_buf_mark_corrupt(bp);
2399                 return -EFSCORRUPTED;
2400         }
2401         if (!(span <= 4 || be32_to_cpu(entry->hashval) == hashval)) {
2402                 xfs_buf_mark_corrupt(bp);
2403                 return -EFSCORRUPTED;
2404         }
2405
2406         /*
2407          * Since we may have duplicate hashval's, find the first matching
2408          * hashval in the leaf.
2409          */
2410         while (probe > 0 && be32_to_cpu(entry->hashval) >= hashval) {
2411                 entry--;
2412                 probe--;
2413         }
2414         while (probe < ichdr.count &&
2415                be32_to_cpu(entry->hashval) < hashval) {
2416                 entry++;
2417                 probe++;
2418         }
2419         if (probe == ichdr.count || be32_to_cpu(entry->hashval) != hashval) {
2420                 args->index = probe;
2421                 return -ENOATTR;
2422         }
2423
2424         /*
2425          * Duplicate keys may be present, so search all of them for a match.
2426          */
2427         for (; probe < ichdr.count && (be32_to_cpu(entry->hashval) == hashval);
2428                         entry++, probe++) {
2429 /*
2430  * GROT: Add code to remove incomplete entries.
2431  */
2432                 if (entry->flags & XFS_ATTR_LOCAL) {
2433                         name_loc = xfs_attr3_leaf_name_local(leaf, probe);
2434                         if (!xfs_attr_match(args, name_loc->namelen,
2435                                         name_loc->nameval, entry->flags))
2436                                 continue;
2437                         args->index = probe;
2438                         return -EEXIST;
2439                 } else {
2440                         name_rmt = xfs_attr3_leaf_name_remote(leaf, probe);
2441                         if (!xfs_attr_match(args, name_rmt->namelen,
2442                                         name_rmt->name, entry->flags))
2443                                 continue;
2444                         args->index = probe;
2445                         args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2446                         args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2447                         args->rmtblkcnt = xfs_attr3_rmt_blocks(
2448                                                         args->dp->i_mount,
2449                                                         args->rmtvaluelen);
2450                         return -EEXIST;
2451                 }
2452         }
2453         args->index = probe;
2454         return -ENOATTR;
2455 }
2456
2457 /*
2458  * Get the value associated with an attribute name from a leaf attribute
2459  * list structure.
2460  *
2461  * If args->valuelen is zero, only the length needs to be returned.  Unlike a
2462  * lookup, we only return an error if the attribute does not exist or we can't
2463  * retrieve the value.
2464  */
2465 int
2466 xfs_attr3_leaf_getvalue(
2467         struct xfs_buf          *bp,
2468         struct xfs_da_args      *args)
2469 {
2470         struct xfs_attr_leafblock *leaf;
2471         struct xfs_attr3_icleaf_hdr ichdr;
2472         struct xfs_attr_leaf_entry *entry;
2473         struct xfs_attr_leaf_name_local *name_loc;
2474         struct xfs_attr_leaf_name_remote *name_rmt;
2475
2476         leaf = bp->b_addr;
2477         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2478         ASSERT(ichdr.count < args->geo->blksize / 8);
2479         ASSERT(args->index < ichdr.count);
2480
2481         entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2482         if (entry->flags & XFS_ATTR_LOCAL) {
2483                 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2484                 ASSERT(name_loc->namelen == args->namelen);
2485                 ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0);
2486                 return xfs_attr_copy_value(args,
2487                                         &name_loc->nameval[args->namelen],
2488                                         be16_to_cpu(name_loc->valuelen));
2489         }
2490
2491         name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2492         ASSERT(name_rmt->namelen == args->namelen);
2493         ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0);
2494         args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
2495         args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
2496         args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount,
2497                                                args->rmtvaluelen);
2498         return xfs_attr_copy_value(args, NULL, args->rmtvaluelen);
2499 }
2500
2501 /*========================================================================
2502  * Utility routines.
2503  *========================================================================*/
2504
2505 /*
2506  * Move the indicated entries from one leaf to another.
2507  * NOTE: this routine modifies both source and destination leaves.
2508  */
2509 /*ARGSUSED*/
2510 STATIC void
2511 xfs_attr3_leaf_moveents(
2512         struct xfs_da_args              *args,
2513         struct xfs_attr_leafblock       *leaf_s,
2514         struct xfs_attr3_icleaf_hdr     *ichdr_s,
2515         int                             start_s,
2516         struct xfs_attr_leafblock       *leaf_d,
2517         struct xfs_attr3_icleaf_hdr     *ichdr_d,
2518         int                             start_d,
2519         int                             count)
2520 {
2521         struct xfs_attr_leaf_entry      *entry_s;
2522         struct xfs_attr_leaf_entry      *entry_d;
2523         int                             desti;
2524         int                             tmp;
2525         int                             i;
2526
2527         /*
2528          * Check for nothing to do.
2529          */
2530         if (count == 0)
2531                 return;
2532
2533         /*
2534          * Set up environment.
2535          */
2536         ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC ||
2537                ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC);
2538         ASSERT(ichdr_s->magic == ichdr_d->magic);
2539         ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8);
2540         ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s))
2541                                         + xfs_attr3_leaf_hdr_size(leaf_s));
2542         ASSERT(ichdr_d->count < args->geo->blksize / 8);
2543         ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d))
2544                                         + xfs_attr3_leaf_hdr_size(leaf_d));
2545
2546         ASSERT(start_s < ichdr_s->count);
2547         ASSERT(start_d <= ichdr_d->count);
2548         ASSERT(count <= ichdr_s->count);
2549
2550
2551         /*
2552          * Move the entries in the destination leaf up to make a hole?
2553          */
2554         if (start_d < ichdr_d->count) {
2555                 tmp  = ichdr_d->count - start_d;
2556                 tmp *= sizeof(xfs_attr_leaf_entry_t);
2557                 entry_s = &xfs_attr3_leaf_entryp(leaf_d)[start_d];
2558                 entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d + count];
2559                 memmove(entry_d, entry_s, tmp);
2560         }
2561
2562         /*
2563          * Copy all entry's in the same (sorted) order,
2564          * but allocate attribute info packed and in sequence.
2565          */
2566         entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s];
2567         entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d];
2568         desti = start_d;
2569         for (i = 0; i < count; entry_s++, entry_d++, desti++, i++) {
2570                 ASSERT(be16_to_cpu(entry_s->nameidx) >= ichdr_s->firstused);
2571                 tmp = xfs_attr_leaf_entsize(leaf_s, start_s + i);
2572 #ifdef GROT
2573                 /*
2574                  * Code to drop INCOMPLETE entries.  Difficult to use as we
2575                  * may also need to change the insertion index.  Code turned
2576                  * off for 6.2, should be revisited later.
2577                  */
2578                 if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */
2579                         memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp);
2580                         ichdr_s->usedbytes -= tmp;
2581                         ichdr_s->count -= 1;
2582                         entry_d--;      /* to compensate for ++ in loop hdr */
2583                         desti--;
2584                         if ((start_s + i) < offset)
2585                                 result++;       /* insertion index adjustment */
2586                 } else {
2587 #endif /* GROT */
2588                         ichdr_d->firstused -= tmp;
2589                         /* both on-disk, don't endian flip twice */
2590                         entry_d->hashval = entry_s->hashval;
2591                         entry_d->nameidx = cpu_to_be16(ichdr_d->firstused);
2592                         entry_d->flags = entry_s->flags;
2593                         ASSERT(be16_to_cpu(entry_d->nameidx) + tmp
2594                                                         <= args->geo->blksize);
2595                         memmove(xfs_attr3_leaf_name(leaf_d, desti),
2596                                 xfs_attr3_leaf_name(leaf_s, start_s + i), tmp);
2597                         ASSERT(be16_to_cpu(entry_s->nameidx) + tmp
2598                                                         <= args->geo->blksize);
2599                         memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp);
2600                         ichdr_s->usedbytes -= tmp;
2601                         ichdr_d->usedbytes += tmp;
2602                         ichdr_s->count -= 1;
2603                         ichdr_d->count += 1;
2604                         tmp = ichdr_d->count * sizeof(xfs_attr_leaf_entry_t)
2605                                         + xfs_attr3_leaf_hdr_size(leaf_d);
2606                         ASSERT(ichdr_d->firstused >= tmp);
2607 #ifdef GROT
2608                 }
2609 #endif /* GROT */
2610         }
2611
2612         /*
2613          * Zero out the entries we just copied.
2614          */
2615         if (start_s == ichdr_s->count) {
2616                 tmp = count * sizeof(xfs_attr_leaf_entry_t);
2617                 entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s];
2618                 ASSERT(((char *)entry_s + tmp) <=
2619                        ((char *)leaf_s + args->geo->blksize));
2620                 memset(entry_s, 0, tmp);
2621         } else {
2622                 /*
2623                  * Move the remaining entries down to fill the hole,
2624                  * then zero the entries at the top.
2625                  */
2626                 tmp  = (ichdr_s->count - count) * sizeof(xfs_attr_leaf_entry_t);
2627                 entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s + count];
2628                 entry_d = &xfs_attr3_leaf_entryp(leaf_s)[start_s];
2629                 memmove(entry_d, entry_s, tmp);
2630
2631                 tmp = count * sizeof(xfs_attr_leaf_entry_t);
2632                 entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count];
2633                 ASSERT(((char *)entry_s + tmp) <=
2634                        ((char *)leaf_s + args->geo->blksize));
2635                 memset(entry_s, 0, tmp);
2636         }
2637
2638         /*
2639          * Fill in the freemap information
2640          */
2641         ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_d);
2642         ichdr_d->freemap[0].base += ichdr_d->count * sizeof(xfs_attr_leaf_entry_t);
2643         ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base;
2644         ichdr_d->freemap[1].base = 0;
2645         ichdr_d->freemap[2].base = 0;
2646         ichdr_d->freemap[1].size = 0;
2647         ichdr_d->freemap[2].size = 0;
2648         ichdr_s->holes = 1;     /* leaf may not be compact */
2649 }
2650
2651 /*
2652  * Pick up the last hashvalue from a leaf block.
2653  */
2654 xfs_dahash_t
2655 xfs_attr_leaf_lasthash(
2656         struct xfs_buf  *bp,
2657         int             *count)
2658 {
2659         struct xfs_attr3_icleaf_hdr ichdr;
2660         struct xfs_attr_leaf_entry *entries;
2661         struct xfs_mount *mp = bp->b_mount;
2662
2663         xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, bp->b_addr);
2664         entries = xfs_attr3_leaf_entryp(bp->b_addr);
2665         if (count)
2666                 *count = ichdr.count;
2667         if (!ichdr.count)
2668                 return 0;
2669         return be32_to_cpu(entries[ichdr.count - 1].hashval);
2670 }
2671
2672 /*
2673  * Calculate the number of bytes used to store the indicated attribute
2674  * (whether local or remote only calculate bytes in this block).
2675  */
2676 STATIC int
2677 xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index)
2678 {
2679         struct xfs_attr_leaf_entry *entries;
2680         xfs_attr_leaf_name_local_t *name_loc;
2681         xfs_attr_leaf_name_remote_t *name_rmt;
2682         int size;
2683
2684         entries = xfs_attr3_leaf_entryp(leaf);
2685         if (entries[index].flags & XFS_ATTR_LOCAL) {
2686                 name_loc = xfs_attr3_leaf_name_local(leaf, index);
2687                 size = xfs_attr_leaf_entsize_local(name_loc->namelen,
2688                                                    be16_to_cpu(name_loc->valuelen));
2689         } else {
2690                 name_rmt = xfs_attr3_leaf_name_remote(leaf, index);
2691                 size = xfs_attr_leaf_entsize_remote(name_rmt->namelen);
2692         }
2693         return size;
2694 }
2695
2696 /*
2697  * Calculate the number of bytes that would be required to store the new
2698  * attribute (whether local or remote only calculate bytes in this block).
2699  * This routine decides as a side effect whether the attribute will be
2700  * a "local" or a "remote" attribute.
2701  */
2702 int
2703 xfs_attr_leaf_newentsize(
2704         struct xfs_da_args      *args,
2705         int                     *local)
2706 {
2707         int                     size;
2708
2709         size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen);
2710         if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) {
2711                 if (local)
2712                         *local = 1;
2713                 return size;
2714         }
2715         if (local)
2716                 *local = 0;
2717         return xfs_attr_leaf_entsize_remote(args->namelen);
2718 }
2719
2720
2721 /*========================================================================
2722  * Manage the INCOMPLETE flag in a leaf entry
2723  *========================================================================*/
2724
2725 /*
2726  * Clear the INCOMPLETE flag on an entry in a leaf block.
2727  */
2728 int
2729 xfs_attr3_leaf_clearflag(
2730         struct xfs_da_args      *args)
2731 {
2732         struct xfs_attr_leafblock *leaf;
2733         struct xfs_attr_leaf_entry *entry;
2734         struct xfs_attr_leaf_name_remote *name_rmt;
2735         struct xfs_buf          *bp;
2736         int                     error;
2737 #ifdef DEBUG
2738         struct xfs_attr3_icleaf_hdr ichdr;
2739         xfs_attr_leaf_name_local_t *name_loc;
2740         int namelen;
2741         char *name;
2742 #endif /* DEBUG */
2743
2744         trace_xfs_attr_leaf_clearflag(args);
2745         /*
2746          * Set up the operation.
2747          */
2748         error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2749         if (error)
2750                 return error;
2751
2752         leaf = bp->b_addr;
2753         entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2754         ASSERT(entry->flags & XFS_ATTR_INCOMPLETE);
2755
2756 #ifdef DEBUG
2757         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2758         ASSERT(args->index < ichdr.count);
2759         ASSERT(args->index >= 0);
2760
2761         if (entry->flags & XFS_ATTR_LOCAL) {
2762                 name_loc = xfs_attr3_leaf_name_local(leaf, args->index);
2763                 namelen = name_loc->namelen;
2764                 name = (char *)name_loc->nameval;
2765         } else {
2766                 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2767                 namelen = name_rmt->namelen;
2768                 name = (char *)name_rmt->name;
2769         }
2770         ASSERT(be32_to_cpu(entry->hashval) == args->hashval);
2771         ASSERT(namelen == args->namelen);
2772         ASSERT(memcmp(name, args->name, namelen) == 0);
2773 #endif /* DEBUG */
2774
2775         entry->flags &= ~XFS_ATTR_INCOMPLETE;
2776         xfs_trans_log_buf(args->trans, bp,
2777                          XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry)));
2778
2779         if (args->rmtblkno) {
2780                 ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0);
2781                 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2782                 name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2783                 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2784                 xfs_trans_log_buf(args->trans, bp,
2785                          XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt)));
2786         }
2787
2788         return 0;
2789 }
2790
2791 /*
2792  * Set the INCOMPLETE flag on an entry in a leaf block.
2793  */
2794 int
2795 xfs_attr3_leaf_setflag(
2796         struct xfs_da_args      *args)
2797 {
2798         struct xfs_attr_leafblock *leaf;
2799         struct xfs_attr_leaf_entry *entry;
2800         struct xfs_attr_leaf_name_remote *name_rmt;
2801         struct xfs_buf          *bp;
2802         int error;
2803 #ifdef DEBUG
2804         struct xfs_attr3_icleaf_hdr ichdr;
2805 #endif
2806
2807         trace_xfs_attr_leaf_setflag(args);
2808
2809         /*
2810          * Set up the operation.
2811          */
2812         error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
2813         if (error)
2814                 return error;
2815
2816         leaf = bp->b_addr;
2817 #ifdef DEBUG
2818         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf);
2819         ASSERT(args->index < ichdr.count);
2820         ASSERT(args->index >= 0);
2821 #endif
2822         entry = &xfs_attr3_leaf_entryp(leaf)[args->index];
2823
2824         ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) == 0);
2825         entry->flags |= XFS_ATTR_INCOMPLETE;
2826         xfs_trans_log_buf(args->trans, bp,
2827                         XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry)));
2828         if ((entry->flags & XFS_ATTR_LOCAL) == 0) {
2829                 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
2830                 name_rmt->valueblk = 0;
2831                 name_rmt->valuelen = 0;
2832                 xfs_trans_log_buf(args->trans, bp,
2833                          XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt)));
2834         }
2835
2836         return 0;
2837 }
2838
2839 /*
2840  * In a single transaction, clear the INCOMPLETE flag on the leaf entry
2841  * given by args->blkno/index and set the INCOMPLETE flag on the leaf
2842  * entry given by args->blkno2/index2.
2843  *
2844  * Note that they could be in different blocks, or in the same block.
2845  */
2846 int
2847 xfs_attr3_leaf_flipflags(
2848         struct xfs_da_args      *args)
2849 {
2850         struct xfs_attr_leafblock *leaf1;
2851         struct xfs_attr_leafblock *leaf2;
2852         struct xfs_attr_leaf_entry *entry1;
2853         struct xfs_attr_leaf_entry *entry2;
2854         struct xfs_attr_leaf_name_remote *name_rmt;
2855         struct xfs_buf          *bp1;
2856         struct xfs_buf          *bp2;
2857         int error;
2858 #ifdef DEBUG
2859         struct xfs_attr3_icleaf_hdr ichdr1;
2860         struct xfs_attr3_icleaf_hdr ichdr2;
2861         xfs_attr_leaf_name_local_t *name_loc;
2862         int namelen1, namelen2;
2863         char *name1, *name2;
2864 #endif /* DEBUG */
2865
2866         trace_xfs_attr_leaf_flipflags(args);
2867
2868         /*
2869          * Read the block containing the "old" attr
2870          */
2871         error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp1);
2872         if (error)
2873                 return error;
2874
2875         /*
2876          * Read the block containing the "new" attr, if it is different
2877          */
2878         if (args->blkno2 != args->blkno) {
2879                 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2,
2880                                            &bp2);
2881                 if (error)
2882                         return error;
2883         } else {
2884                 bp2 = bp1;
2885         }
2886
2887         leaf1 = bp1->b_addr;
2888         entry1 = &xfs_attr3_leaf_entryp(leaf1)[args->index];
2889
2890         leaf2 = bp2->b_addr;
2891         entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2];
2892
2893 #ifdef DEBUG
2894         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr1, leaf1);
2895         ASSERT(args->index < ichdr1.count);
2896         ASSERT(args->index >= 0);
2897
2898         xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr2, leaf2);
2899         ASSERT(args->index2 < ichdr2.count);
2900         ASSERT(args->index2 >= 0);
2901
2902         if (entry1->flags & XFS_ATTR_LOCAL) {
2903                 name_loc = xfs_attr3_leaf_name_local(leaf1, args->index);
2904                 namelen1 = name_loc->namelen;
2905                 name1 = (char *)name_loc->nameval;
2906         } else {
2907                 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2908                 namelen1 = name_rmt->namelen;
2909                 name1 = (char *)name_rmt->name;
2910         }
2911         if (entry2->flags & XFS_ATTR_LOCAL) {
2912                 name_loc = xfs_attr3_leaf_name_local(leaf2, args->index2);
2913                 namelen2 = name_loc->namelen;
2914                 name2 = (char *)name_loc->nameval;
2915         } else {
2916                 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2917                 namelen2 = name_rmt->namelen;
2918                 name2 = (char *)name_rmt->name;
2919         }
2920         ASSERT(be32_to_cpu(entry1->hashval) == be32_to_cpu(entry2->hashval));
2921         ASSERT(namelen1 == namelen2);
2922         ASSERT(memcmp(name1, name2, namelen1) == 0);
2923 #endif /* DEBUG */
2924
2925         ASSERT(entry1->flags & XFS_ATTR_INCOMPLETE);
2926         ASSERT((entry2->flags & XFS_ATTR_INCOMPLETE) == 0);
2927
2928         entry1->flags &= ~XFS_ATTR_INCOMPLETE;
2929         xfs_trans_log_buf(args->trans, bp1,
2930                           XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1)));
2931         if (args->rmtblkno) {
2932                 ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0);
2933                 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
2934                 name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
2935                 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
2936                 xfs_trans_log_buf(args->trans, bp1,
2937                          XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt)));
2938         }
2939
2940         entry2->flags |= XFS_ATTR_INCOMPLETE;
2941         xfs_trans_log_buf(args->trans, bp2,
2942                           XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2)));
2943         if ((entry2->flags & XFS_ATTR_LOCAL) == 0) {
2944                 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2);
2945                 name_rmt->valueblk = 0;
2946                 name_rmt->valuelen = 0;
2947                 xfs_trans_log_buf(args->trans, bp2,
2948                          XFS_DA_LOGRANGE(leaf2, name_rmt, sizeof(*name_rmt)));
2949         }
2950
2951         return 0;
2952 }