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; _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs