From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-177.mta0.migadu.com (out-177.mta0.migadu.com [91.218.175.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DCA093E9595 for ; Thu, 2 Apr 2026 14:20:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.177 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775139618; cv=none; b=eWGO2uQZ0Sd6Xqe7OqcTTOt/HnTqG2610k5JJxTCYwj4sj8VpAEdFsIKSPs209mGye5cpCkO0fllbRa75yvFCCVZtZEa67MCU522J1XSfdoxHeTxz+R2RHWfRH4XlLdNfdSWhwPGvSyIoAqX2maUDBva0bTDdAIWX5U1ALQjm1Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775139618; c=relaxed/simple; bh=J+Qf7F9HmvgTzO/kqWdgbA/+v0kJjp5pOAXyHiGB/rQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Kf7jZ4aKg3Zm5reuvfc/K/iErTvve1mMWI1H8xiHRIkhGw/4TbrvgWvVFgObXOtVqm8yibkG/mSbfItw31YBHto29jNRmWZ9xqnvplYxYKeltFLYYouS+Z/2dQtWhbMnn8p0vz0xkd1x8PWQxxoCllCpH5mqJUTGtAzoc8ScS3c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=I9dATJdk; arc=none smtp.client-ip=91.218.175.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="I9dATJdk" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1775139613; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wie3XPMhf984dwwEtLh87sNo0dnbHepfftrFNxTOpsw=; b=I9dATJdkxyNxWIh8DkjgDWWw2kUtyZcSjxtrle7NU/xmbtE+57gWshwzhohBTat4XTxmWI BQnwf3dTsIH2bfgxOmOqZ2IuLxwUDrNfibT6fA1oGR44tmx0w5wLlY6dzPzsK2/mHdLlJ8 F/pQ7kivuty55FnUNuKRe25i2YQ6cmM= From: huiwen.he@linux.dev To: smfrench@gmail.com, linkinjeon@kernel.org, dhowells@redhat.com, chenxiaosong@kylinos.cn, chenxiaosong@chenxiaosong.com, tangyouling@kylinos.cn Cc: linux-cifs@vger.kernel.org, Huiwen He Subject: [PATCH v3 11/13] smb/client: use binary search for SMB1 DOS/SRV error mapping Date: Thu, 2 Apr 2026 14:18:37 +0000 Message-ID: <20260402141839.461257-12-huiwen.he@linux.dev> In-Reply-To: <20260402141839.461257-1-huiwen.he@linux.dev> References: <20260402141839.461257-1-huiwen.he@linux.dev> Precedence: bulk X-Mailing-List: linux-cifs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT From: Huiwen He Currently, map_smb_to_linux_error() uses linear searches for both mapping_table_ERRDOS[] and mapping_table_ERRSRV[]. Refactor this by introducing search_mapping_table_ERRDOS() and search_mapping_table_ERRSRV() that implements binary search(as the tables are sorted).This improves lookup performance and reduces code duplication. Also remove the sentinel entries from the mapping tables as they are no longer needed with ARRAY_SIZE(). Signed-off-by: Huiwen He Reviewed-by: ChenXiaoSong --- fs/smb/client/smb1maperror.c | 67 ++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/fs/smb/client/smb1maperror.c b/fs/smb/client/smb1maperror.c index 294ac9646bff..28e1c84fa83b 100644 --- a/fs/smb/client/smb1maperror.c +++ b/fs/smb/client/smb1maperror.c @@ -9,6 +9,7 @@ * Copyright (C) Luke Kenneth Casson Leighton 1997-2001. */ +#include #include "cifsproto.h" #include "smb1proto.h" #include "smberr.h" @@ -20,13 +21,24 @@ struct smb_to_posix_error { int posix_code; }; +static __always_inline int smb1_posix_error_cmp(const void *_key, const void *_pivot) +{ + __u16 key = *(__u16 *)_key; + const struct smb_to_posix_error *pivot = _pivot; + + if (key < pivot->smb_err) + return -1; + if (key > pivot->smb_err) + return 1; + return 0; +} + static const struct smb_to_posix_error mapping_table_ERRDOS[] = { /* * Automatically generated by the `gen_smb1_mapping` script, * sorted by DOS error code (ascending). */ #include "smb1_err_dos_map.c" - {0, 0} }; static const struct smb_to_posix_error mapping_table_ERRSRV[] = { @@ -35,7 +47,6 @@ static const struct smb_to_posix_error mapping_table_ERRSRV[] = { * sorted by SRV error code (ascending). */ #include "smb1_err_srv_map.c" - {0, 0} }; /***************************************************************************** @@ -72,14 +83,32 @@ search_ntstatus_to_dos_map(__u32 ntstatus) ntstatus_to_dos_cmp); } +static const struct smb_to_posix_error * +search_mapping_table_ERRDOS(__u16 smb_err) +{ + return __inline_bsearch(&smb_err, mapping_table_ERRDOS, + ARRAY_SIZE(mapping_table_ERRDOS), + sizeof(struct smb_to_posix_error), + smb1_posix_error_cmp); +} + +static const struct smb_to_posix_error * +search_mapping_table_ERRSRV(__u16 smb_err) +{ + return __inline_bsearch(&smb_err, mapping_table_ERRSRV, + ARRAY_SIZE(mapping_table_ERRSRV), + sizeof(struct smb_to_posix_error), + smb1_posix_error_cmp); +} + int map_smb_to_linux_error(char *buf, bool logErr) { struct smb_hdr *smb = (struct smb_hdr *)buf; - unsigned int i; int rc = -EIO; /* if transport error smb error may not be set */ __u8 smberrclass; __u16 smberrcode; + const struct smb_to_posix_error *err_map = NULL; /* BB if NT Status codes - map NT BB */ @@ -112,38 +141,16 @@ map_smb_to_linux_error(char *buf, bool logErr) /* old style errors */ - /* DOS class smb error codes - map DOS */ if (smberrclass == ERRDOS) { + /* DOS class smb error codes - map DOS */ /* 1 byte field no need to byte reverse */ - for (i = 0; - i < - sizeof(mapping_table_ERRDOS) / - sizeof(struct smb_to_posix_error); i++) { - if (mapping_table_ERRDOS[i].smb_err == 0) - break; - else if (mapping_table_ERRDOS[i].smb_err == - smberrcode) { - rc = mapping_table_ERRDOS[i].posix_code; - break; - } - /* else try next error mapping one to see if match */ - } + err_map = search_mapping_table_ERRDOS(smberrcode); } else if (smberrclass == ERRSRV) { /* server class of error codes */ - for (i = 0; - i < - sizeof(mapping_table_ERRSRV) / - sizeof(struct smb_to_posix_error); i++) { - if (mapping_table_ERRSRV[i].smb_err == 0) - break; - else if (mapping_table_ERRSRV[i].smb_err == - smberrcode) { - rc = mapping_table_ERRSRV[i].posix_code; - break; - } - /* else try next error mapping to see if match */ - } + err_map = search_mapping_table_ERRSRV(smberrcode); } + if (err_map) + rc = err_map->posix_code; /* else ERRHRD class errors or junk - return EIO */ /* special cases for NT status codes which cannot be translated to DOS codes */ -- 2.53.0