Re: [PATCH] Btrfs: Fix NOCOW file attribute

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I've used the following to test the patch:
rm a
touch a
chattr +C a
dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
sync
filefrag -v a
dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
sync
filefrag -v a

Before the patch:
ierdnac-hp btrfs # ./test
+ rm a
+ touch a
+ chattr +C a
+ dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
+ sync
+ filefrag -v a
Filesystem type is: 9123683e
File size of a is 32768 (8 blocks, blocksize 4096)
ext logical physical expected length flags
   0       0  1473536               8 eof
a: 1 extent found
+ dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
+ sync
+ filefrag -v a
Filesystem type is: 9123683e
File size of a is 32768 (8 blocks, blocksize 4096)
ext logical physical expected length flags
   0       0  1473560               8 eof
a: 1 extent found
ierdnac-hp btrfs # 

After the patch:
ierdnac-hp btrfs # ./test
+ rm a
+ touch a
+ chattr +C a
+ dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
1+0 records in
1+0 records out
32768 bytes (33 kB) copied, 3.651e-05 s, 898 MB/s
+ sync
+ filefrag -v a
Filesystem type is: 9123683e
File size of a is 32768 (8 blocks, blocksize 4096)
ext logical physical expected length flags
   0       0  1473560               8 eof
a: 1 extent found
+ dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
1+0 records in
1+0 records out
32768 bytes (33 kB) copied, 4.6666e-05 s, 702 MB/s
+ sync
+ filefrag -v a
Filesystem type is: 9123683e
File size of a is 32768 (8 blocks, blocksize 4096)
ext logical physical expected length flags
   0       0  1473560               8 eof
a: 1 extent found
ierdnac-hp btrfs # 

My question is what is the expected behaviour for setting the chattr
after the file is filed with bytes like this:
rm a
touch a
# chattr +C a -> before chattr was here and we move it below
dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
sync
filefrag -v a
chattr +C a
dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
sync
filefrag -v a

Because in this case btrfs doesn't honour the NOCOW attribute:
+ rm a
+ touch a
+ dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
1+0 records in
1+0 records out
32768 bytes (33 kB) copied, 3.5127e-05 s, 933 MB/s
+ sync
+ filefrag -v a
Filesystem type is: 9123683e
File size of a is 32768 (8 blocks, blocksize 4096)
ext logical physical expected length flags
   0       0  1473544               8 eof
a: 1 extent found
+ chattr +C a
+ dd if=/dev/zero of=a bs=32k conv=notrunc,nocreat count=1
1+0 records in
1+0 records out
32768 bytes (33 kB) copied, 3.4169e-05 s, 959 MB/s
+ sync
+ filefrag -v a
Filesystem type is: 9123683e
File size of a is 32768 (8 blocks, blocksize 4096)
ext logical physical expected length flags
   0       0  1473536               8 eof
a: 1 extent found

It's supposed to honour the NOCOW attribute or not ?

On Sat, 2012-06-16 at 15:37 +0300, Andrei Popa wrote:
> Adds BTRFS_INODE_NODATASUM to inode flags when setting NOCOW for a file (chattr +C file).
> In btrfs, NOCOW implies NODATASUM and without setting NODATASUM, btrfs doesn't honour correctly the NOCOW attribute.
> 
> Signed-off-by: Andrei Popa <andrei.popa@xxxxxxxx>
> ---
>  fs/btrfs/ioctl.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index 0e92e57..8a7be76 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -139,7 +139,7 @@ void btrfs_inherit_iflags(struct inode *inode, struct inode *dir)
>  	}
>  
>  	if (flags & BTRFS_INODE_NODATACOW)
> -		BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW;
> +		BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW | BTRFS_INODE_NODATASUM;
>  
>  	btrfs_update_iflags(inode);
>  }
> @@ -236,7 +236,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
>  	else
>  		ip->flags &= ~BTRFS_INODE_DIRSYNC;
>  	if (flags & FS_NOCOW_FL)
> -		ip->flags |= BTRFS_INODE_NODATACOW;
> +		ip->flags |= BTRFS_INODE_NODATACOW | BTRFS_INODE_NODATASUM;
>  	else
>  		ip->flags &= ~BTRFS_INODE_NODATACOW;
>  

-- 
Andrei Popa
(+4) 0741.57.80.90

Attachment: smime.p7s
Description: S/MIME cryptographic signature


[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux