btrfs: Fix a data space underflow warning
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Thu, 29 Oct 2015 09:28:46 +0000 (17:28 +0800)
committerChris Mason <clm@fb.com>
Tue, 3 Nov 2015 15:44:20 +0000 (07:44 -0800)
Even with quota disabled, generic/127 will trigger a kernel warning by
underflow data space info.

The bug is caused by buffered write, which in case of short copy, the
start parameter for btrfs_delalloc_release_space() is wrong, and
round_up/down() in btrfs_delalloc_release() extents the range to page
aligned, decreasing one more page than expected.

This patch will fix it by passing correct start.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/file.c

index 381be79f779a2daa9c8f5d2a52c4a0bd6784701a..e6df6f1b13dd313afbe75f03b7b9ddbd75b0f6ea 100644 (file)
@@ -1604,12 +1604,17 @@ again:
                                BTRFS_I(inode)->outstanding_extents++;
                                spin_unlock(&BTRFS_I(inode)->lock);
                        }
-                       if (only_release_metadata)
+                       if (only_release_metadata) {
                                btrfs_delalloc_release_metadata(inode,
                                                                release_bytes);
-                       else
-                               btrfs_delalloc_release_space(inode, pos,
+                       } else {
+                               u64 __pos;
+
+                               __pos = round_down(pos, root->sectorsize) +
+                                       (dirty_pages << PAGE_CACHE_SHIFT);
+                               btrfs_delalloc_release_space(inode, __pos,
                                                             release_bytes);
+                       }
                }
 
                release_bytes = dirty_pages << PAGE_CACHE_SHIFT;