]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libxfs: sync dir2 kernel differences
authorDave Chinner <dchinner@redhat.com>
Wed, 4 Sep 2013 22:05:14 +0000 (22:05 +0000)
committerRich Johnston <rjohnston@sgi.com>
Mon, 16 Sep 2013 20:14:41 +0000 (15:14 -0500)
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Review-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Rich Johnston <rjohnston@sgi.com>
libxfs/xfs_dir2.c
libxfs/xfs_dir2_data.c
libxfs/xfs_dir2_leaf.c
libxfs/xfs_dir2_node.c

index 6a4027f6bc13060d07f7d19891d29810592dee34..830fe3e1ab703230fe116c6cb4f90823bb806897 100644 (file)
@@ -391,6 +391,51 @@ xfs_dir_replace(
        return rval;
 }
 
+/*
+ * See if this entry can be added to the directory without allocating space.
+ * First checks that the caller couldn't reserve enough space (resblks = 0).
+ */
+int
+xfs_dir_canenter(
+       xfs_trans_t     *tp,
+       xfs_inode_t     *dp,
+       struct xfs_name *name,          /* name of entry to add */
+       uint            resblks)
+{
+       xfs_da_args_t   args;
+       int             rval;
+       int             v;              /* type-checking value */
+
+       if (resblks)
+               return 0;
+
+       ASSERT(S_ISDIR(dp->i_d.di_mode));
+
+       memset(&args, 0, sizeof(xfs_da_args_t));
+       args.name = name->name;
+       args.namelen = name->len;
+       args.hashval = dp->i_mount->m_dirnameops->hashname(name);
+       args.dp = dp;
+       args.whichfork = XFS_DATA_FORK;
+       args.trans = tp;
+       args.op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME |
+                                                       XFS_DA_OP_OKNOENT;
+
+       if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
+               rval = xfs_dir2_sf_addname(&args);
+       else if ((rval = xfs_dir2_isblock(tp, dp, &v)))
+               return rval;
+       else if (v)
+               rval = xfs_dir2_block_addname(&args);
+       else if ((rval = xfs_dir2_isleaf(tp, dp, &v)))
+               return rval;
+       else if (v)
+               rval = xfs_dir2_leaf_addname(&args);
+       else
+               rval = xfs_dir2_node_addname(&args);
+       return rval;
+}
+
 /*
  * Utility routines.
  */
index 155352c08ef5017d69a407ee4579851e4a43d780..064ddb2b390404f274288415fdaf23225a817327 100644 (file)
@@ -53,15 +53,15 @@ __xfs_dir3_data_check(
        bf = xfs_dir3_data_bestfree_p(hdr);
        p = (char *)xfs_dir3_data_entry_p(hdr);
 
-       switch (be32_to_cpu(hdr->magic)) {
-       case XFS_DIR2_BLOCK_MAGIC:
-       case XFS_DIR3_BLOCK_MAGIC:
+       switch (hdr->magic) {
+       case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
+       case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC):
                btp = xfs_dir2_block_tail_p(mp, hdr);
                lep = xfs_dir2_block_leaf_p(btp);
                endp = (char *)lep;
                break;
-       case XFS_DIR2_DATA_MAGIC:
-       case XFS_DIR3_DATA_MAGIC:
+       case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
+       case cpu_to_be32(XFS_DIR2_DATA_MAGIC):
                endp = (char *)hdr + mp->m_dirblksize;
                break;
        default:
@@ -209,14 +209,14 @@ xfs_dir3_data_reada_verify(
        struct xfs_mount        *mp = bp->b_target->bt_mount;
        struct xfs_dir2_data_hdr *hdr = bp->b_addr;
 
-       switch (be32_to_cpu(hdr->magic)) {
-       case XFS_DIR2_BLOCK_MAGIC:
-       case XFS_DIR3_BLOCK_MAGIC:
+       switch (hdr->magic) {
+       case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC):
+       case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
                bp->b_ops = &xfs_dir3_block_buf_ops;
                bp->b_ops->verify_read(bp);
                return;
-       case XFS_DIR2_DATA_MAGIC:
-       case XFS_DIR3_DATA_MAGIC:
+       case cpu_to_be32(XFS_DIR2_DATA_MAGIC):
+       case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
                xfs_dir3_data_verify(bp);
                return;
        default:
index a287bb1816d01c0dd38bb3fba09d20b3d7cc84ec..8c20b9ec149fde16f2ddc9b88065e83736470f93 100644 (file)
@@ -247,14 +247,14 @@ xfs_dir3_leaf1_write_verify(
        __write_verify(bp, XFS_DIR2_LEAF1_MAGIC);
 }
 
-void
+static void
 xfs_dir3_leafn_read_verify(
        struct xfs_buf  *bp)
 {
        __read_verify(bp, XFS_DIR2_LEAFN_MAGIC);
 }
 
-void
+static void
 xfs_dir3_leafn_write_verify(
        struct xfs_buf  *bp)
 {
index f819776bb502f195889e24f2f8a1efe281332ef0..fea0131c389feaf42f8352d701e6bdb1e2269e47 100644 (file)
@@ -257,7 +257,6 @@ xfs_dir3_free_get_buf(
                hdr3->hdr.blkno = cpu_to_be64(bp->b_bn);
                hdr3->hdr.owner = cpu_to_be64(dp->i_ino);
                uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid);
-
        } else
                hdr.magic = XFS_DIR2_FREE_MAGIC;
        xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr);
@@ -978,7 +977,7 @@ xfs_dir2_leafn_rebalance(
        xfs_dir2_leaf_t         *leaf1;         /* first leaf structure */
        xfs_dir2_leaf_t         *leaf2;         /* second leaf structure */
        int                     mid;            /* midpoint leaf index */
-#ifdef DEBUG
+#if defined(DEBUG) || defined(XFS_WARN)
        int                     oldstale;       /* old count of stale leaves */
 #endif
        int                     oldsum;         /* old total leaf count */
@@ -1007,7 +1006,7 @@ xfs_dir2_leafn_rebalance(
        ents2 = xfs_dir3_leaf_ents_p(leaf2);
 
        oldsum = hdr1.count + hdr2.count;
-#ifdef DEBUG
+#if defined(DEBUG) || defined(XFS_WARN)
        oldstale = hdr1.stale + hdr2.stale;
 #endif
        mid = oldsum >> 1;
@@ -1101,7 +1100,6 @@ xfs_dir3_data_block_free(
        __be16                  *bests;
        struct xfs_dir3_icfree_hdr freehdr;
 
-
        xfs_dir3_free_hdr_from_disk(&freehdr, free);
 
        bests = xfs_dir3_free_bests_p(tp->t_mountp, free);
@@ -1115,12 +1113,14 @@ xfs_dir3_data_block_free(
                return 0;
        }
 
-       /*
-        * One less used entry in the free table. Unused is not converted
-        * because we only need to know if it zero
-        */
+       /* One less used entry in the free table. */
        freehdr.nused--;
 
+       /*
+        * If this was the last entry in the table, we can trim the table size
+        * back.  There might be other entries at the end referring to
+        * non-existent data blocks, get those too.
+        */
        if (findex == freehdr.nvalid - 1) {
                int     i;              /* free entry index */
 
@@ -1159,7 +1159,6 @@ xfs_dir3_data_block_free(
                 */
        }
 
-
        /* Log the free entry that changed, unless we got rid of it.  */
        if (logfree)
                xfs_dir2_free_log_bests(tp, fbp, findex, findex);
@@ -1275,9 +1274,8 @@ xfs_dir2_leafn_remove(
        {
                struct xfs_dir3_icfree_hdr freehdr;
                xfs_dir3_free_hdr_from_disk(&freehdr, free);
-               ASSERT(freehdr.firstdb ==
-                                      xfs_dir3_free_max_bests(mp) *
-                                      (fdb - XFS_DIR2_FREE_FIRSTDB(mp)));
+               ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) *
+                                         (fdb - XFS_DIR2_FREE_FIRSTDB(mp)));
        }
 #endif
                /*
@@ -1425,7 +1423,7 @@ xfs_dir2_leafn_toosmall(
        leaf = blk->bp->b_addr;
        xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
        ents = xfs_dir3_leaf_ents_p(leaf);
-       xfs_dir3_leaf_check(mp, blk->bp);
+       xfs_dir3_leaf_check(state->args->dp->i_mount, blk->bp);
 
        count = leafhdr.count - leafhdr.stale;
        bytes = xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]);
@@ -1863,7 +1861,7 @@ xfs_dir2_node_addname_int(
                 * If there wasn't a freespace block, the read will
                 * return a NULL fbp.  Allocate and initialize a new one.
                 */
-               if(!fbp) {
+               if (!fbp) {
                        error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE,
                                                    &fbno);
                        if (error)