[PATCH v2] erofs-utils: fix build failure with musl libc

Natanael Copa ncopa at alpinelinux.org
Thu May 8 02:35:07 AEST 2025


On Wed,  7 May 2025 21:25:48 +0800
Gao Xiang <hsiangkao at linux.alibaba.com> wrote:

> because musl use readdir, pread and lseek instead of readdir64,
> pread64 and lseek64.
> 
> Reported-by: Milan P. Stani* <mps at arvanta.net>
> Thanks-to: Natanael Copa <ncopa at alpinelinux.org>
> Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
> ---
> (Fix wrong email address typo..)
> 
> Hi,
> 
> Due to the original patch lacks of the commit message and
> SOB, so I revised myself.

Ok with me.

> 
> I add "_FILE_OFFSET_BITS 64" in the top since "contrib/stress.c"
> can be compiled individually.

This looks correct.


Thank you!

> Feel free to repost a formal patch if inappropriate.
> 
> Thanks,
> Gao Xiang
> 
>  contrib/stress.c | 23 ++++++++++++-----------
>  1 file changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/contrib/stress.c b/contrib/stress.c
> index d8def6a..0ef8c67 100644
> --- a/contrib/stress.c
> +++ b/contrib/stress.c
> @@ -4,6 +4,7 @@
>   *
>   * Copyright (C) 2019-2025 Gao Xiang <xiang at kernel.org>
>   */
> +#define _FILE_OFFSET_BITS 64
>  #define _GNU_SOURCE
>  #include "erofs/defs.h"
>  #include <errno.h>
> @@ -271,7 +272,7 @@ static int __getdents_f(unsigned int sn, struct fent *fe)
>  	}
>  
>  	dir = fdopendir(dfd);
> -	while (readdir64(dir) != NULL)
> +	while (readdir(dir) != NULL)
>  		continue;
>  	closedir(dir);
>  	return 0;
> @@ -428,7 +429,7 @@ static int __read_f(unsigned int sn, struct fent *fe, uint64_t filesize)
>  
>  	printf("%d[%u]/%u read_f: %llu bytes @ %llu of %s\n", getpid(), procid,
>  	       sn, len | 0ULL, off | 0ULL, fe->subpath);
> -	nread = pread64(fe->fd, buf, len, off);
> +	nread = pread(fe->fd, buf, len, off);
>  	if (nread != trimmed) {
>  		fprintf(stderr, "%d[%u]/%u read_f: failed to read %llu bytes @ %llu of %s\n",
>  			getpid(), procid, sn, len | 0ULL, off | 0ULL,
> @@ -439,7 +440,7 @@ static int __read_f(unsigned int sn, struct fent *fe, uint64_t filesize)
>  	if (fe->chkfd < 0)
>  		return 0;
>  
> -	nread2 = pread64(fe->chkfd, chkbuf, len, off);
> +	nread2 = pread(fe->chkfd, chkbuf, len, off);
>  	if (nread2 <= 0) {
>  		fprintf(stderr, "%d[%u]/%u read_f: failed to check %llu bytes @ %llu of %s\n",
>  			getpid(), procid, sn, len | 0ULL, off | 0ULL,
> @@ -477,14 +478,14 @@ static int read_f(int op, unsigned int sn)
>  	if (ret)
>  		return ret;
>  
> -	fsz = lseek64(fe->fd, 0, SEEK_END);
> +	fsz = lseek(fe->fd, 0, SEEK_END);
>  	if (fsz <= 0) {
>  		if (!fsz) {
>  			printf("%d[%u]/%u %s: zero size @ %s\n",
>  			       getpid(), procid, sn, __func__, fe->subpath);
>  			return 0;
>  		}
> -		fprintf(stderr, "%d[%u]/%u %s: lseek64 %s failed %d\n",
> +		fprintf(stderr, "%d[%u]/%u %s: lseek %s failed %d\n",
>  			getpid(), procid, sn, __func__, fe->subpath, errno);
>  		return -errno;
>  	}
> @@ -504,7 +505,7 @@ static int __doscan_f(unsigned int sn, const char *op, struct fent *fe,
>  	for (pos = 0; pos < filesize; pos += chunksize) {
>  		ssize_t nread, nread2;
>  
> -		nread = pread64(fe->fd, buf, chunksize, pos);
> +		nread = pread(fe->fd, buf, chunksize, pos);
>  
>  		if (nread <= 0)
>  			return -errno;
> @@ -515,7 +516,7 @@ static int __doscan_f(unsigned int sn, const char *op, struct fent *fe,
>  		if (fe->chkfd < 0)
>  			continue;
>  
> -		nread2 = pread64(fe->chkfd, chkbuf, chunksize, pos);
> +		nread2 = pread(fe->chkfd, chkbuf, chunksize, pos);
>  		if (nread2 <= 0)
>  			return -errno;
>  
> @@ -547,14 +548,14 @@ static int doscan_f(int op, unsigned int sn)
>  	if (ret)
>  		return ret;
>  
> -	fsz = lseek64(fe->fd, 0, SEEK_END);
> +	fsz = lseek(fe->fd, 0, SEEK_END);
>  	if (fsz <= 0) {
>  		if (!fsz) {
>  			printf("%d[%u]/%u %s: zero size @ %s\n",
>  			       getpid(), procid, sn, __func__, fe->subpath);
>  			return 0;
>  		}
> -		fprintf(stderr, "%d[%u]/%u %s: lseek64 %s failed %d\n",
> +		fprintf(stderr, "%d[%u]/%u %s: lseek %s failed %d\n",
>  			getpid(), procid, sn, __func__, fe->subpath, errno);
>  		return -errno;
>  	}
> @@ -576,7 +577,7 @@ static int doscan_aligned_f(int op, unsigned int sn)
>  	ret = tryopen(sn, __func__, fe);
>  	if (ret)
>  		return ret;
> -	fsz = lseek64(fe->fd, 0, SEEK_END);
> +	fsz = lseek(fe->fd, 0, SEEK_END);
>  	if (fsz <= psz) {
>  		if (fsz >= 0) {
>  			printf("%d[%u]/%u %s: size too small %lld @ %s\n",
> @@ -584,7 +585,7 @@ static int doscan_aligned_f(int op, unsigned int sn)
>  			       fe->subpath);
>  			return 0;
>  		}
> -		fprintf(stderr, "%d[%u]/%u %s: lseek64 %s failed %d\n",
> +		fprintf(stderr, "%d[%u]/%u %s: lseek %s failed %d\n",
>  			getpid(), procid, sn, __func__, fe->subpath, errno);
>  		return -errno;
>  	}



More information about the Linux-erofs mailing list