summaryrefslogtreecommitdiff
path: root/fs/ext4/ext4_common.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2024-11-01 13:38:05 -0600
committerTom Rini <trini@konsulko.com>2024-11-01 13:38:05 -0600
commit8e5e64d55de9ed97875a0c1b7f293a0286d64312 (patch)
tree4888d5dd9db7a34fa6c49f507919a89f06e4a85a /fs/ext4/ext4_common.c
parent15a55dbff6d9b64178ccb7d12c0e0d24fa79f37a (diff)
parent29e5a2e9597234700420e8e93055861eba3b409c (diff)
Merge patch series "fs: ext4: implement opendir, readdir, closedir"
Heinrich Schuchardt <heinrich.schuchardt@canonical.com> says: With this series opendir, readdir, closedir are implemented for ext4. These functions are needed for the UEFI sub-system to interact with the ext4 file system. To reduce code growth the functions are reused to implement the ls command for ext4. A memory leak in ext4fs_exists is resolved. ext4fs_iterate_dir is simplified by removing a redundant pointer copy. Link: https://lore.kernel.org/r/20241026064048.370062-1-heinrich.schuchardt@canonical.com
Diffstat (limited to 'fs/ext4/ext4_common.c')
-rw-r--r--fs/ext4/ext4_common.c48
1 files changed, 9 insertions, 39 deletions
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
index 76f7102456e..cc150cf824f 100644
--- a/fs/ext4/ext4_common.c
+++ b/fs/ext4/ext4_common.c
@@ -2046,24 +2046,23 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
unsigned int fpos = 0;
int status;
loff_t actread;
- struct ext2fs_node *diro = (struct ext2fs_node *) dir;
#ifdef DEBUG
if (name != NULL)
printf("Iterate dir %s\n", name);
#endif /* of DEBUG */
- if (!diro->inode_read) {
- status = ext4fs_read_inode(diro->data, diro->ino, &diro->inode);
+ if (!dir->inode_read) {
+ status = ext4fs_read_inode(dir->data, dir->ino, &dir->inode);
if (status == 0)
return 0;
}
/* Search the file. */
- while (fpos < le32_to_cpu(diro->inode.size)) {
+ while (fpos < le32_to_cpu(dir->inode.size)) {
struct ext2_dirent dirent;
- status = ext4fs_read_file(diro, fpos,
- sizeof(struct ext2_dirent),
- (char *)&dirent, &actread);
+ status = ext4fs_read_file(dir, fpos,
+ sizeof(struct ext2_dirent),
+ (char *)&dirent, &actread);
if (status < 0)
return 0;
@@ -2077,7 +2076,7 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
struct ext2fs_node *fdiro;
int type = FILETYPE_UNKNOWN;
- status = ext4fs_read_file(diro,
+ status = ext4fs_read_file(dir,
fpos +
sizeof(struct ext2_dirent),
dirent.namelen, filename,
@@ -2089,7 +2088,7 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
if (!fdiro)
return 0;
- fdiro->data = diro->data;
+ fdiro->data = dir->data;
fdiro->ino = le32_to_cpu(dirent.inode);
filename[dirent.namelen] = '\0';
@@ -2104,7 +2103,7 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
else if (dirent.filetype == FILETYPE_REG)
type = FILETYPE_REG;
} else {
- status = ext4fs_read_inode(diro->data,
+ status = ext4fs_read_inode(dir->data,
le32_to_cpu
(dirent.inode),
&fdiro->inode);
@@ -2138,35 +2137,6 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
*fnode = fdiro;
return 1;
}
- } else {
- if (fdiro->inode_read == 0) {
- status = ext4fs_read_inode(diro->data,
- le32_to_cpu(
- dirent.inode),
- &fdiro->inode);
- if (status == 0) {
- free(fdiro);
- return 0;
- }
- fdiro->inode_read = 1;
- }
- switch (type) {
- case FILETYPE_DIRECTORY:
- printf("<DIR> ");
- break;
- case FILETYPE_SYMLINK:
- printf("<SYM> ");
- break;
- case FILETYPE_REG:
- printf(" ");
- break;
- default:
- printf("< ? > ");
- break;
- }
- printf("%10u %s\n",
- le32_to_cpu(fdiro->inode.size),
- filename);
}
free(fdiro);
}