diff options
author | Guangyu Sun <guangyu.sun@oracle.com> | 2013-09-16 13:42:03 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-09-21 11:05:30 -0400 |
commit | 93fd63c2f001ca6797c6b15b696a484b165b4800 (patch) | |
tree | 00f39eed768262a9b4cd3f39e054d243dca4672c /fs | |
parent | 5138cccf3470fcaa8a42df79a17f20c72f866158 (diff) |
Btrfs: dir_inode_operations should use btrfs_update_time also
Commit 2bc5565286121d2a77ccd728eb3484dff2035b58 (Btrfs: don't update atime on
RO subvolumes) ensures that the access time of an inode is not updated when
the inode lives in a read-only subvolume.
However, if a directory on a read-only subvolume is accessed, the atime is
updated. This results in a write operation to a read-only subvolume. I
believe that access times should never be updated on read-only subvolumes.
To reproduce:
# mkfs.btrfs -f /dev/dm-3
(...)
# mount /dev/dm-3 /mnt
# btrfs subvol create /mnt/sub
Create subvolume '/mnt/sub'
# mkdir /mnt/sub/dir
# echo "abc" > /mnt/sub/dir/file
# btrfs subvol snapshot -r /mnt/sub /mnt/rosnap
Create a readonly snapshot of '/mnt/sub' in '/mnt/rosnap'
# stat /mnt/rosnap/dir
File: `/mnt/rosnap/dir'
Size: 8 Blocks: 0 IO Block: 4096 directory
Device: 16h/22d Inode: 257 Links: 1
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-09-11 07:21:49.389157126 -0400
Modify: 2013-09-11 07:22:02.330156079 -0400
Change: 2013-09-11 07:22:02.330156079 -0400
# ls /mnt/rosnap/dir
file
# stat /mnt/rosnap/dir
File: `/mnt/rosnap/dir'
Size: 8 Blocks: 0 IO Block: 4096 directory
Device: 16h/22d Inode: 257 Links: 1
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-09-11 07:22:56.797151670 -0400
Modify: 2013-09-11 07:22:02.330156079 -0400
Change: 2013-09-11 07:22:02.330156079 -0400
Reported-by: Koen De Wit <koen.de.wit@oracle.com>
Signed-off-by: Guangyu Sun <guangyu.sun@oracle.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/inode.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 931036c6eb90..8af6c03953ad 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -8617,11 +8617,13 @@ static const struct inode_operations btrfs_dir_inode_operations = { | |||
8617 | .removexattr = btrfs_removexattr, | 8617 | .removexattr = btrfs_removexattr, |
8618 | .permission = btrfs_permission, | 8618 | .permission = btrfs_permission, |
8619 | .get_acl = btrfs_get_acl, | 8619 | .get_acl = btrfs_get_acl, |
8620 | .update_time = btrfs_update_time, | ||
8620 | }; | 8621 | }; |
8621 | static const struct inode_operations btrfs_dir_ro_inode_operations = { | 8622 | static const struct inode_operations btrfs_dir_ro_inode_operations = { |
8622 | .lookup = btrfs_lookup, | 8623 | .lookup = btrfs_lookup, |
8623 | .permission = btrfs_permission, | 8624 | .permission = btrfs_permission, |
8624 | .get_acl = btrfs_get_acl, | 8625 | .get_acl = btrfs_get_acl, |
8626 | .update_time = btrfs_update_time, | ||
8625 | }; | 8627 | }; |
8626 | 8628 | ||
8627 | static const struct file_operations btrfs_dir_file_operations = { | 8629 | static const struct file_operations btrfs_dir_file_operations = { |