mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 14:44:12 +00:00
btrfs: zoned: return int from btrfs_check_meta_write_pointer
[ Upstream commit2ad8c0510a
] Now that we have writeback_control passed to btrfs_check_meta_write_pointer(), we can move the wbc condition in submit_eb_page() to btrfs_check_meta_write_pointer() and return int. Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Stable-dep-of:13bb483d32
("btrfs: zoned: activate metadata block group on write time") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
11aef5c195
commit
28c26c6fee
3 changed files with 30 additions and 21 deletions
|
@ -1918,14 +1918,9 @@ static int submit_eb_page(struct page *page, struct btrfs_eb_write_context *ctx)
|
|||
|
||||
ctx->eb = eb;
|
||||
|
||||
if (!btrfs_check_meta_write_pointer(eb->fs_info, ctx)) {
|
||||
/*
|
||||
* If for_sync, this hole will be filled with
|
||||
* trasnsaction commit.
|
||||
*/
|
||||
if (wbc->sync_mode == WB_SYNC_ALL && !wbc->for_sync)
|
||||
ret = -EAGAIN;
|
||||
else
|
||||
ret = btrfs_check_meta_write_pointer(eb->fs_info, ctx);
|
||||
if (ret) {
|
||||
if (ret == -EBUSY)
|
||||
ret = 0;
|
||||
free_extent_buffer(eb);
|
||||
return ret;
|
||||
|
|
|
@ -1758,14 +1758,23 @@ void btrfs_finish_ordered_zoned(struct btrfs_ordered_extent *ordered)
|
|||
}
|
||||
}
|
||||
|
||||
bool btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_eb_write_context *ctx)
|
||||
/*
|
||||
* Check if @ctx->eb is aligned to the write pointer.
|
||||
*
|
||||
* Return:
|
||||
* 0: @ctx->eb is at the write pointer. You can write it.
|
||||
* -EAGAIN: There is a hole. The caller should handle the case.
|
||||
* -EBUSY: There is a hole, but the caller can just bail out.
|
||||
*/
|
||||
int btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_eb_write_context *ctx)
|
||||
{
|
||||
const struct writeback_control *wbc = ctx->wbc;
|
||||
const struct extent_buffer *eb = ctx->eb;
|
||||
struct btrfs_block_group *block_group = ctx->zoned_bg;
|
||||
|
||||
if (!btrfs_is_zoned(fs_info))
|
||||
return true;
|
||||
return 0;
|
||||
|
||||
if (block_group) {
|
||||
if (block_group->start > eb->start ||
|
||||
|
@ -1779,15 +1788,20 @@ bool btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,
|
|||
if (!block_group) {
|
||||
block_group = btrfs_lookup_block_group(fs_info, eb->start);
|
||||
if (!block_group)
|
||||
return true;
|
||||
return 0;
|
||||
ctx->zoned_bg = block_group;
|
||||
}
|
||||
|
||||
if (block_group->meta_write_pointer != eb->start)
|
||||
return false;
|
||||
block_group->meta_write_pointer = eb->start + eb->len;
|
||||
if (block_group->meta_write_pointer == eb->start) {
|
||||
block_group->meta_write_pointer = eb->start + eb->len;
|
||||
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If for_sync, this hole will be filled with trasnsaction commit. */
|
||||
if (wbc->sync_mode == WB_SYNC_ALL && !wbc->for_sync)
|
||||
return -EAGAIN;
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
void btrfs_revert_meta_write_pointer(struct btrfs_block_group *cache,
|
||||
|
|
|
@ -58,8 +58,8 @@ void btrfs_redirty_list_add(struct btrfs_transaction *trans,
|
|||
struct extent_buffer *eb);
|
||||
bool btrfs_use_zone_append(struct btrfs_bio *bbio);
|
||||
void btrfs_record_physical_zoned(struct btrfs_bio *bbio);
|
||||
bool btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_eb_write_context *ctx);
|
||||
int btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_eb_write_context *ctx);
|
||||
void btrfs_revert_meta_write_pointer(struct btrfs_block_group *cache,
|
||||
struct extent_buffer *eb);
|
||||
int btrfs_zoned_issue_zeroout(struct btrfs_device *device, u64 physical, u64 length);
|
||||
|
@ -188,10 +188,10 @@ static inline void btrfs_record_physical_zoned(struct btrfs_bio *bbio)
|
|||
{
|
||||
}
|
||||
|
||||
static inline bool btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_eb_write_context *ctx)
|
||||
static inline int btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_eb_write_context *ctx)
|
||||
{
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void btrfs_revert_meta_write_pointer(
|
||||
|
|
Loading…
Reference in a new issue