Files
Benjamin Coddington 06cf07f8a3 nfs: fix incorrect error handling in LOCALIO
JIRA: https://issues.redhat.com/browse/RHEL-77609

commit ead11ac50ad4b8ef1b64806e962ea984862d96ad
Author: Mike Snitzer <snitzer@kernel.org>
Date:   Mon Jan 13 17:29:03 2025 -0500

    nfs: fix incorrect error handling in LOCALIO

    nfs4_stat_to_errno() expects a NFSv4 error code as an argument and
    returns a POSIX errno.

    The problem is LOCALIO is passing nfs4_stat_to_errno() the POSIX errno
    return values from filp->f_op->read_iter(), filp->f_op->write_iter()
    and vfs_fsync_range().

    So the POSIX errno that nfs_local_pgio_done() and
    nfs_local_commit_done() are passing to nfs4_stat_to_errno() are
    failing to match any NFSv4 error code, which results in
    nfs4_stat_to_errno() defaulting to returning -EREMOTEIO. This causes
    assertions in upper layers due to -EREMOTEIO not being a valid NFSv4
    error code.

    Fix this by updating nfs_local_pgio_done() and nfs_local_commit_done()
    to use the new nfs_localio_errno_to_nfs4_stat() to map a POSIX errno
    to an NFSv4 error code.

    Care was taken to factor out nfs4_errtbl_common[] to avoid duplicating
    the same NFS error to errno table. nfs4_errtbl_common[] is checked
    first by both nfs4_stat_to_errno and nfs_localio_errno_to_nfs4_stat
    before they check their own more specialized tables (nfs4_errtbl[] and
    nfs4_errtbl_localio[] respectively).

    While auditing the associated error mapping tables, the (ab)use of -1
    for the last table entry was removed in favor of using ARRAY_SIZE to
    iterate the nfs_errtbl[] and nfs4_errtbl[]. And 'errno_NFSERR_IO' was
    removed because it caused needless obfuscation.

    Fixes: 70ba381e1a ("nfs: add LOCALIO support")
    Reported-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Mike Snitzer <snitzer@kernel.org>
    Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2025-03-31 11:34:31 -04:00

19 lines
458 B
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* This file contains constants and methods used by both NFS client and server.
*/
#ifndef _LINUX_NFS_COMMON_H
#define _LINUX_NFS_COMMON_H
#include <linux/errno.h>
#include <uapi/linux/nfs.h>
/* Mapping from NFS error code to "errno" error code. */
int nfs_stat_to_errno(enum nfs_stat status);
int nfs4_stat_to_errno(int stat);
__u32 nfs_localio_errno_to_nfs4_stat(int errno);
#endif /* _LINUX_NFS_COMMON_H */