diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2019-12-09 11:09:40 +0000 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2020-01-20 20:12:41 -0500 |
commit | 90011c7ad999c9565a5c97704cd5bda151ebe447 (patch) | |
tree | 587a6fe434d34aa91759b026f61d8c3ef625622e /fs/adfs | |
parent | 419a6e5e82ca0bdba0cc3624d969b65ae49d959b (diff) | |
download | linux-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.c | 32 |
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); |