~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/xfs/xfs_da_btree.c

Version: ~ [ linux-5.11 ] ~ [ linux-5.10.17 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.99 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.176 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.221 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.257 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.257 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
  3  * Copyright (c) 2013 Red Hat, Inc.
  4  * All Rights Reserved.
  5  *
  6  * This program is free software; you can redistribute it and/or
  7  * modify it under the terms of the GNU General Public License as
  8  * published by the Free Software Foundation.
  9  *
 10  * This program is distributed in the hope that it would be useful,
 11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13  * GNU General Public License for more details.
 14  *
 15  * You should have received a copy of the GNU General Public License
 16  * along with this program; if not, write the Free Software Foundation,
 17  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 18  */
 19 #include "xfs.h"
 20 #include "xfs_fs.h"
 21 #include "xfs_shared.h"
 22 #include "xfs_format.h"
 23 #include "xfs_log_format.h"
 24 #include "xfs_trans_resv.h"
 25 #include "xfs_bit.h"
 26 #include "xfs_sb.h"
 27 #include "xfs_ag.h"
 28 #include "xfs_mount.h"
 29 #include "xfs_da_format.h"
 30 #include "xfs_da_btree.h"
 31 #include "xfs_dir2.h"
 32 #include "xfs_dir2_priv.h"
 33 #include "xfs_inode.h"
 34 #include "xfs_trans.h"
 35 #include "xfs_inode_item.h"
 36 #include "xfs_alloc.h"
 37 #include "xfs_bmap.h"
 38 #include "xfs_attr.h"
 39 #include "xfs_attr_leaf.h"
 40 #include "xfs_error.h"
 41 #include "xfs_trace.h"
 42 #include "xfs_cksum.h"
 43 #include "xfs_buf_item.h"
 44 
 45 /*
 46  * xfs_da_btree.c
 47  *
 48  * Routines to implement directories as Btrees of hashed names.
 49  */
 50 
 51 /*========================================================================
 52  * Function prototypes for the kernel.
 53  *========================================================================*/
 54 
 55 /*
 56  * Routines used for growing the Btree.
 57  */
 58 STATIC int xfs_da3_root_split(xfs_da_state_t *state,
 59                                             xfs_da_state_blk_t *existing_root,
 60                                             xfs_da_state_blk_t *new_child);
 61 STATIC int xfs_da3_node_split(xfs_da_state_t *state,
 62                                             xfs_da_state_blk_t *existing_blk,
 63                                             xfs_da_state_blk_t *split_blk,
 64                                             xfs_da_state_blk_t *blk_to_add,
 65                                             int treelevel,
 66                                             int *result);
 67 STATIC void xfs_da3_node_rebalance(xfs_da_state_t *state,
 68                                          xfs_da_state_blk_t *node_blk_1,
 69                                          xfs_da_state_blk_t *node_blk_2);
 70 STATIC void xfs_da3_node_add(xfs_da_state_t *state,
 71                                    xfs_da_state_blk_t *old_node_blk,
 72                                    xfs_da_state_blk_t *new_node_blk);
 73 
 74 /*
 75  * Routines used for shrinking the Btree.
 76  */
 77 STATIC int xfs_da3_root_join(xfs_da_state_t *state,
 78                                            xfs_da_state_blk_t *root_blk);
 79 STATIC int xfs_da3_node_toosmall(xfs_da_state_t *state, int *retval);
 80 STATIC void xfs_da3_node_remove(xfs_da_state_t *state,
 81                                               xfs_da_state_blk_t *drop_blk);
 82 STATIC void xfs_da3_node_unbalance(xfs_da_state_t *state,
 83                                          xfs_da_state_blk_t *src_node_blk,
 84                                          xfs_da_state_blk_t *dst_node_blk);
 85 
 86 /*
 87  * Utility routines.
 88  */
 89 STATIC int      xfs_da3_blk_unlink(xfs_da_state_t *state,
 90                                   xfs_da_state_blk_t *drop_blk,
 91                                   xfs_da_state_blk_t *save_blk);
 92 
 93 
 94 kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */
 95 
 96 /*
 97  * Allocate a dir-state structure.
 98  * We don't put them on the stack since they're large.
 99  */
100 xfs_da_state_t *
101 xfs_da_state_alloc(void)
102 {
103         return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS);
104 }
105 
106 /*
107  * Kill the altpath contents of a da-state structure.
108  */
109 STATIC void
110 xfs_da_state_kill_altpath(xfs_da_state_t *state)
111 {
112         int     i;
113 
114         for (i = 0; i < state->altpath.active; i++)
115                 state->altpath.blk[i].bp = NULL;
116         state->altpath.active = 0;
117 }
118 
119 /*
120  * Free a da-state structure.
121  */
122 void
123 xfs_da_state_free(xfs_da_state_t *state)
124 {
125         xfs_da_state_kill_altpath(state);
126 #ifdef DEBUG
127         memset((char *)state, 0, sizeof(*state));
128 #endif /* DEBUG */
129         kmem_zone_free(xfs_da_state_zone, state);
130 }
131 
132 static bool
133 xfs_da3_node_verify(
134         struct xfs_buf          *bp)
135 {
136         struct xfs_mount        *mp = bp->b_target->bt_mount;
137         struct xfs_da_intnode   *hdr = bp->b_addr;
138         struct xfs_da3_icnode_hdr ichdr;
139         const struct xfs_dir_ops *ops;
140 
141         ops = xfs_dir_get_ops(mp, NULL);
142 
143         ops->node_hdr_from_disk(&ichdr, hdr);
144 
145         if (xfs_sb_version_hascrc(&mp->m_sb)) {
146                 struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
147 
148                 if (ichdr.magic != XFS_DA3_NODE_MAGIC)
149                         return false;
150 
151                 if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid))
152                         return false;
153                 if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn)
154                         return false;
155         } else {
156                 if (ichdr.magic != XFS_DA_NODE_MAGIC)
157                         return false;
158         }
159         if (ichdr.level == 0)
160                 return false;
161         if (ichdr.level > XFS_DA_NODE_MAXDEPTH)
162                 return false;
163         if (ichdr.count == 0)
164                 return false;
165 
166         /*
167          * we don't know if the node is for and attribute or directory tree,
168          * so only fail if the count is outside both bounds
169          */
170         if (ichdr.count > mp->m_dir_node_ents &&
171             ichdr.count > mp->m_attr_node_ents)
172                 return false;
173 
174         /* XXX: hash order check? */
175 
176         return true;
177 }
178 
179 static void
180 xfs_da3_node_write_verify(
181         struct xfs_buf  *bp)
182 {
183         struct xfs_mount        *mp = bp->b_target->bt_mount;
184         struct xfs_buf_log_item *bip = bp->b_fspriv;
185         struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
186 
187         if (!xfs_da3_node_verify(bp)) {
188                 XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);
189                 xfs_buf_ioerror(bp, EFSCORRUPTED);
190                 return;
191         }
192 
193         if (!xfs_sb_version_hascrc(&mp->m_sb))
194                 return;
195 
196         if (bip)
197                 hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn);
198 
199         xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DA3_NODE_CRC_OFF);
200 }
201 
202 /*
203  * leaf/node format detection on trees is sketchy, so a node read can be done on
204  * leaf level blocks when detection identifies the tree as a node format tree
205  * incorrectly. In this case, we need to swap the verifier to match the correct
206  * format of the block being read.
207  */
208 static void
209 xfs_da3_node_read_verify(
210         struct xfs_buf          *bp)
211 {
212         struct xfs_mount        *mp = bp->b_target->bt_mount;
213         struct xfs_da_blkinfo   *info = bp->b_addr;
214 
215         switch (be16_to_cpu(info->magic)) {
216                 case XFS_DA3_NODE_MAGIC:
217                         if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length),
218                                               XFS_DA3_NODE_CRC_OFF))
219                                 break;
220                         /* fall through */
221                 case XFS_DA_NODE_MAGIC:
222                         if (!xfs_da3_node_verify(bp))
223                                 break;
224                         return;
225                 case XFS_ATTR_LEAF_MAGIC:
226                 case XFS_ATTR3_LEAF_MAGIC:
227                         bp->b_ops = &xfs_attr3_leaf_buf_ops;
228                         bp->b_ops->verify_read(bp);
229                         return;
230                 case XFS_DIR2_LEAFN_MAGIC:
231                 case XFS_DIR3_LEAFN_MAGIC:
232                         bp->b_ops = &xfs_dir3_leafn_buf_ops;
233                         bp->b_ops->verify_read(bp);
234                         return;
235                 default:
236                         break;
237         }
238 
239         /* corrupt block */
240         XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);
241         xfs_buf_ioerror(bp, EFSCORRUPTED);
242 }
243 
244 const struct xfs_buf_ops xfs_da3_node_buf_ops = {
245         .verify_read = xfs_da3_node_read_verify,
246         .verify_write = xfs_da3_node_write_verify,
247 };
248 
249 int
250 xfs_da3_node_read(
251         struct xfs_trans        *tp,
252         struct xfs_inode        *dp,
253         xfs_dablk_t             bno,
254         xfs_daddr_t             mappedbno,
255         struct xfs_buf          **bpp,
256         int                     which_fork)
257 {
258         int                     err;
259 
260         err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp,
261                                         which_fork, &xfs_da3_node_buf_ops);
262         if (!err && tp) {
263                 struct xfs_da_blkinfo   *info = (*bpp)->b_addr;
264                 int                     type;
265 
266                 switch (be16_to_cpu(info->magic)) {
267                 case XFS_DA_NODE_MAGIC:
268                 case XFS_DA3_NODE_MAGIC:
269                         type = XFS_BLFT_DA_NODE_BUF;
270                         break;
271                 case XFS_ATTR_LEAF_MAGIC:
272                 case XFS_ATTR3_LEAF_MAGIC:
273                         type = XFS_BLFT_ATTR_LEAF_BUF;
274                         break;
275                 case XFS_DIR2_LEAFN_MAGIC:
276                 case XFS_DIR3_LEAFN_MAGIC:
277                         type = XFS_BLFT_DIR_LEAFN_BUF;
278                         break;
279                 default:
280                         type = 0;
281                         ASSERT(0);
282                         break;
283                 }
284                 xfs_trans_buf_set_type(tp, *bpp, type);
285         }
286         return err;
287 }
288 
289 /*========================================================================
290  * Routines used for growing the Btree.
291  *========================================================================*/
292 
293 /*
294  * Create the initial contents of an intermediate node.
295  */
296 int
297 xfs_da3_node_create(
298         struct xfs_da_args      *args,
299         xfs_dablk_t             blkno,
300         int                     level,
301         struct xfs_buf          **bpp,
302         int                     whichfork)
303 {
304         struct xfs_da_intnode   *node;
305         struct xfs_trans        *tp = args->trans;
306         struct xfs_mount        *mp = tp->t_mountp;
307         struct xfs_da3_icnode_hdr ichdr = {0};
308         struct xfs_buf          *bp;
309         int                     error;
310         struct xfs_inode        *dp = args->dp;
311 
312         trace_xfs_da_node_create(args);
313         ASSERT(level <= XFS_DA_NODE_MAXDEPTH);
314 
315         error = xfs_da_get_buf(tp, dp, blkno, -1, &bp, whichfork);
316         if (error)
317                 return(error);
318         bp->b_ops = &xfs_da3_node_buf_ops;
319         xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
320         node = bp->b_addr;
321 
322         if (xfs_sb_version_hascrc(&mp->m_sb)) {
323                 struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
324 
325                 ichdr.magic = XFS_DA3_NODE_MAGIC;
326                 hdr3->info.blkno = cpu_to_be64(bp->b_bn);
327                 hdr3->info.owner = cpu_to_be64(args->dp->i_ino);
328                 uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_uuid);
329         } else {
330                 ichdr.magic = XFS_DA_NODE_MAGIC;
331         }
332         ichdr.level = level;
333 
334         dp->d_ops->node_hdr_to_disk(node, &ichdr);
335         xfs_trans_log_buf(tp, bp,
336                 XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size));
337 
338         *bpp = bp;
339         return(0);
340 }
341 
342 /*
343  * Split a leaf node, rebalance, then possibly split
344  * intermediate nodes, rebalance, etc.
345  */
346 int                                                     /* error */
347 xfs_da3_split(
348         struct xfs_da_state     *state)
349 {
350         struct xfs_da_state_blk *oldblk;
351         struct xfs_da_state_blk *newblk;
352         struct xfs_da_state_blk *addblk;
353         struct xfs_da_intnode   *node;
354         struct xfs_buf          *bp;
355         int                     max;
356         int                     action = 0;
357         int                     error;
358         int                     i;
359 
360         trace_xfs_da_split(state->args);
361 
362         /*
363          * Walk back up the tree splitting/inserting/adjusting as necessary.
364          * If we need to insert and there isn't room, split the node, then
365          * decide which fragment to insert the new block from below into.
366          * Note that we may split the root this way, but we need more fixup.
367          */
368         max = state->path.active - 1;
369         ASSERT((max >= 0) && (max < XFS_DA_NODE_MAXDEPTH));
370         ASSERT(state->path.blk[max].magic == XFS_ATTR_LEAF_MAGIC ||
371                state->path.blk[max].magic == XFS_DIR2_LEAFN_MAGIC);
372 
373         addblk = &state->path.blk[max];         /* initial dummy value */
374         for (i = max; (i >= 0) && addblk; state->path.active--, i--) {
375                 oldblk = &state->path.blk[i];
376                 newblk = &state->altpath.blk[i];
377 
378                 /*
379                  * If a leaf node then
380                  *     Allocate a new leaf node, then rebalance across them.
381                  * else if an intermediate node then
382                  *     We split on the last layer, must we split the node?
383                  */
384                 switch (oldblk->magic) {
385                 case XFS_ATTR_LEAF_MAGIC:
386                         error = xfs_attr3_leaf_split(state, oldblk, newblk);
387                         if ((error != 0) && (error != ENOSPC)) {
388                                 return(error);  /* GROT: attr is inconsistent */
389                         }
390                         if (!error) {
391                                 addblk = newblk;
392                                 break;
393                         }
394                         /*
395                          * Entry wouldn't fit, split the leaf again.
396                          */
397                         state->extravalid = 1;
398                         if (state->inleaf) {
399                                 state->extraafter = 0;  /* before newblk */
400                                 trace_xfs_attr_leaf_split_before(state->args);
401                                 error = xfs_attr3_leaf_split(state, oldblk,
402                                                             &state->extrablk);
403                         } else {
404                                 state->extraafter = 1;  /* after newblk */
405                                 trace_xfs_attr_leaf_split_after(state->args);
406                                 error = xfs_attr3_leaf_split(state, newblk,
407                                                             &state->extrablk);
408                         }
409                         if (error)
410                                 return(error);  /* GROT: attr inconsistent */
411                         addblk = newblk;
412                         break;
413                 case XFS_DIR2_LEAFN_MAGIC:
414                         error = xfs_dir2_leafn_split(state, oldblk, newblk);
415                         if (error)
416                                 return error;
417                         addblk = newblk;
418                         break;
419                 case XFS_DA_NODE_MAGIC:
420                         error = xfs_da3_node_split(state, oldblk, newblk, addblk,
421                                                          max - i, &action);
422                         addblk->bp = NULL;
423                         if (error)
424                                 return(error);  /* GROT: dir is inconsistent */
425                         /*
426                          * Record the newly split block for the next time thru?
427                          */
428                         if (action)
429                                 addblk = newblk;
430                         else
431                                 addblk = NULL;
432                         break;
433                 }
434 
435                 /*
436                  * Update the btree to show the new hashval for this child.
437                  */
438                 xfs_da3_fixhashpath(state, &state->path);
439         }
440         if (!addblk)
441                 return(0);
442 
443         /*
444          * Split the root node.
445          */
446         ASSERT(state->path.active == 0);
447         oldblk = &state->path.blk[0];
448         error = xfs_da3_root_split(state, oldblk, addblk);
449         if (error) {
450                 addblk->bp = NULL;
451                 return(error);  /* GROT: dir is inconsistent */
452         }
453 
454         /*
455          * Update pointers to the node which used to be block 0 and
456          * just got bumped because of the addition of a new root node.
457          * There might be three blocks involved if a double split occurred,
458          * and the original block 0 could be at any position in the list.
459          *
460          * Note: the magic numbers and sibling pointers are in the same
461          * physical place for both v2 and v3 headers (by design). Hence it
462          * doesn't matter which version of the xfs_da_intnode structure we use
463          * here as the result will be the same using either structure.
464          */
465         node = oldblk->bp->b_addr;
466         if (node->hdr.info.forw) {
467                 if (be32_to_cpu(node->hdr.info.forw) == addblk->blkno) {
468                         bp = addblk->bp;
469                 } else {
470                         ASSERT(state->extravalid);
471                         bp = state->extrablk.bp;
472                 }
473                 node = bp->b_addr;
474                 node->hdr.info.back = cpu_to_be32(oldblk->blkno);
475                 xfs_trans_log_buf(state->args->trans, bp,
476                     XFS_DA_LOGRANGE(node, &node->hdr.info,
477                     sizeof(node->hdr.info)));
478         }
479         node = oldblk->bp->b_addr;
480         if (node->hdr.info.back) {
481                 if (be32_to_cpu(node->hdr.info.back) == addblk->blkno) {
482                         bp = addblk->bp;
483                 } else {
484                         ASSERT(state->extravalid);
485                         bp = state->extrablk.bp;
486                 }
487                 node = bp->b_addr;
488                 node->hdr.info.forw = cpu_to_be32(oldblk->blkno);
489                 xfs_trans_log_buf(state->args->trans, bp,
490                     XFS_DA_LOGRANGE(node, &node->hdr.info,
491                     sizeof(node->hdr.info)));
492         }
493         addblk->bp = NULL;
494         return(0);
495 }
496 
497 /*
498  * Split the root.  We have to create a new root and point to the two
499  * parts (the split old root) that we just created.  Copy block zero to
500  * the EOF, extending the inode in process.
501  */
502 STATIC int                                              /* error */
503 xfs_da3_root_split(
504         struct xfs_da_state     *state,
505         struct xfs_da_state_blk *blk1,
506         struct xfs_da_state_blk *blk2)
507 {
508         struct xfs_da_intnode   *node;
509         struct xfs_da_intnode   *oldroot;
510         struct xfs_da_node_entry *btree;
511         struct xfs_da3_icnode_hdr nodehdr;
512         struct xfs_da_args      *args;
513         struct xfs_buf          *bp;
514         struct xfs_inode        *dp;
515         struct xfs_trans        *tp;
516         struct xfs_mount        *mp;
517         struct xfs_dir2_leaf    *leaf;
518         xfs_dablk_t             blkno;
519         int                     level;
520         int                     error;
521         int                     size;
522 
523         trace_xfs_da_root_split(state->args);
524 
525         /*
526          * Copy the existing (incorrect) block from the root node position
527          * to a free space somewhere.
528          */
529         args = state->args;
530         error = xfs_da_grow_inode(args, &blkno);
531         if (error)
532                 return error;
533 
534         dp = args->dp;
535         tp = args->trans;
536         mp = state->mp;
537         error = xfs_da_get_buf(tp, dp, blkno, -1, &bp, args->whichfork);
538         if (error)
539                 return error;
540         node = bp->b_addr;
541         oldroot = blk1->bp->b_addr;
542         if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
543             oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) {
544                 struct xfs_da3_icnode_hdr nodehdr;
545 
546                 dp->d_ops->node_hdr_from_disk(&nodehdr, oldroot);
547                 btree = dp->d_ops->node_tree_p(oldroot);
548                 size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot);
549                 level = nodehdr.level;
550 
551                 /*
552                  * we are about to copy oldroot to bp, so set up the type
553                  * of bp while we know exactly what it will be.
554                  */
555                 xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
556         } else {
557                 struct xfs_dir3_icleaf_hdr leafhdr;
558                 struct xfs_dir2_leaf_entry *ents;
559 
560                 leaf = (xfs_dir2_leaf_t *)oldroot;
561                 dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
562                 ents = dp->d_ops->leaf_ents_p(leaf);
563 
564                 ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
565                        leafhdr.magic == XFS_DIR3_LEAFN_MAGIC);
566                 size = (int)((char *)&ents[leafhdr.count] - (char *)leaf);
567                 level = 0;
568 
569                 /*
570                  * we are about to copy oldroot to bp, so set up the type
571                  * of bp while we know exactly what it will be.
572                  */
573                 xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF);
574         }
575 
576         /*
577          * we can copy most of the information in the node from one block to
578          * another, but for CRC enabled headers we have to make sure that the
579          * block specific identifiers are kept intact. We update the buffer
580          * directly for this.
581          */
582         memcpy(node, oldroot, size);
583         if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) ||
584             oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
585                 struct xfs_da3_intnode *node3 = (struct xfs_da3_intnode *)node;
586 
587                 node3->hdr.info.blkno = cpu_to_be64(bp->b_bn);
588         }
589         xfs_trans_log_buf(tp, bp, 0, size - 1);
590 
591         bp->b_ops = blk1->bp->b_ops;
592         xfs_trans_buf_copy_type(bp, blk1->bp);
593         blk1->bp = bp;
594         blk1->blkno = blkno;
595 
596         /*
597          * Set up the new root node.
598          */
599         error = xfs_da3_node_create(args,
600                 (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0,
601                 level + 1, &bp, args->whichfork);
602         if (error)
603                 return error;
604 
605         node = bp->b_addr;
606         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
607         btree = dp->d_ops->node_tree_p(node);
608         btree[0].hashval = cpu_to_be32(blk1->hashval);
609         btree[0].before = cpu_to_be32(blk1->blkno);
610         btree[1].hashval = cpu_to_be32(blk2->hashval);
611         btree[1].before = cpu_to_be32(blk2->blkno);
612         nodehdr.count = 2;
613         dp->d_ops->node_hdr_to_disk(node, &nodehdr);
614 
615 #ifdef DEBUG
616         if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
617             oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
618                 ASSERT(blk1->blkno >= mp->m_dirleafblk &&
619                        blk1->blkno < mp->m_dirfreeblk);
620                 ASSERT(blk2->blkno >= mp->m_dirleafblk &&
621                        blk2->blkno < mp->m_dirfreeblk);
622         }
623 #endif
624 
625         /* Header is already logged by xfs_da_node_create */
626         xfs_trans_log_buf(tp, bp,
627                 XFS_DA_LOGRANGE(node, btree, sizeof(xfs_da_node_entry_t) * 2));
628 
629         return 0;
630 }
631 
632 /*
633  * Split the node, rebalance, then add the new entry.
634  */
635 STATIC int                                              /* error */
636 xfs_da3_node_split(
637         struct xfs_da_state     *state,
638         struct xfs_da_state_blk *oldblk,
639         struct xfs_da_state_blk *newblk,
640         struct xfs_da_state_blk *addblk,
641         int                     treelevel,
642         int                     *result)
643 {
644         struct xfs_da_intnode   *node;
645         struct xfs_da3_icnode_hdr nodehdr;
646         xfs_dablk_t             blkno;
647         int                     newcount;
648         int                     error;
649         int                     useextra;
650         struct xfs_inode        *dp = state->args->dp;
651 
652         trace_xfs_da_node_split(state->args);
653 
654         node = oldblk->bp->b_addr;
655         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
656 
657         /*
658          * With V2 dirs the extra block is data or freespace.
659          */
660         useextra = state->extravalid && state->args->whichfork == XFS_ATTR_FORK;
661         newcount = 1 + useextra;
662         /*
663          * Do we have to split the node?
664          */
665         if (nodehdr.count + newcount > state->node_ents) {
666                 /*
667                  * Allocate a new node, add to the doubly linked chain of
668                  * nodes, then move some of our excess entries into it.
669                  */
670                 error = xfs_da_grow_inode(state->args, &blkno);
671                 if (error)
672                         return(error);  /* GROT: dir is inconsistent */
673 
674                 error = xfs_da3_node_create(state->args, blkno, treelevel,
675                                            &newblk->bp, state->args->whichfork);
676                 if (error)
677                         return(error);  /* GROT: dir is inconsistent */
678                 newblk->blkno = blkno;
679                 newblk->magic = XFS_DA_NODE_MAGIC;
680                 xfs_da3_node_rebalance(state, oldblk, newblk);
681                 error = xfs_da3_blk_link(state, oldblk, newblk);
682                 if (error)
683                         return(error);
684                 *result = 1;
685         } else {
686                 *result = 0;
687         }
688 
689         /*
690          * Insert the new entry(s) into the correct block
691          * (updating last hashval in the process).
692          *
693          * xfs_da3_node_add() inserts BEFORE the given index,
694          * and as a result of using node_lookup_int() we always
695          * point to a valid entry (not after one), but a split
696          * operation always results in a new block whose hashvals
697          * FOLLOW the current block.
698          *
699          * If we had double-split op below us, then add the extra block too.
700          */
701         node = oldblk->bp->b_addr;
702         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
703         if (oldblk->index <= nodehdr.count) {
704                 oldblk->index++;
705                 xfs_da3_node_add(state, oldblk, addblk);
706                 if (useextra) {
707                         if (state->extraafter)
708                                 oldblk->index++;
709                         xfs_da3_node_add(state, oldblk, &state->extrablk);
710                         state->extravalid = 0;
711                 }
712         } else {
713                 newblk->index++;
714                 xfs_da3_node_add(state, newblk, addblk);
715                 if (useextra) {
716                         if (state->extraafter)
717                                 newblk->index++;
718                         xfs_da3_node_add(state, newblk, &state->extrablk);
719                         state->extravalid = 0;
720                 }
721         }
722 
723         return(0);
724 }
725 
726 /*
727  * Balance the btree elements between two intermediate nodes,
728  * usually one full and one empty.
729  *
730  * NOTE: if blk2 is empty, then it will get the upper half of blk1.
731  */
732 STATIC void
733 xfs_da3_node_rebalance(
734         struct xfs_da_state     *state,
735         struct xfs_da_state_blk *blk1,
736         struct xfs_da_state_blk *blk2)
737 {
738         struct xfs_da_intnode   *node1;
739         struct xfs_da_intnode   *node2;
740         struct xfs_da_intnode   *tmpnode;
741         struct xfs_da_node_entry *btree1;
742         struct xfs_da_node_entry *btree2;
743         struct xfs_da_node_entry *btree_s;
744         struct xfs_da_node_entry *btree_d;
745         struct xfs_da3_icnode_hdr nodehdr1;
746         struct xfs_da3_icnode_hdr nodehdr2;
747         struct xfs_trans        *tp;
748         int                     count;
749         int                     tmp;
750         int                     swap = 0;
751         struct xfs_inode        *dp = state->args->dp;
752 
753         trace_xfs_da_node_rebalance(state->args);
754 
755         node1 = blk1->bp->b_addr;
756         node2 = blk2->bp->b_addr;
757         dp->d_ops->node_hdr_from_disk(&nodehdr1, node1);
758         dp->d_ops->node_hdr_from_disk(&nodehdr2, node2);
759         btree1 = dp->d_ops->node_tree_p(node1);
760         btree2 = dp->d_ops->node_tree_p(node2);
761 
762         /*
763          * Figure out how many entries need to move, and in which direction.
764          * Swap the nodes around if that makes it simpler.
765          */
766         if (nodehdr1.count > 0 && nodehdr2.count > 0 &&
767             ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) ||
768              (be32_to_cpu(btree2[nodehdr2.count - 1].hashval) <
769                         be32_to_cpu(btree1[nodehdr1.count - 1].hashval)))) {
770                 tmpnode = node1;
771                 node1 = node2;
772                 node2 = tmpnode;
773                 dp->d_ops->node_hdr_from_disk(&nodehdr1, node1);
774                 dp->d_ops->node_hdr_from_disk(&nodehdr2, node2);
775                 btree1 = dp->d_ops->node_tree_p(node1);
776                 btree2 = dp->d_ops->node_tree_p(node2);
777                 swap = 1;
778         }
779 
780         count = (nodehdr1.count - nodehdr2.count) / 2;
781         if (count == 0)
782                 return;
783         tp = state->args->trans;
784         /*
785          * Two cases: high-to-low and low-to-high.
786          */
787         if (count > 0) {
788                 /*
789                  * Move elements in node2 up to make a hole.
790                  */
791                 tmp = nodehdr2.count;
792                 if (tmp > 0) {
793                         tmp *= (uint)sizeof(xfs_da_node_entry_t);
794                         btree_s = &btree2[0];
795                         btree_d = &btree2[count];
796                         memmove(btree_d, btree_s, tmp);
797                 }
798 
799                 /*
800                  * Move the req'd B-tree elements from high in node1 to
801                  * low in node2.
802                  */
803                 nodehdr2.count += count;
804                 tmp = count * (uint)sizeof(xfs_da_node_entry_t);
805                 btree_s = &btree1[nodehdr1.count - count];
806                 btree_d = &btree2[0];
807                 memcpy(btree_d, btree_s, tmp);
808                 nodehdr1.count -= count;
809         } else {
810                 /*
811                  * Move the req'd B-tree elements from low in node2 to
812                  * high in node1.
813                  */
814                 count = -count;
815                 tmp = count * (uint)sizeof(xfs_da_node_entry_t);
816                 btree_s = &btree2[0];
817                 btree_d = &btree1[nodehdr1.count];
818                 memcpy(btree_d, btree_s, tmp);
819                 nodehdr1.count += count;
820 
821                 xfs_trans_log_buf(tp, blk1->bp,
822                         XFS_DA_LOGRANGE(node1, btree_d, tmp));
823 
824                 /*
825                  * Move elements in node2 down to fill the hole.
826                  */
827                 tmp  = nodehdr2.count - count;
828                 tmp *= (uint)sizeof(xfs_da_node_entry_t);
829                 btree_s = &btree2[count];
830                 btree_d = &btree2[0];
831                 memmove(btree_d, btree_s, tmp);
832                 nodehdr2.count -= count;
833         }
834 
835         /*
836          * Log header of node 1 and all current bits of node 2.
837          */
838         dp->d_ops->node_hdr_to_disk(node1, &nodehdr1);
839         xfs_trans_log_buf(tp, blk1->bp,
840                 XFS_DA_LOGRANGE(node1, &node1->hdr, dp->d_ops->node_hdr_size));
841 
842         dp->d_ops->node_hdr_to_disk(node2, &nodehdr2);
843         xfs_trans_log_buf(tp, blk2->bp,
844                 XFS_DA_LOGRANGE(node2, &node2->hdr,
845                                 dp->d_ops->node_hdr_size +
846                                 (sizeof(btree2[0]) * nodehdr2.count)));
847 
848         /*
849          * Record the last hashval from each block for upward propagation.
850          * (note: don't use the swapped node pointers)
851          */
852         if (swap) {
853                 node1 = blk1->bp->b_addr;
854                 node2 = blk2->bp->b_addr;
855                 dp->d_ops->node_hdr_from_disk(&nodehdr1, node1);
856                 dp->d_ops->node_hdr_from_disk(&nodehdr2, node2);
857                 btree1 = dp->d_ops->node_tree_p(node1);
858                 btree2 = dp->d_ops->node_tree_p(node2);
859         }
860         blk1->hashval = be32_to_cpu(btree1[nodehdr1.count - 1].hashval);
861         blk2->hashval = be32_to_cpu(btree2[nodehdr2.count - 1].hashval);
862 
863         /*
864          * Adjust the expected index for insertion.
865          */
866         if (blk1->index >= nodehdr1.count) {
867                 blk2->index = blk1->index - nodehdr1.count;
868                 blk1->index = nodehdr1.count + 1;       /* make it invalid */
869         }
870 }
871 
872 /*
873  * Add a new entry to an intermediate node.
874  */
875 STATIC void
876 xfs_da3_node_add(
877         struct xfs_da_state     *state,
878         struct xfs_da_state_blk *oldblk,
879         struct xfs_da_state_blk *newblk)
880 {
881         struct xfs_da_intnode   *node;
882         struct xfs_da3_icnode_hdr nodehdr;
883         struct xfs_da_node_entry *btree;
884         int                     tmp;
885         struct xfs_inode        *dp = state->args->dp;
886 
887         trace_xfs_da_node_add(state->args);
888 
889         node = oldblk->bp->b_addr;
890         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
891         btree = dp->d_ops->node_tree_p(node);
892 
893         ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count);
894         ASSERT(newblk->blkno != 0);
895         if (state->args->whichfork == XFS_DATA_FORK)
896                 ASSERT(newblk->blkno >= state->mp->m_dirleafblk &&
897                        newblk->blkno < state->mp->m_dirfreeblk);
898 
899         /*
900          * We may need to make some room before we insert the new node.
901          */
902         tmp = 0;
903         if (oldblk->index < nodehdr.count) {
904                 tmp = (nodehdr.count - oldblk->index) * (uint)sizeof(*btree);
905                 memmove(&btree[oldblk->index + 1], &btree[oldblk->index], tmp);
906         }
907         btree[oldblk->index].hashval = cpu_to_be32(newblk->hashval);
908         btree[oldblk->index].before = cpu_to_be32(newblk->blkno);
909         xfs_trans_log_buf(state->args->trans, oldblk->bp,
910                 XFS_DA_LOGRANGE(node, &btree[oldblk->index],
911                                 tmp + sizeof(*btree)));
912 
913         nodehdr.count += 1;
914         dp->d_ops->node_hdr_to_disk(node, &nodehdr);
915         xfs_trans_log_buf(state->args->trans, oldblk->bp,
916                 XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size));
917 
918         /*
919          * Copy the last hash value from the oldblk to propagate upwards.
920          */
921         oldblk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval);
922 }
923 
924 /*========================================================================
925  * Routines used for shrinking the Btree.
926  *========================================================================*/
927 
928 /*
929  * Deallocate an empty leaf node, remove it from its parent,
930  * possibly deallocating that block, etc...
931  */
932 int
933 xfs_da3_join(
934         struct xfs_da_state     *state)
935 {
936         struct xfs_da_state_blk *drop_blk;
937         struct xfs_da_state_blk *save_blk;
938         int                     action = 0;
939         int                     error;
940 
941         trace_xfs_da_join(state->args);
942 
943         drop_blk = &state->path.blk[ state->path.active-1 ];
944         save_blk = &state->altpath.blk[ state->path.active-1 ];
945         ASSERT(state->path.blk[0].magic == XFS_DA_NODE_MAGIC);
946         ASSERT(drop_blk->magic == XFS_ATTR_LEAF_MAGIC ||
947                drop_blk->magic == XFS_DIR2_LEAFN_MAGIC);
948 
949         /*
950          * Walk back up the tree joining/deallocating as necessary.
951          * When we stop dropping blocks, break out.
952          */
953         for (  ; state->path.active >= 2; drop_blk--, save_blk--,
954                  state->path.active--) {
955                 /*
956                  * See if we can combine the block with a neighbor.
957                  *   (action == 0) => no options, just leave
958                  *   (action == 1) => coalesce, then unlink
959                  *   (action == 2) => block empty, unlink it
960                  */
961                 switch (drop_blk->magic) {
962                 case XFS_ATTR_LEAF_MAGIC:
963                         error = xfs_attr3_leaf_toosmall(state, &action);
964                         if (error)
965                                 return(error);
966                         if (action == 0)
967                                 return(0);
968                         xfs_attr3_leaf_unbalance(state, drop_blk, save_blk);
969                         break;
970                 case XFS_DIR2_LEAFN_MAGIC:
971                         error = xfs_dir2_leafn_toosmall(state, &action);
972                         if (error)
973                                 return error;
974                         if (action == 0)
975                                 return 0;
976                         xfs_dir2_leafn_unbalance(state, drop_blk, save_blk);
977                         break;
978                 case XFS_DA_NODE_MAGIC:
979                         /*
980                          * Remove the offending node, fixup hashvals,
981                          * check for a toosmall neighbor.
982                          */
983                         xfs_da3_node_remove(state, drop_blk);
984                         xfs_da3_fixhashpath(state, &state->path);
985                         error = xfs_da3_node_toosmall(state, &action);
986                         if (error)
987                                 return(error);
988                         if (action == 0)
989                                 return 0;
990                         xfs_da3_node_unbalance(state, drop_blk, save_blk);
991                         break;
992                 }
993                 xfs_da3_fixhashpath(state, &state->altpath);
994                 error = xfs_da3_blk_unlink(state, drop_blk, save_blk);
995                 xfs_da_state_kill_altpath(state);
996                 if (error)
997                         return(error);
998                 error = xfs_da_shrink_inode(state->args, drop_blk->blkno,
999                                                          drop_blk->bp);
1000                 drop_blk->bp = NULL;
1001                 if (error)
1002                         return(error);
1003         }
1004         /*
1005          * We joined all the way to the top.  If it turns out that
1006          * we only have one entry in the root, make the child block
1007          * the new root.
1008          */
1009         xfs_da3_node_remove(state, drop_blk);
1010         xfs_da3_fixhashpath(state, &state->path);
1011         error = xfs_da3_root_join(state, &state->path.blk[0]);
1012         return(error);
1013 }
1014 
1015 #ifdef  DEBUG
1016 static void
1017 xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level)
1018 {
1019         __be16  magic = blkinfo->magic;
1020 
1021         if (level == 1) {
1022                 ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1023                        magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) ||
1024                        magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
1025                        magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
1026         } else {
1027                 ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
1028                        magic == cpu_to_be16(XFS_DA3_NODE_MAGIC));
1029         }
1030         ASSERT(!blkinfo->forw);
1031         ASSERT(!blkinfo->back);
1032 }
1033 #else   /* !DEBUG */
1034 #define xfs_da_blkinfo_onlychild_validate(blkinfo, level)
1035 #endif  /* !DEBUG */
1036 
1037 /*
1038  * We have only one entry in the root.  Copy the only remaining child of
1039  * the old root to block 0 as the new root node.
1040  */
1041 STATIC int
1042 xfs_da3_root_join(
1043         struct xfs_da_state     *state,
1044         struct xfs_da_state_blk *root_blk)
1045 {
1046         struct xfs_da_intnode   *oldroot;
1047         struct xfs_da_args      *args;
1048         xfs_dablk_t             child;
1049         struct xfs_buf          *bp;
1050         struct xfs_da3_icnode_hdr oldroothdr;
1051         struct xfs_da_node_entry *btree;
1052         int                     error;
1053         struct xfs_inode        *dp = state->args->dp;
1054 
1055         trace_xfs_da_root_join(state->args);
1056 
1057         ASSERT(root_blk->magic == XFS_DA_NODE_MAGIC);
1058 
1059         args = state->args;
1060         oldroot = root_blk->bp->b_addr;
1061         dp->d_ops->node_hdr_from_disk(&oldroothdr, oldroot);
1062         ASSERT(oldroothdr.forw == 0);
1063         ASSERT(oldroothdr.back == 0);
1064 
1065         /*
1066          * If the root has more than one child, then don't do anything.
1067          */
1068         if (oldroothdr.count > 1)
1069                 return 0;
1070 
1071         /*
1072          * Read in the (only) child block, then copy those bytes into
1073          * the root block's buffer and free the original child block.
1074          */
1075         btree = dp->d_ops->node_tree_p(oldroot);
1076         child = be32_to_cpu(btree[0].before);
1077         ASSERT(child != 0);
1078         error = xfs_da3_node_read(args->trans, dp, child, -1, &bp,
1079                                              args->whichfork);
1080         if (error)
1081                 return error;
1082         xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level);
1083 
1084         /*
1085          * This could be copying a leaf back into the root block in the case of
1086          * there only being a single leaf block left in the tree. Hence we have
1087          * to update the b_ops pointer as well to match the buffer type change
1088          * that could occur. For dir3 blocks we also need to update the block
1089          * number in the buffer header.
1090          */
1091         memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize);
1092         root_blk->bp->b_ops = bp->b_ops;
1093         xfs_trans_buf_copy_type(root_blk->bp, bp);
1094         if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) {
1095                 struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr;
1096                 da3->blkno = cpu_to_be64(root_blk->bp->b_bn);
1097         }
1098         xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1);
1099         error = xfs_da_shrink_inode(args, child, bp);
1100         return(error);
1101 }
1102 
1103 /*
1104  * Check a node block and its neighbors to see if the block should be
1105  * collapsed into one or the other neighbor.  Always keep the block
1106  * with the smaller block number.
1107  * If the current block is over 50% full, don't try to join it, return 0.
1108  * If the block is empty, fill in the state structure and return 2.
1109  * If it can be collapsed, fill in the state structure and return 1.
1110  * If nothing can be done, return 0.
1111  */
1112 STATIC int
1113 xfs_da3_node_toosmall(
1114         struct xfs_da_state     *state,
1115         int                     *action)
1116 {
1117         struct xfs_da_intnode   *node;
1118         struct xfs_da_state_blk *blk;
1119         struct xfs_da_blkinfo   *info;
1120         xfs_dablk_t             blkno;
1121         struct xfs_buf          *bp;
1122         struct xfs_da3_icnode_hdr nodehdr;
1123         int                     count;
1124         int                     forward;
1125         int                     error;
1126         int                     retval;
1127         int                     i;
1128         struct xfs_inode        *dp = state->args->dp;
1129 
1130         trace_xfs_da_node_toosmall(state->args);
1131 
1132         /*
1133          * Check for the degenerate case of the block being over 50% full.
1134          * If so, it's not worth even looking to see if we might be able
1135          * to coalesce with a sibling.
1136          */
1137         blk = &state->path.blk[ state->path.active-1 ];
1138         info = blk->bp->b_addr;
1139         node = (xfs_da_intnode_t *)info;
1140         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
1141         if (nodehdr.count > (state->node_ents >> 1)) {
1142                 *action = 0;    /* blk over 50%, don't try to join */
1143                 return(0);      /* blk over 50%, don't try to join */
1144         }
1145 
1146         /*
1147          * Check for the degenerate case of the block being empty.
1148          * If the block is empty, we'll simply delete it, no need to
1149          * coalesce it with a sibling block.  We choose (arbitrarily)
1150          * to merge with the forward block unless it is NULL.
1151          */
1152         if (nodehdr.count == 0) {
1153                 /*
1154                  * Make altpath point to the block we want to keep and
1155                  * path point to the block we want to drop (this one).
1156                  */
1157                 forward = (info->forw != 0);
1158                 memcpy(&state->altpath, &state->path, sizeof(state->path));
1159                 error = xfs_da3_path_shift(state, &state->altpath, forward,
1160                                                  0, &retval);
1161                 if (error)
1162                         return(error);
1163                 if (retval) {
1164                         *action = 0;
1165                 } else {
1166                         *action = 2;
1167                 }
1168                 return(0);
1169         }
1170 
1171         /*
1172          * Examine each sibling block to see if we can coalesce with
1173          * at least 25% free space to spare.  We need to figure out
1174          * whether to merge with the forward or the backward block.
1175          * We prefer coalescing with the lower numbered sibling so as
1176          * to shrink a directory over time.
1177          */
1178         count  = state->node_ents;
1179         count -= state->node_ents >> 2;
1180         count -= nodehdr.count;
1181 
1182         /* start with smaller blk num */
1183         forward = nodehdr.forw < nodehdr.back;
1184         for (i = 0; i < 2; forward = !forward, i++) {
1185                 struct xfs_da3_icnode_hdr thdr;
1186                 if (forward)
1187                         blkno = nodehdr.forw;
1188                 else
1189                         blkno = nodehdr.back;
1190                 if (blkno == 0)
1191                         continue;
1192                 error = xfs_da3_node_read(state->args->trans, dp,
1193                                         blkno, -1, &bp, state->args->whichfork);
1194                 if (error)
1195                         return(error);
1196 
1197                 node = bp->b_addr;
1198                 dp->d_ops->node_hdr_from_disk(&thdr, node);
1199                 xfs_trans_brelse(state->args->trans, bp);
1200 
1201                 if (count - thdr.count >= 0)
1202                         break;  /* fits with at least 25% to spare */
1203         }
1204         if (i >= 2) {
1205                 *action = 0;
1206                 return 0;
1207         }
1208 
1209         /*
1210          * Make altpath point to the block we want to keep (the lower
1211          * numbered block) and path point to the block we want to drop.
1212          */
1213         memcpy(&state->altpath, &state->path, sizeof(state->path));
1214         if (blkno < blk->blkno) {
1215                 error = xfs_da3_path_shift(state, &state->altpath, forward,
1216                                                  0, &retval);
1217         } else {
1218                 error = xfs_da3_path_shift(state, &state->path, forward,
1219                                                  0, &retval);
1220         }
1221         if (error)
1222                 return error;
1223         if (retval) {
1224                 *action = 0;
1225                 return 0;
1226         }
1227         *action = 1;
1228         return 0;
1229 }
1230 
1231 /*
1232  * Pick up the last hashvalue from an intermediate node.
1233  */
1234 STATIC uint
1235 xfs_da3_node_lasthash(
1236         struct xfs_inode        *dp,
1237         struct xfs_buf          *bp,
1238         int                     *count)
1239 {
1240         struct xfs_da_intnode    *node;
1241         struct xfs_da_node_entry *btree;
1242         struct xfs_da3_icnode_hdr nodehdr;
1243 
1244         node = bp->b_addr;
1245         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
1246         if (count)
1247                 *count = nodehdr.count;
1248         if (!nodehdr.count)
1249                 return 0;
1250         btree = dp->d_ops->node_tree_p(node);
1251         return be32_to_cpu(btree[nodehdr.count - 1].hashval);
1252 }
1253 
1254 /*
1255  * Walk back up the tree adjusting hash values as necessary,
1256  * when we stop making changes, return.
1257  */
1258 void
1259 xfs_da3_fixhashpath(
1260         struct xfs_da_state     *state,
1261         struct xfs_da_state_path *path)
1262 {
1263         struct xfs_da_state_blk *blk;
1264         struct xfs_da_intnode   *node;
1265         struct xfs_da_node_entry *btree;
1266         xfs_dahash_t            lasthash=0;
1267         int                     level;
1268         int                     count;
1269         struct xfs_inode        *dp = state->args->dp;
1270 
1271         trace_xfs_da_fixhashpath(state->args);
1272 
1273         level = path->active-1;
1274         blk = &path->blk[ level ];
1275         switch (blk->magic) {
1276         case XFS_ATTR_LEAF_MAGIC:
1277                 lasthash = xfs_attr_leaf_lasthash(blk->bp, &count);
1278                 if (count == 0)
1279                         return;
1280                 break;
1281         case XFS_DIR2_LEAFN_MAGIC:
1282                 lasthash = xfs_dir2_leafn_lasthash(dp, blk->bp, &count);
1283                 if (count == 0)
1284                         return;
1285                 break;
1286         case XFS_DA_NODE_MAGIC:
1287                 lasthash = xfs_da3_node_lasthash(dp, blk->bp, &count);
1288                 if (count == 0)
1289                         return;
1290                 break;
1291         }
1292         for (blk--, level--; level >= 0; blk--, level--) {
1293                 struct xfs_da3_icnode_hdr nodehdr;
1294 
1295                 node = blk->bp->b_addr;
1296                 dp->d_ops->node_hdr_from_disk(&nodehdr, node);
1297                 btree = dp->d_ops->node_tree_p(node);
1298                 if (be32_to_cpu(btree[blk->index].hashval) == lasthash)
1299                         break;
1300                 blk->hashval = lasthash;
1301                 btree[blk->index].hashval = cpu_to_be32(lasthash);
1302                 xfs_trans_log_buf(state->args->trans, blk->bp,
1303                                   XFS_DA_LOGRANGE(node, &btree[blk->index],
1304                                                   sizeof(*btree)));
1305 
1306                 lasthash = be32_to_cpu(btree[nodehdr.count - 1].hashval);
1307         }
1308 }
1309 
1310 /*
1311  * Remove an entry from an intermediate node.
1312  */
1313 STATIC void
1314 xfs_da3_node_remove(
1315         struct xfs_da_state     *state,
1316         struct xfs_da_state_blk *drop_blk)
1317 {
1318         struct xfs_da_intnode   *node;
1319         struct xfs_da3_icnode_hdr nodehdr;
1320         struct xfs_da_node_entry *btree;
1321         int                     index;
1322         int                     tmp;
1323         struct xfs_inode        *dp = state->args->dp;
1324 
1325         trace_xfs_da_node_remove(state->args);
1326 
1327         node = drop_blk->bp->b_addr;
1328         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
1329         ASSERT(drop_blk->index < nodehdr.count);
1330         ASSERT(drop_blk->index >= 0);
1331 
1332         /*
1333          * Copy over the offending entry, or just zero it out.
1334          */
1335         index = drop_blk->index;
1336         btree = dp->d_ops->node_tree_p(node);
1337         if (index < nodehdr.count - 1) {
1338                 tmp  = nodehdr.count - index - 1;
1339                 tmp *= (uint)sizeof(xfs_da_node_entry_t);
1340                 memmove(&btree[index], &btree[index + 1], tmp);
1341                 xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1342                     XFS_DA_LOGRANGE(node, &btree[index], tmp));
1343                 index = nodehdr.count - 1;
1344         }
1345         memset(&btree[index], 0, sizeof(xfs_da_node_entry_t));
1346         xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1347             XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index])));
1348         nodehdr.count -= 1;
1349         dp->d_ops->node_hdr_to_disk(node, &nodehdr);
1350         xfs_trans_log_buf(state->args->trans, drop_blk->bp,
1351             XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size));
1352 
1353         /*
1354          * Copy the last hash value from the block to propagate upwards.
1355          */
1356         drop_blk->hashval = be32_to_cpu(btree[index - 1].hashval);
1357 }
1358 
1359 /*
1360  * Unbalance the elements between two intermediate nodes,
1361  * move all Btree elements from one node into another.
1362  */
1363 STATIC void
1364 xfs_da3_node_unbalance(
1365         struct xfs_da_state     *state,
1366         struct xfs_da_state_blk *drop_blk,
1367         struct xfs_da_state_blk *save_blk)
1368 {
1369         struct xfs_da_intnode   *drop_node;
1370         struct xfs_da_intnode   *save_node;
1371         struct xfs_da_node_entry *drop_btree;
1372         struct xfs_da_node_entry *save_btree;
1373         struct xfs_da3_icnode_hdr drop_hdr;
1374         struct xfs_da3_icnode_hdr save_hdr;
1375         struct xfs_trans        *tp;
1376         int                     sindex;
1377         int                     tmp;
1378         struct xfs_inode        *dp = state->args->dp;
1379 
1380         trace_xfs_da_node_unbalance(state->args);
1381 
1382         drop_node = drop_blk->bp->b_addr;
1383         save_node = save_blk->bp->b_addr;
1384         dp->d_ops->node_hdr_from_disk(&drop_hdr, drop_node);
1385         dp->d_ops->node_hdr_from_disk(&save_hdr, save_node);
1386         drop_btree = dp->d_ops->node_tree_p(drop_node);
1387         save_btree = dp->d_ops->node_tree_p(save_node);
1388         tp = state->args->trans;
1389 
1390         /*
1391          * If the dying block has lower hashvals, then move all the
1392          * elements in the remaining block up to make a hole.
1393          */
1394         if ((be32_to_cpu(drop_btree[0].hashval) <
1395                         be32_to_cpu(save_btree[0].hashval)) ||
1396             (be32_to_cpu(drop_btree[drop_hdr.count - 1].hashval) <
1397                         be32_to_cpu(save_btree[save_hdr.count - 1].hashval))) {
1398                 /* XXX: check this - is memmove dst correct? */
1399                 tmp = save_hdr.count * sizeof(xfs_da_node_entry_t);
1400                 memmove(&save_btree[drop_hdr.count], &save_btree[0], tmp);
1401 
1402                 sindex = 0;
1403                 xfs_trans_log_buf(tp, save_blk->bp,
1404                         XFS_DA_LOGRANGE(save_node, &save_btree[0],
1405                                 (save_hdr.count + drop_hdr.count) *
1406                                                 sizeof(xfs_da_node_entry_t)));
1407         } else {
1408                 sindex = save_hdr.count;
1409                 xfs_trans_log_buf(tp, save_blk->bp,
1410                         XFS_DA_LOGRANGE(save_node, &save_btree[sindex],
1411                                 drop_hdr.count * sizeof(xfs_da_node_entry_t)));
1412         }
1413 
1414         /*
1415          * Move all the B-tree elements from drop_blk to save_blk.
1416          */
1417         tmp = drop_hdr.count * (uint)sizeof(xfs_da_node_entry_t);
1418         memcpy(&save_btree[sindex], &drop_btree[0], tmp);
1419         save_hdr.count += drop_hdr.count;
1420 
1421         dp->d_ops->node_hdr_to_disk(save_node, &save_hdr);
1422         xfs_trans_log_buf(tp, save_blk->bp,
1423                 XFS_DA_LOGRANGE(save_node, &save_node->hdr,
1424                                 dp->d_ops->node_hdr_size));
1425 
1426         /*
1427          * Save the last hashval in the remaining block for upward propagation.
1428          */
1429         save_blk->hashval = be32_to_cpu(save_btree[save_hdr.count - 1].hashval);
1430 }
1431 
1432 /*========================================================================
1433  * Routines used for finding things in the Btree.
1434  *========================================================================*/
1435 
1436 /*
1437  * Walk down the Btree looking for a particular filename, filling
1438  * in the state structure as we go.
1439  *
1440  * We will set the state structure to point to each of the elements
1441  * in each of the nodes where either the hashval is or should be.
1442  *
1443  * We support duplicate hashval's so for each entry in the current
1444  * node that could contain the desired hashval, descend.  This is a
1445  * pruned depth-first tree search.
1446  */
1447 int                                                     /* error */
1448 xfs_da3_node_lookup_int(
1449         struct xfs_da_state     *state,
1450         int                     *result)
1451 {
1452         struct xfs_da_state_blk *blk;
1453         struct xfs_da_blkinfo   *curr;
1454         struct xfs_da_intnode   *node;
1455         struct xfs_da_node_entry *btree;
1456         struct xfs_da3_icnode_hdr nodehdr;
1457         struct xfs_da_args      *args;
1458         xfs_dablk_t             blkno;
1459         xfs_dahash_t            hashval;
1460         xfs_dahash_t            btreehashval;
1461         int                     probe;
1462         int                     span;
1463         int                     max;
1464         int                     error;
1465         int                     retval;
1466         struct xfs_inode        *dp = state->args->dp;
1467 
1468         args = state->args;
1469 
1470         /*
1471          * Descend thru the B-tree searching each level for the right
1472          * node to use, until the right hashval is found.
1473          */
1474         blkno = (args->whichfork == XFS_DATA_FORK)? state->mp->m_dirleafblk : 0;
1475         for (blk = &state->path.blk[0], state->path.active = 1;
1476                          state->path.active <= XFS_DA_NODE_MAXDEPTH;
1477                          blk++, state->path.active++) {
1478                 /*
1479                  * Read the next node down in the tree.
1480                  */
1481                 blk->blkno = blkno;
1482                 error = xfs_da3_node_read(args->trans, args->dp, blkno,
1483                                         -1, &blk->bp, args->whichfork);
1484                 if (error) {
1485                         blk->blkno = 0;
1486                         state->path.active--;
1487                         return(error);
1488                 }
1489                 curr = blk->bp->b_addr;
1490                 blk->magic = be16_to_cpu(curr->magic);
1491 
1492                 if (blk->magic == XFS_ATTR_LEAF_MAGIC ||
1493                     blk->magic == XFS_ATTR3_LEAF_MAGIC) {
1494                         blk->magic = XFS_ATTR_LEAF_MAGIC;
1495                         blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);
1496                         break;
1497                 }
1498 
1499                 if (blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1500                     blk->magic == XFS_DIR3_LEAFN_MAGIC) {
1501                         blk->magic = XFS_DIR2_LEAFN_MAGIC;
1502                         blk->hashval = xfs_dir2_leafn_lasthash(args->dp,
1503                                                                blk->bp, NULL);
1504                         break;
1505                 }
1506 
1507                 blk->magic = XFS_DA_NODE_MAGIC;
1508 
1509 
1510                 /*
1511                  * Search an intermediate node for a match.
1512                  */
1513                 node = blk->bp->b_addr;
1514                 dp->d_ops->node_hdr_from_disk(&nodehdr, node);
1515                 btree = dp->d_ops->node_tree_p(node);
1516 
1517                 max = nodehdr.count;
1518                 blk->hashval = be32_to_cpu(btree[max - 1].hashval);
1519 
1520                 /*
1521                  * Binary search.  (note: small blocks will skip loop)
1522                  */
1523                 probe = span = max / 2;
1524                 hashval = args->hashval;
1525                 while (span > 4) {
1526                         span /= 2;
1527                         btreehashval = be32_to_cpu(btree[probe].hashval);
1528                         if (btreehashval < hashval)
1529                                 probe += span;
1530                         else if (btreehashval > hashval)
1531                                 probe -= span;
1532                         else
1533                                 break;
1534                 }
1535                 ASSERT((probe >= 0) && (probe < max));
1536                 ASSERT((span <= 4) ||
1537                         (be32_to_cpu(btree[probe].hashval) == hashval));
1538 
1539                 /*
1540                  * Since we may have duplicate hashval's, find the first
1541                  * matching hashval in the node.
1542                  */
1543                 while (probe > 0 &&
1544                        be32_to_cpu(btree[probe].hashval) >= hashval) {
1545                         probe--;
1546                 }
1547                 while (probe < max &&
1548                        be32_to_cpu(btree[probe].hashval) < hashval) {
1549                         probe++;
1550                 }
1551 
1552                 /*
1553                  * Pick the right block to descend on.
1554                  */
1555                 if (probe == max) {
1556                         blk->index = max - 1;
1557                         blkno = be32_to_cpu(btree[max - 1].before);
1558                 } else {
1559                         blk->index = probe;
1560                         blkno = be32_to_cpu(btree[probe].before);
1561                 }
1562         }
1563 
1564         /*
1565          * A leaf block that ends in the hashval that we are interested in
1566          * (final hashval == search hashval) means that the next block may
1567          * contain more entries with the same hashval, shift upward to the
1568          * next leaf and keep searching.
1569          */
1570         for (;;) {
1571                 if (blk->magic == XFS_DIR2_LEAFN_MAGIC) {
1572                         retval = xfs_dir2_leafn_lookup_int(blk->bp, args,
1573                                                         &blk->index, state);
1574                 } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) {
1575                         retval = xfs_attr3_leaf_lookup_int(blk->bp, args);
1576                         blk->index = args->index;
1577                         args->blkno = blk->blkno;
1578                 } else {
1579                         ASSERT(0);
1580                         return XFS_ERROR(EFSCORRUPTED);
1581                 }
1582                 if (((retval == ENOENT) || (retval == ENOATTR)) &&
1583                     (blk->hashval == args->hashval)) {
1584                         error = xfs_da3_path_shift(state, &state->path, 1, 1,
1585                                                          &retval);
1586                         if (error)
1587                                 return(error);
1588                         if (retval == 0) {
1589                                 continue;
1590                         } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) {
1591                                 /* path_shift() gives ENOENT */
1592                                 retval = XFS_ERROR(ENOATTR);
1593                         }
1594                 }
1595                 break;
1596         }
1597         *result = retval;
1598         return(0);
1599 }
1600 
1601 /*========================================================================
1602  * Utility routines.
1603  *========================================================================*/
1604 
1605 /*
1606  * Compare two intermediate nodes for "order".
1607  */
1608 STATIC int
1609 xfs_da3_node_order(
1610         struct xfs_inode *dp,
1611         struct xfs_buf  *node1_bp,
1612         struct xfs_buf  *node2_bp)
1613 {
1614         struct xfs_da_intnode   *node1;
1615         struct xfs_da_intnode   *node2;
1616         struct xfs_da_node_entry *btree1;
1617         struct xfs_da_node_entry *btree2;
1618         struct xfs_da3_icnode_hdr node1hdr;
1619         struct xfs_da3_icnode_hdr node2hdr;
1620 
1621         node1 = node1_bp->b_addr;
1622         node2 = node2_bp->b_addr;
1623         dp->d_ops->node_hdr_from_disk(&node1hdr, node1);
1624         dp->d_ops->node_hdr_from_disk(&node2hdr, node2);
1625         btree1 = dp->d_ops->node_tree_p(node1);
1626         btree2 = dp->d_ops->node_tree_p(node2);
1627 
1628         if (node1hdr.count > 0 && node2hdr.count > 0 &&
1629             ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) ||
1630              (be32_to_cpu(btree2[node2hdr.count - 1].hashval) <
1631               be32_to_cpu(btree1[node1hdr.count - 1].hashval)))) {
1632                 return 1;
1633         }
1634         return 0;
1635 }
1636 
1637 /*
1638  * Link a new block into a doubly linked list of blocks (of whatever type).
1639  */
1640 int                                                     /* error */
1641 xfs_da3_blk_link(
1642         struct xfs_da_state     *state,
1643         struct xfs_da_state_blk *old_blk,
1644         struct xfs_da_state_blk *new_blk)
1645 {
1646         struct xfs_da_blkinfo   *old_info;
1647         struct xfs_da_blkinfo   *new_info;
1648         struct xfs_da_blkinfo   *tmp_info;
1649         struct xfs_da_args      *args;
1650         struct xfs_buf          *bp;
1651         int                     before = 0;
1652         int                     error;
1653         struct xfs_inode        *dp = state->args->dp;
1654 
1655         /*
1656          * Set up environment.
1657          */
1658         args = state->args;
1659         ASSERT(args != NULL);
1660         old_info = old_blk->bp->b_addr;
1661         new_info = new_blk->bp->b_addr;
1662         ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC ||
1663                old_blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1664                old_blk->magic == XFS_ATTR_LEAF_MAGIC);
1665 
1666         switch (old_blk->magic) {
1667         case XFS_ATTR_LEAF_MAGIC:
1668                 before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp);
1669                 break;
1670         case XFS_DIR2_LEAFN_MAGIC:
1671                 before = xfs_dir2_leafn_order(dp, old_blk->bp, new_blk->bp);
1672                 break;
1673         case XFS_DA_NODE_MAGIC:
1674                 before = xfs_da3_node_order(dp, old_blk->bp, new_blk->bp);
1675                 break;
1676         }
1677 
1678         /*
1679          * Link blocks in appropriate order.
1680          */
1681         if (before) {
1682                 /*
1683                  * Link new block in before existing block.
1684                  */
1685                 trace_xfs_da_link_before(args);
1686                 new_info->forw = cpu_to_be32(old_blk->blkno);
1687                 new_info->back = old_info->back;
1688                 if (old_info->back) {
1689                         error = xfs_da3_node_read(args->trans, dp,
1690                                                 be32_to_cpu(old_info->back),
1691                                                 -1, &bp, args->whichfork);
1692                         if (error)
1693                                 return(error);
1694                         ASSERT(bp != NULL);
1695                         tmp_info = bp->b_addr;
1696                         ASSERT(tmp_info->magic == old_info->magic);
1697                         ASSERT(be32_to_cpu(tmp_info->forw) == old_blk->blkno);
1698                         tmp_info->forw = cpu_to_be32(new_blk->blkno);
1699                         xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1);
1700                 }
1701                 old_info->back = cpu_to_be32(new_blk->blkno);
1702         } else {
1703                 /*
1704                  * Link new block in after existing block.
1705                  */
1706                 trace_xfs_da_link_after(args);
1707                 new_info->forw = old_info->forw;
1708                 new_info->back = cpu_to_be32(old_blk->blkno);
1709                 if (old_info->forw) {
1710                         error = xfs_da3_node_read(args->trans, dp,
1711                                                 be32_to_cpu(old_info->forw),
1712                                                 -1, &bp, args->whichfork);
1713                         if (error)
1714                                 return(error);
1715                         ASSERT(bp != NULL);
1716                         tmp_info = bp->b_addr;
1717                         ASSERT(tmp_info->magic == old_info->magic);
1718                         ASSERT(be32_to_cpu(tmp_info->back) == old_blk->blkno);
1719                         tmp_info->back = cpu_to_be32(new_blk->blkno);
1720                         xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1);
1721                 }
1722                 old_info->forw = cpu_to_be32(new_blk->blkno);
1723         }
1724 
1725         xfs_trans_log_buf(args->trans, old_blk->bp, 0, sizeof(*tmp_info) - 1);
1726         xfs_trans_log_buf(args->trans, new_blk->bp, 0, sizeof(*tmp_info) - 1);
1727         return(0);
1728 }
1729 
1730 /*
1731  * Unlink a block from a doubly linked list of blocks.
1732  */
1733 STATIC int                                              /* error */
1734 xfs_da3_blk_unlink(
1735         struct xfs_da_state     *state,
1736         struct xfs_da_state_blk *drop_blk,
1737         struct xfs_da_state_blk *save_blk)
1738 {
1739         struct xfs_da_blkinfo   *drop_info;
1740         struct xfs_da_blkinfo   *save_info;
1741         struct xfs_da_blkinfo   *tmp_info;
1742         struct xfs_da_args      *args;
1743         struct xfs_buf          *bp;
1744         int                     error;
1745 
1746         /*
1747          * Set up environment.
1748          */
1749         args = state->args;
1750         ASSERT(args != NULL);
1751         save_info = save_blk->bp->b_addr;
1752         drop_info = drop_blk->bp->b_addr;
1753         ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC ||
1754                save_blk->magic == XFS_DIR2_LEAFN_MAGIC ||
1755                save_blk->magic == XFS_ATTR_LEAF_MAGIC);
1756         ASSERT(save_blk->magic == drop_blk->magic);
1757         ASSERT((be32_to_cpu(save_info->forw) == drop_blk->blkno) ||
1758                (be32_to_cpu(save_info->back) == drop_blk->blkno));
1759         ASSERT((be32_to_cpu(drop_info->forw) == save_blk->blkno) ||
1760                (be32_to_cpu(drop_info->back) == save_blk->blkno));
1761 
1762         /*
1763          * Unlink the leaf block from the doubly linked chain of leaves.
1764          */
1765         if (be32_to_cpu(save_info->back) == drop_blk->blkno) {
1766                 trace_xfs_da_unlink_back(args);
1767                 save_info->back = drop_info->back;
1768                 if (drop_info->back) {
1769                         error = xfs_da3_node_read(args->trans, args->dp,
1770                                                 be32_to_cpu(drop_info->back),
1771                                                 -1, &bp, args->whichfork);
1772                         if (error)
1773                                 return(error);
1774                         ASSERT(bp != NULL);
1775                         tmp_info = bp->b_addr;
1776                         ASSERT(tmp_info->magic == save_info->magic);
1777                         ASSERT(be32_to_cpu(tmp_info->forw) == drop_blk->blkno);
1778                         tmp_info->forw = cpu_to_be32(save_blk->blkno);
1779                         xfs_trans_log_buf(args->trans, bp, 0,
1780                                                     sizeof(*tmp_info) - 1);
1781                 }
1782         } else {
1783                 trace_xfs_da_unlink_forward(args);
1784                 save_info->forw = drop_info->forw;
1785                 if (drop_info->forw) {
1786                         error = xfs_da3_node_read(args->trans, args->dp,
1787                                                 be32_to_cpu(drop_info->forw),
1788                                                 -1, &bp, args->whichfork);
1789                         if (error)
1790                                 return(error);
1791                         ASSERT(bp != NULL);
1792                         tmp_info = bp->b_addr;
1793                         ASSERT(tmp_info->magic == save_info->magic);
1794                         ASSERT(be32_to_cpu(tmp_info->back) == drop_blk->blkno);
1795                         tmp_info->back = cpu_to_be32(save_blk->blkno);
1796                         xfs_trans_log_buf(args->trans, bp, 0,
1797                                                     sizeof(*tmp_info) - 1);
1798                 }
1799         }
1800 
1801         xfs_trans_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1);
1802         return(0);
1803 }
1804 
1805 /*
1806  * Move a path "forward" or "!forward" one block at the current level.
1807  *
1808  * This routine will adjust a "path" to point to the next block
1809  * "forward" (higher hashvalues) or "!forward" (lower hashvals) in the
1810  * Btree, including updating pointers to the intermediate nodes between
1811  * the new bottom and the root.
1812  */
1813 int                                                     /* error */
1814 xfs_da3_path_shift(
1815         struct xfs_da_state     *state,
1816         struct xfs_da_state_path *path,
1817         int                     forward,
1818         int                     release,
1819         int                     *result)
1820 {
1821         struct xfs_da_state_blk *blk;
1822         struct xfs_da_blkinfo   *info;
1823         struct xfs_da_intnode   *node;
1824         struct xfs_da_args      *args;
1825         struct xfs_da_node_entry *btree;
1826         struct xfs_da3_icnode_hdr nodehdr;
1827         xfs_dablk_t             blkno = 0;
1828         int                     level;
1829         int                     error;
1830         struct xfs_inode        *dp = state->args->dp;
1831 
1832         trace_xfs_da_path_shift(state->args);
1833 
1834         /*
1835          * Roll up the Btree looking for the first block where our
1836          * current index is not at the edge of the block.  Note that
1837          * we skip the bottom layer because we want the sibling block.
1838          */
1839         args = state->args;
1840         ASSERT(args != NULL);
1841         ASSERT(path != NULL);
1842         ASSERT((path->active > 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
1843         level = (path->active-1) - 1;   /* skip bottom layer in path */
1844         for (blk = &path->blk[level]; level >= 0; blk--, level--) {
1845                 node = blk->bp->b_addr;
1846                 dp->d_ops->node_hdr_from_disk(&nodehdr, node);
1847                 btree = dp->d_ops->node_tree_p(node);
1848 
1849                 if (forward && (blk->index < nodehdr.count - 1)) {
1850                         blk->index++;
1851                         blkno = be32_to_cpu(btree[blk->index].before);
1852                         break;
1853                 } else if (!forward && (blk->index > 0)) {
1854                         blk->index--;
1855                         blkno = be32_to_cpu(btree[blk->index].before);
1856                         break;
1857                 }
1858         }
1859         if (level < 0) {
1860                 *result = XFS_ERROR(ENOENT);    /* we're out of our tree */
1861                 ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
1862                 return(0);
1863         }
1864 
1865         /*
1866          * Roll down the edge of the subtree until we reach the
1867          * same depth we were at originally.
1868          */
1869         for (blk++, level++; level < path->active; blk++, level++) {
1870                 /*
1871                  * Release the old block.
1872                  * (if it's dirty, trans won't actually let go)
1873                  */
1874                 if (release)
1875                         xfs_trans_brelse(args->trans, blk->bp);
1876 
1877                 /*
1878                  * Read the next child block.
1879                  */
1880                 blk->blkno = blkno;
1881                 error = xfs_da3_node_read(args->trans, dp, blkno, -1,
1882                                         &blk->bp, args->whichfork);
1883                 if (error)
1884                         return(error);
1885                 info = blk->bp->b_addr;
1886                 ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) ||
1887                        info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) ||
1888                        info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
1889                        info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) ||
1890                        info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) ||
1891                        info->magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC));
1892 
1893 
1894                 /*
1895                  * Note: we flatten the magic number to a single type so we
1896                  * don't have to compare against crc/non-crc types elsewhere.
1897                  */
1898                 switch (be16_to_cpu(info->magic)) {
1899                 case XFS_DA_NODE_MAGIC:
1900                 case XFS_DA3_NODE_MAGIC:
1901                         blk->magic = XFS_DA_NODE_MAGIC;
1902                         node = (xfs_da_intnode_t *)info;
1903                         dp->d_ops->node_hdr_from_disk(&nodehdr, node);
1904                         btree = dp->d_ops->node_tree_p(node);
1905                         blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval);
1906                         if (forward)
1907                                 blk->index = 0;
1908                         else
1909                                 blk->index = nodehdr.count - 1;
1910                         blkno = be32_to_cpu(btree[blk->index].before);
1911                         break;
1912                 case XFS_ATTR_LEAF_MAGIC:
1913                 case XFS_ATTR3_LEAF_MAGIC:
1914                         blk->magic = XFS_ATTR_LEAF_MAGIC;
1915                         ASSERT(level == path->active-1);
1916                         blk->index = 0;
1917                         blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);
1918                         break;
1919                 case XFS_DIR2_LEAFN_MAGIC:
1920                 case XFS_DIR3_LEAFN_MAGIC:
1921                         blk->magic = XFS_DIR2_LEAFN_MAGIC;
1922                         ASSERT(level == path->active-1);
1923                         blk->index = 0;
1924                         blk->hashval = xfs_dir2_leafn_lasthash(args->dp,
1925                                                                blk->bp, NULL);
1926                         break;
1927                 default:
1928                         ASSERT(0);
1929                         break;
1930                 }
1931         }
1932         *result = 0;
1933         return 0;
1934 }
1935 
1936 
1937 /*========================================================================
1938  * Utility routines.
1939  *========================================================================*/
1940 
1941 /*
1942  * Implement a simple hash on a character string.
1943  * Rotate the hash value by 7 bits, then XOR each character in.
1944  * This is implemented with some source-level loop unrolling.
1945  */
1946 xfs_dahash_t
1947 xfs_da_hashname(const __uint8_t *name, int namelen)
1948 {
1949         xfs_dahash_t hash;
1950 
1951         /*
1952          * Do four characters at a time as long as we can.
1953          */
1954         for (hash = 0; namelen >= 4; namelen -= 4, name += 4)
1955                 hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^
1956                        (name[3] << 0) ^ rol32(hash, 7 * 4);
1957 
1958         /*
1959          * Now do the rest of the characters.
1960          */
1961         switch (namelen) {
1962         case 3:
1963                 return (name[0] << 14) ^ (name[1] << 7) ^ (name[2] << 0) ^
1964                        rol32(hash, 7 * 3);
1965         case 2:
1966                 return (name[0] << 7) ^ (name[1] << 0) ^ rol32(hash, 7 * 2);
1967         case 1:
1968                 return (name[0] << 0) ^ rol32(hash, 7 * 1);
1969         default: /* case 0: */
1970                 return hash;
1971         }
1972 }
1973 
1974 enum xfs_dacmp
1975 xfs_da_compname(
1976         struct xfs_da_args *args,
1977         const unsigned char *name,
1978         int             len)
1979 {
1980         return (args->namelen == len && memcmp(args->name, name, len) == 0) ?
1981                                         XFS_CMP_EXACT : XFS_CMP_DIFFERENT;
1982 }
1983 
1984 static xfs_dahash_t
1985 xfs_default_hashname(
1986         struct xfs_name *name)
1987 {
1988         return xfs_da_hashname(name->name, name->len);
1989 }
1990 
1991 const struct xfs_nameops xfs_default_nameops = {
1992         .hashname       = xfs_default_hashname,
1993         .compname       = xfs_da_compname
1994 };
1995 
1996 int
1997 xfs_da_grow_inode_int(
1998         struct xfs_da_args      *args,
1999         xfs_fileoff_t           *bno,
2000         int                     count)
2001 {
2002         struct xfs_trans        *tp = args->trans;
2003         struct xfs_inode        *dp = args->dp;
2004         int                     w = args->whichfork;
2005         xfs_drfsbno_t           nblks = dp->i_d.di_nblocks;
2006         struct xfs_bmbt_irec    map, *mapp;
2007         int                     nmap, error, got, i, mapi;
2008 
2009         /*
2010          * Find a spot in the file space to put the new block.
2011          */
2012         error = xfs_bmap_first_unused(tp, dp, count, bno, w);
2013         if (error)
2014                 return error;
2015 
2016         /*
2017          * Try mapping it in one filesystem block.
2018          */
2019         nmap = 1;
2020         ASSERT(args->firstblock != NULL);
2021         error = xfs_bmapi_write(tp, dp, *bno, count,
2022                         xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG,
2023                         args->firstblock, args->total, &map, &nmap,
2024                         args->flist);
2025         if (error)
2026                 return error;
2027 
2028         ASSERT(nmap <= 1);
2029         if (nmap == 1) {
2030                 mapp = &map;
2031                 mapi = 1;
2032         } else if (nmap == 0 && count > 1) {
2033                 xfs_fileoff_t           b;
2034                 int                     c;
2035 
2036                 /*
2037                  * If we didn't get it and the block might work if fragmented,
2038                  * try without the CONTIG flag.  Loop until we get it all.
2039                  */
2040                 mapp = kmem_alloc(sizeof(*mapp) * count, KM_SLEEP);
2041                 for (b = *bno, mapi = 0; b < *bno + count; ) {
2042                         nmap = MIN(XFS_BMAP_MAX_NMAP, count);
2043                         c = (int)(*bno + count - b);
2044                         error = xfs_bmapi_write(tp, dp, b, c,
2045                                         xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA,
2046                                         args->firstblock, args->total,
2047                                         &mapp[mapi], &nmap, args->flist);
2048                         if (error)
2049                                 goto out_free_map;
2050                         if (nmap < 1)
2051                                 break;
2052                         mapi += nmap;
2053                         b = mapp[mapi - 1].br_startoff +
2054                             mapp[mapi - 1].br_blockcount;
2055                 }
2056         } else {
2057                 mapi = 0;
2058                 mapp = NULL;
2059         }
2060 
2061         /*
2062          * Count the blocks we got, make sure it matches the total.
2063          */
2064         for (i = 0, got = 0; i < mapi; i++)
2065                 got += mapp[i].br_blockcount;
2066         if (got != count || mapp[0].br_startoff != *bno ||
2067             mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount !=
2068             *bno + count) {
2069                 error = XFS_ERROR(ENOSPC);
2070                 goto out_free_map;
2071         }
2072 
2073         /* account for newly allocated blocks in reserved blocks total */
2074         args->total -= dp->i_d.di_nblocks - nblks;
2075 
2076 out_free_map:
2077         if (mapp != &map)
2078                 kmem_free(mapp);
2079         return error;
2080 }
2081 
2082 /*
2083  * Add a block to the btree ahead of the file.
2084  * Return the new block number to the caller.
2085  */
2086 int
2087 xfs_da_grow_inode(
2088         struct xfs_da_args      *args,
2089         xfs_dablk_t             *new_blkno)
2090 {
2091         xfs_fileoff_t           bno;
2092         int                     count;
2093         int                     error;
2094 
2095         trace_xfs_da_grow_inode(args);
2096 
2097         if (args->whichfork == XFS_DATA_FORK) {
2098                 bno = args->dp->i_mount->m_dirleafblk;
2099                 count = args->dp->i_mount->m_dirblkfsbs;
2100         } else {
2101                 bno = 0;
2102                 count = 1;
2103         }
2104 
2105         error = xfs_da_grow_inode_int(args, &bno, count);
2106         if (!error)
2107                 *new_blkno = (xfs_dablk_t)bno;
2108         return error;
2109 }
2110 
2111 /*
2112  * Ick.  We need to always be able to remove a btree block, even
2113  * if there's no space reservation because the filesystem is full.
2114  * This is called if xfs_bunmapi on a btree block fails due to ENOSPC.
2115  * It swaps the target block with the last block in the file.  The
2116  * last block in the file can always be removed since it can't cause
2117  * a bmap btree split to do that.
2118  */
2119 STATIC int
2120 xfs_da3_swap_lastblock(
2121         struct xfs_da_args      *args,
2122         xfs_dablk_t             *dead_blknop,
2123         struct xfs_buf          **dead_bufp)
2124 {
2125         struct xfs_da_blkinfo   *dead_info;
2126         struct xfs_da_blkinfo   *sib_info;
2127         struct xfs_da_intnode   *par_node;
2128         struct xfs_da_intnode   *dead_node;
2129         struct xfs_dir2_leaf    *dead_leaf2;
2130         struct xfs_da_node_entry *btree;
2131         struct xfs_da3_icnode_hdr par_hdr;
2132         struct xfs_inode        *dp;
2133         struct xfs_trans        *tp;
2134         struct xfs_mount        *mp;
2135         struct xfs_buf          *dead_buf;
2136         struct xfs_buf          *last_buf;
2137         struct xfs_buf          *sib_buf;
2138         struct xfs_buf          *par_buf;
2139         xfs_dahash_t            dead_hash;
2140         xfs_fileoff_t           lastoff;
2141         xfs_dablk_t             dead_blkno;
2142         xfs_dablk_t             last_blkno;
2143         xfs_dablk_t             sib_blkno;
2144         xfs_dablk_t             par_blkno;
2145         int                     error;
2146         int                     w;
2147         int                     entno;
2148         int                     level;
2149         int                     dead_level;
2150 
2151         trace_xfs_da_swap_lastblock(args);
2152 
2153         dead_buf = *dead_bufp;
2154         dead_blkno = *dead_blknop;
2155         tp = args->trans;
2156         dp = args->dp;
2157         w = args->whichfork;
2158         ASSERT(w == XFS_DATA_FORK);
2159         mp = dp->i_mount;
2160         lastoff = mp->m_dirfreeblk;
2161         error = xfs_bmap_last_before(tp, dp, &lastoff, w);
2162         if (error)
2163                 return error;
2164         if (unlikely(lastoff == 0)) {
2165                 XFS_ERROR_REPORT("xfs_da_swap_lastblock(1)", XFS_ERRLEVEL_LOW,
2166                                  mp);
2167                 return XFS_ERROR(EFSCORRUPTED);
2168         }
2169         /*
2170          * Read the last block in the btree space.
2171          */
2172         last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs;
2173         error = xfs_da3_node_read(tp, dp, last_blkno, -1, &last_buf, w);
2174         if (error)
2175                 return error;
2176         /*
2177          * Copy the last block into the dead buffer and log it.
2178          */
2179         memcpy(dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize);
2180         xfs_trans_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1);
2181         dead_info = dead_buf->b_addr;
2182         /*
2183          * Get values from the moved block.
2184          */
2185         if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) ||
2186             dead_info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
2187                 struct xfs_dir3_icleaf_hdr leafhdr;
2188                 struct xfs_dir2_leaf_entry *ents;
2189 
2190                 dead_leaf2 = (xfs_dir2_leaf_t *)dead_info;
2191                 dp->d_ops->leaf_hdr_from_disk(&leafhdr, dead_leaf2);
2192                 ents = dp->d_ops->leaf_ents_p(dead_leaf2);
2193                 dead_level = 0;
2194                 dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval);
2195         } else {
2196                 struct xfs_da3_icnode_hdr deadhdr;
2197 
2198                 dead_node = (xfs_da_intnode_t *)dead_info;
2199                 dp->d_ops->node_hdr_from_disk(&deadhdr, dead_node);
2200                 btree = dp->d_ops->node_tree_p(dead_node);
2201                 dead_level = deadhdr.level;
2202                 dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval);
2203         }
2204         sib_buf = par_buf = NULL;
2205         /*
2206          * If the moved block has a left sibling, fix up the pointers.
2207          */
2208         if ((sib_blkno = be32_to_cpu(dead_info->back))) {
2209                 error = xfs_da3_node_read(tp, dp, sib_blkno, -1, &sib_buf, w);
2210                 if (error)
2211                         goto done;
2212                 sib_info = sib_buf->b_addr;
2213                 if (unlikely(
2214                     be32_to_cpu(sib_info->forw) != last_blkno ||
2215                     sib_info->magic != dead_info->magic)) {
2216                         XFS_ERROR_REPORT("xfs_da_swap_lastblock(2)",
2217                                          XFS_ERRLEVEL_LOW, mp);
2218                         error = XFS_ERROR(EFSCORRUPTED);
2219                         goto done;
2220                 }
2221                 sib_info->forw = cpu_to_be32(dead_blkno);
2222                 xfs_trans_log_buf(tp, sib_buf,
2223                         XFS_DA_LOGRANGE(sib_info, &sib_info->forw,
2224                                         sizeof(sib_info->forw)));
2225                 sib_buf = NULL;
2226         }
2227         /*
2228          * If the moved block has a right sibling, fix up the pointers.
2229          */
2230         if ((sib_blkno = be32_to_cpu(dead_info->forw))) {
2231                 error = xfs_da3_node_read(tp, dp, sib_blkno, -1, &sib_buf, w);
2232                 if (error)
2233                         goto done;
2234                 sib_info = sib_buf->b_addr;
2235                 if (unlikely(
2236                        be32_to_cpu(sib_info->back) != last_blkno ||
2237                        sib_info->magic != dead_info->magic)) {
2238                         XFS_ERROR_REPORT("xfs_da_swap_lastblock(3)",
2239                                          XFS_ERRLEVEL_LOW, mp);
2240                         error = XFS_ERROR(EFSCORRUPTED);
2241                         goto done;
2242                 }
2243                 sib_info->back = cpu_to_be32(dead_blkno);
2244                 xfs_trans_log_buf(tp, sib_buf,
2245                         XFS_DA_LOGRANGE(sib_info, &sib_info->back,
2246                                         sizeof(sib_info->back)));
2247                 sib_buf = NULL;
2248         }
2249         par_blkno = mp->m_dirleafblk;
2250         level = -1;
2251         /*
2252          * Walk down the tree looking for the parent of the moved block.
2253          */
2254         for (;;) {
2255                 error = xfs_da3_node_read(tp, dp, par_blkno, -1, &par_buf, w);
2256                 if (error)
2257                         goto done;
2258                 par_node = par_buf->b_addr;
2259                 dp->d_ops->node_hdr_from_disk(&par_hdr, par_node);
2260                 if (level >= 0 && level != par_hdr.level + 1) {
2261                         XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)",
2262                                          XFS_ERRLEVEL_LOW, mp);
2263                         error = XFS_ERROR(EFSCORRUPTED);
2264                         goto done;
2265                 }
2266                 level = par_hdr.level;
2267                 btree = dp->d_ops->node_tree_p(par_node);
2268                 for (entno = 0;
2269                      entno < par_hdr.count &&
2270                      be32_to_cpu(btree[entno].hashval) < dead_hash;
2271                      entno++)
2272                         continue;
2273                 if (entno == par_hdr.count) {
2274                         XFS_ERROR_REPORT("xfs_da_swap_lastblock(5)",
2275                                          XFS_ERRLEVEL_LOW, mp);
2276                         error = XFS_ERROR(EFSCORRUPTED);
2277                         goto done;
2278                 }
2279                 par_blkno = be32_to_cpu(btree[entno].before);
2280                 if (level == dead_level + 1)
2281                         break;
2282                 xfs_trans_brelse(tp, par_buf);
2283                 par_buf = NULL;
2284         }
2285         /*
2286          * We're in the right parent block.
2287          * Look for the right entry.
2288          */
2289         for (;;) {
2290                 for (;
2291                      entno < par_hdr.count &&
2292                      be32_to_cpu(btree[entno].before) != last_blkno;
2293                      entno++)
2294                         continue;
2295                 if (entno < par_hdr.count)
2296                         break;
2297                 par_blkno = par_hdr.forw;
2298                 xfs_trans_brelse(tp, par_buf);
2299                 par_buf = NULL;
2300                 if (unlikely(par_blkno == 0)) {
2301                         XFS_ERROR_REPORT("xfs_da_swap_lastblock(6)",
2302                                          XFS_ERRLEVEL_LOW, mp);
2303                         error = XFS_ERROR(EFSCORRUPTED);
2304                         goto done;
2305                 }
2306                 error = xfs_da3_node_read(tp, dp, par_blkno, -1, &par_buf, w);
2307                 if (error)
2308                         goto done;
2309                 par_node = par_buf->b_addr;
2310                 dp->d_ops->node_hdr_from_disk(&par_hdr, par_node);
2311                 if (par_hdr.level != level) {
2312                         XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)",
2313                                          XFS_ERRLEVEL_LOW, mp);
2314                         error = XFS_ERROR(EFSCORRUPTED);
2315                         goto done;
2316                 }
2317                 btree = dp->d_ops->node_tree_p(par_node);
2318                 entno = 0;
2319         }
2320         /*
2321          * Update the parent entry pointing to the moved block.
2322          */
2323         btree[entno].before = cpu_to_be32(dead_blkno);
2324         xfs_trans_log_buf(tp, par_buf,
2325                 XFS_DA_LOGRANGE(par_node, &btree[entno].before,
2326                                 sizeof(btree[entno].before)));
2327         *dead_blknop = last_blkno;
2328         *dead_bufp = last_buf;
2329         return 0;
2330 done:
2331         if (par_buf)
2332                 xfs_trans_brelse(tp, par_buf);
2333         if (sib_buf)
2334                 xfs_trans_brelse(tp, sib_buf);
2335         xfs_trans_brelse(tp, last_buf);
2336         return error;
2337 }
2338 
2339 /*
2340  * Remove a btree block from a directory or attribute.
2341  */
2342 int
2343 xfs_da_shrink_inode(
2344         xfs_da_args_t   *args,
2345         xfs_dablk_t     dead_blkno,
2346         struct xfs_buf  *dead_buf)
2347 {
2348         xfs_inode_t *dp;
2349         int done, error, w, count;
2350         xfs_trans_t *tp;
2351         xfs_mount_t *mp;
2352 
2353         trace_xfs_da_shrink_inode(args);
2354 
2355         dp = args->dp;
2356         w = args->whichfork;
2357         tp = args->trans;
2358         mp = dp->i_mount;
2359         if (w == XFS_DATA_FORK)
2360                 count = mp->m_dirblkfsbs;
2361         else
2362                 count = 1;
2363         for (;;) {
2364                 /*
2365                  * Remove extents.  If we get ENOSPC for a dir we have to move
2366                  * the last block to the place we want to kill.
2367                  */
2368                 error = xfs_bunmapi(tp, dp, dead_blkno, count,
2369                                     xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA,
2370                                     0, args->firstblock, args->flist, &done);
2371                 if (error == ENOSPC) {
2372                         if (w != XFS_DATA_FORK)
2373                                 break;
2374                         error = xfs_da3_swap_lastblock(args, &dead_blkno,
2375                                                       &dead_buf);
2376                         if (error)
2377                                 break;
2378                 } else {
2379                         break;
2380                 }
2381         }
2382         xfs_trans_binval(tp, dead_buf);
2383         return error;
2384 }
2385 
2386 /*
2387  * See if the mapping(s) for this btree block are valid, i.e.
2388  * don't contain holes, are logically contiguous, and cover the whole range.
2389  */
2390 STATIC int
2391 xfs_da_map_covers_blocks(
2392         int             nmap,
2393         xfs_bmbt_irec_t *mapp,
2394         xfs_dablk_t     bno,
2395         int             count)
2396 {
2397         int             i;
2398         xfs_fileoff_t   off;
2399 
2400         for (i = 0, off = bno; i < nmap; i++) {
2401                 if (mapp[i].br_startblock == HOLESTARTBLOCK ||
2402                     mapp[i].br_startblock == DELAYSTARTBLOCK) {
2403                         return 0;
2404                 }
2405                 if (off != mapp[i].br_startoff) {
2406                         return 0;
2407                 }
2408                 off += mapp[i].br_blockcount;
2409         }
2410         return off == bno + count;
2411 }
2412 
2413 /*
2414  * Convert a struct xfs_bmbt_irec to a struct xfs_buf_map.
2415  *
2416  * For the single map case, it is assumed that the caller has provided a pointer
2417  * to a valid xfs_buf_map.  For the multiple map case, this function will
2418  * allocate the xfs_buf_map to hold all the maps and replace the caller's single
2419  * map pointer with the allocated map.
2420  */
2421 static int
2422 xfs_buf_map_from_irec(
2423         struct xfs_mount        *mp,
2424         struct xfs_buf_map      **mapp,
2425         int                     *nmaps,
2426         struct xfs_bmbt_irec    *irecs,
2427         int                     nirecs)
2428 {
2429         struct xfs_buf_map      *map;
2430         int                     i;
2431 
2432         ASSERT(*nmaps == 1);
2433         ASSERT(nirecs >= 1);
2434 
2435         if (nirecs > 1) {
2436                 map = kmem_zalloc(nirecs * sizeof(struct xfs_buf_map),
2437                                   KM_SLEEP | KM_NOFS);
2438                 if (!map)
2439                         return ENOMEM;
2440                 *mapp = map;
2441         }
2442 
2443         *nmaps = nirecs;
2444         map = *mapp;
2445         for (i = 0; i < *nmaps; i++) {
2446                 ASSERT(irecs[i].br_startblock != DELAYSTARTBLOCK &&
2447                        irecs[i].br_startblock != HOLESTARTBLOCK);
2448                 map[i].bm_bn = XFS_FSB_TO_DADDR(mp, irecs[i].br_startblock);
2449                 map[i].bm_len = XFS_FSB_TO_BB(mp, irecs[i].br_blockcount);
2450         }
2451         return 0;
2452 }
2453 
2454 /*
2455  * Map the block we are given ready for reading. There are three possible return
2456  * values:
2457  *      -1 - will be returned if we land in a hole and mappedbno == -2 so the
2458  *           caller knows not to execute a subsequent read.
2459  *       0 - if we mapped the block successfully
2460  *      >0 - positive error number if there was an error.
2461  */
2462 static int
2463 xfs_dabuf_map(
2464         struct xfs_trans        *trans,
2465         struct xfs_inode        *dp,
2466         xfs_dablk_t             bno,
2467         xfs_daddr_t             mappedbno,
2468         int                     whichfork,
2469         struct xfs_buf_map      **map,
2470         int                     *nmaps)
2471 {
2472         struct xfs_mount        *mp = dp->i_mount;
2473         int                     nfsb;
2474         int                     error = 0;
2475         struct xfs_bmbt_irec    irec;
2476         struct xfs_bmbt_irec    *irecs = &irec;
2477         int                     nirecs;
2478 
2479         ASSERT(map && *map);
2480         ASSERT(*nmaps == 1);
2481 
2482         nfsb = (whichfork == XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1;
2483 
2484         /*
2485          * Caller doesn't have a mapping.  -2 means don't complain
2486          * if we land in a hole.
2487          */
2488         if (mappedbno == -1 || mappedbno == -2) {
2489                 /*
2490                  * Optimize the one-block case.
2491                  */
2492                 if (nfsb != 1)
2493                         irecs = kmem_zalloc(sizeof(irec) * nfsb,
2494                                             KM_SLEEP | KM_NOFS);
2495 
2496                 nirecs = nfsb;
2497                 error = xfs_bmapi_read(dp, (xfs_fileoff_t)bno, nfsb, irecs,
2498                                        &nirecs, xfs_bmapi_aflag(whichfork));
2499                 if (error)
2500                         goto out;
2501         } else {
2502                 irecs->br_startblock = XFS_DADDR_TO_FSB(mp, mappedbno);
2503                 irecs->br_startoff = (xfs_fileoff_t)bno;
2504                 irecs->br_blockcount = nfsb;
2505                 irecs->br_state = 0;
2506                 nirecs = 1;
2507         }
2508 
2509         if (!xfs_da_map_covers_blocks(nirecs, irecs, bno, nfsb)) {
2510                 error = mappedbno == -2 ? -1 : XFS_ERROR(EFSCORRUPTED);
2511                 if (unlikely(error == EFSCORRUPTED)) {
2512                         if (xfs_error_level >= XFS_ERRLEVEL_LOW) {
2513                                 int i;
2514                                 xfs_alert(mp, "%s: bno %lld dir: inode %lld",
2515                                         __func__, (long long)bno,
2516                                         (long long)dp->i_ino);
2517                                 for (i = 0; i < *nmaps; i++) {
2518                                         xfs_alert(mp,
2519 "[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d",
2520                                                 i,
2521                                                 (long long)irecs[i].br_startoff,
2522                                                 (long long)irecs[i].br_startblock,
2523                                                 (long long)irecs[i].br_blockcount,
2524                                                 irecs[i].br_state);
2525                                 }
2526                         }
2527                         XFS_ERROR_REPORT("xfs_da_do_buf(1)",
2528                                          XFS_ERRLEVEL_LOW, mp);
2529                 }
2530                 goto out;
2531         }
2532         error = xfs_buf_map_from_irec(mp, map, nmaps, irecs, nirecs);
2533 out:
2534         if (irecs != &irec)
2535                 kmem_free(irecs);
2536         return error;
2537 }
2538 
2539 /*
2540  * Get a buffer for the dir/attr block.
2541  */
2542 int
2543 xfs_da_get_buf(
2544         struct xfs_trans        *trans,
2545         struct xfs_inode        *dp,
2546         xfs_dablk_t             bno,
2547         xfs_daddr_t             mappedbno,
2548         struct xfs_buf          **bpp,
2549         int                     whichfork)
2550 {
2551         struct xfs_buf          *bp;
2552         struct xfs_buf_map      map;
2553         struct xfs_buf_map      *mapp;
2554         int                     nmap;
2555         int                     error;
2556 
2557         *bpp = NULL;
2558         mapp = &map;
2559         nmap = 1;
2560         error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork,
2561                                 &mapp, &nmap);
2562         if (error) {
2563                 /* mapping a hole is not an error, but we don't continue */
2564                 if (error == -1)
2565                         error = 0;
2566                 goto out_free;
2567         }
2568 
2569         bp = xfs_trans_get_buf_map(trans, dp->i_mount->m_ddev_targp,
2570                                     mapp, nmap, 0);
2571         error = bp ? bp->b_error : XFS_ERROR(EIO);
2572         if (error) {
2573                 xfs_trans_brelse(trans, bp);
2574                 goto out_free;
2575         }
2576 
2577         *bpp = bp;
2578 
2579 out_free:
2580         if (mapp != &map)
2581                 kmem_free(mapp);
2582 
2583         return error;
2584 }
2585 
2586 /*
2587  * Get a buffer for the dir/attr block, fill in the contents.
2588  */
2589 int
2590 xfs_da_read_buf(
2591         struct xfs_trans        *trans,
2592         struct xfs_inode        *dp,
2593         xfs_dablk_t             bno,
2594         xfs_daddr_t             mappedbno,
2595         struct xfs_buf          **bpp,
2596         int                     whichfork,
2597         const struct xfs_buf_ops *ops)
2598 {
2599         struct xfs_buf          *bp;
2600         struct xfs_buf_map      map;
2601         struct xfs_buf_map      *mapp;
2602         int                     nmap;
2603         int                     error;
2604 
2605         *bpp = NULL;
2606         mapp = &map;
2607         nmap = 1;
2608         error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork,
2609                                 &mapp, &nmap);
2610         if (error) {
2611                 /* mapping a hole is not an error, but we don't continue */
2612                 if (error == -1)
2613                         error = 0;
2614                 goto out_free;
2615         }
2616 
2617         error = xfs_trans_read_buf_map(dp->i_mount, trans,
2618                                         dp->i_mount->m_ddev_targp,
2619                                         mapp, nmap, 0, &bp, ops);
2620         if (error)
2621                 goto out_free;
2622 
2623         if (whichfork == XFS_ATTR_FORK)
2624                 xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF);
2625         else
2626                 xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF);
2627 
2628         /*
2629          * This verification code will be moved to a CRC verification callback
2630          * function so just leave it here unchanged until then.
2631          */
2632         {
2633                 xfs_dir2_data_hdr_t     *hdr = bp->b_addr;
2634                 xfs_dir2_free_t         *free = bp->b_addr;
2635                 xfs_da_blkinfo_t        *info = bp->b_addr;
2636                 uint                    magic, magic1;
2637                 struct xfs_mount        *mp = dp->i_mount;
2638 
2639                 magic = be16_to_cpu(info->magic);
2640                 magic1 = be32_to_cpu(hdr->magic);
2641                 if (unlikely(
2642                     XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) &&
2643                                    (magic != XFS_DA3_NODE_MAGIC) &&
2644                                    (magic != XFS_ATTR_LEAF_MAGIC) &&
2645                                    (magic != XFS_ATTR3_LEAF_MAGIC) &&
2646                                    (magic != XFS_DIR2_LEAF1_MAGIC) &&
2647                                    (magic != XFS_DIR3_LEAF1_MAGIC) &&
2648                                    (magic != XFS_DIR2_LEAFN_MAGIC) &&
2649                                    (magic != XFS_DIR3_LEAFN_MAGIC) &&
2650                                    (magic1 != XFS_DIR2_BLOCK_MAGIC) &&
2651                                    (magic1 != XFS_DIR3_BLOCK_MAGIC) &&
2652                                    (magic1 != XFS_DIR2_DATA_MAGIC) &&
2653                                    (magic1 != XFS_DIR3_DATA_MAGIC) &&
2654                                    (free->hdr.magic !=
2655                                         cpu_to_be32(XFS_DIR2_FREE_MAGIC)) &&
2656                                    (free->hdr.magic !=
2657                                         cpu_to_be32(XFS_DIR3_FREE_MAGIC)),
2658                                 mp, XFS_ERRTAG_DA_READ_BUF,
2659                                 XFS_RANDOM_DA_READ_BUF))) {
2660                         trace_xfs_da_btree_corrupt(bp, _RET_IP_);
2661                         XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)",
2662                                              XFS_ERRLEVEL_LOW, mp, info);
2663                         error = XFS_ERROR(EFSCORRUPTED);
2664                         xfs_trans_brelse(trans, bp);
2665                         goto out_free;
2666                 }
2667         }
2668         *bpp = bp;
2669 out_free:
2670         if (mapp != &map)
2671                 kmem_free(mapp);
2672 
2673         return error;
2674 }
2675 
2676 /*
2677  * Readahead the dir/attr block.
2678  */
2679 xfs_daddr_t
2680 xfs_da_reada_buf(
2681         struct xfs_trans        *trans,
2682         struct xfs_inode        *dp,
2683         xfs_dablk_t             bno,
2684         xfs_daddr_t             mappedbno,
2685         int                     whichfork,
2686         const struct xfs_buf_ops *ops)
2687 {
2688         struct xfs_buf_map      map;
2689         struct xfs_buf_map      *mapp;
2690         int                     nmap;
2691         int                     error;
2692 
2693         mapp = &map;
2694         nmap = 1;
2695         error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork,
2696                                 &mapp, &nmap);
2697         if (error) {
2698                 /* mapping a hole is not an error, but we don't continue */
2699                 if (error == -1)
2700                         error = 0;
2701                 goto out_free;
2702         }
2703 
2704         mappedbno = mapp[0].bm_bn;
2705         xfs_buf_readahead_map(dp->i_mount->m_ddev_targp, mapp, nmap, ops);
2706 
2707 out_free:
2708         if (mapp != &map)
2709                 kmem_free(mapp);
2710 
2711         if (error)
2712                 return -1;
2713         return mappedbno;
2714 }
2715 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp