summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2019-12-09 11:09:15 +0000
committerAl Viro <viro@zeniv.linux.org.uk>2020-01-20 20:12:40 -0500
commit95fbadbb5566e383f0cfe40d895e698ab38bdbc7 (patch)
tree97c0fc9d60b2f16765c9803ef52003bbdff93a74
parent71b2612776c1b9c34c460f79bcdaef46d0e77ed2 (diff)
fs/adfs: dir: add common dir object initialisation
Initialise the dir object before we pass it down to the directory format specific read handler. This allows us to get rid of the initialisation inside those handlers. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/adfs/dir.c16
-rw-r--r--fs/adfs/dir_f.c3
-rw-r--r--fs/adfs/dir_fplus.c6
3 files changed, 13 insertions, 12 deletions
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c
index a54c53244992..c1b8b5bccbec 100644
--- a/fs/adfs/dir.c
+++ b/fs/adfs/dir.c
@@ -13,6 +13,16 @@
*/
static DEFINE_RWLOCK(adfs_dir_lock);
+static int adfs_dir_read(struct super_block *sb, u32 indaddr,
+ unsigned int size, struct adfs_dir *dir)
+{
+ dir->sb = sb;
+ dir->bhs = dir->bh;
+ dir->nr_buffers = 0;
+
+ return ADFS_SB(sb)->s_dir->read(sb, indaddr, size, dir);
+}
+
void adfs_object_fixup(struct adfs_dir *dir, struct object_info *obj)
{
unsigned int dots, i;
@@ -64,7 +74,7 @@ adfs_readdir(struct file *file, struct dir_context *ctx)
if (ctx->pos >> 32)
return 0;
- ret = ops->read(sb, inode->i_ino, inode->i_size, &dir);
+ ret = adfs_dir_read(sb, inode->i_ino, inode->i_size, &dir);
if (ret)
return ret;
@@ -115,7 +125,7 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait)
goto out;
}
- ret = ops->read(sb, obj->parent_id, 0, &dir);
+ ret = adfs_dir_read(sb, obj->parent_id, 0, &dir);
if (ret)
goto out;
@@ -167,7 +177,7 @@ static int adfs_dir_lookup_byname(struct inode *inode, const struct qstr *qstr,
u32 name_len;
int ret;
- ret = ops->read(sb, inode->i_ino, inode->i_size, &dir);
+ ret = adfs_dir_read(sb, inode->i_ino, inode->i_size, &dir);
if (ret)
goto out;
diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c
index c1a950c7400a..e62f35eb7789 100644
--- a/fs/adfs/dir_f.c
+++ b/fs/adfs/dir_f.c
@@ -139,9 +139,6 @@ static int adfs_dir_read(struct super_block *sb, u32 indaddr,
size >>= blocksize_bits;
- dir->nr_buffers = 0;
- dir->sb = sb;
-
for (blk = 0; blk < size; blk++) {
int phys;
diff --git a/fs/adfs/dir_fplus.c b/fs/adfs/dir_fplus.c
index 5f5420c9b943..52c42a9986d9 100644
--- a/fs/adfs/dir_fplus.c
+++ b/fs/adfs/dir_fplus.c
@@ -17,11 +17,6 @@ adfs_fplus_read(struct super_block *sb, unsigned int id, unsigned int sz, struct
unsigned int blk, size;
int i, ret = -EIO;
- dir->nr_buffers = 0;
-
- /* start off using fixed bh set - only alloc for big dirs */
- dir->bhs = &dir->bh[0];
-
block = __adfs_block_map(sb, id, 0);
if (!block) {
adfs_error(sb, "dir object %X has a hole at offset 0", id);
@@ -94,7 +89,6 @@ adfs_fplus_read(struct super_block *sb, unsigned int id, unsigned int sz, struct
}
dir->parent_id = le32_to_cpu(h->bigdirparent);
- dir->sb = sb;
return 0;
out: