diff options
author | Josef Bacik <josef@redhat.com> | 2011-09-21 15:05:58 -0400 |
---|---|---|
committer | Josef Bacik <josef@redhat.com> | 2011-10-19 15:12:45 -0400 |
commit | 3b16a4e3c355ee3c790473decfcf83d4faeb8ce0 (patch) | |
tree | 5c3dad941468cf6952623cc18d6b1e682ee3f264 /fs/btrfs/ioctl.c | |
parent | 455757c322cc0a0f2a692c5625dd88aaf6a7b889 (diff) | |
download | lwn-3b16a4e3c355ee3c790473decfcf83d4faeb8ce0.tar.gz lwn-3b16a4e3c355ee3c790473decfcf83d4faeb8ce0.zip |
Btrfs: use the inode's mapping mask for allocating pages
Johannes pointed out we were allocating only kernel pages for doing writes,
which is kind of a big deal if you are on 32bit and have more than a gig of ram.
So fix our allocations to use the mapping's gfp but still clear __GFP_FS so we
don't re-enter. Thanks,
Reported-by: Johannes Weiner <jweiner@redhat.com>
Signed-off-by: Josef Bacik <josef@redhat.com>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 538f65a79ec5..24fd75bb0f96 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -843,6 +843,7 @@ static int cluster_pages_for_defrag(struct inode *inode, int i_done; struct btrfs_ordered_extent *ordered; struct extent_state *cached_state = NULL; + gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping); if (isize == 0) return 0; @@ -860,7 +861,7 @@ again: for (i = 0; i < num_pages; i++) { struct page *page; page = find_or_create_page(inode->i_mapping, - start_index + i, GFP_NOFS); + start_index + i, mask); if (!page) break; |