btrfs: fix stat blocks accounting
authorDavid Sterba <dsterba@suse.cz>
Sun, 20 Nov 2011 12:33:38 +0000 (07:33 -0500)
committerChris Mason <chris.mason@oracle.com>
Sun, 20 Nov 2011 12:42:15 +0000 (07:42 -0500)
Round inode bytes and delalloc bytes up to real blocksize before
converting to sector size. Otherwise eg. files smaller than 512
are reported with zero blocks due to incorrect rounding.

Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/inode.c

index e16215f480d007228ddefa90273b0056c4061fdc..8ad26b135a1c0fa7f88890464d6c63b5accd0d7e 100644 (file)
@@ -6794,11 +6794,13 @@ static int btrfs_getattr(struct vfsmount *mnt,
                         struct dentry *dentry, struct kstat *stat)
 {
        struct inode *inode = dentry->d_inode;
+       u32 blocksize = inode->i_sb->s_blocksize;
+
        generic_fillattr(inode, stat);
        stat->dev = BTRFS_I(inode)->root->anon_dev;
        stat->blksize = PAGE_CACHE_SIZE;
-       stat->blocks = (inode_get_bytes(inode) +
-                       BTRFS_I(inode)->delalloc_bytes) >> 9;
+       stat->blocks = (ALIGN(inode_get_bytes(inode), blocksize) +
+               ALIGN(BTRFS_I(inode)->delalloc_bytes, blocksize)) >> 9;
        return 0;
 }