]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
smb/client: annotate smberr.h with POSIX error codes
authorHuiwen He <hehuiwen@kylinos.cn>
Thu, 2 Apr 2026 14:18:35 +0000 (14:18 +0000)
committerSteve French <stfrench@microsoft.com>
Mon, 6 Apr 2026 00:58:40 +0000 (19:58 -0500)
Annotate SMB1 error definitions in smberr.h with their corresponding
POSIX error codes.

To facilitate automated processing and ensure consistent formatting,
existing inline comments (/* ... */) in smberr.h were first moved to
the lines preceding the #define statements.

This provides the source data for generating sorted mapping tables,
allowing the implementation of binary search for faster error mapping
lookups in later commits.

The annotations were performed based on the manual
mapping_table_ERRDOS[] and mapping_table_ERRSRV[] arrays in
smb1maperror.c using the following python script:

#!/usr/bin/env python3
import re
import os

MAP_FILE = "fs/smb/client/smb1maperror.c"
SMBERR_FILE = "fs/smb/client/smberr.h"

def get_mappings():
    mappings = {}
    if not os.path.exists(MAP_FILE):
return mappings
    with open(MAP_FILE, "r") as f:
content = f.read()
    for table in ["mapping_table_ERRDOS", "mapping_table_ERRSRV"]:
pattern = (
    rf'static const struct smb_to_posix_error {table}\[\] = '
    r'\{([\s\S]+?)\};'
)
match = re.search(pattern, content)
if match:
    entry_pattern = (
r'\{\s*([A-Za-z0-9_]+)\s*,\s*'
r'(-[A-Z0-9_]+)\s*\}'
    )
    entries = re.findall(entry_pattern, match.group(1))
    for name, posix in entries:
if name != "0":
    mappings[name] = posix
    return mappings

def format_comment(comment_lines):
    """
    Formats comment lines to comply with Linux kernel coding style.
    Single-line comments remain on one line.
    Multi-line comments use the standard block format.
    """
    raw_text = []
    for line in comment_lines:
line = line.strip()
if line.startswith('/*'):
    line = line[2:]
if line.endswith('*/'):
    line = line[:-2]
line = line.lstrip(' *').strip()
if line:
    raw_text.append(line)

    if not raw_text:
return []

    # If it's a single line of text, keep it simple
    if len(raw_text) == 1:
return [f"/* {raw_text[0]} */"]

    # Multi-line: Standard Kernel Block Comment Format
    formatted = ["/*"]
    for text in raw_text:
formatted.append(f" * {text}")
    formatted.append(" */")
    return formatted

def fix_content(content, mappings):
    lines = content.splitlines()
    new_lines, i = [], 0
    while i < len(lines):
line = lines[i]
# Match #define with inline comment
define_re = (
    r'^(\s*#define\s+([A-Za-z0-9_]+)\s+'
    r'[^\s/]+)\s*/\*'
)
match = re.match(define_re, line)
if match:
    prefix, name = match.group(1), match.group(2)

    # Extract full comment block
    comment_block = [line[line.find('/*'):].strip()]
    if '*/' not in line:
while i + 1 < len(lines):
    i += 1
    comment_block.append(lines[i].strip())
    if '*/' in lines[i]:
break

    # Format and add comment
    new_lines.extend(format_comment(comment_block))

    # Add define with tab-separated POSIX code
    new_define = prefix.rstrip()
    if name in mappings:
new_define += '\t// ' + mappings[name]
    new_lines.append(new_define)
else:
    no_comment_re = (
r'^(\s*#define\s+([A-Za-z0-9_]+)\s+'
r'[^\s/]+)\s*$'
    )
    match_no_comment = re.match(no_comment_re, line)
    if match_no_comment:
prefix = match_no_comment.group(1)
name = match_no_comment.group(2)
new_define = prefix.rstrip()
if name in mappings:
    new_define += '\t// ' + mappings[name]
new_lines.append(new_define)
    else:
new_lines.append(line)
i += 1
    return '\n'.join(new_lines)

if __name__ == "__main__":
    m = get_mappings()
    if os.path.exists(SMBERR_FILE):
with open(SMBERR_FILE, "r") as f:
    content = f.read()
fixed = fix_content(content, m)
with open(SMBERR_FILE, "w") as f:
    f.write(fixed + '\n')
print(f"Successfully processed {SMBERR_FILE}")

Signed-off-by: Huiwen He <hehuiwen@kylinos.cn>
Reviewed-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smberr.h

index 5cdd958aaa3528004d0eca94a984bb6a7960746e..d3633623473a593296d9ee2894ef0908118cde36 100644 (file)
@@ -9,11 +9,16 @@
  *
  */
 
-#define SUCCESS        0x00    /* The request was successful. */
-#define ERRDOS 0x01    /* Error is from the core DOS operating system set */
-#define ERRSRV 0x02    /* Error is generated by the file server daemon */
-#define ERRHRD 0x03    /* Error is a hardware error. */
-#define ERRCMD 0xFF    /* Command was not in the "SMB" format. */
+/* The request was successful. */
+#define SUCCESS        0x00
+/* Error is from the core DOS operating system set */
+#define ERRDOS 0x01
+/* Error is generated by the file server daemon */
+#define ERRSRV 0x02
+/* Error is a hardware error. */
+#define ERRHRD 0x03
+/* Command was not in the "SMB" format. */
+#define ERRCMD 0xFF
 
 /* The following error codes may be generated with the SUCCESS error class.*/
 
 
 /* The following error codes may be generated with the ERRDOS error class.*/
 
-#define ERRbadfunc             1       /* Invalid function. The server did not
-                                          recognize or could not perform a
-                                          system call generated by the server,
-                                          e.g., set the DIRECTORY attribute on
-                                          a data file, invalid seek mode. */
-#define ERRbadfile             2       /* File not found. The last component
-                                          of a file's pathname could not be
-                                          found. */
-#define ERRbadpath             3       /* Directory invalid. A directory
-                                          component in a pathname could not be
-                                          found. */
-#define ERRnofids              4       /* Too many open files. The server has
-                                          no file handles available. */
-#define ERRnoaccess            5       /* Access denied, the client's context
-                                          does not permit the requested
-                                          function. This includes the
-                                          following conditions: invalid rename
-                                          command, write to Fid open for read
-                                          only, read on Fid open for write
-                                          only, attempt to delete a non-empty
-                                          directory */
-#define ERRbadfid              6       /* Invalid file handle. The file handle
-                                          specified was not recognized by the
-                                          server. */
-#define ERRbadmcb              7       /* Memory control blocks destroyed. */
-#define ERRnomem               8       /* Insufficient server memory to
-                                          perform the requested function. */
-#define ERRbadmem              9       /* Invalid memory block address. */
-#define ERRbadenv              10      /* Invalid environment. */
-#define ERRbadformat           11      /* Invalid format. */
-#define ERRbadaccess           12      /* Invalid open mode. */
-#define ERRbaddata             13      /* Invalid data (generated only by
-                                          IOCTL calls within the server). */
-#define ERRbaddrive            15      /* Invalid drive specified. */
-#define ERRremcd               16      /* A Delete Directory request attempted
-                                          to remove the server's current
-                                          directory. */
-#define ERRdiffdevice          17      /* Not same device (e.g., a cross
-                                          volume rename was attempted */
-#define ERRnofiles             18      /* A File Search command can find no
-                                          more files matching the specified
-                                          criteria. */
-#define ERRwriteprot           19      /* media is write protected */
+/*
+ * Invalid function. The server did not
+ * recognize or could not perform a
+ * system call generated by the server,
+ * e.g., set the DIRECTORY attribute on
+ * a data file, invalid seek mode.
+ */
+#define ERRbadfunc             1       // -EINVAL
+/*
+ * File not found. The last component
+ * of a file's pathname could not be
+ * found.
+ */
+#define ERRbadfile             2       // -ENOENT
+/*
+ * Directory invalid. A directory
+ * component in a pathname could not be
+ * found.
+ */
+#define ERRbadpath             3       // -ENOTDIR
+/*
+ * Too many open files. The server has
+ * no file handles available.
+ */
+#define ERRnofids              4       // -EMFILE
+/*
+ * Access denied, the client's context
+ * does not permit the requested
+ * function. This includes the
+ * following conditions: invalid rename
+ * command, write to Fid open for read
+ * only, read on Fid open for write
+ * only, attempt to delete a non-empty
+ * directory
+ */
+#define ERRnoaccess            5       // -EACCES
+/*
+ * Invalid file handle. The file handle
+ * specified was not recognized by the
+ * server.
+ */
+#define ERRbadfid              6       // -EBADF
+/* Memory control blocks destroyed. */
+#define ERRbadmcb              7       // -EIO
+/*
+ * Insufficient server memory to
+ * perform the requested function.
+ */
+#define ERRnomem               8       // -EREMOTEIO
+/* Invalid memory block address. */
+#define ERRbadmem              9       // -EFAULT
+/* Invalid environment. */
+#define ERRbadenv              10      // -EFAULT
+/* Invalid format. */
+#define ERRbadformat           11      // -EINVAL
+/* Invalid open mode. */
+#define ERRbadaccess           12      // -EACCES
+/*
+ * Invalid data (generated only by
+ * IOCTL calls within the server).
+ */
+#define ERRbaddata             13      // -EIO
+/* Invalid drive specified. */
+#define ERRbaddrive            15      // -ENXIO
+/*
+ * A Delete Directory request attempted
+ * to remove the server's current
+ * directory.
+ */
+#define ERRremcd               16      // -EACCES
+/*
+ * Not same device (e.g., a cross
+ * volume rename was attempted
+ */
+#define ERRdiffdevice          17      // -EXDEV
+/*
+ * A File Search command can find no
+ * more files matching the specified
+ * criteria.
+ */
+#define ERRnofiles             18      // -ENOENT
+/* media is write protected */
+#define ERRwriteprot           19      // -EROFS
 #define ERRgeneral             31
-#define ERRbadshare            32      /* The sharing mode specified for an
-                                          Open conflicts with existing FIDs on
-                                          the file. */
-#define ERRlock                        33      /* A Lock request conflicted with an
-                                          existing lock or specified an
-                                          invalid mode, or an Unlock requested
-                                          attempted to remove a lock held by
-                                          another process. */
-#define ERRunsup               50
-#define ERRnosuchshare         67
-#define ERRfilexists           80      /* The file named in the request
-                                          already exists. */
-#define ERRinvparm             87
-#define ERRdiskfull            112
-#define ERRinvname             123
-#define ERRunknownlevel                124
-#define ERRdirnotempty         145
-#define ERRnotlocked           158
-#define ERRcancelviolation     173
-#define ERRalreadyexists       183
+/*
+ * The sharing mode specified for an
+ * Open conflicts with existing FIDs on
+ * the file.
+ */
+#define ERRbadshare            32      // -EBUSY
+/*
+ * A Lock request conflicted with an
+ * existing lock or specified an
+ * invalid mode, or an Unlock requested
+ * attempted to remove a lock held by
+ * another process.
+ */
+#define ERRlock                        33      // -EACCES
+#define ERRunsup               50      // -EINVAL
+#define ERRnosuchshare         67      // -ENXIO
+/*
+ * The file named in the request
+ * already exists.
+ */
+#define ERRfilexists           80      // -EEXIST
+#define ERRinvparm             87      // -EINVAL
+#define ERRdiskfull            112     // -ENOSPC
+#define ERRinvname             123     // -ENOENT
+#define ERRunknownlevel                124     // -EOPNOTSUPP
+#define ERRdirnotempty         145     // -ENOTEMPTY
+#define ERRnotlocked           158     // -ENOLCK
+#define ERRcancelviolation     173     // -ENOLCK
+#define ERRalreadyexists       183     // -EEXIST
 #define ERRbadpipe             230
 #define ERRpipebusy            231
 #define ERRpipeclosing         232
 #define ERRnotconnected                233
-#define ERRmoredata            234
-#define ERReasnotsupported     282
-#define ErrQuota               0x200   /* The operation would cause a quota
-                                          limit to be exceeded. */
-#define ErrNotALink            0x201   /* A link operation was performed on a
-                                          pathname that was not a link. */
-#define ERRnetlogonNotStarted  2455
+#define ERRmoredata            234     // -EOVERFLOW
+#define ERReasnotsupported     282     // -EOPNOTSUPP
+/*
+ * The operation would cause a quota
+ * limit to be exceeded.
+ */
+#define ErrQuota               0x200   // -EDQUOT
+/*
+ * A link operation was performed on a
+ * pathname that was not a link.
+ */
+#define ErrNotALink            0x201   // -ENOLINK
+#define ERRnetlogonNotStarted  2455    // -ENOPROTOOPT
 
 /* Below errors are used internally (do not come over the wire) for passthrough
    from STATUS codes to POSIX only  */
-#define ERRsymlink              0xFFFD
-#define ErrTooManyLinks         0xFFFE
+#define ERRsymlink              0xFFFD // -EOPNOTSUPP
+#define ErrTooManyLinks         0xFFFE // -EMLINK
 
 /* Following error codes may be generated with the ERRSRV error class.*/
 
-#define ERRerror               1       /* Non-specific error code. It is
-                                          returned under the following
-                                          conditions: resource other than disk
-                                          space exhausted (e.g. TIDs), first
-                                          SMB command was not negotiate,
-                                          multiple negotiates attempted, and
-                                          internal server error. */
-#define ERRbadpw               2       /* Bad password - name/password pair in
-                                          a TreeConnect or Session Setup are
-                                          invalid. */
-#define ERRbadtype             3       /* used for indicating DFS referral
-                                          needed */
-#define ERRaccess              4       /* The client does not have the
-                                          necessary access rights within the
-                                          specified context for requested
-                                          function. */
-#define ERRinvtid              5       /* The Tid specified in a command was
-                                          invalid. */
-#define ERRinvnetname          6       /* Invalid network name in tree
-                                          connect. */
-#define ERRinvdevice           7       /* Invalid device - printer request
-                                          made to non-printer connection or
-                                          non-printer request made to printer
-                                          connection. */
-#define ERRqfull               49      /* Print queue full (files) -- returned
-                                          by open print file. */
-#define ERRqtoobig             50      /* Print queue full -- no space. */
-#define ERRqeof                        51      /* EOF on print queue dump */
-#define ERRinvpfid             52      /* Invalid print file FID. */
-#define ERRsmbcmd              64      /* The server did not recognize the
-                                          command received. */
-#define ERRsrverror            65      /* The server encountered an internal
-                                          error, e.g., system file
-                                          unavailable. */
-#define ERRbadBID              66      /* (obsolete) */
-#define ERRfilespecs           67      /* The Fid and pathname parameters
-                                          contained an invalid combination of
-                                          values. */
-#define ERRbadLink             68      /* (obsolete) */
-#define ERRbadpermits          69      /* The access permissions specified for
-                                          a file or directory are not a valid
-                                          combination. */
-#define ERRbadPID              70
-#define ERRsetattrmode         71      /* attribute (mode) is invalid */
-#define ERRpaused              81      /* Server is paused */
-#define ERRmsgoff              82      /* reserved - messaging off */
-#define ERRnoroom              83      /* reserved - no room for message */
-#define ERRrmuns               87      /* reserved - too many remote names */
-#define ERRtimeout             88      /* operation timed out */
-#define ERRnoresource          89      /* No resources available for request
-                                          */
-#define ERRtoomanyuids         90      /* Too many UIDs active on this session
-                                          */
-#define ERRbaduid              91      /* The UID is not known as a valid user
-                                          */
-#define ERRusempx              250     /* temporarily unable to use raw */
-#define ERRusestd              251     /* temporarily unable to use either raw
-                                          or mpx */
-#define ERR_NOTIFY_ENUM_DIR    1024
-#define ERRnoSuchUser          2238    /* user account does not exist */
-#define ERRaccountexpired      2239
-#define ERRbadclient           2240    /* can not logon from this client */
-#define ERRbadLogonTime                2241    /* logon hours do not allow this */
-#define ERRpasswordExpired     2242
-#define ERRnosupport           0xFFFF
+/*
+ * Non-specific error code. It is
+ * returned under the following
+ * conditions: resource other than disk
+ * space exhausted (e.g. TIDs), first
+ * SMB command was not negotiate,
+ * multiple negotiates attempted, and
+ * internal server error.
+ */
+#define ERRerror               1       // -EIO
+/*
+ * Bad password - name/password pair in
+ * a TreeConnect or Session Setup are
+ * invalid.
+ */
+#define ERRbadpw               2       // -EACCES
+/*
+ * used for indicating DFS referral
+ * needed
+ */
+#define ERRbadtype             3       // -EREMOTE
+/*
+ * The client does not have the
+ * necessary access rights within the
+ * specified context for requested
+ * function.
+ */
+#define ERRaccess              4       // -EACCES
+/*
+ * The Tid specified in a command was
+ * invalid.
+ */
+#define ERRinvtid              5       // -ENXIO
+/*
+ * Invalid network name in tree
+ * connect.
+ */
+#define ERRinvnetname          6       // -ENXIO
+/*
+ * Invalid device - printer request
+ * made to non-printer connection or
+ * non-printer request made to printer
+ * connection.
+ */
+#define ERRinvdevice           7       // -ENXIO
+/*
+ * Print queue full (files) -- returned
+ * by open print file.
+ */
+#define ERRqfull               49      // -ENOSPC
+/* Print queue full -- no space. */
+#define ERRqtoobig             50      // -ENOSPC
+/* EOF on print queue dump */
+#define ERRqeof                        51      // -EIO
+/* Invalid print file FID. */
+#define ERRinvpfid             52      // -EBADF
+/*
+ * The server did not recognize the
+ * command received.
+ */
+#define ERRsmbcmd              64      // -EBADRQC
+/*
+ * The server encountered an internal
+ * error, e.g., system file
+ * unavailable.
+ */
+#define ERRsrverror            65      // -EIO
+/* (obsolete) */
+#define ERRbadBID              66      // -EIO
+/*
+ * The Fid and pathname parameters
+ * contained an invalid combination of
+ * values.
+ */
+#define ERRfilespecs           67      // -EINVAL
+/* (obsolete) */
+#define ERRbadLink             68      // -EIO
+/*
+ * The access permissions specified for
+ * a file or directory are not a valid
+ * combination.
+ */
+#define ERRbadpermits          69      // -EINVAL
+#define ERRbadPID              70      // -ESRCH
+/* attribute (mode) is invalid */
+#define ERRsetattrmode         71      // -EINVAL
+/* Server is paused */
+#define ERRpaused              81      // -EHOSTDOWN
+/* reserved - messaging off */
+#define ERRmsgoff              82      // -EHOSTDOWN
+/* reserved - no room for message */
+#define ERRnoroom              83      // -ENOSPC
+/* reserved - too many remote names */
+#define ERRrmuns               87      // -EUSERS
+/* operation timed out */
+#define ERRtimeout             88      // -ETIME
+/* No resources available for request */
+#define ERRnoresource          89      // -EREMOTEIO
+/* Too many UIDs active on this session */
+#define ERRtoomanyuids         90      // -EUSERS
+/* The UID is not known as a valid user */
+#define ERRbaduid              91      // -EACCES
+/* temporarily unable to use raw */
+#define ERRusempx              250     // -EIO
+/*
+ * temporarily unable to use either raw
+ * or mpx
+ */
+#define ERRusestd              251     // -EIO
+#define ERR_NOTIFY_ENUM_DIR    1024    // -ENOBUFS
+/* user account does not exist */
+#define ERRnoSuchUser          2238    // -EACCES
+#define ERRaccountexpired      2239    // -EKEYEXPIRED
+/* can not logon from this client */
+#define ERRbadclient           2240    // -EACCES
+/* logon hours do not allow this */
+#define ERRbadLogonTime                2241    // -EACCES
+#define ERRpasswordExpired     2242    // -EKEYEXPIRED
+#define ERRnosupport           0xFFFF  // -EINVAL