[linux] Use fstat() rather than statx()

The statx() system call has a clean header file and a consistent
layout, but was unfortunately added only in kernel 4.11.

Using stat() or fstat() directly is extremely messy since glibc does
not necessarily use the kernel native data structures.  However, as
the only current use case is to obtain the length of an open file, we
can merely provide a wrapper that does precisely this.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2021-03-03 00:34:02 +00:00
parent 2a2909cd1f
commit 69ecab2634
3 changed files with 8 additions and 11 deletions

View File

@@ -200,14 +200,15 @@ int __asmcall linux_ioctl ( int fd, unsigned long request, ... ) {
}
/**
* Wrap statx()
* Wrap part of fstat()
*
*/
int __asmcall linux_statx ( int dirfd, const char *pathname, int flags,
unsigned int mask, struct statx *statxbuf ) {
int __asmcall linux_fstat_size ( int fd, size_t *size ) {
struct stat stat;
int ret;
ret = statx ( dirfd, pathname, flags, mask, statxbuf );
ret = fstat ( fd, &stat );
*size = stat.st_size;
if ( ret == -1 )
linux_errno = errno;
return ret;
@@ -531,7 +532,7 @@ PROVIDE_IPXE_SYM ( linux_read );
PROVIDE_IPXE_SYM ( linux_write );
PROVIDE_IPXE_SYM ( linux_fcntl );
PROVIDE_IPXE_SYM ( linux_ioctl );
PROVIDE_IPXE_SYM ( linux_statx );
PROVIDE_IPXE_SYM ( linux_fstat_size );
PROVIDE_IPXE_SYM ( linux_poll );
PROVIDE_IPXE_SYM ( linux_nanosleep );
PROVIDE_IPXE_SYM ( linux_usleep );

View File

@@ -40,7 +40,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
* @ret len Length read, or negative error
*/
int linux_sysfs_read ( const char *filename, userptr_t *data ) {
struct statx statx;
size_t offset;
size_t len;
ssize_t read;
@@ -57,13 +56,12 @@ int linux_sysfs_read ( const char *filename, userptr_t *data ) {
}
/* Get file length */
if ( linux_statx ( fd, "", AT_EMPTY_PATH, STATX_SIZE, &statx ) == -1 ) {
if ( linux_fstat_size ( fd, &len ) == -1 ) {
rc = -ELINUX ( linux_errno );
DBGC ( filename, "LINUX could not stat %s: %s\n",
filename, linux_strerror ( linux_errno ) );
goto err_stat;
}
len = statx.stx_size;
/* Allocate buffer */
*data = umalloc ( len );