fs/adfs: dir: add helper to read directory using inode
authorRussell King <rmk+kernel@armlinux.org.uk>
Mon, 9 Dec 2019 11:09:40 +0000 (11:09 +0000)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 21 Jan 2020 01:12:41 +0000 (20:12 -0500)
Add a helper to read a directory using the inode, which we do in two
places.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/adfs/dir.c

index b8e2a90..882377e 100644 (file)
@@ -137,6 +137,26 @@ static int adfs_dir_read(struct super_block *sb, u32 indaddr,
        return ADFS_SB(sb)->s_dir->read(sb, indaddr, size, dir);
 }
 
+static int adfs_dir_read_inode(struct super_block *sb, struct inode *inode,
+                              struct adfs_dir *dir)
+{
+       int ret;
+
+       ret = adfs_dir_read(sb, inode->i_ino, inode->i_size, dir);
+       if (ret)
+               return ret;
+
+       if (ADFS_I(inode)->parent_id != dir->parent_id) {
+               adfs_error(sb,
+                          "parent directory id changed under me! (%06x but got %06x)\n",
+                          ADFS_I(inode)->parent_id, dir->parent_id);
+               adfs_dir_relse(dir);
+               ret = -EIO;
+       }
+
+       return ret;
+}
+
 static int adfs_dir_sync(struct adfs_dir *dir)
 {
        int err = 0;
@@ -203,7 +223,7 @@ adfs_readdir(struct file *file, struct dir_context *ctx)
        if (ctx->pos >> 32)
                return 0;
 
-       ret = adfs_dir_read(sb, inode->i_ino, inode->i_size, &dir);
+       ret = adfs_dir_read_inode(sb, inode, &dir);
        if (ret)
                return ret;
 
@@ -304,18 +324,10 @@ static int adfs_dir_lookup_byname(struct inode *inode, const struct qstr *qstr,
        u32 name_len;
        int ret;
 
-       ret = adfs_dir_read(sb, inode->i_ino, inode->i_size, &dir);
+       ret = adfs_dir_read_inode(sb, inode, &dir);
        if (ret)
                goto out;
 
-       if (ADFS_I(inode)->parent_id != dir.parent_id) {
-               adfs_error(sb,
-                          "parent directory changed under me! (%06x but got %06x)\n",
-                          ADFS_I(inode)->parent_id, dir.parent_id);
-               ret = -EIO;
-               goto free_out;
-       }
-
        obj->parent_id = inode->i_ino;
 
        read_lock(&adfs_dir_lock);