Skip to content

Commit df48063

Browse files
Qu Wenruomasoncl
authored andcommitted
btrfs: extent-tree: Switch to new delalloc space reserve and release
Use new __btrfs_delalloc_reserve_space() and __btrfs_delalloc_release_space() to reserve and release space for delalloc. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
1 parent 1ada3a6 commit df48063

File tree

4 files changed

+38
-25
lines changed

4 files changed

+38
-25
lines changed

fs/btrfs/file.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,7 +1608,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
16081608
btrfs_delalloc_release_metadata(inode,
16091609
release_bytes);
16101610
else
1611-
btrfs_delalloc_release_space(inode,
1611+
__btrfs_delalloc_release_space(inode, pos,
16121612
release_bytes);
16131613
}
16141614

@@ -1661,7 +1661,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
16611661
btrfs_end_write_no_snapshoting(root);
16621662
btrfs_delalloc_release_metadata(inode, release_bytes);
16631663
} else {
1664-
btrfs_delalloc_release_space(inode, release_bytes);
1664+
__btrfs_delalloc_release_space(inode, pos,
1665+
release_bytes);
16651666
}
16661667
}
16671668

fs/btrfs/inode-map.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -488,17 +488,17 @@ int btrfs_save_ino_cache(struct btrfs_root *root,
488488
/* Just to make sure we have enough space */
489489
prealloc += 8 * PAGE_CACHE_SIZE;
490490

491-
ret = btrfs_delalloc_reserve_space(inode, prealloc);
491+
ret = __btrfs_delalloc_reserve_space(inode, 0, prealloc);
492492
if (ret)
493493
goto out_put;
494494

495495
ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, prealloc,
496496
prealloc, prealloc, &alloc_hint);
497497
if (ret) {
498-
btrfs_delalloc_release_space(inode, prealloc);
498+
__btrfs_delalloc_release_space(inode, 0, prealloc);
499499
goto out_put;
500500
}
501-
btrfs_free_reserved_data_space(inode, prealloc);
501+
__btrfs_free_reserved_data_space(inode, 0, prealloc);
502502

503503
ret = btrfs_write_out_ino_cache(root, trans, path, inode);
504504
out_put:

fs/btrfs/inode.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,7 +1769,8 @@ static void btrfs_clear_bit_hook(struct inode *inode,
17691769

17701770
if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID
17711771
&& do_list && !(state->state & EXTENT_NORESERVE))
1772-
btrfs_free_reserved_data_space(inode, len);
1772+
__btrfs_free_reserved_data_space(inode, state->start,
1773+
len);
17731774

17741775
__percpu_counter_add(&root->fs_info->delalloc_bytes, -len,
17751776
root->fs_info->delalloc_batch);
@@ -1992,7 +1993,8 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work)
19921993
goto again;
19931994
}
19941995

1995-
ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
1996+
ret = __btrfs_delalloc_reserve_space(inode, page_start,
1997+
PAGE_CACHE_SIZE);
19961998
if (ret) {
19971999
mapping_set_error(page->mapping, ret);
19982000
end_extent_writepage(page, ret, page_start, page_end);
@@ -4638,14 +4640,17 @@ int btrfs_truncate_page(struct inode *inode, loff_t from, loff_t len,
46384640
if ((offset & (blocksize - 1)) == 0 &&
46394641
(!len || ((len & (blocksize - 1)) == 0)))
46404642
goto out;
4641-
ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
4643+
ret = __btrfs_delalloc_reserve_space(inode,
4644+
round_down(from, PAGE_CACHE_SIZE), PAGE_CACHE_SIZE);
46424645
if (ret)
46434646
goto out;
46444647

46454648
again:
46464649
page = find_or_create_page(mapping, index, mask);
46474650
if (!page) {
4648-
btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
4651+
__btrfs_delalloc_release_space(inode,
4652+
round_down(from, PAGE_CACHE_SIZE),
4653+
PAGE_CACHE_SIZE);
46494654
ret = -ENOMEM;
46504655
goto out;
46514656
}
@@ -4713,7 +4718,8 @@ int btrfs_truncate_page(struct inode *inode, loff_t from, loff_t len,
47134718

47144719
out_unlock:
47154720
if (ret)
4716-
btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
4721+
__btrfs_delalloc_release_space(inode, page_start,
4722+
PAGE_CACHE_SIZE);
47174723
unlock_page(page);
47184724
page_cache_release(page);
47194725
out:
@@ -7644,7 +7650,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
76447650
spin_unlock(&BTRFS_I(inode)->lock);
76457651
}
76467652

7647-
btrfs_free_reserved_data_space(inode, len);
7653+
__btrfs_free_reserved_data_space(inode, start, len);
76487654
WARN_ON(dio_data->reserve < len);
76497655
dio_data->reserve -= len;
76507656
current->journal_info = dio_data;
@@ -8434,7 +8440,7 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
84348440
mutex_unlock(&inode->i_mutex);
84358441
relock = true;
84368442
}
8437-
ret = btrfs_delalloc_reserve_space(inode, count);
8443+
ret = __btrfs_delalloc_reserve_space(inode, offset, count);
84388444
if (ret)
84398445
goto out;
84408446
dio_data.outstanding_extents = div64_u64(count +
@@ -8463,11 +8469,11 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
84638469
current->journal_info = NULL;
84648470
if (ret < 0 && ret != -EIOCBQUEUED) {
84658471
if (dio_data.reserve)
8466-
btrfs_delalloc_release_space(inode,
8467-
dio_data.reserve);
8472+
__btrfs_delalloc_release_space(inode, offset,
8473+
dio_data.reserve);
84688474
} else if (ret >= 0 && (size_t)ret < count)
8469-
btrfs_delalloc_release_space(inode,
8470-
count - (size_t)ret);
8475+
__btrfs_delalloc_release_space(inode, offset,
8476+
count - (size_t)ret);
84718477
}
84728478
out:
84738479
if (wakeup)
@@ -8675,7 +8681,11 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
86758681
u64 page_end;
86768682

86778683
sb_start_pagefault(inode->i_sb);
8678-
ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
8684+
page_start = page_offset(page);
8685+
page_end = page_start + PAGE_CACHE_SIZE - 1;
8686+
8687+
ret = __btrfs_delalloc_reserve_space(inode, page_start,
8688+
PAGE_CACHE_SIZE);
86798689
if (!ret) {
86808690
ret = file_update_time(vma->vm_file);
86818691
reserved = 1;
@@ -8694,8 +8704,6 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
86948704
again:
86958705
lock_page(page);
86968706
size = i_size_read(inode);
8697-
page_start = page_offset(page);
8698-
page_end = page_start + PAGE_CACHE_SIZE - 1;
86998707

87008708
if ((page->mapping != inode->i_mapping) ||
87018709
(page_start >= size)) {
@@ -8772,7 +8780,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
87728780
}
87738781
unlock_page(page);
87748782
out:
8775-
btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
8783+
__btrfs_delalloc_release_space(inode, page_start, PAGE_CACHE_SIZE);
87768784
out_noreserve:
87778785
sb_end_pagefault(inode->i_sb);
87788786
return ret;

fs/btrfs/ioctl.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,8 +1119,9 @@ static int cluster_pages_for_defrag(struct inode *inode,
11191119

11201120
page_cnt = min_t(u64, (u64)num_pages, (u64)file_end - start_index + 1);
11211121

1122-
ret = btrfs_delalloc_reserve_space(inode,
1123-
page_cnt << PAGE_CACHE_SHIFT);
1122+
ret = __btrfs_delalloc_reserve_space(inode,
1123+
start_index << PAGE_CACHE_SHIFT,
1124+
page_cnt << PAGE_CACHE_SHIFT);
11241125
if (ret)
11251126
return ret;
11261127
i_done = 0;
@@ -1209,8 +1210,9 @@ static int cluster_pages_for_defrag(struct inode *inode,
12091210
spin_lock(&BTRFS_I(inode)->lock);
12101211
BTRFS_I(inode)->outstanding_extents++;
12111212
spin_unlock(&BTRFS_I(inode)->lock);
1212-
btrfs_delalloc_release_space(inode,
1213-
(page_cnt - i_done) << PAGE_CACHE_SHIFT);
1213+
__btrfs_delalloc_release_space(inode,
1214+
start_index << PAGE_CACHE_SHIFT,
1215+
(page_cnt - i_done) << PAGE_CACHE_SHIFT);
12141216
}
12151217

12161218

@@ -1235,7 +1237,9 @@ static int cluster_pages_for_defrag(struct inode *inode,
12351237
unlock_page(pages[i]);
12361238
page_cache_release(pages[i]);
12371239
}
1238-
btrfs_delalloc_release_space(inode, page_cnt << PAGE_CACHE_SHIFT);
1240+
__btrfs_delalloc_release_space(inode,
1241+
start_index << PAGE_CACHE_SHIFT,
1242+
page_cnt << PAGE_CACHE_SHIFT);
12391243
return ret;
12401244

12411245
}

0 commit comments

Comments
 (0)