libxfs: make resync with the userspace libxfs easier
diff mbox series

Message ID 20191217023535.GA12765@magnolia
State New
Headers show
Series
  • libxfs: make resync with the userspace libxfs easier
Related show

Commit Message

Darrick J. Wong Dec. 17, 2019, 2:35 a.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

Prepare to resync the userspace libxfs with the kernel libxfs.  There
were a few things I missed -- a couple of static inline directory
functions that have to be exported for xfs_repair; a couple of directory
naming functions that make porting much easier if they're /not/ static
inline; and a u16 usage that should have been uint16_t.

None of these things are bugs in their own right; this just makes
porting xfsprogs easier.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/libxfs/xfs_bmap.c      |    2 +-
 fs/xfs/libxfs/xfs_dir2.c      |   21 +++++++++++++++++++++
 fs/xfs/libxfs/xfs_dir2_priv.h |   29 +++++++++--------------------
 fs/xfs/libxfs/xfs_dir2_sf.c   |    6 +++---
 4 files changed, 34 insertions(+), 24 deletions(-)

Comments

Eric Sandeen Dec. 18, 2019, 9 p.m. UTC | #1
On 12/16/19 8:35 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Prepare to resync the userspace libxfs with the kernel libxfs.  There
> were a few things I missed -- a couple of static inline directory
> functions that have to be exported for xfs_repair; a couple of directory
> naming functions that make porting much easier if they're /not/ static
> inline; and a u16 usage that should have been uint16_t.
> 
> None of these things are bugs in their own right; this just makes
> porting xfsprogs easier.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

This all seems fine - I'm wondering about prototypes in xfs_dir2_priv.h
vs xfs_dir2.h - at this point I'm not sure why we have the two,
help?

But whatevs, if that needs cleanup it can come later.

Reviewed-by: Eric Sandeen <sandeen@redhat.com>

> ---
>  fs/xfs/libxfs/xfs_bmap.c      |    2 +-
>  fs/xfs/libxfs/xfs_dir2.c      |   21 +++++++++++++++++++++
>  fs/xfs/libxfs/xfs_dir2_priv.h |   29 +++++++++--------------------
>  fs/xfs/libxfs/xfs_dir2_sf.c   |    6 +++---
>  4 files changed, 34 insertions(+), 24 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index 4a802b3abe77..4c2e046fbfad 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -4561,7 +4561,7 @@ xfs_bmapi_convert_delalloc(
>  	struct xfs_mount	*mp = ip->i_mount;
>  	xfs_fileoff_t		offset_fsb = XFS_B_TO_FSBT(mp, offset);
>  	struct xfs_bmalloca	bma = { NULL };
> -	u16			flags = 0;
> +	uint16_t		flags = 0;
>  	struct xfs_trans	*tp;
>  	int			error;
>  
> diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> index 0aa87cbde49e..dd6fcaaea318 100644
> --- a/fs/xfs/libxfs/xfs_dir2.c
> +++ b/fs/xfs/libxfs/xfs_dir2.c
> @@ -724,3 +724,24 @@ xfs_dir2_namecheck(
>  	/* There shouldn't be any slashes or nulls here */
>  	return !memchr(name, '/', length) && !memchr(name, 0, length);
>  }
> +
> +xfs_dahash_t
> +xfs_dir2_hashname(
> +	struct xfs_mount	*mp,
> +	struct xfs_name		*name)
> +{
> +	if (unlikely(xfs_sb_version_hasasciici(&mp->m_sb)))
> +		return xfs_ascii_ci_hashname(name);
> +	return xfs_da_hashname(name->name, name->len);
> +}
> +
> +enum xfs_dacmp
> +xfs_dir2_compname(
> +	struct xfs_da_args	*args,
> +	const unsigned char	*name,
> +	int			len)
> +{
> +	if (unlikely(xfs_sb_version_hasasciici(&args->dp->i_mount->m_sb)))
> +		return xfs_ascii_ci_compname(args, name, len);
> +	return xfs_da_compname(args, name, len);
> +}
> diff --git a/fs/xfs/libxfs/xfs_dir2_priv.h b/fs/xfs/libxfs/xfs_dir2_priv.h
> index c031c53d0f0d..01ee0b926572 100644
> --- a/fs/xfs/libxfs/xfs_dir2_priv.h
> +++ b/fs/xfs/libxfs/xfs_dir2_priv.h
> @@ -175,6 +175,12 @@ extern int xfs_dir2_sf_lookup(struct xfs_da_args *args);
>  extern int xfs_dir2_sf_removename(struct xfs_da_args *args);
>  extern int xfs_dir2_sf_replace(struct xfs_da_args *args);
>  extern xfs_failaddr_t xfs_dir2_sf_verify(struct xfs_inode *ip);
> +int xfs_dir2_sf_entsize(struct xfs_mount *mp,
> +		struct xfs_dir2_sf_hdr *hdr, int len);
> +void xfs_dir2_sf_put_ino(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr,
> +		struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino);
> +void xfs_dir2_sf_put_ftype(struct xfs_mount *mp,
> +		struct xfs_dir2_sf_entry *sfep, uint8_t ftype);
>  
>  /* xfs_dir2_readdir.c */
>  extern int xfs_readdir(struct xfs_trans *tp, struct xfs_inode *dp,
> @@ -194,25 +200,8 @@ xfs_dir2_data_entsize(
>  	return round_up(len, XFS_DIR2_DATA_ALIGN);
>  }
>  
> -static inline xfs_dahash_t
> -xfs_dir2_hashname(
> -	struct xfs_mount	*mp,
> -	struct xfs_name		*name)
> -{
> -	if (unlikely(xfs_sb_version_hasasciici(&mp->m_sb)))
> -		return xfs_ascii_ci_hashname(name);
> -	return xfs_da_hashname(name->name, name->len);
> -}
> -
> -static inline enum xfs_dacmp
> -xfs_dir2_compname(
> -	struct xfs_da_args	*args,
> -	const unsigned char	*name,
> -	int			len)
> -{
> -	if (unlikely(xfs_sb_version_hasasciici(&args->dp->i_mount->m_sb)))
> -		return xfs_ascii_ci_compname(args, name, len);
> -	return xfs_da_compname(args, name, len);
> -}
> +xfs_dahash_t xfs_dir2_hashname(struct xfs_mount *mp, struct xfs_name *name);
> +enum xfs_dacmp xfs_dir2_compname(struct xfs_da_args *args,
> +		const unsigned char *name, int len);
>  
>  #endif /* __XFS_DIR2_PRIV_H__ */
> diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c
> index 8b94d33d232f..7b7f6fb2ea3b 100644
> --- a/fs/xfs/libxfs/xfs_dir2_sf.c
> +++ b/fs/xfs/libxfs/xfs_dir2_sf.c
> @@ -37,7 +37,7 @@ static void xfs_dir2_sf_check(xfs_da_args_t *args);
>  static void xfs_dir2_sf_toino4(xfs_da_args_t *args);
>  static void xfs_dir2_sf_toino8(xfs_da_args_t *args);
>  
> -static int
> +int
>  xfs_dir2_sf_entsize(
>  	struct xfs_mount	*mp,
>  	struct xfs_dir2_sf_hdr	*hdr,
> @@ -84,7 +84,7 @@ xfs_dir2_sf_get_ino(
>  	return get_unaligned_be64(from) & XFS_MAXINUMBER;
>  }
>  
> -static void
> +void
>  xfs_dir2_sf_put_ino(
>  	struct xfs_mount		*mp,
>  	struct xfs_dir2_sf_hdr		*hdr,
> @@ -145,7 +145,7 @@ xfs_dir2_sf_get_ftype(
>  	return XFS_DIR3_FT_UNKNOWN;
>  }
>  
> -static void
> +void
>  xfs_dir2_sf_put_ftype(
>  	struct xfs_mount	*mp,
>  	struct xfs_dir2_sf_entry *sfep,
>
Darrick J. Wong Dec. 18, 2019, 9:07 p.m. UTC | #2
On Wed, Dec 18, 2019 at 03:00:14PM -0600, Eric Sandeen wrote:
> On 12/16/19 8:35 PM, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Prepare to resync the userspace libxfs with the kernel libxfs.  There
> > were a few things I missed -- a couple of static inline directory
> > functions that have to be exported for xfs_repair; a couple of directory
> > naming functions that make porting much easier if they're /not/ static
> > inline; and a u16 usage that should have been uint16_t.
> > 
> > None of these things are bugs in their own right; this just makes
> > porting xfsprogs easier.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> 
> This all seems fine - I'm wondering about prototypes in xfs_dir2_priv.h
> vs xfs_dir2.h - at this point I'm not sure why we have the two,
> help?

I think the xfs_dir2_priv header is for symbols that are internal to
directories, whereas xfs_dir2.h is for functions that higher level
functions should call to create/modify/erase directory entries.

> But whatevs, if that needs cleanup it can come later.
> 
> Reviewed-by: Eric Sandeen <sandeen@redhat.com>

Thanks.

--D

> > ---
> >  fs/xfs/libxfs/xfs_bmap.c      |    2 +-
> >  fs/xfs/libxfs/xfs_dir2.c      |   21 +++++++++++++++++++++
> >  fs/xfs/libxfs/xfs_dir2_priv.h |   29 +++++++++--------------------
> >  fs/xfs/libxfs/xfs_dir2_sf.c   |    6 +++---
> >  4 files changed, 34 insertions(+), 24 deletions(-)
> > 
> > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> > index 4a802b3abe77..4c2e046fbfad 100644
> > --- a/fs/xfs/libxfs/xfs_bmap.c
> > +++ b/fs/xfs/libxfs/xfs_bmap.c
> > @@ -4561,7 +4561,7 @@ xfs_bmapi_convert_delalloc(
> >  	struct xfs_mount	*mp = ip->i_mount;
> >  	xfs_fileoff_t		offset_fsb = XFS_B_TO_FSBT(mp, offset);
> >  	struct xfs_bmalloca	bma = { NULL };
> > -	u16			flags = 0;
> > +	uint16_t		flags = 0;
> >  	struct xfs_trans	*tp;
> >  	int			error;
> >  
> > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> > index 0aa87cbde49e..dd6fcaaea318 100644
> > --- a/fs/xfs/libxfs/xfs_dir2.c
> > +++ b/fs/xfs/libxfs/xfs_dir2.c
> > @@ -724,3 +724,24 @@ xfs_dir2_namecheck(
> >  	/* There shouldn't be any slashes or nulls here */
> >  	return !memchr(name, '/', length) && !memchr(name, 0, length);
> >  }
> > +
> > +xfs_dahash_t
> > +xfs_dir2_hashname(
> > +	struct xfs_mount	*mp,
> > +	struct xfs_name		*name)
> > +{
> > +	if (unlikely(xfs_sb_version_hasasciici(&mp->m_sb)))
> > +		return xfs_ascii_ci_hashname(name);
> > +	return xfs_da_hashname(name->name, name->len);
> > +}
> > +
> > +enum xfs_dacmp
> > +xfs_dir2_compname(
> > +	struct xfs_da_args	*args,
> > +	const unsigned char	*name,
> > +	int			len)
> > +{
> > +	if (unlikely(xfs_sb_version_hasasciici(&args->dp->i_mount->m_sb)))
> > +		return xfs_ascii_ci_compname(args, name, len);
> > +	return xfs_da_compname(args, name, len);
> > +}
> > diff --git a/fs/xfs/libxfs/xfs_dir2_priv.h b/fs/xfs/libxfs/xfs_dir2_priv.h
> > index c031c53d0f0d..01ee0b926572 100644
> > --- a/fs/xfs/libxfs/xfs_dir2_priv.h
> > +++ b/fs/xfs/libxfs/xfs_dir2_priv.h
> > @@ -175,6 +175,12 @@ extern int xfs_dir2_sf_lookup(struct xfs_da_args *args);
> >  extern int xfs_dir2_sf_removename(struct xfs_da_args *args);
> >  extern int xfs_dir2_sf_replace(struct xfs_da_args *args);
> >  extern xfs_failaddr_t xfs_dir2_sf_verify(struct xfs_inode *ip);
> > +int xfs_dir2_sf_entsize(struct xfs_mount *mp,
> > +		struct xfs_dir2_sf_hdr *hdr, int len);
> > +void xfs_dir2_sf_put_ino(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr,
> > +		struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino);
> > +void xfs_dir2_sf_put_ftype(struct xfs_mount *mp,
> > +		struct xfs_dir2_sf_entry *sfep, uint8_t ftype);
> >  
> >  /* xfs_dir2_readdir.c */
> >  extern int xfs_readdir(struct xfs_trans *tp, struct xfs_inode *dp,
> > @@ -194,25 +200,8 @@ xfs_dir2_data_entsize(
> >  	return round_up(len, XFS_DIR2_DATA_ALIGN);
> >  }
> >  
> > -static inline xfs_dahash_t
> > -xfs_dir2_hashname(
> > -	struct xfs_mount	*mp,
> > -	struct xfs_name		*name)
> > -{
> > -	if (unlikely(xfs_sb_version_hasasciici(&mp->m_sb)))
> > -		return xfs_ascii_ci_hashname(name);
> > -	return xfs_da_hashname(name->name, name->len);
> > -}
> > -
> > -static inline enum xfs_dacmp
> > -xfs_dir2_compname(
> > -	struct xfs_da_args	*args,
> > -	const unsigned char	*name,
> > -	int			len)
> > -{
> > -	if (unlikely(xfs_sb_version_hasasciici(&args->dp->i_mount->m_sb)))
> > -		return xfs_ascii_ci_compname(args, name, len);
> > -	return xfs_da_compname(args, name, len);
> > -}
> > +xfs_dahash_t xfs_dir2_hashname(struct xfs_mount *mp, struct xfs_name *name);
> > +enum xfs_dacmp xfs_dir2_compname(struct xfs_da_args *args,
> > +		const unsigned char *name, int len);
> >  
> >  #endif /* __XFS_DIR2_PRIV_H__ */
> > diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c
> > index 8b94d33d232f..7b7f6fb2ea3b 100644
> > --- a/fs/xfs/libxfs/xfs_dir2_sf.c
> > +++ b/fs/xfs/libxfs/xfs_dir2_sf.c
> > @@ -37,7 +37,7 @@ static void xfs_dir2_sf_check(xfs_da_args_t *args);
> >  static void xfs_dir2_sf_toino4(xfs_da_args_t *args);
> >  static void xfs_dir2_sf_toino8(xfs_da_args_t *args);
> >  
> > -static int
> > +int
> >  xfs_dir2_sf_entsize(
> >  	struct xfs_mount	*mp,
> >  	struct xfs_dir2_sf_hdr	*hdr,
> > @@ -84,7 +84,7 @@ xfs_dir2_sf_get_ino(
> >  	return get_unaligned_be64(from) & XFS_MAXINUMBER;
> >  }
> >  
> > -static void
> > +void
> >  xfs_dir2_sf_put_ino(
> >  	struct xfs_mount		*mp,
> >  	struct xfs_dir2_sf_hdr		*hdr,
> > @@ -145,7 +145,7 @@ xfs_dir2_sf_get_ftype(
> >  	return XFS_DIR3_FT_UNKNOWN;
> >  }
> >  
> > -static void
> > +void
> >  xfs_dir2_sf_put_ftype(
> >  	struct xfs_mount	*mp,
> >  	struct xfs_dir2_sf_entry *sfep,
> >
Christoph Hellwig Dec. 24, 2019, 8:29 a.m. UTC | #3
On Mon, Dec 16, 2019 at 06:35:35PM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Prepare to resync the userspace libxfs with the kernel libxfs.  There
> were a few things I missed -- a couple of static inline directory
> functions that have to be exported for xfs_repair; a couple of directory
> naming functions that make porting much easier if they're /not/ static
> inline; and a u16 usage that should have been uint16_t.
> 
> None of these things are bugs in their own right; this just makes
> porting xfsprogs easier.

Instead of exporting random low-level helpers can you please look
into refactoring repair to not require such low level access.  E.g.
the put_ino helper seems to be mostly used for convert short form
directories from and to the 8 byte inode format, for which we already
have kernel helpers in a slighty different form.

I'm also kinda pissed that this was rushed into mainline after -rc2
despite not fixing anything in the kernel.  That is not how the
development cycle is supposed to work.
Darrick J. Wong Dec. 24, 2019, 9:27 p.m. UTC | #4
On Tue, Dec 24, 2019 at 12:29:54AM -0800, Christoph Hellwig wrote:
> On Mon, Dec 16, 2019 at 06:35:35PM -0800, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Prepare to resync the userspace libxfs with the kernel libxfs.  There
> > were a few things I missed -- a couple of static inline directory
> > functions that have to be exported for xfs_repair; a couple of directory
> > naming functions that make porting much easier if they're /not/ static
> > inline; and a u16 usage that should have been uint16_t.
> > 
> > None of these things are bugs in their own right; this just makes
> > porting xfsprogs easier.
> 
> Instead of exporting random low-level helpers can you please look
> into refactoring repair to not require such low level access.  E.g.
> the put_ino helper seems to be mostly used for convert short form
> directories from and to the 8 byte inode format, for which we already
> have kernel helpers in a slighty different form.

We do?  I didn't find /any/ helpers to fix shortform inums and ftype.
xfs_repair directly manipulates a lot of directory structures directly
with libxfs functions.

> I'm also kinda pissed that this was rushed into mainline after -rc2
> despite not fixing anything in the kernel.  That is not how the
> development cycle is supposed to work.

Frankly, I trust you (and everyone else) to know when a kernel patchset
heading upstream is going to require a lot of non-trivial changes to
xfsprogs and to send a patchset to make whatever cleanups to xfsprogs
are necessary and then port the kernel patches.

95% of the time, the API changes are pretty minor, and Eric and I can
just figure it out between the two of us.  The directory refactoring you
sent for 5.5 turned out to involve a lot more work and I didn't want
Eric to be 100% stuck with the burden of figuring out how to apply
everything.

But maybe I should start asking submitters always to send kernel +
xfsprogs patches at the same time.  Allison's been doing that with the
deferred attr patches and it's very helpful not to have to imagine what
the userspace changes will look like.

So anyway, I am sorry for ruffling your feathers.  I am particularly bad
at handling small cleanups to smooth over xfsprogs when reviewers are
short.

--D
Christoph Hellwig Jan. 7, 2020, 2:18 p.m. UTC | #5
On Tue, Dec 24, 2019 at 01:27:24PM -0800, Darrick J. Wong wrote:
> > Instead of exporting random low-level helpers can you please look
> > into refactoring repair to not require such low level access.  E.g.
> > the put_ino helper seems to be mostly used for convert short form
> > directories from and to the 8 byte inode format, for which we already
> > have kernel helpers in a slighty different form.
> 
> We do?  I didn't find /any/ helpers to fix shortform inums and ftype.
> xfs_repair directly manipulates a lot of directory structures directly
> with libxfs functions.

We have helpers to convert between the 4 and 7 byte ino sf format,
which sounds like something that should be reused.

> So anyway, I am sorry for ruffling your feathers.  I am particularly bad
> at handling small cleanups to smooth over xfsprogs when reviewers are
> short.

What really annoys me is not that patch - it is worth a discussion.
The problem is that you rushed it into -rc against the merge window
rules before we could even have a discussion.

Patch
diff mbox series

diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
index 4a802b3abe77..4c2e046fbfad 100644
--- a/fs/xfs/libxfs/xfs_bmap.c
+++ b/fs/xfs/libxfs/xfs_bmap.c
@@ -4561,7 +4561,7 @@  xfs_bmapi_convert_delalloc(
 	struct xfs_mount	*mp = ip->i_mount;
 	xfs_fileoff_t		offset_fsb = XFS_B_TO_FSBT(mp, offset);
 	struct xfs_bmalloca	bma = { NULL };
-	u16			flags = 0;
+	uint16_t		flags = 0;
 	struct xfs_trans	*tp;
 	int			error;
 
diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
index 0aa87cbde49e..dd6fcaaea318 100644
--- a/fs/xfs/libxfs/xfs_dir2.c
+++ b/fs/xfs/libxfs/xfs_dir2.c
@@ -724,3 +724,24 @@  xfs_dir2_namecheck(
 	/* There shouldn't be any slashes or nulls here */
 	return !memchr(name, '/', length) && !memchr(name, 0, length);
 }
+
+xfs_dahash_t
+xfs_dir2_hashname(
+	struct xfs_mount	*mp,
+	struct xfs_name		*name)
+{
+	if (unlikely(xfs_sb_version_hasasciici(&mp->m_sb)))
+		return xfs_ascii_ci_hashname(name);
+	return xfs_da_hashname(name->name, name->len);
+}
+
+enum xfs_dacmp
+xfs_dir2_compname(
+	struct xfs_da_args	*args,
+	const unsigned char	*name,
+	int			len)
+{
+	if (unlikely(xfs_sb_version_hasasciici(&args->dp->i_mount->m_sb)))
+		return xfs_ascii_ci_compname(args, name, len);
+	return xfs_da_compname(args, name, len);
+}
diff --git a/fs/xfs/libxfs/xfs_dir2_priv.h b/fs/xfs/libxfs/xfs_dir2_priv.h
index c031c53d0f0d..01ee0b926572 100644
--- a/fs/xfs/libxfs/xfs_dir2_priv.h
+++ b/fs/xfs/libxfs/xfs_dir2_priv.h
@@ -175,6 +175,12 @@  extern int xfs_dir2_sf_lookup(struct xfs_da_args *args);
 extern int xfs_dir2_sf_removename(struct xfs_da_args *args);
 extern int xfs_dir2_sf_replace(struct xfs_da_args *args);
 extern xfs_failaddr_t xfs_dir2_sf_verify(struct xfs_inode *ip);
+int xfs_dir2_sf_entsize(struct xfs_mount *mp,
+		struct xfs_dir2_sf_hdr *hdr, int len);
+void xfs_dir2_sf_put_ino(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr,
+		struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino);
+void xfs_dir2_sf_put_ftype(struct xfs_mount *mp,
+		struct xfs_dir2_sf_entry *sfep, uint8_t ftype);
 
 /* xfs_dir2_readdir.c */
 extern int xfs_readdir(struct xfs_trans *tp, struct xfs_inode *dp,
@@ -194,25 +200,8 @@  xfs_dir2_data_entsize(
 	return round_up(len, XFS_DIR2_DATA_ALIGN);
 }
 
-static inline xfs_dahash_t
-xfs_dir2_hashname(
-	struct xfs_mount	*mp,
-	struct xfs_name		*name)
-{
-	if (unlikely(xfs_sb_version_hasasciici(&mp->m_sb)))
-		return xfs_ascii_ci_hashname(name);
-	return xfs_da_hashname(name->name, name->len);
-}
-
-static inline enum xfs_dacmp
-xfs_dir2_compname(
-	struct xfs_da_args	*args,
-	const unsigned char	*name,
-	int			len)
-{
-	if (unlikely(xfs_sb_version_hasasciici(&args->dp->i_mount->m_sb)))
-		return xfs_ascii_ci_compname(args, name, len);
-	return xfs_da_compname(args, name, len);
-}
+xfs_dahash_t xfs_dir2_hashname(struct xfs_mount *mp, struct xfs_name *name);
+enum xfs_dacmp xfs_dir2_compname(struct xfs_da_args *args,
+		const unsigned char *name, int len);
 
 #endif /* __XFS_DIR2_PRIV_H__ */
diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c
index 8b94d33d232f..7b7f6fb2ea3b 100644
--- a/fs/xfs/libxfs/xfs_dir2_sf.c
+++ b/fs/xfs/libxfs/xfs_dir2_sf.c
@@ -37,7 +37,7 @@  static void xfs_dir2_sf_check(xfs_da_args_t *args);
 static void xfs_dir2_sf_toino4(xfs_da_args_t *args);
 static void xfs_dir2_sf_toino8(xfs_da_args_t *args);
 
-static int
+int
 xfs_dir2_sf_entsize(
 	struct xfs_mount	*mp,
 	struct xfs_dir2_sf_hdr	*hdr,
@@ -84,7 +84,7 @@  xfs_dir2_sf_get_ino(
 	return get_unaligned_be64(from) & XFS_MAXINUMBER;
 }
 
-static void
+void
 xfs_dir2_sf_put_ino(
 	struct xfs_mount		*mp,
 	struct xfs_dir2_sf_hdr		*hdr,
@@ -145,7 +145,7 @@  xfs_dir2_sf_get_ftype(
 	return XFS_DIR3_FT_UNKNOWN;
 }
 
-static void
+void
 xfs_dir2_sf_put_ftype(
 	struct xfs_mount	*mp,
 	struct xfs_dir2_sf_entry *sfep,