subsys/fs: remove ambiguity in readdir results

Existing file system implementations do not provide the special "."
(current) and ".." (parent) directory entries in the readdir results.
littlefs does.

Remove these entries in the abstraction layer.  This simplifies code in
higher level consumers that aren't prepared to see them.  Consumers like
FUSE that need them can put them back without having to worry about
conflicts.

Closes issue #17951

Signed-off-by: Peter A. Bigot <pab@pabigot.com>
This commit is contained in:
Peter A. Bigot 2019-08-02 09:50:52 -05:00 committed by Carles Cufí
parent 979fb85d50
commit a8b7a21524
3 changed files with 23 additions and 3 deletions

View file

@ -362,7 +362,12 @@ int fs_opendir(struct fs_dir_t *zdp, const char *path);
/**
* @brief Directory read entry
*
* Reads directory entries of a open directory
* Reads directory entries of a open directory.
*
* @note: Most existing underlying file systems do not generate POSIX
* special directory entries "." or "..". For consistency the
* abstraction layer will remove these from lower layer results so
* higher layers see consistent results.
*
* @param zdp Pointer to the directory object
* @param entry Pointer to zfs_dirent structure to read the entry into

View file

@ -255,11 +255,25 @@ int fs_readdir(struct fs_dir_t *zdp, struct fs_dirent *entry)
int rc = -EINVAL;
if (zdp->mp->fs->readdir != NULL) {
rc = zdp->mp->fs->readdir(zdp, entry);
/* Loop until error or not special directory */
while (true) {
rc = zdp->mp->fs->readdir(zdp, entry);
if (rc < 0) {
break;
}
if (entry->type != FS_DIR_ENTRY_DIR) {
break;
}
if ((strcmp(entry->name, ".") != 0)
&& (strcmp(entry->name, "..") != 0)) {
break;
}
}
if (rc < 0) {
LOG_ERR("directory read error (%d)", rc);
}
}
return rc;
}

View file

@ -393,7 +393,8 @@ int testfs_bcmd_verify_layout(struct testfs_path *pp,
stat.size);
if (dotdir) {
/* ignore */
zassert_true(false,
"special directories observed");
} else if (cp != NULL) {
rc = check_layout_entry(pp, &stat, cp, ecp);
if (rc > 0) {