[PATCH v2 3/5] fs: fat: carve out fat_create_dir_entry()

Heinrich Schuchardt
2022-07-31T11:59:37Z

fat_mkdir() and file_fat_write_at() use identical code to create a new
directory entry. Carve out a new function fat_create_dir_entry() to avoid
this code duplication.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
---
v2:
handle errors returned by fat_create_dir_entry()
---
fs/fat/fat_write.c | 93 ++++++++++++++++++++++------------------------
1 file changed, 44 insertions(+), 49 deletions(-)

diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
index 57522f96a8..ccdacd22c2 100644
--- a/fs/fat/fat_write.c
+++ b/fs/fat/fat_write.c
@@ -1314,6 +1314,43 @@ static int normalize_longname(char *l_filename, const char *filename)
return 0;
}

+/**
+ * fat_create_dir_entry() - create directory entry
+ *
+ * @itr: directory iterator
+ * @basename: name of file or directory to be created
+ * @size: file size
+ * @attr: file or directory attributes
+ * Return: 0 for success, -EIO on error
+ */
+static int fat_create_dir_entry(fat_itr *itr, const char *basename,
+ loff_t size, u8 attr)
+{
+ /* Create a new file */
+ char shortname[SHORT_NAME_SIZE];
+ int ndent;
+ int ret;
+
+ /* Check if long name is needed */
+ ndent = set_name(itr, basename, shortname);
+ if (ndent < 0)
+ return ndent;
+ ret = fat_find_empty_dentries(itr, ndent);
+ if (ret)
+ return ret;
+ if (ndent > 1) {
+ /* Set long name entries */
+ ret = fill_dir_slot(itr, basename, shortname);
+ if (ret)
+ return ret;
+ }
+
+ /* Set short name entry */
+ fill_dentry(itr->fsdata, itr->dent, shortname, 0, size, attr);
+
+ return 0;
+}
+
int file_fat_write_at(const char *filename, loff_t pos, void *buffer,
loff_t size, loff_t *actwrite)
{
@@ -1383,8 +1420,6 @@ int file_fat_write_at(const char *filename, loff_t pos, void *buffer,
retdent->size = cpu_to_le32(pos + size);
} else {
/* Create a new file */
- char shortname[SHORT_NAME_SIZE];
- int ndent;

if (pos) {
/* No hole allowed */
@@ -1392,26 +1427,12 @@ int file_fat_write_at(const char *filename, loff_t pos, void *buffer,
goto exit;
}

- /* Check if long name is needed */
- ndent = set_name(itr, basename, shortname);
- if (ndent < 0) {
- ret = ndent;
- goto exit;
- }
- ret = fat_find_empty_dentries(itr, ndent);
- if (ret)
+ ret = fat_create_dir_entry(itr, basename, size, ATTR_ARCH);
+ if (ret < 0) {
+ log_err("Can't create directory entry\n");
goto exit;
- if (ndent > 1) {
- /* Set long name entries */
- ret = fill_dir_slot(itr, basename, shortname);
- if (ret)
- goto exit;
}

- /* Set short name entry */
- fill_dentry(itr->fsdata, itr->dent, shortname, 0, size,
- ATTR_ARCH);
-
retdent = itr->dent;
}

@@ -1693,38 +1714,12 @@ int fat_mkdir(const char *dirname)
ret = -EEXIST;
goto exit;
} else {
- char shortname[SHORT_NAME_SIZE];
- int ndent;
-
- if (itr->is_root) {
- /* root dir cannot have "." or ".." */
- if (!strcmp(l_dirname, ".") ||
- !strcmp(l_dirname, "..")) {
- ret = -EINVAL;
- goto exit;
- }
- }
-
- /* Check if long name is needed */
- ndent = set_name(itr, basename, shortname);
- if (ndent < 0) {
- ret = ndent;
- goto exit;
- }
- ret = fat_find_empty_dentries(itr, ndent);
- if (ret)
+ ret = fat_create_dir_entry(itr, basename, 0,
+ ATTR_DIR | ATTR_ARCH);
+ if (ret < 0) {
+ log_err("Can't create directory entry\n");
goto exit;
- if (ndent > 1) {
- /* Set long name entries */
- ret = fill_dir_slot(itr, basename, shortname);
- if (ret)
- goto exit;
}
-
- /* Set attribute as archive for regular file */
- fill_dentry(itr->fsdata, itr->dent, shortname, 0, 0,
- ATTR_DIR | ATTR_ARCH);
-
retdent = itr->dent;
}

--
2.36.1