xfs: expose xfs_bmap_local_to_extents for online repair
authorDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:54:58 +0000 (14:54 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:58:57 +0000 (14:58 -0700)
Allow online repair to call xfs_bmap_local_to_extents and add a void *
argument at the end so that online repair can pass its own context.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_bmap.h
fs/xfs/libxfs/xfs_symlink_remote.c
fs/xfs/libxfs/xfs_symlink_remote.h

index 46bbc9f0a11732a2402ea1265466c900e1fca9e4..59b8b9dc29ccff9f44ad301c987317ffadc3b38d 100644 (file)
@@ -779,7 +779,7 @@ xfs_bmap_local_to_extents_empty(
 }
 
 
-STATIC int                             /* error */
+int                                    /* error */
 xfs_bmap_local_to_extents(
        xfs_trans_t     *tp,            /* transaction pointer */
        xfs_inode_t     *ip,            /* incore inode pointer */
@@ -789,7 +789,8 @@ xfs_bmap_local_to_extents(
        void            (*init_fn)(struct xfs_trans *tp,
                                   struct xfs_buf *bp,
                                   struct xfs_inode *ip,
-                                  struct xfs_ifork *ifp))
+                                  struct xfs_ifork *ifp, void *priv),
+       void            *priv)
 {
        int             error = 0;
        int             flags;          /* logging flags returned */
@@ -850,7 +851,7 @@ xfs_bmap_local_to_extents(
         * log here. Note that init_fn must also set the buffer log item type
         * correctly.
         */
-       init_fn(tp, bp, ip, ifp);
+       init_fn(tp, bp, ip, ifp, priv);
 
        /* account for the change in fork size */
        xfs_idata_realloc(ip, -ifp->if_bytes, whichfork);
@@ -982,8 +983,8 @@ xfs_bmap_add_attrfork_local(
 
        if (S_ISLNK(VFS_I(ip)->i_mode))
                return xfs_bmap_local_to_extents(tp, ip, 1, flags,
-                                                XFS_DATA_FORK,
-                                                xfs_symlink_local_to_remote);
+                               XFS_DATA_FORK, xfs_symlink_local_to_remote,
+                               NULL);
 
        /* should only be called for types that support local format data */
        ASSERT(0);
index b8bdbf1560e658f41e4f6b329349e2cf217ca815..32fb2a455c294f627d8ce21ebc45971a37ba350a 100644 (file)
@@ -179,6 +179,12 @@ unsigned int xfs_bmap_compute_attr_offset(struct xfs_mount *mp);
 int    xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd);
 void   xfs_bmap_local_to_extents_empty(struct xfs_trans *tp,
                struct xfs_inode *ip, int whichfork);
+int xfs_bmap_local_to_extents(struct xfs_trans *tp, struct xfs_inode *ip,
+               xfs_extlen_t total, int *logflagsp, int whichfork,
+               void (*init_fn)(struct xfs_trans *tp, struct xfs_buf *bp,
+                               struct xfs_inode *ip, struct xfs_ifork *ifp,
+                               void *priv),
+               void *priv);
 void   xfs_bmap_compute_maxlevels(struct xfs_mount *mp, int whichfork);
 int    xfs_bmap_first_unused(struct xfs_trans *tp, struct xfs_inode *ip,
                xfs_extlen_t len, xfs_fileoff_t *unused, int whichfork);
index 8f0d5c584f46f8ec95625e3e0c719dfc48340a1f..d150576ddd0af297f1d9bc7a01a6566b31bb2b4f 100644 (file)
@@ -169,7 +169,8 @@ xfs_symlink_local_to_remote(
        struct xfs_trans        *tp,
        struct xfs_buf          *bp,
        struct xfs_inode        *ip,
-       struct xfs_ifork        *ifp)
+       struct xfs_ifork        *ifp,
+       void                    *priv)
 {
        struct xfs_mount        *mp = ip->i_mount;
        char                    *buf;
index ac3dac8f617ed063c6e14a5353e347b916a42b45..83b89a1deb9f2c542e029dd9a76a7e3d9eec3516 100644 (file)
@@ -16,7 +16,8 @@ int xfs_symlink_hdr_set(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset,
 bool xfs_symlink_hdr_ok(xfs_ino_t ino, uint32_t offset,
                        uint32_t size, struct xfs_buf *bp);
 void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp,
-                                struct xfs_inode *ip, struct xfs_ifork *ifp);
+                                struct xfs_inode *ip, struct xfs_ifork *ifp,
+                                void *priv);
 xfs_failaddr_t xfs_symlink_shortform_verify(void *sfp, int64_t size);
 int xfs_symlink_remote_read(struct xfs_inode *ip, char *link);
 int xfs_symlink_write_target(struct xfs_trans *tp, struct xfs_inode *ip,