diff --git a/doc/xml/release/2024/2.51.xml b/doc/xml/release/2024/2.51.xml
index 43ae80a2a..222f22f30 100644
--- a/doc/xml/release/2024/2.51.xml
+++ b/doc/xml/release/2024/2.51.xml
@@ -14,6 +14,19 @@
Skip zero-length files for block incremental delta restore.
+
+
+
+
+
+
+
+
+
+
+
+ Fix performance regression in storage list.
+
diff --git a/doc/xml/release/contributor.xml b/doc/xml/release/contributor.xml
index fe9edaf1a..489470f5d 100644
--- a/doc/xml/release/contributor.xml
+++ b/doc/xml/release/contributor.xml
@@ -670,6 +670,11 @@
mahomedh
+
+ Maksym Boguk
+ MaximBoguk
+
+
Oscar
MannerMan
diff --git a/src/storage/storage.c b/src/storage/storage.c
index cc5c95be2..543845dbf 100644
--- a/src/storage/storage.c
+++ b/src/storage/storage.c
@@ -378,8 +378,8 @@ storageList(const Storage *this, const String *pathExp, StorageListParam param)
MEM_CONTEXT_TEMP_BEGIN()
{
StorageIterator *const storageItr = storageNewItrP(
- this, pathExp, .errorOnMissing = param.errorOnMissing, .nullOnMissing = param.nullOnMissing,
- .expression = param.expression);
+ this, pathExp, .level = storageInfoLevelExists, .errorOnMissing = param.errorOnMissing,
+ .nullOnMissing = param.nullOnMissing, .expression = param.expression);
if (storageItr != NULL)
{
diff --git a/test/src/module/storage/posixTest.c b/test/src/module/storage/posixTest.c
index db4fd5837..38ed41414 100644
--- a/test/src/module/storage/posixTest.c
+++ b/test/src/module/storage/posixTest.c
@@ -486,6 +486,23 @@ testRun(void)
storageTest->pub.interface.feature ^= 1 << storageFeatureInfoDetail;
+ // -------------------------------------------------------------------------------------------------------------------------
+ TEST_TITLE("path basic info - no recurse");
+
+ storageTest->pub.interface.feature ^= 1 << storageFeatureInfoDetail;
+
+ TEST_STORAGE_LIST(
+ storageTest, "pg",
+ "zzz/\n"
+ "pipe*\n"
+ "path/\n"
+ "link> {d=../file}\n"
+ "file {s=8, t=1656433838}\n"
+ "./\n",
+ .levelForce = true, .includeDot = true, .noRecurse = true, .sortOrder = sortOrderDesc);
+
+ storageTest->pub.interface.feature ^= 1 << storageFeatureInfoDetail;
+
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("empty path - filter");
diff --git a/test/src/module/storage/sftpTest.c b/test/src/module/storage/sftpTest.c
index 4846e417b..7f9008e3d 100644
--- a/test/src/module/storage/sftpTest.c
+++ b/test/src/module/storage/sftpTest.c
@@ -3776,15 +3776,8 @@ testRun(void)
.resultInt = 8, .attrPerms = LIBSSH2_SFTP_S_IFREG | LIBSSH2_SFTP_S_IRWXU | LIBSSH2_SFTP_S_IRWXG,
.flags = LIBSSH2_SFTP_ATTR_PERMISSIONS | LIBSSH2_SFTP_ATTR_ACMODTIME | LIBSSH2_SFTP_ATTR_UIDGID,
.mtime = 1656434296, .uid = TEST_USER_ID, .gid = TEST_GROUP_ID},
- {.function = HRNLIBSSH2_SFTP_STAT_EX, .param = "[\"" TEST_PATH "/.aaa.txt\",1]", .fileName = STRDEF(".aaa.txt"),
- .resultInt = LIBSSH2_ERROR_NONE,
- .attrPerms = LIBSSH2_SFTP_S_IFREG | LIBSSH2_SFTP_S_IRWXU | LIBSSH2_SFTP_S_IRWXG,
- .flags = LIBSSH2_SFTP_ATTR_PERMISSIONS | LIBSSH2_SFTP_ATTR_ACMODTIME | LIBSSH2_SFTP_ATTR_UIDGID,
- .mtime = 1656434296, .uid = TEST_USER_ID, .gid = TEST_GROUP_ID},
{.function = HRNLIBSSH2_SFTP_READDIR_EX, .param = "[\".aaa.txt\",4095,null,0]", .fileName = STRDEF("noperm"),
.resultInt = 6, .uid = 0, .gid = 0},
- {.function = HRNLIBSSH2_SFTP_STAT_EX, .param = "[\"" TEST_PATH "/noperm\",1]", .fileName = STRDEF("noperm"),
- .resultInt = LIBSSH2_ERROR_NONE, .uid = 0, .gid = 0},
{.function = HRNLIBSSH2_SFTP_READDIR_EX, .param = "[\"noperm\",4095,null,0]", .fileName = STRDEF(""),
.resultInt = LIBSSH2_ERROR_NONE, .uid = 0, .gid = 0},
{.function = HRNLIBSSH2_SFTP_CLOSE_HANDLE, .resultInt = LIBSSH2_ERROR_NONE},
@@ -3801,15 +3794,8 @@ testRun(void)
.resultInt = 7, .attrPerms = LIBSSH2_SFTP_S_IFREG | LIBSSH2_SFTP_S_IRWXU | LIBSSH2_SFTP_S_IRWXG,
.flags = LIBSSH2_SFTP_ATTR_PERMISSIONS | LIBSSH2_SFTP_ATTR_ACMODTIME | LIBSSH2_SFTP_ATTR_UIDGID,
.mtime = 1656434296, .uid = TEST_USER_ID, .gid = TEST_GROUP_ID},
- {.function = HRNLIBSSH2_SFTP_STAT_EX, .param = "[\"" TEST_PATH "/bbb.txt\",1]", .fileName = STRDEF("bbb.txt"),
- .resultInt = LIBSSH2_ERROR_NONE,
- .attrPerms = LIBSSH2_SFTP_S_IFREG | LIBSSH2_SFTP_S_IRWXU | LIBSSH2_SFTP_S_IRWXG,
- .flags = LIBSSH2_SFTP_ATTR_PERMISSIONS | LIBSSH2_SFTP_ATTR_ACMODTIME | LIBSSH2_SFTP_ATTR_UIDGID,
- .mtime = 1656434296, .uid = TEST_USER_ID, .gid = TEST_GROUP_ID},
{.function = HRNLIBSSH2_SFTP_READDIR_EX, .param = "[\"bbb.txt\",4095,null,0]", .fileName = STRDEF("noperm"),
.resultInt = 6, .uid = 0, .gid = 0},
- {.function = HRNLIBSSH2_SFTP_STAT_EX, .param = "[\"" TEST_PATH "/noperm\",1]", .fileName = STRDEF("noperm"),
- .resultInt = LIBSSH2_ERROR_NONE, .uid = 0, .gid = 0},
{.function = HRNLIBSSH2_SFTP_READDIR_EX, .param = "[\"noperm\",4095,null,0]", .fileName = STRDEF(""),
.resultInt = LIBSSH2_ERROR_NONE, .uid = 0, .gid = 0},
{.function = HRNLIBSSH2_SFTP_CLOSE_HANDLE, .resultInt = LIBSSH2_ERROR_EAGAIN},