Browse Source

Btrfs: Fix page count calculation

take offset of start position into account when calculating page count.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Yan, Zheng 14 years ago
parent
commit
3a90983dbd
1 changed files with 4 additions and 4 deletions
  1. 4 4
      fs/btrfs/file.c

+ 4 - 4
fs/btrfs/file.c

@@ -991,8 +991,8 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
 		size_t write_bytes = min(iov_iter_count(&i),
 		size_t write_bytes = min(iov_iter_count(&i),
 					 nrptrs * (size_t)PAGE_CACHE_SIZE -
 					 nrptrs * (size_t)PAGE_CACHE_SIZE -
 					 offset);
 					 offset);
-		size_t num_pages = (write_bytes + PAGE_CACHE_SIZE - 1) >>
-					PAGE_CACHE_SHIFT;
+		size_t num_pages = (write_bytes + offset +
+				    PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
 
 
 		WARN_ON(num_pages > nrptrs);
 		WARN_ON(num_pages > nrptrs);
 		memset(pages, 0, sizeof(struct page *) * nrptrs);
 		memset(pages, 0, sizeof(struct page *) * nrptrs);
@@ -1022,8 +1022,8 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
 
 
 		copied = btrfs_copy_from_user(pos, num_pages,
 		copied = btrfs_copy_from_user(pos, num_pages,
 					   write_bytes, pages, &i);
 					   write_bytes, pages, &i);
-		dirty_pages = (copied + PAGE_CACHE_SIZE - 1) >>
-					PAGE_CACHE_SHIFT;
+		dirty_pages = (copied + offset + PAGE_CACHE_SIZE - 1) >>
+				PAGE_CACHE_SHIFT;
 
 
 		if (num_pages > dirty_pages) {
 		if (num_pages > dirty_pages) {
 			if (copied > 0)
 			if (copied > 0)