From cc625ccd0e6c2804cd0935743e3b51121a712562 Mon Sep 17 00:00:00 2001 From: Russell King Date: Mon, 9 Dec 2019 11:10:42 +0000 Subject: fs/adfs: newdir: clean up adfs_f_update() __adfs_dir_put() and adfs_dir_find_entry() are only called from adfs_f_update(), so move them into this function, removing some unnecessary entry copying by doing so. Signed-off-by: Russell King Signed-off-by: Al Viro --- fs/adfs/dir_f.c | 73 +++++++++++++++++++-------------------------------------- 1 file changed, 24 insertions(+), 49 deletions(-) diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c index dbb4f1ef7bb7..36cfadb2b893 100644 --- a/fs/adfs/dir_f.c +++ b/fs/adfs/dir_f.c @@ -229,46 +229,6 @@ __adfs_dir_get(struct adfs_dir *dir, int pos, struct object_info *obj) return 0; } -static int -__adfs_dir_put(struct adfs_dir *dir, int pos, struct object_info *obj) -{ - struct adfs_direntry de; - int ret; - - ret = adfs_dir_copyfrom(&de, dir, pos, 26); - if (ret) - return ret; - - adfs_obj2dir(&de, obj); - - return adfs_dir_copyto(dir, pos, &de, 26); -} - -/* - * the caller is responsible for holding the necessary - * locks. - */ -static int adfs_dir_find_entry(struct adfs_dir *dir, u32 indaddr) -{ - int pos, ret; - - ret = -ENOENT; - - for (pos = 5; pos < ADFS_NUM_DIR_ENTRIES * 26 + 5; pos += 26) { - struct object_info obj; - - if (!__adfs_dir_get(dir, pos, &obj)) - break; - - if (obj.indaddr == indaddr) { - ret = pos; - break; - } - } - - return ret; -} - static int adfs_f_setpos(struct adfs_dir *dir, unsigned int fpos) { @@ -308,18 +268,33 @@ static int adfs_f_iterate(struct adfs_dir *dir, struct dir_context *ctx) return 0; } -static int -adfs_f_update(struct adfs_dir *dir, struct object_info *obj) +static int adfs_f_update(struct adfs_dir *dir, struct object_info *obj) { - int ret; + struct adfs_direntry de; + int offset, ret; - ret = adfs_dir_find_entry(dir, obj->indaddr); - if (ret < 0) { - adfs_error(dir->sb, "unable to locate entry to update"); - return ret; - } + offset = 5 - (int)sizeof(de); + + do { + offset += sizeof(de); + ret = adfs_dir_copyfrom(&de, dir, offset, sizeof(de)); + if (ret) { + adfs_error(dir->sb, "error reading directory entry"); + return -ENOENT; + } + if (!de.dirobname[0]) { + adfs_error(dir->sb, "unable to locate entry to update"); + return -ENOENT; + } + } while (adfs_readval(de.dirinddiscadd, 3) != obj->indaddr); + + /* Update the directory entry with the new object state */ + adfs_obj2dir(&de, obj); - __adfs_dir_put(dir, ret, obj); + /* Write the directory entry back to the directory */ + ret = adfs_dir_copyto(dir, pos, &de, 26); + if (ret) + return ret; /* * Increment directory sequence number -- cgit