xfs
[Top] [All Lists]

[RFC 03/17] xfs: (parent ptr) get offset when replacing a directory name

To: xfs@xxxxxxxxxxx
Subject: [RFC 03/17] xfs: (parent ptr) get offset when replacing a directory name
From: Mark Tinguely <tinguely@xxxxxxx>
Date: Wed, 15 Jan 2014 16:00:15 -0600
Delivered-to: xfs@xxxxxxxxxxx
References: <20140115220012.624438534@xxxxxxx>
User-agent: quilt/0.51-1
Return the directory offset information when replacing an entry to the
directory.

This offset will be used as the parent pointer offset in xfs_rename.

---
 fs/xfs/xfs_dir2.c       |    5 ++++-
 fs/xfs/xfs_dir2.h       |    3 ++-
 fs/xfs/xfs_dir2_block.c |    1 +
 fs/xfs/xfs_dir2_leaf.c  |    1 +
 fs/xfs/xfs_dir2_node.c  |    1 +
 fs/xfs/xfs_dir2_sf.c    |    3 +++
 fs/xfs/xfs_inode.c      |    8 ++++----
 7 files changed, 16 insertions(+), 6 deletions(-)

Index: b/fs/xfs/xfs_dir2.c
===================================================================
--- a/fs/xfs/xfs_dir2.c
+++ b/fs/xfs/xfs_dir2.c
@@ -391,7 +391,8 @@ xfs_dir_replace(
        xfs_ino_t       inum,           /* new inode number */
        xfs_fsblock_t   *first,         /* bmap's firstblock */
        xfs_bmap_free_t *flist,         /* bmap's freeblock list */
-       xfs_extlen_t    total)          /* bmap's total block count */
+       xfs_extlen_t    total,          /* bmap's total block count */
+       __uint32_t      *offset)        /* out: return entry's dir offset */
 {
        xfs_da_args_t   args;
        int             rval;
@@ -427,6 +428,8 @@ xfs_dir_replace(
                rval = xfs_dir2_leaf_replace(&args);
        else
                rval = xfs_dir2_node_replace(&args);
+       if (offset)
+               *offset = args.offset;
        return rval;
 }
 
Index: b/fs/xfs/xfs_dir2.h
===================================================================
--- a/fs/xfs/xfs_dir2.h
+++ b/fs/xfs/xfs_dir2.h
@@ -132,7 +132,8 @@ extern int xfs_dir_removename(struct xfs
 extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
                                struct xfs_name *name, xfs_ino_t inum,
                                xfs_fsblock_t *first,
-                               struct xfs_bmap_free *flist, xfs_extlen_t tot);
+                               struct xfs_bmap_free *flist, xfs_extlen_t tot,
+                               __uint32_t *offset);
 extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
                                struct xfs_name *name, uint resblks);
 
Index: b/fs/xfs/xfs_dir2_block.c
===================================================================
--- a/fs/xfs/xfs_dir2_block.c
+++ b/fs/xfs/xfs_dir2_block.c
@@ -872,6 +872,7 @@ xfs_dir2_block_replace(
        /*
         * Point to the data entry we need to change.
         */
+       args->offset = be32_to_cpu(blp[ent].address);
        dep = (xfs_dir2_data_entry_t *)
              ((char *)hdr + xfs_dir2_dataptr_to_off(mp, 
be32_to_cpu(blp[ent].address)));
        ASSERT(be64_to_cpu(dep->inumber) != args->inumber);
Index: b/fs/xfs/xfs_dir2_leaf.c
===================================================================
--- a/fs/xfs/xfs_dir2_leaf.c
+++ b/fs/xfs/xfs_dir2_leaf.c
@@ -1515,6 +1515,7 @@ xfs_dir2_leaf_replace(
        /*
         * Point to the data entry.
         */
+       args->offset = be32_to_cpu(lep->address);
        dep = (xfs_dir2_data_entry_t *)
              ((char *)dbp->b_addr +
               xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address)));
Index: b/fs/xfs/xfs_dir2_node.c
===================================================================
--- a/fs/xfs/xfs_dir2_node.c
+++ b/fs/xfs/xfs_dir2_node.c
@@ -2186,6 +2186,7 @@ xfs_dir2_node_replace(
                hdr = state->extrablk.bp->b_addr;
                ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||
                       hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC));
+               args->offset = be32_to_cpu(lep->address);
                dep = (xfs_dir2_data_entry_t *)
                      ((char *)hdr +
                       xfs_dir2_dataptr_to_off(state->mp, 
be32_to_cpu(lep->address)));
Index: b/fs/xfs/xfs_dir2_sf.c
===================================================================
--- a/fs/xfs/xfs_dir2_sf.c
+++ b/fs/xfs/xfs_dir2_sf.c
@@ -987,6 +987,9 @@ xfs_dir2_sf_replace(
 #endif
                                dp->d_ops->sf_put_ino(sfp, sfep, args->inumber);
                                dp->d_ops->sf_put_ftype(sfep, args->filetype);
+                               args->offset = xfs_dir2_byte_to_dataptr(
+                                                 dp->i_mount,
+                                                 xfs_dir2_sf_get_offset(sfep));
                                break;
                        }
                }
Index: b/fs/xfs/xfs_inode.c
===================================================================
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2778,8 +2778,8 @@ xfs_rename(
                 * name at the destination directory, remove it first.
                 */
                error = xfs_dir_replace(tp, target_dp, target_name,
-                                       src_ip->i_ino,
-                                       &first_block, &free_list, spaceres);
+                                       src_ip->i_ino, &first_block,
+                                       &free_list, spaceres, NULL);
                if (error)
                        goto abort_return;
 
@@ -2813,8 +2813,8 @@ xfs_rename(
                 * directory.
                 */
                error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
-                                       target_dp->i_ino,
-                                       &first_block, &free_list, spaceres);
+                                       target_dp->i_ino, &first_block,
+                                       &free_list, spaceres, NULL);
                ASSERT(error != EEXIST);
                if (error)
                        goto abort_return;


<Prev in Thread] Current Thread [Next in Thread>