fs/adfs: newdir: clean up adfs_f_update()
authorRussell King <rmk+kernel@armlinux.org.uk>
Mon, 9 Dec 2019 11:10:42 +0000 (11:10 +0000)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 21 Jan 2020 01:12:42 +0000 (20:12 -0500)
__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>
fs/adfs/dir_f.c

index dbb4f1ef7bb7a08425db4961b62d625cce0394bd..36cfadb2b893651452e71438963426295259fc7f 100644 (file)
@@ -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