From: Dave Chinner <dchinner@xxxxxxxxxx> This conversion was overlooked earlier on. Now that the differences between userspace and kernel space are getting smaller this bug is obvious. Fix it. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- include/xfs_symlink.h | 2 ++ libxfs/xfs_bmap.c | 12 ------------ libxfs/xfs_symlink.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h index 55f3f2d..e85dfd1 100644 --- a/include/xfs_symlink.h +++ b/include/xfs_symlink.h @@ -31,6 +31,8 @@ struct xfs_dsymlink_hdr { int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); bool xfs_symlink_hdr_ok(struct xfs_mount *mp, 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); extern const struct xfs_buf_ops xfs_symlink_buf_ops; diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 5234674..ce72b87 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1221,18 +1221,6 @@ xfs_bmap_add_attrfork_extents( return error; } -STATIC void -xfs_symlink_local_to_remote( - struct xfs_trans *tp, - struct xfs_buf *bp, - struct xfs_inode *ip, - struct xfs_ifork *ifp) -{ - /* remote symlink blocks are not verifiable until CRCs come along */ - bp->b_ops = NULL; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); -} - /* * Called from xfs_bmap_add_attrfork to handle local format files. Each * different data fork content type needs a different callout to do the diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink.c index 860b123..f2e69f9 100644 --- a/libxfs/xfs_symlink.c +++ b/libxfs/xfs_symlink.c @@ -145,3 +145,32 @@ const struct xfs_buf_ops xfs_symlink_buf_ops = { .verify_write = xfs_symlink_write_verify, }; +void +xfs_symlink_local_to_remote( + struct xfs_trans *tp, + struct xfs_buf *bp, + struct xfs_inode *ip, + struct xfs_ifork *ifp) +{ + struct xfs_mount *mp = ip->i_mount; + char *buf; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) { + bp->b_ops = NULL; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + return; + } + + /* + * As this symlink fits in an inode literal area, it must also fit in + * the smallest buffer the filesystem supports. + */ + ASSERT(BBTOB(bp->b_length) >= + ifp->if_bytes + sizeof(struct xfs_dsymlink_hdr)); + + bp->b_ops = &xfs_symlink_buf_ops; + + buf = bp->b_addr; + buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp); + memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes); +} -- 1.8.3.2 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs