xfs: cleanup xfs_idestroy_fork
authorChristoph Hellwig <hch@lst.de>
Mon, 18 May 2020 17:29:27 +0000 (10:29 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 19 May 2020 16:40:59 +0000 (09:40 -0700)
Move freeing the dynamically allocated attr and COW fork, as well
as zeroing the pointers where actually needed into the callers, and
just pass the xfs_ifork structure to xfs_idestroy_fork.  Also simplify
the kmem_free calls by not checking for NULL first.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/libxfs/xfs_attr_leaf.c
fs/xfs/libxfs/xfs_inode_buf.c
fs/xfs/libxfs/xfs_inode_fork.c
fs/xfs/libxfs/xfs_inode_fork.h
fs/xfs/xfs_attr_inactive.c
fs/xfs/xfs_icache.c

index 9ca33d064f839dfdaa823bd827234a781e28dc72..f3d18a1f5b20c8c336dcaa1e83d740a6d1bbc25a 100644 (file)
@@ -717,11 +717,10 @@ xfs_attr_fork_remove(
 {
        ASSERT(ip->i_afp->if_nextents == 0);
 
-       xfs_idestroy_fork(ip, XFS_ATTR_FORK);
+       xfs_idestroy_fork(ip->i_afp);
+       kmem_cache_free(xfs_ifork_zone, ip->i_afp);
+       ip->i_afp = NULL;
        ip->i_d.di_forkoff = 0;
-
-       ASSERT(ip->i_afp == NULL);
-
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 }
 
index ab555671e15439d032d79bb7b1e224fa4edf32de..6f84ea85fdd837813e2054117c9339cc6a562525 100644 (file)
@@ -271,7 +271,7 @@ xfs_inode_from_disk(
        return 0;
 
 out_destroy_data_fork:
-       xfs_idestroy_fork(ip, XFS_DATA_FORK);
+       xfs_idestroy_fork(&ip->i_df);
        return error;
 }
 
index ef43b4893766cf95bf32d30a6b73d19c7884e36b..28b366275ae0ed76255cea8a7ad5bc30a9b21ad8 100644 (file)
@@ -503,38 +503,24 @@ xfs_idata_realloc(
 
 void
 xfs_idestroy_fork(
-       xfs_inode_t     *ip,
-       int             whichfork)
+       struct xfs_ifork        *ifp)
 {
-       struct xfs_ifork        *ifp;
-
-       ifp = XFS_IFORK_PTR(ip, whichfork);
        if (ifp->if_broot != NULL) {
                kmem_free(ifp->if_broot);
                ifp->if_broot = NULL;
        }
 
        /*
-        * If the format is local, then we can't have an extents
-        * array so just look for an inline data array.  If we're
-        * not local then we may or may not have an extents list,
-        * so check and free it up if we do.
+        * If the format is local, then we can't have an extents array so just
+        * look for an inline data array.  If we're not local then we may or may
+        * not have an extents list, so check and free it up if we do.
         */
        if (ifp->if_format == XFS_DINODE_FMT_LOCAL) {
-               if (ifp->if_u1.if_data != NULL) {
-                       kmem_free(ifp->if_u1.if_data);
-                       ifp->if_u1.if_data = NULL;
-               }
-       } else if ((ifp->if_flags & XFS_IFEXTENTS) && ifp->if_height) {
-               xfs_iext_destroy(ifp);
-       }
-
-       if (whichfork == XFS_ATTR_FORK) {
-               kmem_cache_free(xfs_ifork_zone, ip->i_afp);
-               ip->i_afp = NULL;
-       } else if (whichfork == XFS_COW_FORK) {
-               kmem_cache_free(xfs_ifork_zone, ip->i_cowfp);
-               ip->i_cowfp = NULL;
+               kmem_free(ifp->if_u1.if_data);
+               ifp->if_u1.if_data = NULL;
+       } else if (ifp->if_flags & XFS_IFEXTENTS) {
+               if (ifp->if_height)
+                       xfs_iext_destroy(ifp);
        }
 }
 
index d849cca103edd7f45a41695bf8180d1eb9255a83..a4953e95c4f3f61f81ef6e3a72002d238e096f91 100644 (file)
@@ -86,7 +86,7 @@ int           xfs_iformat_data_fork(struct xfs_inode *, struct xfs_dinode *);
 int            xfs_iformat_attr_fork(struct xfs_inode *, struct xfs_dinode *);
 void           xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *,
                                struct xfs_inode_log_item *, int);
-void           xfs_idestroy_fork(struct xfs_inode *, int);
+void           xfs_idestroy_fork(struct xfs_ifork *ifp);
 void           xfs_idata_realloc(struct xfs_inode *ip, int64_t byte_diff,
                                int whichfork);
 void           xfs_iroot_realloc(struct xfs_inode *, int, int);
index 00ffc46c0bf715677dffda4b5cde1e1e84e295e3..bfad669e6b2f8ea550fb582c5335682a047dfc3d 100644 (file)
@@ -388,8 +388,11 @@ out_cancel:
        xfs_trans_cancel(trans);
 out_destroy_fork:
        /* kill the in-core attr fork before we drop the inode lock */
-       if (dp->i_afp)
-               xfs_idestroy_fork(dp, XFS_ATTR_FORK);
+       if (dp->i_afp) {
+               xfs_idestroy_fork(dp->i_afp);
+               kmem_cache_free(xfs_ifork_zone, dp->i_afp);
+               dp->i_afp = NULL;
+       }
        if (lock_mode)
                xfs_iunlock(dp, lock_mode);
        return error;
index c09b3e9eab1da0128bd6098576a9ee268602c0fb..d806d3bfa89361f1893015a8f09c3d443bf98ebc 100644 (file)
@@ -87,15 +87,18 @@ xfs_inode_free_callback(
        case S_IFREG:
        case S_IFDIR:
        case S_IFLNK:
-               xfs_idestroy_fork(ip, XFS_DATA_FORK);
+               xfs_idestroy_fork(&ip->i_df);
                break;
        }
 
-       if (ip->i_afp)
-               xfs_idestroy_fork(ip, XFS_ATTR_FORK);
-       if (ip->i_cowfp)
-               xfs_idestroy_fork(ip, XFS_COW_FORK);
-
+       if (ip->i_afp) {
+               xfs_idestroy_fork(ip->i_afp);
+               kmem_cache_free(xfs_ifork_zone, ip->i_afp);
+       }
+       if (ip->i_cowfp) {
+               xfs_idestroy_fork(ip->i_cowfp);
+               kmem_cache_free(xfs_ifork_zone, ip->i_cowfp);
+       }
        if (ip->i_itemp) {
                ASSERT(!test_bit(XFS_LI_IN_AIL,
                                 &ip->i_itemp->ili_item.li_flags));