Commit ef744be4 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: expose xfs_bmap_local_to_extents for online repair



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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 73597e3e
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -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);
+6 −0
Original line number Diff line number Diff line
@@ -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);
+2 −1
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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,