From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: <linux-btrfs@vger.kernel.org>
Subject: [PATCH v2 14/23] btrfs: extent-tree: Switch to new check_data_free_space and free_reserved_data_space
Date: Fri, 9 Oct 2015 10:25:48 +0800 [thread overview]
Message-ID: <1444357551-1286-1-git-send-email-quwenruo@cn.fujitsu.com> (raw)
In-Reply-To: <1444356684-30162-1-git-send-email-quwenruo@cn.fujitsu.com>
Use new reserve/free for buffered write and inode cache.
For buffered write case, as nodatacow write won't increase quota account,
so unlike old behavior which does reserve before check nocow, now we
check nocow first and then only reserve data if we can't do nocow write.
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
---
v2:
Add call for new free function too. Or we will leak reserved space in
case of data reservation succeeded but metadata reservation failed.
---
fs/btrfs/extent-tree.c | 4 ++--
fs/btrfs/file.c | 34 +++++++++++++++++++++-------------
fs/btrfs/relocation.c | 8 ++++----
3 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 0cd6baa..f4b9db8 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3356,7 +3356,7 @@ again:
num_pages *= 16;
num_pages *= PAGE_CACHE_SIZE;
- ret = btrfs_check_data_free_space(inode, num_pages, num_pages);
+ ret = __btrfs_check_data_free_space(inode, 0, num_pages);
if (ret)
goto out_put;
@@ -3365,7 +3365,7 @@ again:
&alloc_hint);
if (!ret)
dcs = BTRFS_DC_SETUP;
- btrfs_free_reserved_data_space(inode, num_pages);
+ __btrfs_free_reserved_data_space(inode, 0, num_pages);
out_put:
iput(inode);
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index b823fac..142b217 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1510,12 +1510,17 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
}
reserve_bytes = num_pages << PAGE_CACHE_SHIFT;
- ret = btrfs_check_data_free_space(inode, reserve_bytes, write_bytes);
- if (ret == -ENOSPC &&
- (BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW |
- BTRFS_INODE_PREALLOC))) {
+
+ if (BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW |
+ BTRFS_INODE_PREALLOC)) {
ret = check_can_nocow(inode, pos, &write_bytes);
+ if (ret < 0)
+ break;
if (ret > 0) {
+ /*
+ * For nodata cow case, no need to reserve
+ * data space.
+ */
only_release_metadata = true;
/*
* our prealloc extent may be smaller than
@@ -1524,20 +1529,19 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
num_pages = DIV_ROUND_UP(write_bytes + offset,
PAGE_CACHE_SIZE);
reserve_bytes = num_pages << PAGE_CACHE_SHIFT;
- ret = 0;
- } else {
- ret = -ENOSPC;
+ goto reserve_metadata;
}
}
-
- if (ret)
+ ret = __btrfs_check_data_free_space(inode, pos, write_bytes);
+ if (ret < 0)
break;
+reserve_metadata:
ret = btrfs_delalloc_reserve_metadata(inode, reserve_bytes);
if (ret) {
if (!only_release_metadata)
- btrfs_free_reserved_data_space(inode,
- reserve_bytes);
+ __btrfs_free_reserved_data_space(inode, pos,
+ write_bytes);
else
btrfs_end_write_no_snapshoting(root);
break;
@@ -2569,8 +2573,11 @@ static long btrfs_fallocate(struct file *file, int mode,
/*
* Make sure we have enough space before we do the
* allocation.
+ * XXX: The behavior must be changed to do accurate check first
+ * and then check data reserved space.
*/
- ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start, alloc_end - alloc_start);
+ ret = btrfs_check_data_free_space(inode, alloc_start,
+ alloc_end - alloc_start);
if (ret)
return ret;
@@ -2703,7 +2710,8 @@ static long btrfs_fallocate(struct file *file, int mode,
out:
mutex_unlock(&inode->i_mutex);
/* Let go of our reservation. */
- btrfs_free_reserved_data_space(inode, alloc_end - alloc_start);
+ __btrfs_free_reserved_data_space(inode, alloc_start,
+ alloc_end - alloc_start);
return ret;
}
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 303babe..f4621c5 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -3034,8 +3034,8 @@ int prealloc_file_extent_cluster(struct inode *inode,
BUG_ON(cluster->start != cluster->boundary[0]);
mutex_lock(&inode->i_mutex);
- ret = btrfs_check_data_free_space(inode, cluster->end +
- 1 - cluster->start, 0);
+ ret = __btrfs_check_data_free_space(inode, cluster->start,
+ cluster->end + 1 - cluster->start);
if (ret)
goto out;
@@ -3056,8 +3056,8 @@ int prealloc_file_extent_cluster(struct inode *inode,
break;
nr++;
}
- btrfs_free_reserved_data_space(inode, cluster->end +
- 1 - cluster->start);
+ __btrfs_free_reserved_data_space(inode, cluster->start,
+ cluster->end + 1 - cluster->start);
out:
mutex_unlock(&inode->i_mutex);
return ret;
--
2.6.1
next prev parent reply other threads:[~2015-10-09 2:28 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-09 2:11 [PATCH v2 00/23] Rework btrfs qgroup reserved space framework Qu Wenruo
2015-10-09 2:11 ` [PATCH v2 01/23] btrfs: qgroup: New function declaration for new reserve implement Qu Wenruo
2015-10-09 2:11 ` [PATCH v2 02/23] btrfs: qgroup: Implement data_rsv_map init/free functions Qu Wenruo
2015-10-09 2:15 ` [PATCH v2 03/23] btrfs: qgroup: Introduce new function to search most left reserve range Qu Wenruo
2015-10-09 2:15 ` [PATCH v2 04/23] btrfs: qgroup: Introduce function to insert non-overlap " Qu Wenruo
2015-10-09 2:15 ` [PATCH v2 05/23] btrfs: qgroup: Introduce function to reserve data range per inode Qu Wenruo
2015-10-09 2:18 ` [PATCH v2 06/23] btrfs: qgroup: Introduce btrfs_qgroup_reserve_data function Qu Wenruo
2015-10-09 2:18 ` [PATCH v2 07/23] btrfs: qgroup: Introduce function to release reserved range Qu Wenruo
2015-10-09 2:18 ` [PATCH v2 08/23] btrfs: qgroup: Introduce function to release/free reserved data range Qu Wenruo
2015-10-09 2:18 ` [PATCH v2 09/23] btrfs: delayed_ref: Add new function to record reserved space into delayed ref Qu Wenruo
2015-10-09 2:22 ` [PATCH v2 10/23] btrfs: delayed_ref: release and free qgroup reserved at proper timing Qu Wenruo
2015-10-09 2:22 ` [PATCH v2 11/23] btrfs: qgroup: Introduce new functions to reserve/free metadata Qu Wenruo
2015-10-09 2:22 ` [PATCH v2 12/23] btrfs: qgroup: Use new metadata reservation Qu Wenruo
2015-10-09 2:22 ` [PATCH v2 13/23] btrfs: extent-tree: Add new version of btrfs_check_data_free_space and btrfs_free_reserved_data_space Qu Wenruo
2015-10-09 2:25 ` Qu Wenruo [this message]
2015-10-09 2:25 ` [PATCH v2 15/23] btrfs: extent-tree: Add new version of btrfs_delalloc_reserve/release_space Qu Wenruo
2015-10-09 2:25 ` [PATCH v2 16/23] btrfs: extent-tree: Switch to new delalloc space reserve and release Qu Wenruo
2015-10-09 2:30 ` [PATCH v2 18/23] btrfs: qgroup: Add handler for NOCOW and inline Qu Wenruo
2015-10-09 2:30 ` [PATCH v2 19/23] btrfs: Add handler for invalidate page Qu Wenruo
2015-10-09 2:34 ` [PATCH v2 20/23] btrfs: qgroup: Add new trace point for qgroup data reserve Qu Wenruo
2015-10-09 2:34 ` [PATCH v2 21/23] btrfs: fallocate: Add support to accurate qgroup reserve Qu Wenruo
2015-10-09 2:34 ` [PATCH v2 22/23] btrfs: Avoid truncate tailing page if fallocate range doesn't exceed inode size Qu Wenruo
2015-10-09 2:34 ` [PATCH v2 23/23] btrfs: qgroup: Avoid calling btrfs_free_reserved_data_space in clear_bit_hook Qu Wenruo
2015-10-09 4:08 ` [PATCH v2 17/23] btrfs: qgroup: Cleanup old inaccurate facilities Qu Wenruo
2015-10-09 4:36 ` [PATCH v2 00/23] Rework btrfs qgroup reserved space framework Josef Bacik
2015-10-09 5:45 ` Qu Wenruo
2015-10-09 6:41 ` Filipe Manana
2015-10-09 8:19 ` Qu Wenruo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1444357551-1286-1-git-send-email-quwenruo@cn.fujitsu.com \
--to=quwenruo@cn.fujitsu.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).