diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-05-13 00:36:01 (GMT) |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-05-13 00:36:01 (GMT) |
commit | ae05327a00fd47c34dfe25294b359a3f3fef96e8 (patch) | |
tree | edcaac0eda8abcfaad9e9bd2b6ea72dd7306d374 | |
parent | 9717a91b01feda644f45fd63624a641385ef8f2d (diff) | |
download | linux-ae05327a00fd47c34dfe25294b359a3f3fef96e8.tar.xz |
ext4: switch to ->iterate_shared()
Note that we need relax_dir() equivalent for directories
locked shared.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/ext4/dir.c | 4 | ||||
-rw-r--r-- | include/linux/fs.h | 7 |
2 files changed, 9 insertions, 2 deletions
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 561d730..5d00bf0 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c @@ -266,7 +266,7 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) ctx->pos += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize); } - if ((ctx->pos < inode->i_size) && !dir_relax(inode)) + if ((ctx->pos < inode->i_size) && !dir_relax_shared(inode)) goto done; brelse(bh); bh = NULL; @@ -644,7 +644,7 @@ int ext4_check_all_de(struct inode *dir, struct buffer_head *bh, void *buf, const struct file_operations ext4_dir_operations = { .llseek = ext4_dir_llseek, .read = generic_read_dir, - .iterate = ext4_readdir, + .iterate_shared = ext4_readdir, .unlocked_ioctl = ext4_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = ext4_compat_ioctl, diff --git a/include/linux/fs.h b/include/linux/fs.h index 3dc0258..e87245a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3134,6 +3134,13 @@ static inline bool dir_relax(struct inode *inode) return !IS_DEADDIR(inode); } +static inline bool dir_relax_shared(struct inode *inode) +{ + inode_unlock_shared(inode); + inode_lock_shared(inode); + return !IS_DEADDIR(inode); +} + extern bool path_noexec(const struct path *path); extern void inode_nohighmem(struct inode *inode); |