From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-180.mta0.migadu.com (out-180.mta0.migadu.com [91.218.175.180]) (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 33F3B3988FA for ; Wed, 1 Apr 2026 07:30:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.180 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775028654; cv=none; b=M5bVZZ92dG8itAaZhV46wKjqwik3BKx3vKCbIp1Jw7ileLzXk23kDnPzuP/XwCVv7nuiu1cH2Tl6DB5c3SVpb3qlpE2/U9sfYx0oGe+AUnDOHaQ40eTaC/pQQQIEtZo59TGcdRF/PUNI5jtVIHtD/u/f5/y7svGrc1m3Xd9CPoQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775028654; c=relaxed/simple; bh=bLYgPgxoM0Ku9melY2KY4DmV+z+6iNRmEmTzqNNlQjM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TJDGXOWJKALJlIhyrE5oDy7NLph7hpBlv+KLjIGX4rgJf0kexlkR3J1vfrxOUNMkmJavRy6KNvUlq5R32sgLHUlSfvF+XGlOH/p4hky+YTAv4QwtrdVu2jH6WzOMtENNoTeHVNhZuBAb9O8wC4KdwsLnzSAe7FUbVhwz+arWFgE= 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=UwypDknB; arc=none smtp.client-ip=91.218.175.180 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="UwypDknB" 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=1775028650; 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=AQd6gyemc8+zFy61sB3sFsbLgE3vIuKauaKBXjpp6sI=; b=UwypDknBAChSpqfxM1a15rTztTmgVvQ3yzo9UahMwn6U8pq8wRveFEXjLGSFesbKuOlD+L QyAQzrjGzASRkFlsThUfGz0RK2SBrXtYHFUZE63CSs6/LmjcRGQRZsB/mhvW57vpDitVrb g9ArvFL8o3NEpLI0eEE2WmKQhv15AoQ= From: huiwen.he@linux.dev To: smfrench@gmail.com, linkinjeon@kernel.org, pc@manguebit.org, ronniesahlberg@gmail.com, sprasad@microsoft.com, tom@talpey.com, bharathsm@microsoft.com, senozhatsky@chromium.org, dhowells@redhat.com, chenxiaosong@kylinos.cn, chenxiaosong@chenxiaosong.com, tangyouling@kylinos.cn Cc: linux-cifs@vger.kernel.org, Huiwen He Subject: [PATCH v2 10/12] smb/client: use binary search for SMB1 DOS/SRV error mapping Date: Wed, 1 Apr 2026 07:29:10 +0000 Message-ID: <20260401072912.355072-11-huiwen.he@linux.dev> In-Reply-To: <20260401072912.355072-1-huiwen.he@linux.dev> References: <20260401072912.355072-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 a helper function smb1_map_to_posix() 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 bed579afc37b..3074c60301ad 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.52.0