From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 122D7C48BDF for ; Sun, 13 Jun 2021 13:41:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F1A576128A for ; Sun, 13 Jun 2021 13:41:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231882AbhFMNnD (ORCPT ); Sun, 13 Jun 2021 09:43:03 -0400 Received: from smtp-out1.suse.de ([195.135.220.28]:34588 "EHLO smtp-out1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231846AbhFMNnD (ORCPT ); Sun, 13 Jun 2021 09:43:03 -0400 Received: from imap.suse.de (imap-alt.suse-dmz.suse.de [192.168.254.47]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 3FCB121972; Sun, 13 Jun 2021 13:41:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1623591661; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=znXXNpFAe+aq+YAsUkY0lqM2azAuju2wzEFWUnhjD8E=; b=rAi/2znaRQsOtnopGHiIRzzyUQgevCBwNL1b0yoy/lj8xfBy5rZcWKRU5JkXL36MntQhUY ixbz8VifzyQOCIPwOVa21MfwFeXL4MDe7wyBLYFadzKwLYV/ow1ZEqDzMNsjxc9uWz4EvL qXVrA6+dQ4Gls8aGN0p6NNU3j8rmbzc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1623591661; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=znXXNpFAe+aq+YAsUkY0lqM2azAuju2wzEFWUnhjD8E=; b=X86wekEHyPOGI0QCifbh+5SHVMQmYoM4A8iQVpr4T213ko5J6y+FRvcT4W+8lIzz0nl7aM qP4+kMsUZimQujAQ== Received: from imap3-int (imap-alt.suse-dmz.suse.de [192.168.254.47]) by imap.suse.de (Postfix) with ESMTP id DCF7B118DD; Sun, 13 Jun 2021 13:41:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1623591661; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=znXXNpFAe+aq+YAsUkY0lqM2azAuju2wzEFWUnhjD8E=; b=rAi/2znaRQsOtnopGHiIRzzyUQgevCBwNL1b0yoy/lj8xfBy5rZcWKRU5JkXL36MntQhUY ixbz8VifzyQOCIPwOVa21MfwFeXL4MDe7wyBLYFadzKwLYV/ow1ZEqDzMNsjxc9uWz4EvL qXVrA6+dQ4Gls8aGN0p6NNU3j8rmbzc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1623591661; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=znXXNpFAe+aq+YAsUkY0lqM2azAuju2wzEFWUnhjD8E=; b=X86wekEHyPOGI0QCifbh+5SHVMQmYoM4A8iQVpr4T213ko5J6y+FRvcT4W+8lIzz0nl7aM qP4+kMsUZimQujAQ== Received: from director2.suse.de ([192.168.254.72]) by imap3-int with ESMTPSA id YT+nLewKxmCSJAAALh3uQQ (envelope-from ); Sun, 13 Jun 2021 13:41:00 +0000 From: Goldwyn Rodrigues To: linux-btrfs@vger.kernel.org Cc: Goldwyn Rodrigues Subject: [RFC PATCH 22/31] btrfs: Set extents delalloc in iomap_end Date: Sun, 13 Jun 2021 08:39:50 -0500 Message-Id: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Goldwyn Rodrigues Since the new code path would not be calling btrfs_dirty_pages(), set extent delalloc for the extent just written. In order to make the flow easier, modify btrfs_buffered_iomap_end() to use written_block_end and block_end to calculate respective written and length sectorsize boundaries. Signed-off-by: Goldwyn Rodrigues --- fs/btrfs/file.c | 58 +++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index ab2b1790e0bb..d311b01a2b71 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1682,44 +1682,38 @@ static int btrfs_buffered_iomap_end(struct inode *inode, loff_t pos, loff_t length, ssize_t written, struct btrfs_iomap *bi) { struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); - size_t num_sectors = BTRFS_BYTES_TO_BLKS(fs_info, bi->reserved_bytes); - size_t dirty_sectors = 0; - int dirty_pages = 0; - int sector_offset = pos & (fs_info->sectorsize - 1); - - if (written) { - dirty_sectors = round_up(written + sector_offset, - fs_info->sectorsize); - dirty_sectors = BTRFS_BYTES_TO_BLKS(fs_info, dirty_sectors); - dirty_pages = DIV_ROUND_UP(written + offset_in_page(pos), - PAGE_SIZE); - } + int ret = 0; + size_t release_bytes = 0; + u64 start = round_down(pos, fs_info->sectorsize); + u64 written_block_end = round_up(pos + written, fs_info->sectorsize) - 1; + u64 block_end = round_up(pos + length, fs_info->sectorsize) - 1; + int extra_bits = 0; - /* Release excess reservations */ - if (num_sectors > dirty_sectors) { - size_t release_bytes = bi->reserved_bytes - - (dirty_sectors << fs_info->sb->s_blocksize_bits); - if (bi->metadata_only) { - btrfs_delalloc_release_metadata(BTRFS_I(inode), - release_bytes, true); - } else { - u64 p; + if (written == 0) + release_bytes = bi->reserved_bytes; + else if (written < length) + release_bytes = block_end - written_block_end + 1; - p = round_down(pos, - fs_info->sectorsize) + - (dirty_pages << PAGE_SHIFT); - btrfs_delalloc_release_space(BTRFS_I(inode), - bi->data_reserved, p, - release_bytes, true); - } - } + if (bi->metadata_only) + extra_bits |= EXTENT_NORESERVE; + + clear_extent_bit(&BTRFS_I(inode)->io_tree, start, written_block_end, + EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, + 0, 0, &bi->cached_state); + + ret = btrfs_set_extent_delalloc(BTRFS_I(inode), start, + written_block_end, extra_bits, &bi->cached_state); + + /* In case of error, release everything in btrfs_iomap_release() */ + if (ret < 0) + release_bytes = bi->reserved_bytes; /* * If we have not locked the extent range, because the range's * start offset is >= i_size, we might still have a non-NULL * cached extent state, acquired while marking the extent range - * as delalloc through btrfs_dirty_pages(). Therefore free any - * possible cached extent state to avoid a memory leak. + * as delalloc. Therefore free any possible cached extent state + * to avoid a memory leak. */ if (bi->extents_locked) unlock_extent_cached(&BTRFS_I(inode)->io_tree, @@ -1732,6 +1726,8 @@ static int btrfs_buffered_iomap_end(struct inode *inode, loff_t pos, if (bi->metadata_only) btrfs_check_nocow_unlock(BTRFS_I(inode)); + btrfs_iomap_release(inode, pos, release_bytes, bi); + return 0; } -- 2.31.1