Skip to content

Commit b78c243

Browse files
committed
Add lfs_stata, lfs_dir_reada functions
Extends regular `lfs_stat` by querying set of attribute at the same time. Improves performance of directory listings.
1 parent 9f4375e commit b78c243

2 files changed

Lines changed: 24 additions & 33 deletions

File tree

lfs.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,8 @@ static int lfs_dir_getgstate(lfs_t *lfs, const lfs_mdir_t *dir,
14111411
}
14121412

14131413
static int lfs_dir_getinfo(lfs_t *lfs, lfs_mdir_t *dir,
1414-
uint16_t id, struct lfs_info *info, const struct lfs_stat_config* config) {
1414+
uint16_t id, struct lfs_info *info,
1415+
struct lfs_attr *attrs, lfs_size_t attr_count) {
14151416
if (id == 0x3ff) {
14161417
// special case for root
14171418
strcpy(info->name, "/");
@@ -1442,13 +1443,12 @@ static int lfs_dir_getinfo(lfs_t *lfs, lfs_mdir_t *dir,
14421443
}
14431444

14441445
// fetch attrs
1445-
if(config != NULL) {
1446-
for (unsigned i = 0; i < config->attr_count; i++) {
1446+
if(attrs != NULL) {
1447+
for (unsigned i = 0; i < attr_count; i++) {
14471448
lfs_stag_t res = lfs_dir_get(lfs, dir,
14481449
LFS_MKTAG(0x7ff, 0x3ff, 0),
1449-
LFS_MKTAG(LFS_TYPE_USERATTR + config->attrs[i].type,
1450-
id, config->attrs[i].size),
1451-
config->attrs[i].buffer);
1450+
LFS_MKTAG(LFS_TYPE_USERATTR + attrs[i].type,
1451+
id, attrs[i].size), attrs[i].buffer);
14521452
if (res < 0 && res != LFS_ERR_NOENT) {
14531453
return res;
14541454
}
@@ -2783,8 +2783,8 @@ static int lfs_dir_close_(lfs_t *lfs, lfs_dir_t *dir) {
27832783
return 0;
27842784
}
27852785

2786-
static int lfs_dir_read_(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info,
2787-
const struct lfs_stat_config* config) {
2786+
static int lfs_dir_reada_(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info,
2787+
struct lfs_attr *attrs, lfs_size_t attr_count) {
27882788
memset(info, 0, sizeof(*info));
27892789

27902790
// special offset for '.' and '..'
@@ -2814,7 +2814,7 @@ static int lfs_dir_read_(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info,
28142814
dir->id = 0;
28152815
}
28162816

2817-
int err = lfs_dir_getinfo(lfs, &dir->m, dir->id, info, config);
2817+
int err = lfs_dir_getinfo(lfs, &dir->m, dir->id, info, attrs, attr_count);
28182818
if (err && err != LFS_ERR_NOENT) {
28192819
return err;
28202820
}
@@ -3970,8 +3970,8 @@ static int lfs_file_enumattr_(lfs_t* lfs, lfs_file_t* file,
39703970
}
39713971

39723972
/// General fs operations ///
3973-
static int lfs_stat_(lfs_t *lfs, const char *path, struct lfs_info *info,
3974-
const struct lfs_stat_config* config) {
3973+
static int lfs_stata_(lfs_t *lfs, const char *path, struct lfs_info *info,
3974+
struct lfs_attr *attrs, lfs_size_t attr_count) {
39753975
lfs_mdir_t cwd;
39763976
lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL);
39773977
if (tag < 0) {
@@ -3984,7 +3984,7 @@ static int lfs_stat_(lfs_t *lfs, const char *path, struct lfs_info *info,
39843984
return LFS_ERR_NOTDIR;
39853985
}
39863986

3987-
return lfs_dir_getinfo(lfs, &cwd, lfs_tag_id(tag), info, config);
3987+
return lfs_dir_getinfo(lfs, &cwd, lfs_tag_id(tag), info, attrs, attr_count);
39883988
}
39893989

39903990
#ifndef LFS_READONLY
@@ -6184,15 +6184,15 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
61846184
}
61856185
#endif
61866186

6187-
int lfs_statcfg(lfs_t *lfs, const char *path, struct lfs_info *info,
6188-
const struct lfs_stat_config* config) {
6187+
int lfs_stata(lfs_t *lfs, const char *path, struct lfs_info *info,
6188+
struct lfs_attr *attrs, lfs_size_t attr_count) {
61896189
int err = LFS_LOCK(lfs->cfg);
61906190
if (err) {
61916191
return err;
61926192
}
61936193
LFS_TRACE("lfs_stat(%p, \"%s\", %p)", (void*)lfs, path, (void*)info);
61946194

6195-
err = lfs_stat_(lfs, path, info, config);
6195+
err = lfs_stata_(lfs, path, info, attrs, attr_count);
61966196

61976197
LFS_TRACE("lfs_stat -> %d", err);
61986198
LFS_UNLOCK(lfs->cfg);
@@ -6496,16 +6496,16 @@ int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir) {
64966496
return err;
64976497
}
64986498

6499-
int lfs_dir_readcfg(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info,
6500-
const struct lfs_stat_config* config) {
6499+
int lfs_dir_reada(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info,
6500+
struct lfs_attr *attrs, lfs_size_t attr_count) {
65016501
int err = LFS_LOCK(lfs->cfg);
65026502
if (err) {
65036503
return err;
65046504
}
65056505
LFS_TRACE("lfs_dir_read(%p, %p, %p)",
65066506
(void*)lfs, (void*)dir, (void*)info);
65076507

6508-
err = lfs_dir_read_(lfs, dir, info, config);
6508+
err = lfs_dir_reada_(lfs, dir, info, attrs, attr_count);
65096509

65106510
LFS_TRACE("lfs_dir_read -> %d", err);
65116511
LFS_UNLOCK(lfs->cfg);

lfs.h

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -365,15 +365,6 @@ struct lfs_file_config {
365365
lfs_size_t attr_count;
366366
};
367367

368-
// Configuration provided during lfs_dir_readcfg and lfs_statcfg
369-
struct lfs_stat_config {
370-
// Optional list of custom attributes to read
371-
struct lfs_attr *attrs;
372-
373-
// Number of custom attributes in the list
374-
lfs_size_t attr_count;
375-
};
376-
377368
/// internal littlefs data structures ///
378369
typedef struct lfs_cache {
379370
lfs_block_t block;
@@ -528,15 +519,15 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath);
528519
#endif
529520

530521
// Find info about a file or directory and read set of custom attributes
531-
int lfs_statcfg(lfs_t *lfs, const char *path, struct lfs_info *info,
532-
const struct lfs_stat_config* config);
522+
int lfs_stata(lfs_t *lfs, const char *path, struct lfs_info *info,
523+
struct lfs_attr *attrs, lfs_size_t attr_count);
533524

534525
// Find info about a file or directory
535526
//
536527
// Fills out the info structure, based on the specified file or directory.
537528
// Returns a negative error code on failure.
538529
static inline int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info) {
539-
return lfs_statcfg(lfs, path, info, NULL);
530+
return lfs_stata(lfs, path, info, NULL, 0);
540531
}
541532

542533
// Get a custom attribute
@@ -704,16 +695,16 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path);
704695
int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir);
705696

706697
// Read directory entry plus attributes
707-
int lfs_dir_readcfg(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info,
708-
const struct lfs_stat_config* config);
698+
int lfs_dir_reada(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info,
699+
struct lfs_attr *attrs, lfs_size_t attr_count);
709700

710701
// Read an entry in the directory
711702
//
712703
// Fills out the info structure, based on the specified file or directory.
713704
// Returns a positive value on success, 0 at the end of directory,
714705
// or a negative error code on failure.
715706
static inline int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info) {
716-
return lfs_dir_readcfg(lfs, dir, info, NULL);
707+
return lfs_dir_reada(lfs, dir, info, NULL, 0);
717708
}
718709

719710
// Change the position of the directory

0 commit comments

Comments
 (0)