]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: remove parent pointers in unlink
authorAllison Henderson <allison.henderson@oracle.com>
Mon, 29 Jul 2024 23:22:48 +0000 (16:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:01:02 +0000 (17:01 -0700)
Source kernel commit: d2d18330f63cd70b50eddac76de7c59a36f2faa7

This patch removes the parent pointer attribute during unlink

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
[djwong: adjust to new ondisk format, minor rebase fixes]
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
libxfs/libxfs_api_defs.h
libxfs/xfs_parent.c
libxfs/xfs_parent.h
libxfs/xfs_trans_space.c
libxfs/xfs_trans_space.h
repair/phase6.c

index 9b44b7709fdbb0d37b4319e22909d82915b43438..896b6c953f4b77fa60f32243805463e4664bb167 100644 (file)
 #define xfs_refcountbt_stage_cursor    libxfs_refcountbt_stage_cursor
 #define xfs_refcount_get_rec           libxfs_refcount_get_rec
 #define xfs_refcount_lookup_le         libxfs_refcount_lookup_le
+#define xfs_remove_space_res           libxfs_remove_space_res
 
 #define xfs_rmap_alloc                 libxfs_rmap_alloc
 #define xfs_rmapbt_calc_reserves       libxfs_rmapbt_calc_reserves
index b0516c3f68dcebcbbffceff416f3bd8e68f52292..0657728e681cafc052971c9aff0f9745562bbed6 100644 (file)
@@ -202,3 +202,25 @@ xfs_parent_addname(
        xfs_attr_defer_add(&ppargs->args, XFS_ATTR_DEFER_SET);
        return 0;
 }
+
+/* Remove a parent pointer to reflect a dirent removal. */
+int
+xfs_parent_removename(
+       struct xfs_trans        *tp,
+       struct xfs_parent_args  *ppargs,
+       struct xfs_inode        *dp,
+       const struct xfs_name   *parent_name,
+       struct xfs_inode        *child)
+{
+       int                     error;
+
+       error = xfs_parent_iread_extents(tp, child);
+       if (error)
+               return error;
+
+       xfs_inode_to_parent_rec(&ppargs->rec, dp);
+       xfs_parent_da_args_init(&ppargs->args, tp, &ppargs->rec, child,
+                       child->i_ino, parent_name);
+       xfs_attr_defer_add(&ppargs->args, XFS_ATTR_DEFER_REMOVE);
+       return 0;
+}
index 6de24e3ef318ca5614732ea913d3b7a2d6b1b73c..4a7fd48c226a4345d959ef80e9ce7a1c7c45aa73 100644 (file)
@@ -81,5 +81,8 @@ xfs_parent_finish(
 int xfs_parent_addname(struct xfs_trans *tp, struct xfs_parent_args *ppargs,
                struct xfs_inode *dp, const struct xfs_name *parent_name,
                struct xfs_inode *child);
+int xfs_parent_removename(struct xfs_trans *tp, struct xfs_parent_args *ppargs,
+               struct xfs_inode *dp, const struct xfs_name *parent_name,
+               struct xfs_inode *child);
 
 #endif /* __XFS_PARENT_H__ */
index bf4a41492c2274d27165d34df3cf879790b12261..86a91a3a844140274cc0e13d2c2c1ac029e1ef29 100644 (file)
@@ -81,3 +81,16 @@ xfs_symlink_space_res(
 
        return ret;
 }
+
+unsigned int
+xfs_remove_space_res(
+       struct xfs_mount        *mp,
+       unsigned int            namelen)
+{
+       unsigned int            ret = XFS_DIRREMOVE_SPACE_RES(mp);
+
+       if (xfs_has_parent(mp))
+               ret += xfs_parent_calc_space_res(mp, namelen);
+
+       return ret;
+}
index 354ad1d6e18d6c584d927eb0ae1edf35434cf677..a4490813c56f132183159680686c9bb106f94836 100644 (file)
@@ -91,8 +91,6 @@
         XFS_DQUOT_CLUSTER_SIZE_FSB)
 #define        XFS_QM_QINOCREATE_SPACE_RES(mp) \
        XFS_IALLOC_SPACE_RES(mp)
-#define        XFS_REMOVE_SPACE_RES(mp)        \
-       XFS_DIRREMOVE_SPACE_RES(mp)
 #define        XFS_RENAME_SPACE_RES(mp,nl)     \
        (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl))
 #define XFS_IFREE_SPACE_RES(mp)                \
@@ -106,5 +104,6 @@ unsigned int xfs_mkdir_space_res(struct xfs_mount *mp, unsigned int namelen);
 unsigned int xfs_link_space_res(struct xfs_mount *mp, unsigned int namelen);
 unsigned int xfs_symlink_space_res(struct xfs_mount *mp, unsigned int namelen,
                unsigned int fsblocks);
+unsigned int xfs_remove_space_res(struct xfs_mount *mp, unsigned int namelen);
 
 #endif /* __XFS_TRANS_SPACE_H__ */
index c4260fb9187e30558d33c30c18ea2e92be7901e2..2eba9772da6c1308be41ac5fdfe8661a0a7458df 100644 (file)
@@ -1283,7 +1283,7 @@ longform_dir2_rebuild(
            libxfs_dir_ino_validate(mp, pip.i_ino))
                pip.i_ino = mp->m_sb.sb_rootino;
 
-       nres = XFS_REMOVE_SPACE_RES(mp);
+       nres = libxfs_remove_space_res(mp, 0);
        error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_remove, nres, 0, 0, &tp);
        if (error)
                res_failed(error);
@@ -1389,7 +1389,7 @@ dir2_kill_block(
        int             nres;
        xfs_trans_t     *tp;
 
-       nres = XFS_REMOVE_SPACE_RES(mp);
+       nres = libxfs_remove_space_res(mp, 0);
        error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_remove, nres, 0, 0, &tp);
        if (error)
                res_failed(error);
@@ -2908,7 +2908,7 @@ process_dir_inode(
                         * inode but it's easier than wedging a
                         * new define in ourselves.
                         */
-                       nres = no_modify ? 0 : XFS_REMOVE_SPACE_RES(mp);
+                       nres = no_modify ? 0 : libxfs_remove_space_res(mp, 0);
                        error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_remove,
                                                    nres, 0, 0, &tp);
                        if (error)