Linux-libre 4.19.123-gnu
[librecmc/linux-libre.git] / fs / xfs / libxfs / xfs_dir2_block.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2003,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_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_da_format.h"
14 #include "xfs_da_btree.h"
15 #include "xfs_inode.h"
16 #include "xfs_trans.h"
17 #include "xfs_inode_item.h"
18 #include "xfs_bmap.h"
19 #include "xfs_buf_item.h"
20 #include "xfs_dir2.h"
21 #include "xfs_dir2_priv.h"
22 #include "xfs_error.h"
23 #include "xfs_trace.h"
24 #include "xfs_cksum.h"
25 #include "xfs_log.h"
26
27 /*
28  * Local function prototypes.
29  */
30 static void xfs_dir2_block_log_leaf(xfs_trans_t *tp, struct xfs_buf *bp,
31                                     int first, int last);
32 static void xfs_dir2_block_log_tail(xfs_trans_t *tp, struct xfs_buf *bp);
33 static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, struct xfs_buf **bpp,
34                                      int *entno);
35 static int xfs_dir2_block_sort(const void *a, const void *b);
36
37 static xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot;
38
39 /*
40  * One-time startup routine called from xfs_init().
41  */
42 void
43 xfs_dir_startup(void)
44 {
45         xfs_dir_hash_dot = xfs_da_hashname((unsigned char *)".", 1);
46         xfs_dir_hash_dotdot = xfs_da_hashname((unsigned char *)"..", 2);
47 }
48
49 static xfs_failaddr_t
50 xfs_dir3_block_verify(
51         struct xfs_buf          *bp)
52 {
53         struct xfs_mount        *mp = bp->b_target->bt_mount;
54         struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
55
56         if (xfs_sb_version_hascrc(&mp->m_sb)) {
57                 if (hdr3->magic != cpu_to_be32(XFS_DIR3_BLOCK_MAGIC))
58                         return __this_address;
59                 if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
60                         return __this_address;
61                 if (be64_to_cpu(hdr3->blkno) != bp->b_bn)
62                         return __this_address;
63                 if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
64                         return __this_address;
65         } else {
66                 if (hdr3->magic != cpu_to_be32(XFS_DIR2_BLOCK_MAGIC))
67                         return __this_address;
68         }
69         return __xfs_dir3_data_check(NULL, bp);
70 }
71
72 static void
73 xfs_dir3_block_read_verify(
74         struct xfs_buf  *bp)
75 {
76         struct xfs_mount        *mp = bp->b_target->bt_mount;
77         xfs_failaddr_t          fa;
78
79         if (xfs_sb_version_hascrc(&mp->m_sb) &&
80              !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF))
81                 xfs_verifier_error(bp, -EFSBADCRC, __this_address);
82         else {
83                 fa = xfs_dir3_block_verify(bp);
84                 if (fa)
85                         xfs_verifier_error(bp, -EFSCORRUPTED, fa);
86         }
87 }
88
89 static void
90 xfs_dir3_block_write_verify(
91         struct xfs_buf  *bp)
92 {
93         struct xfs_mount        *mp = bp->b_target->bt_mount;
94         struct xfs_buf_log_item *bip = bp->b_log_item;
95         struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
96         xfs_failaddr_t          fa;
97
98         fa = xfs_dir3_block_verify(bp);
99         if (fa) {
100                 xfs_verifier_error(bp, -EFSCORRUPTED, fa);
101                 return;
102         }
103
104         if (!xfs_sb_version_hascrc(&mp->m_sb))
105                 return;
106
107         if (bip)
108                 hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn);
109
110         xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF);
111 }
112
113 const struct xfs_buf_ops xfs_dir3_block_buf_ops = {
114         .name = "xfs_dir3_block",
115         .verify_read = xfs_dir3_block_read_verify,
116         .verify_write = xfs_dir3_block_write_verify,
117         .verify_struct = xfs_dir3_block_verify,
118 };
119
120 int
121 xfs_dir3_block_read(
122         struct xfs_trans        *tp,
123         struct xfs_inode        *dp,
124         struct xfs_buf          **bpp)
125 {
126         struct xfs_mount        *mp = dp->i_mount;
127         int                     err;
128
129         err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp,
130                                 XFS_DATA_FORK, &xfs_dir3_block_buf_ops);
131         if (!err && tp && *bpp)
132                 xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF);
133         return err;
134 }
135
136 static void
137 xfs_dir3_block_init(
138         struct xfs_mount        *mp,
139         struct xfs_trans        *tp,
140         struct xfs_buf          *bp,
141         struct xfs_inode        *dp)
142 {
143         struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
144
145         bp->b_ops = &xfs_dir3_block_buf_ops;
146         xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF);
147
148         if (xfs_sb_version_hascrc(&mp->m_sb)) {
149                 memset(hdr3, 0, sizeof(*hdr3));
150                 hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC);
151                 hdr3->blkno = cpu_to_be64(bp->b_bn);
152                 hdr3->owner = cpu_to_be64(dp->i_ino);
153                 uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
154                 return;
155
156         }
157         hdr3->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC);
158 }
159
160 static void
161 xfs_dir2_block_need_space(
162         struct xfs_inode                *dp,
163         struct xfs_dir2_data_hdr        *hdr,
164         struct xfs_dir2_block_tail      *btp,
165         struct xfs_dir2_leaf_entry      *blp,
166         __be16                          **tagpp,
167         struct xfs_dir2_data_unused     **dupp,
168         struct xfs_dir2_data_unused     **enddupp,
169         int                             *compact,
170         int                             len)
171 {
172         struct xfs_dir2_data_free       *bf;
173         __be16                          *tagp = NULL;
174         struct xfs_dir2_data_unused     *dup = NULL;
175         struct xfs_dir2_data_unused     *enddup = NULL;
176
177         *compact = 0;
178         bf = dp->d_ops->data_bestfree_p(hdr);
179
180         /*
181          * If there are stale entries we'll use one for the leaf.
182          */
183         if (btp->stale) {
184                 if (be16_to_cpu(bf[0].length) >= len) {
185                         /*
186                          * The biggest entry enough to avoid compaction.
187                          */
188                         dup = (xfs_dir2_data_unused_t *)
189                               ((char *)hdr + be16_to_cpu(bf[0].offset));
190                         goto out;
191                 }
192
193                 /*
194                  * Will need to compact to make this work.
195                  * Tag just before the first leaf entry.
196                  */
197                 *compact = 1;
198                 tagp = (__be16 *)blp - 1;
199
200                 /* Data object just before the first leaf entry.  */
201                 dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));
202
203                 /*
204                  * If it's not free then the data will go where the
205                  * leaf data starts now, if it works at all.
206                  */
207                 if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) {
208                         if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) *
209                             (uint)sizeof(*blp) < len)
210                                 dup = NULL;
211                 } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len)
212                         dup = NULL;
213                 else
214                         dup = (xfs_dir2_data_unused_t *)blp;
215                 goto out;
216         }
217
218         /*
219          * no stale entries, so just use free space.
220          * Tag just before the first leaf entry.
221          */
222         tagp = (__be16 *)blp - 1;
223
224         /* Data object just before the first leaf entry.  */
225         enddup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));
226
227         /*
228          * If it's not free then can't do this add without cleaning up:
229          * the space before the first leaf entry needs to be free so it
230          * can be expanded to hold the pointer to the new entry.
231          */
232         if (be16_to_cpu(enddup->freetag) == XFS_DIR2_DATA_FREE_TAG) {
233                 /*
234                  * Check out the biggest freespace and see if it's the same one.
235                  */
236                 dup = (xfs_dir2_data_unused_t *)
237                       ((char *)hdr + be16_to_cpu(bf[0].offset));
238                 if (dup != enddup) {
239                         /*
240                          * Not the same free entry, just check its length.
241                          */
242                         if (be16_to_cpu(dup->length) < len)
243                                 dup = NULL;
244                         goto out;
245                 }
246
247                 /*
248                  * It is the biggest freespace, can it hold the leaf too?
249                  */
250                 if (be16_to_cpu(dup->length) < len + (uint)sizeof(*blp)) {
251                         /*
252                          * Yes, use the second-largest entry instead if it works.
253                          */
254                         if (be16_to_cpu(bf[1].length) >= len)
255                                 dup = (xfs_dir2_data_unused_t *)
256                                       ((char *)hdr + be16_to_cpu(bf[1].offset));
257                         else
258                                 dup = NULL;
259                 }
260         }
261 out:
262         *tagpp = tagp;
263         *dupp = dup;
264         *enddupp = enddup;
265 }
266
267 /*
268  * compact the leaf entries.
269  * Leave the highest-numbered stale entry stale.
270  * XXX should be the one closest to mid but mid is not yet computed.
271  */
272 static void
273 xfs_dir2_block_compact(
274         struct xfs_da_args              *args,
275         struct xfs_buf                  *bp,
276         struct xfs_dir2_data_hdr        *hdr,
277         struct xfs_dir2_block_tail      *btp,
278         struct xfs_dir2_leaf_entry      *blp,
279         int                             *needlog,
280         int                             *lfloghigh,
281         int                             *lfloglow)
282 {
283         int                     fromidx;        /* source leaf index */
284         int                     toidx;          /* target leaf index */
285         int                     needscan = 0;
286         int                     highstale;      /* high stale index */
287
288         fromidx = toidx = be32_to_cpu(btp->count) - 1;
289         highstale = *lfloghigh = -1;
290         for (; fromidx >= 0; fromidx--) {
291                 if (blp[fromidx].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) {
292                         if (highstale == -1)
293                                 highstale = toidx;
294                         else {
295                                 if (*lfloghigh == -1)
296                                         *lfloghigh = toidx;
297                                 continue;
298                         }
299                 }
300                 if (fromidx < toidx)
301                         blp[toidx] = blp[fromidx];
302                 toidx--;
303         }
304         *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1);
305         *lfloghigh -= be32_to_cpu(btp->stale) - 1;
306         be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1));
307         xfs_dir2_data_make_free(args, bp,
308                 (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr),
309                 (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)),
310                 needlog, &needscan);
311         btp->stale = cpu_to_be32(1);
312         /*
313          * If we now need to rebuild the bestfree map, do so.
314          * This needs to happen before the next call to use_free.
315          */
316         if (needscan)
317                 xfs_dir2_data_freescan(args->dp, hdr, needlog);
318 }
319
320 /*
321  * Add an entry to a block directory.
322  */
323 int                                             /* error */
324 xfs_dir2_block_addname(
325         xfs_da_args_t           *args)          /* directory op arguments */
326 {
327         xfs_dir2_data_hdr_t     *hdr;           /* block header */
328         xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
329         struct xfs_buf          *bp;            /* buffer for block */
330         xfs_dir2_block_tail_t   *btp;           /* block tail */
331         int                     compact;        /* need to compact leaf ents */
332         xfs_dir2_data_entry_t   *dep;           /* block data entry */
333         xfs_inode_t             *dp;            /* directory inode */
334         xfs_dir2_data_unused_t  *dup;           /* block unused entry */
335         int                     error;          /* error return value */
336         xfs_dir2_data_unused_t  *enddup=NULL;   /* unused at end of data */
337         xfs_dahash_t            hash;           /* hash value of found entry */
338         int                     high;           /* high index for binary srch */
339         int                     highstale;      /* high stale index */
340         int                     lfloghigh=0;    /* last final leaf to log */
341         int                     lfloglow=0;     /* first final leaf to log */
342         int                     len;            /* length of the new entry */
343         int                     low;            /* low index for binary srch */
344         int                     lowstale;       /* low stale index */
345         int                     mid=0;          /* midpoint for binary srch */
346         int                     needlog;        /* need to log header */
347         int                     needscan;       /* need to rescan freespace */
348         __be16                  *tagp;          /* pointer to tag value */
349         xfs_trans_t             *tp;            /* transaction structure */
350
351         trace_xfs_dir2_block_addname(args);
352
353         dp = args->dp;
354         tp = args->trans;
355
356         /* Read the (one and only) directory block into bp. */
357         error = xfs_dir3_block_read(tp, dp, &bp);
358         if (error)
359                 return error;
360
361         len = dp->d_ops->data_entsize(args->namelen);
362
363         /*
364          * Set up pointers to parts of the block.
365          */
366         hdr = bp->b_addr;
367         btp = xfs_dir2_block_tail_p(args->geo, hdr);
368         blp = xfs_dir2_block_leaf_p(btp);
369
370         /*
371          * Find out if we can reuse stale entries or whether we need extra
372          * space for entry and new leaf.
373          */
374         xfs_dir2_block_need_space(dp, hdr, btp, blp, &tagp, &dup,
375                                   &enddup, &compact, len);
376
377         /*
378          * Done everything we need for a space check now.
379          */
380         if (args->op_flags & XFS_DA_OP_JUSTCHECK) {
381                 xfs_trans_brelse(tp, bp);
382                 if (!dup)
383                         return -ENOSPC;
384                 return 0;
385         }
386
387         /*
388          * If we don't have space for the new entry & leaf ...
389          */
390         if (!dup) {
391                 /* Don't have a space reservation: return no-space.  */
392                 if (args->total == 0)
393                         return -ENOSPC;
394                 /*
395                  * Convert to the next larger format.
396                  * Then add the new entry in that format.
397                  */
398                 error = xfs_dir2_block_to_leaf(args, bp);
399                 if (error)
400                         return error;
401                 return xfs_dir2_leaf_addname(args);
402         }
403
404         needlog = needscan = 0;
405
406         /*
407          * If need to compact the leaf entries, do it now.
408          */
409         if (compact) {
410                 xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog,
411                                       &lfloghigh, &lfloglow);
412                 /* recalculate blp post-compaction */
413                 blp = xfs_dir2_block_leaf_p(btp);
414         } else if (btp->stale) {
415                 /*
416                  * Set leaf logging boundaries to impossible state.
417                  * For the no-stale case they're set explicitly.
418                  */
419                 lfloglow = be32_to_cpu(btp->count);
420                 lfloghigh = -1;
421         }
422
423         /*
424          * Find the slot that's first lower than our hash value, -1 if none.
425          */
426         for (low = 0, high = be32_to_cpu(btp->count) - 1; low <= high; ) {
427                 mid = (low + high) >> 1;
428                 if ((hash = be32_to_cpu(blp[mid].hashval)) == args->hashval)
429                         break;
430                 if (hash < args->hashval)
431                         low = mid + 1;
432                 else
433                         high = mid - 1;
434         }
435         while (mid >= 0 && be32_to_cpu(blp[mid].hashval) >= args->hashval) {
436                 mid--;
437         }
438         /*
439          * No stale entries, will use enddup space to hold new leaf.
440          */
441         if (!btp->stale) {
442                 xfs_dir2_data_aoff_t    aoff;
443
444                 /*
445                  * Mark the space needed for the new leaf entry, now in use.
446                  */
447                 aoff = (xfs_dir2_data_aoff_t)((char *)enddup - (char *)hdr +
448                                 be16_to_cpu(enddup->length) - sizeof(*blp));
449                 error = xfs_dir2_data_use_free(args, bp, enddup, aoff,
450                                 (xfs_dir2_data_aoff_t)sizeof(*blp), &needlog,
451                                 &needscan);
452                 if (error)
453                         return error;
454
455                 /*
456                  * Update the tail (entry count).
457                  */
458                 be32_add_cpu(&btp->count, 1);
459                 /*
460                  * If we now need to rebuild the bestfree map, do so.
461                  * This needs to happen before the next call to use_free.
462                  */
463                 if (needscan) {
464                         xfs_dir2_data_freescan(dp, hdr, &needlog);
465                         needscan = 0;
466                 }
467                 /*
468                  * Adjust pointer to the first leaf entry, we're about to move
469                  * the table up one to open up space for the new leaf entry.
470                  * Then adjust our index to match.
471                  */
472                 blp--;
473                 mid++;
474                 if (mid)
475                         memmove(blp, &blp[1], mid * sizeof(*blp));
476                 lfloglow = 0;
477                 lfloghigh = mid;
478         }
479         /*
480          * Use a stale leaf for our new entry.
481          */
482         else {
483                 for (lowstale = mid;
484                      lowstale >= 0 &&
485                         blp[lowstale].address !=
486                         cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
487                      lowstale--)
488                         continue;
489                 for (highstale = mid + 1;
490                      highstale < be32_to_cpu(btp->count) &&
491                         blp[highstale].address !=
492                         cpu_to_be32(XFS_DIR2_NULL_DATAPTR) &&
493                         (lowstale < 0 || mid - lowstale > highstale - mid);
494                      highstale++)
495                         continue;
496                 /*
497                  * Move entries toward the low-numbered stale entry.
498                  */
499                 if (lowstale >= 0 &&
500                     (highstale == be32_to_cpu(btp->count) ||
501                      mid - lowstale <= highstale - mid)) {
502                         if (mid - lowstale)
503                                 memmove(&blp[lowstale], &blp[lowstale + 1],
504                                         (mid - lowstale) * sizeof(*blp));
505                         lfloglow = min(lowstale, lfloglow);
506                         lfloghigh = max(mid, lfloghigh);
507                 }
508                 /*
509                  * Move entries toward the high-numbered stale entry.
510                  */
511                 else {
512                         ASSERT(highstale < be32_to_cpu(btp->count));
513                         mid++;
514                         if (highstale - mid)
515                                 memmove(&blp[mid + 1], &blp[mid],
516                                         (highstale - mid) * sizeof(*blp));
517                         lfloglow = min(mid, lfloglow);
518                         lfloghigh = max(highstale, lfloghigh);
519                 }
520                 be32_add_cpu(&btp->stale, -1);
521         }
522         /*
523          * Point to the new data entry.
524          */
525         dep = (xfs_dir2_data_entry_t *)dup;
526         /*
527          * Fill in the leaf entry.
528          */
529         blp[mid].hashval = cpu_to_be32(args->hashval);
530         blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
531                                 (char *)dep - (char *)hdr));
532         xfs_dir2_block_log_leaf(tp, bp, lfloglow, lfloghigh);
533         /*
534          * Mark space for the data entry used.
535          */
536         error = xfs_dir2_data_use_free(args, bp, dup,
537                         (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),
538                         (xfs_dir2_data_aoff_t)len, &needlog, &needscan);
539         if (error)
540                 return error;
541         /*
542          * Create the new data entry.
543          */
544         dep->inumber = cpu_to_be64(args->inumber);
545         dep->namelen = args->namelen;
546         memcpy(dep->name, args->name, args->namelen);
547         dp->d_ops->data_put_ftype(dep, args->filetype);
548         tagp = dp->d_ops->data_entry_tag_p(dep);
549         *tagp = cpu_to_be16((char *)dep - (char *)hdr);
550         /*
551          * Clean up the bestfree array and log the header, tail, and entry.
552          */
553         if (needscan)
554                 xfs_dir2_data_freescan(dp, hdr, &needlog);
555         if (needlog)
556                 xfs_dir2_data_log_header(args, bp);
557         xfs_dir2_block_log_tail(tp, bp);
558         xfs_dir2_data_log_entry(args, bp, dep);
559         xfs_dir3_data_check(dp, bp);
560         return 0;
561 }
562
563 /*
564  * Log leaf entries from the block.
565  */
566 static void
567 xfs_dir2_block_log_leaf(
568         xfs_trans_t             *tp,            /* transaction structure */
569         struct xfs_buf          *bp,            /* block buffer */
570         int                     first,          /* index of first logged leaf */
571         int                     last)           /* index of last logged leaf */
572 {
573         xfs_dir2_data_hdr_t     *hdr = bp->b_addr;
574         xfs_dir2_leaf_entry_t   *blp;
575         xfs_dir2_block_tail_t   *btp;
576
577         btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr);
578         blp = xfs_dir2_block_leaf_p(btp);
579         xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr),
580                 (uint)((char *)&blp[last + 1] - (char *)hdr - 1));
581 }
582
583 /*
584  * Log the block tail.
585  */
586 static void
587 xfs_dir2_block_log_tail(
588         xfs_trans_t             *tp,            /* transaction structure */
589         struct xfs_buf          *bp)            /* block buffer */
590 {
591         xfs_dir2_data_hdr_t     *hdr = bp->b_addr;
592         xfs_dir2_block_tail_t   *btp;
593
594         btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr);
595         xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr),
596                 (uint)((char *)(btp + 1) - (char *)hdr - 1));
597 }
598
599 /*
600  * Look up an entry in the block.  This is the external routine,
601  * xfs_dir2_block_lookup_int does the real work.
602  */
603 int                                             /* error */
604 xfs_dir2_block_lookup(
605         xfs_da_args_t           *args)          /* dir lookup arguments */
606 {
607         xfs_dir2_data_hdr_t     *hdr;           /* block header */
608         xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
609         struct xfs_buf          *bp;            /* block buffer */
610         xfs_dir2_block_tail_t   *btp;           /* block tail */
611         xfs_dir2_data_entry_t   *dep;           /* block data entry */
612         xfs_inode_t             *dp;            /* incore inode */
613         int                     ent;            /* entry index */
614         int                     error;          /* error return value */
615
616         trace_xfs_dir2_block_lookup(args);
617
618         /*
619          * Get the buffer, look up the entry.
620          * If not found (ENOENT) then return, have no buffer.
621          */
622         if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent)))
623                 return error;
624         dp = args->dp;
625         hdr = bp->b_addr;
626         xfs_dir3_data_check(dp, bp);
627         btp = xfs_dir2_block_tail_p(args->geo, hdr);
628         blp = xfs_dir2_block_leaf_p(btp);
629         /*
630          * Get the offset from the leaf entry, to point to the data.
631          */
632         dep = (xfs_dir2_data_entry_t *)((char *)hdr +
633                         xfs_dir2_dataptr_to_off(args->geo,
634                                                 be32_to_cpu(blp[ent].address)));
635         /*
636          * Fill in inode number, CI name if appropriate, release the block.
637          */
638         args->inumber = be64_to_cpu(dep->inumber);
639         args->filetype = dp->d_ops->data_get_ftype(dep);
640         error = xfs_dir_cilookup_result(args, dep->name, dep->namelen);
641         xfs_trans_brelse(args->trans, bp);
642         return error;
643 }
644
645 /*
646  * Internal block lookup routine.
647  */
648 static int                                      /* error */
649 xfs_dir2_block_lookup_int(
650         xfs_da_args_t           *args,          /* dir lookup arguments */
651         struct xfs_buf          **bpp,          /* returned block buffer */
652         int                     *entno)         /* returned entry number */
653 {
654         xfs_dir2_dataptr_t      addr;           /* data entry address */
655         xfs_dir2_data_hdr_t     *hdr;           /* block header */
656         xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
657         struct xfs_buf          *bp;            /* block buffer */
658         xfs_dir2_block_tail_t   *btp;           /* block tail */
659         xfs_dir2_data_entry_t   *dep;           /* block data entry */
660         xfs_inode_t             *dp;            /* incore inode */
661         int                     error;          /* error return value */
662         xfs_dahash_t            hash;           /* found hash value */
663         int                     high;           /* binary search high index */
664         int                     low;            /* binary search low index */
665         int                     mid;            /* binary search current idx */
666         xfs_mount_t             *mp;            /* filesystem mount point */
667         xfs_trans_t             *tp;            /* transaction pointer */
668         enum xfs_dacmp          cmp;            /* comparison result */
669
670         dp = args->dp;
671         tp = args->trans;
672         mp = dp->i_mount;
673
674         error = xfs_dir3_block_read(tp, dp, &bp);
675         if (error)
676                 return error;
677
678         hdr = bp->b_addr;
679         xfs_dir3_data_check(dp, bp);
680         btp = xfs_dir2_block_tail_p(args->geo, hdr);
681         blp = xfs_dir2_block_leaf_p(btp);
682         /*
683          * Loop doing a binary search for our hash value.
684          * Find our entry, ENOENT if it's not there.
685          */
686         for (low = 0, high = be32_to_cpu(btp->count) - 1; ; ) {
687                 ASSERT(low <= high);
688                 mid = (low + high) >> 1;
689                 if ((hash = be32_to_cpu(blp[mid].hashval)) == args->hashval)
690                         break;
691                 if (hash < args->hashval)
692                         low = mid + 1;
693                 else
694                         high = mid - 1;
695                 if (low > high) {
696                         ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
697                         xfs_trans_brelse(tp, bp);
698                         return -ENOENT;
699                 }
700         }
701         /*
702          * Back up to the first one with the right hash value.
703          */
704         while (mid > 0 && be32_to_cpu(blp[mid - 1].hashval) == args->hashval) {
705                 mid--;
706         }
707         /*
708          * Now loop forward through all the entries with the
709          * right hash value looking for our name.
710          */
711         do {
712                 if ((addr = be32_to_cpu(blp[mid].address)) == XFS_DIR2_NULL_DATAPTR)
713                         continue;
714                 /*
715                  * Get pointer to the entry from the leaf.
716                  */
717                 dep = (xfs_dir2_data_entry_t *)
718                         ((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr));
719                 /*
720                  * Compare name and if it's an exact match, return the index
721                  * and buffer. If it's the first case-insensitive match, store
722                  * the index and buffer and continue looking for an exact match.
723                  */
724                 cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen);
725                 if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) {
726                         args->cmpresult = cmp;
727                         *bpp = bp;
728                         *entno = mid;
729                         if (cmp == XFS_CMP_EXACT)
730                                 return 0;
731                 }
732         } while (++mid < be32_to_cpu(btp->count) &&
733                         be32_to_cpu(blp[mid].hashval) == hash);
734
735         ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
736         /*
737          * Here, we can only be doing a lookup (not a rename or replace).
738          * If a case-insensitive match was found earlier, return success.
739          */
740         if (args->cmpresult == XFS_CMP_CASE)
741                 return 0;
742         /*
743          * No match, release the buffer and return ENOENT.
744          */
745         xfs_trans_brelse(tp, bp);
746         return -ENOENT;
747 }
748
749 /*
750  * Remove an entry from a block format directory.
751  * If that makes the block small enough to fit in shortform, transform it.
752  */
753 int                                             /* error */
754 xfs_dir2_block_removename(
755         xfs_da_args_t           *args)          /* directory operation args */
756 {
757         xfs_dir2_data_hdr_t     *hdr;           /* block header */
758         xfs_dir2_leaf_entry_t   *blp;           /* block leaf pointer */
759         struct xfs_buf          *bp;            /* block buffer */
760         xfs_dir2_block_tail_t   *btp;           /* block tail */
761         xfs_dir2_data_entry_t   *dep;           /* block data entry */
762         xfs_inode_t             *dp;            /* incore inode */
763         int                     ent;            /* block leaf entry index */
764         int                     error;          /* error return value */
765         int                     needlog;        /* need to log block header */
766         int                     needscan;       /* need to fixup bestfree */
767         xfs_dir2_sf_hdr_t       sfh;            /* shortform header */
768         int                     size;           /* shortform size */
769         xfs_trans_t             *tp;            /* transaction pointer */
770
771         trace_xfs_dir2_block_removename(args);
772
773         /*
774          * Look up the entry in the block.  Gets the buffer and entry index.
775          * It will always be there, the vnodeops level does a lookup first.
776          */
777         if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent))) {
778                 return error;
779         }
780         dp = args->dp;
781         tp = args->trans;
782         hdr = bp->b_addr;
783         btp = xfs_dir2_block_tail_p(args->geo, hdr);
784         blp = xfs_dir2_block_leaf_p(btp);
785         /*
786          * Point to the data entry using the leaf entry.
787          */
788         dep = (xfs_dir2_data_entry_t *)((char *)hdr +
789                         xfs_dir2_dataptr_to_off(args->geo,
790                                                 be32_to_cpu(blp[ent].address)));
791         /*
792          * Mark the data entry's space free.
793          */
794         needlog = needscan = 0;
795         xfs_dir2_data_make_free(args, bp,
796                 (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr),
797                 dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);
798         /*
799          * Fix up the block tail.
800          */
801         be32_add_cpu(&btp->stale, 1);
802         xfs_dir2_block_log_tail(tp, bp);
803         /*
804          * Remove the leaf entry by marking it stale.
805          */
806         blp[ent].address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
807         xfs_dir2_block_log_leaf(tp, bp, ent, ent);
808         /*
809          * Fix up bestfree, log the header if necessary.
810          */
811         if (needscan)
812                 xfs_dir2_data_freescan(dp, hdr, &needlog);
813         if (needlog)
814                 xfs_dir2_data_log_header(args, bp);
815         xfs_dir3_data_check(dp, bp);
816         /*
817          * See if the size as a shortform is good enough.
818          */
819         size = xfs_dir2_block_sfsize(dp, hdr, &sfh);
820         if (size > XFS_IFORK_DSIZE(dp))
821                 return 0;
822
823         /*
824          * If it works, do the conversion.
825          */
826         return xfs_dir2_block_to_sf(args, bp, size, &sfh);
827 }
828
829 /*
830  * Replace an entry in a V2 block directory.
831  * Change the inode number to the new value.
832  */
833 int                                             /* error */
834 xfs_dir2_block_replace(
835         xfs_da_args_t           *args)          /* directory operation args */
836 {
837         xfs_dir2_data_hdr_t     *hdr;           /* block header */
838         xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
839         struct xfs_buf          *bp;            /* block buffer */
840         xfs_dir2_block_tail_t   *btp;           /* block tail */
841         xfs_dir2_data_entry_t   *dep;           /* block data entry */
842         xfs_inode_t             *dp;            /* incore inode */
843         int                     ent;            /* leaf entry index */
844         int                     error;          /* error return value */
845
846         trace_xfs_dir2_block_replace(args);
847
848         /*
849          * Lookup the entry in the directory.  Get buffer and entry index.
850          * This will always succeed since the caller has already done a lookup.
851          */
852         if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent))) {
853                 return error;
854         }
855         dp = args->dp;
856         hdr = bp->b_addr;
857         btp = xfs_dir2_block_tail_p(args->geo, hdr);
858         blp = xfs_dir2_block_leaf_p(btp);
859         /*
860          * Point to the data entry we need to change.
861          */
862         dep = (xfs_dir2_data_entry_t *)((char *)hdr +
863                         xfs_dir2_dataptr_to_off(args->geo,
864                                                 be32_to_cpu(blp[ent].address)));
865         ASSERT(be64_to_cpu(dep->inumber) != args->inumber);
866         /*
867          * Change the inode number to the new value.
868          */
869         dep->inumber = cpu_to_be64(args->inumber);
870         dp->d_ops->data_put_ftype(dep, args->filetype);
871         xfs_dir2_data_log_entry(args, bp, dep);
872         xfs_dir3_data_check(dp, bp);
873         return 0;
874 }
875
876 /*
877  * Qsort comparison routine for the block leaf entries.
878  */
879 static int                                      /* sort order */
880 xfs_dir2_block_sort(
881         const void                      *a,     /* first leaf entry */
882         const void                      *b)     /* second leaf entry */
883 {
884         const xfs_dir2_leaf_entry_t     *la;    /* first leaf entry */
885         const xfs_dir2_leaf_entry_t     *lb;    /* second leaf entry */
886
887         la = a;
888         lb = b;
889         return be32_to_cpu(la->hashval) < be32_to_cpu(lb->hashval) ? -1 :
890                 (be32_to_cpu(la->hashval) > be32_to_cpu(lb->hashval) ? 1 : 0);
891 }
892
893 /*
894  * Convert a V2 leaf directory to a V2 block directory if possible.
895  */
896 int                                             /* error */
897 xfs_dir2_leaf_to_block(
898         xfs_da_args_t           *args,          /* operation arguments */
899         struct xfs_buf          *lbp,           /* leaf buffer */
900         struct xfs_buf          *dbp)           /* data buffer */
901 {
902         __be16                  *bestsp;        /* leaf bests table */
903         xfs_dir2_data_hdr_t     *hdr;           /* block header */
904         xfs_dir2_block_tail_t   *btp;           /* block tail */
905         xfs_inode_t             *dp;            /* incore directory inode */
906         xfs_dir2_data_unused_t  *dup;           /* unused data entry */
907         int                     error;          /* error return value */
908         int                     from;           /* leaf from index */
909         xfs_dir2_leaf_t         *leaf;          /* leaf structure */
910         xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
911         xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
912         xfs_mount_t             *mp;            /* file system mount point */
913         int                     needlog;        /* need to log data header */
914         int                     needscan;       /* need to scan for bestfree */
915         xfs_dir2_sf_hdr_t       sfh;            /* shortform header */
916         int                     size;           /* bytes used */
917         __be16                  *tagp;          /* end of entry (tag) */
918         int                     to;             /* block/leaf to index */
919         xfs_trans_t             *tp;            /* transaction pointer */
920         struct xfs_dir2_leaf_entry *ents;
921         struct xfs_dir3_icleaf_hdr leafhdr;
922
923         trace_xfs_dir2_leaf_to_block(args);
924
925         dp = args->dp;
926         tp = args->trans;
927         mp = dp->i_mount;
928         leaf = lbp->b_addr;
929         dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
930         ents = dp->d_ops->leaf_ents_p(leaf);
931         ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
932
933         ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC ||
934                leafhdr.magic == XFS_DIR3_LEAF1_MAGIC);
935         /*
936          * If there are data blocks other than the first one, take this
937          * opportunity to remove trailing empty data blocks that may have
938          * been left behind during no-space-reservation operations.
939          * These will show up in the leaf bests table.
940          */
941         while (dp->i_d.di_size > args->geo->blksize) {
942                 int hdrsz;
943
944                 hdrsz = dp->d_ops->data_entry_offset;
945                 bestsp = xfs_dir2_leaf_bests_p(ltp);
946                 if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) ==
947                                             args->geo->blksize - hdrsz) {
948                         if ((error =
949                             xfs_dir2_leaf_trim_data(args, lbp,
950                                     (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1))))
951                                 return error;
952                 } else
953                         return 0;
954         }
955         /*
956          * Read the data block if we don't already have it, give up if it fails.
957          */
958         if (!dbp) {
959                 error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp);
960                 if (error)
961                         return error;
962         }
963         hdr = dbp->b_addr;
964         ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||
965                hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC));
966
967         /*
968          * Size of the "leaf" area in the block.
969          */
970         size = (uint)sizeof(xfs_dir2_block_tail_t) +
971                (uint)sizeof(*lep) * (leafhdr.count - leafhdr.stale);
972         /*
973          * Look at the last data entry.
974          */
975         tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1;
976         dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));
977         /*
978          * If it's not free or is too short we can't do it.
979          */
980         if (be16_to_cpu(dup->freetag) != XFS_DIR2_DATA_FREE_TAG ||
981             be16_to_cpu(dup->length) < size)
982                 return 0;
983
984         /*
985          * Start converting it to block form.
986          */
987         xfs_dir3_block_init(mp, tp, dbp, dp);
988
989         needlog = 1;
990         needscan = 0;
991         /*
992          * Use up the space at the end of the block (blp/btp).
993          */
994         error = xfs_dir2_data_use_free(args, dbp, dup,
995                         args->geo->blksize - size, size, &needlog, &needscan);
996         if (error)
997                 return error;
998         /*
999          * Initialize the block tail.
1000          */
1001         btp = xfs_dir2_block_tail_p(args->geo, hdr);
1002         btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale);
1003         btp->stale = 0;
1004         xfs_dir2_block_log_tail(tp, dbp);
1005         /*
1006          * Initialize the block leaf area.  We compact out stale entries.
1007          */
1008         lep = xfs_dir2_block_leaf_p(btp);
1009         for (from = to = 0; from < leafhdr.count; from++) {
1010                 if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
1011                         continue;
1012                 lep[to++] = ents[from];
1013         }
1014         ASSERT(to == be32_to_cpu(btp->count));
1015         xfs_dir2_block_log_leaf(tp, dbp, 0, be32_to_cpu(btp->count) - 1);
1016         /*
1017          * Scan the bestfree if we need it and log the data block header.
1018          */
1019         if (needscan)
1020                 xfs_dir2_data_freescan(dp, hdr, &needlog);
1021         if (needlog)
1022                 xfs_dir2_data_log_header(args, dbp);
1023         /*
1024          * Pitch the old leaf block.
1025          */
1026         error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp);
1027         if (error)
1028                 return error;
1029
1030         /*
1031          * Now see if the resulting block can be shrunken to shortform.
1032          */
1033         size = xfs_dir2_block_sfsize(dp, hdr, &sfh);
1034         if (size > XFS_IFORK_DSIZE(dp))
1035                 return 0;
1036
1037         return xfs_dir2_block_to_sf(args, dbp, size, &sfh);
1038 }
1039
1040 /*
1041  * Convert the shortform directory to block form.
1042  */
1043 int                                             /* error */
1044 xfs_dir2_sf_to_block(
1045         xfs_da_args_t           *args)          /* operation arguments */
1046 {
1047         xfs_dir2_db_t           blkno;          /* dir-relative block # (0) */
1048         xfs_dir2_data_hdr_t     *hdr;           /* block header */
1049         xfs_dir2_leaf_entry_t   *blp;           /* block leaf entries */
1050         struct xfs_buf          *bp;            /* block buffer */
1051         xfs_dir2_block_tail_t   *btp;           /* block tail pointer */
1052         xfs_dir2_data_entry_t   *dep;           /* data entry pointer */
1053         xfs_inode_t             *dp;            /* incore directory inode */
1054         int                     dummy;          /* trash */
1055         xfs_dir2_data_unused_t  *dup;           /* unused entry pointer */
1056         int                     endoffset;      /* end of data objects */
1057         int                     error;          /* error return value */
1058         int                     i;              /* index */
1059         xfs_mount_t             *mp;            /* filesystem mount point */
1060         int                     needlog;        /* need to log block header */
1061         int                     needscan;       /* need to scan block freespc */
1062         int                     newoffset;      /* offset from current entry */
1063         int                     offset;         /* target block offset */
1064         xfs_dir2_sf_entry_t     *sfep;          /* sf entry pointer */
1065         xfs_dir2_sf_hdr_t       *oldsfp;        /* old shortform header  */
1066         xfs_dir2_sf_hdr_t       *sfp;           /* shortform header  */
1067         __be16                  *tagp;          /* end of data entry */
1068         xfs_trans_t             *tp;            /* transaction pointer */
1069         struct xfs_name         name;
1070         struct xfs_ifork        *ifp;
1071
1072         trace_xfs_dir2_sf_to_block(args);
1073
1074         dp = args->dp;
1075         tp = args->trans;
1076         mp = dp->i_mount;
1077         ifp = XFS_IFORK_PTR(dp, XFS_DATA_FORK);
1078         ASSERT(ifp->if_flags & XFS_IFINLINE);
1079         /*
1080          * Bomb out if the shortform directory is way too short.
1081          */
1082         if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) {
1083                 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1084                 return -EIO;
1085         }
1086
1087         oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data;
1088
1089         ASSERT(ifp->if_bytes == dp->i_d.di_size);
1090         ASSERT(ifp->if_u1.if_data != NULL);
1091         ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count));
1092         ASSERT(dp->i_d.di_nextents == 0);
1093
1094         /*
1095          * Copy the directory into a temporary buffer.
1096          * Then pitch the incore inode data so we can make extents.
1097          */
1098         sfp = kmem_alloc(ifp->if_bytes, KM_SLEEP);
1099         memcpy(sfp, oldsfp, ifp->if_bytes);
1100
1101         xfs_idata_realloc(dp, -ifp->if_bytes, XFS_DATA_FORK);
1102         xfs_bmap_local_to_extents_empty(dp, XFS_DATA_FORK);
1103         dp->i_d.di_size = 0;
1104
1105         /*
1106          * Add block 0 to the inode.
1107          */
1108         error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &blkno);
1109         if (error)
1110                 goto out_free;
1111         /*
1112          * Initialize the data block, then convert it to block format.
1113          */
1114         error = xfs_dir3_data_init(args, blkno, &bp);
1115         if (error)
1116                 goto out_free;
1117         xfs_dir3_block_init(mp, tp, bp, dp);
1118         hdr = bp->b_addr;
1119
1120         /*
1121          * Compute size of block "tail" area.
1122          */
1123         i = (uint)sizeof(*btp) +
1124             (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t);
1125         /*
1126          * The whole thing is initialized to free by the init routine.
1127          * Say we're using the leaf and tail area.
1128          */
1129         dup = dp->d_ops->data_unused_p(hdr);
1130         needlog = needscan = 0;
1131         error = xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i,
1132                         i, &needlog, &needscan);
1133         if (error)
1134                 goto out_free;
1135         ASSERT(needscan == 0);
1136         /*
1137          * Fill in the tail.
1138          */
1139         btp = xfs_dir2_block_tail_p(args->geo, hdr);
1140         btp->count = cpu_to_be32(sfp->count + 2);       /* ., .. */
1141         btp->stale = 0;
1142         blp = xfs_dir2_block_leaf_p(btp);
1143         endoffset = (uint)((char *)blp - (char *)hdr);
1144         /*
1145          * Remove the freespace, we'll manage it.
1146          */
1147         error = xfs_dir2_data_use_free(args, bp, dup,
1148                         (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),
1149                         be16_to_cpu(dup->length), &needlog, &needscan);
1150         if (error)
1151                 goto out_free;
1152         /*
1153          * Create entry for .
1154          */
1155         dep = dp->d_ops->data_dot_entry_p(hdr);
1156         dep->inumber = cpu_to_be64(dp->i_ino);
1157         dep->namelen = 1;
1158         dep->name[0] = '.';
1159         dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR);
1160         tagp = dp->d_ops->data_entry_tag_p(dep);
1161         *tagp = cpu_to_be16((char *)dep - (char *)hdr);
1162         xfs_dir2_data_log_entry(args, bp, dep);
1163         blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot);
1164         blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
1165                                 (char *)dep - (char *)hdr));
1166         /*
1167          * Create entry for ..
1168          */
1169         dep = dp->d_ops->data_dotdot_entry_p(hdr);
1170         dep->inumber = cpu_to_be64(dp->d_ops->sf_get_parent_ino(sfp));
1171         dep->namelen = 2;
1172         dep->name[0] = dep->name[1] = '.';
1173         dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR);
1174         tagp = dp->d_ops->data_entry_tag_p(dep);
1175         *tagp = cpu_to_be16((char *)dep - (char *)hdr);
1176         xfs_dir2_data_log_entry(args, bp, dep);
1177         blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot);
1178         blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
1179                                 (char *)dep - (char *)hdr));
1180         offset = dp->d_ops->data_first_offset;
1181         /*
1182          * Loop over existing entries, stuff them in.
1183          */
1184         i = 0;
1185         if (!sfp->count)
1186                 sfep = NULL;
1187         else
1188                 sfep = xfs_dir2_sf_firstentry(sfp);
1189         /*
1190          * Need to preserve the existing offset values in the sf directory.
1191          * Insert holes (unused entries) where necessary.
1192          */
1193         while (offset < endoffset) {
1194                 /*
1195                  * sfep is null when we reach the end of the list.
1196                  */
1197                 if (sfep == NULL)
1198                         newoffset = endoffset;
1199                 else
1200                         newoffset = xfs_dir2_sf_get_offset(sfep);
1201                 /*
1202                  * There should be a hole here, make one.
1203                  */
1204                 if (offset < newoffset) {
1205                         dup = (xfs_dir2_data_unused_t *)((char *)hdr + offset);
1206                         dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG);
1207                         dup->length = cpu_to_be16(newoffset - offset);
1208                         *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16(
1209                                 ((char *)dup - (char *)hdr));
1210                         xfs_dir2_data_log_unused(args, bp, dup);
1211                         xfs_dir2_data_freeinsert(hdr,
1212                                                  dp->d_ops->data_bestfree_p(hdr),
1213                                                  dup, &dummy);
1214                         offset += be16_to_cpu(dup->length);
1215                         continue;
1216                 }
1217                 /*
1218                  * Copy a real entry.
1219                  */
1220                 dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset);
1221                 dep->inumber = cpu_to_be64(dp->d_ops->sf_get_ino(sfp, sfep));
1222                 dep->namelen = sfep->namelen;
1223                 dp->d_ops->data_put_ftype(dep, dp->d_ops->sf_get_ftype(sfep));
1224                 memcpy(dep->name, sfep->name, dep->namelen);
1225                 tagp = dp->d_ops->data_entry_tag_p(dep);
1226                 *tagp = cpu_to_be16((char *)dep - (char *)hdr);
1227                 xfs_dir2_data_log_entry(args, bp, dep);
1228                 name.name = sfep->name;
1229                 name.len = sfep->namelen;
1230                 blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops->
1231                                                         hashname(&name));
1232                 blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(
1233                                                  (char *)dep - (char *)hdr));
1234                 offset = (int)((char *)(tagp + 1) - (char *)hdr);
1235                 if (++i == sfp->count)
1236                         sfep = NULL;
1237                 else
1238                         sfep = dp->d_ops->sf_nextentry(sfp, sfep);
1239         }
1240         /* Done with the temporary buffer */
1241         kmem_free(sfp);
1242         /*
1243          * Sort the leaf entries by hash value.
1244          */
1245         xfs_sort(blp, be32_to_cpu(btp->count), sizeof(*blp), xfs_dir2_block_sort);
1246         /*
1247          * Log the leaf entry area and tail.
1248          * Already logged the header in data_init, ignore needlog.
1249          */
1250         ASSERT(needscan == 0);
1251         xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1);
1252         xfs_dir2_block_log_tail(tp, bp);
1253         xfs_dir3_data_check(dp, bp);
1254         return 0;
1255 out_free:
1256         kmem_free(sfp);
1257         return error;
1258 }