Skip to content

Commit

Permalink
fs/adfs: newdir: clean up adfs_f_update()
Browse files Browse the repository at this point in the history
__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 <[email protected]>
Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Russell King authored and Al Viro committed Jan 21, 2020
1 parent 9318731 commit cc625cc
Showing 1 changed file with 24 additions and 49 deletions.
73 changes: 24 additions & 49 deletions fs/adfs/dir_f.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit cc625cc

Please sign in to comment.