diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2019-12-09 14:10:42 +0300 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2020-01-21 04:12:42 +0300 |
commit | cc625ccd0e6c2804cd0935743e3b51121a712562 (patch) | |
tree | 477a885d36d17223a9e075408accfb5785bce036 /fs/adfs/dir_f.c | |
parent | 9318731bec8d38bdbe701d395cf103157046831d (diff) | |
download | linux-cc625ccd0e6c2804cd0935743e3b51121a712562.tar.xz |
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 <rmk+kernel@armlinux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/adfs/dir_f.c')
-rw-r--r-- | fs/adfs/dir_f.c | 73 |
1 files 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 @@ -230,46 +230,6 @@ __adfs_dir_get(struct adfs_dir *dir, int pos, struct object_info *obj) } 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) { if (fpos >= ADFS_NUM_DIR_ENTRIES) @@ -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 |