summaryrefslogtreecommitdiffstats
path: root/fs/adfs
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2019-12-09 11:09:40 +0000
committerAl Viro <viro@zeniv.linux.org.uk>2020-01-20 20:12:41 -0500
commit90011c7ad999c9565a5c97704cd5bda151ebe447 (patch)
tree587a6fe434d34aa91759b026f61d8c3ef625622e /fs/adfs
parent419a6e5e82ca0bdba0cc3624d969b65ae49d959b (diff)
downloadlinux-90011c7ad999c9565a5c97704cd5bda151ebe447.tar.gz
linux-90011c7ad999c9565a5c97704cd5bda151ebe447.tar.bz2
linux-90011c7ad999c9565a5c97704cd5bda151ebe447.zip
fs/adfs: dir: add helper to read directory using inode
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>
Diffstat (limited to 'fs/adfs')
-rw-r--r--fs/adfs/dir.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c
index b8e2a909fa3f..882377e86041 100644
--- a/fs/adfs/dir.c
+++ b/fs/adfs/dir.c
@@ -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);