btrfs: use simple_dir_inode_operations for placeholder subvolume directory
When you snapshot a subvolume containing a subvolume, you get a placeholder directory where the subvolume would be. These directories have their own btrfs_dir_ro_inode_operations. Al pointed out [1] that these directories can use simple_lookup() instead of btrfs_lookup(), as they are always empty. Furthermore, they can use the default generic_permission() instead of btrfs_permission(); the additional checks in the latter don't matter because we can't write to the directory anyways. Finally, they can use the default generic_update_time() instead of btrfs_update_time(), as the inode doesn't exist on disk and doesn't need any special handling. All together, this means that we can get rid of btrfs_dir_ro_inode_operations and use simple_dir_inode_operations instead. 1: https://lore.kernel.org/linux-btrfs/20190929052934.GY26530@ZenIV.linux.org.uk/ Cc: Al Viro <viro@zeniv.linux.org.uk> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Omar Sandoval <osandov@fb.com> Reviewed-by: David Sterba <dsterba@suse.com> [ add comment ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
b38f4cbd65
commit
6bb6b51447
|
@ -64,7 +64,6 @@ struct btrfs_dio_data {
|
|||
|
||||
static const struct inode_operations btrfs_dir_inode_operations;
|
||||
static const struct inode_operations btrfs_symlink_inode_operations;
|
||||
static const struct inode_operations btrfs_dir_ro_inode_operations;
|
||||
static const struct inode_operations btrfs_special_inode_operations;
|
||||
static const struct inode_operations btrfs_file_inode_operations;
|
||||
static const struct address_space_operations btrfs_aops;
|
||||
|
@ -5869,7 +5868,11 @@ static struct inode *new_simple_dir(struct super_block *s,
|
|||
set_bit(BTRFS_INODE_DUMMY, &BTRFS_I(inode)->runtime_flags);
|
||||
|
||||
inode->i_ino = BTRFS_EMPTY_SUBVOL_DIR_OBJECTID;
|
||||
inode->i_op = &btrfs_dir_ro_inode_operations;
|
||||
/*
|
||||
* We only need lookup, the rest is read-only and there's no inode
|
||||
* associated with the dentry
|
||||
*/
|
||||
inode->i_op = &simple_dir_inode_operations;
|
||||
inode->i_opflags &= ~IOP_XATTR;
|
||||
inode->i_fop = &simple_dir_operations;
|
||||
inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO;
|
||||
|
@ -11010,11 +11013,6 @@ static const struct inode_operations btrfs_dir_inode_operations = {
|
|||
.update_time = btrfs_update_time,
|
||||
.tmpfile = btrfs_tmpfile,
|
||||
};
|
||||
static const struct inode_operations btrfs_dir_ro_inode_operations = {
|
||||
.lookup = btrfs_lookup,
|
||||
.permission = btrfs_permission,
|
||||
.update_time = btrfs_update_time,
|
||||
};
|
||||
|
||||
static const struct file_operations btrfs_dir_file_operations = {
|
||||
.llseek = generic_file_llseek,
|
||||
|
|
Loading…
Reference in New Issue