* [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode
@ 2012-07-10 11:28 Liu Bo
2012-07-10 11:28 ` [PATCH 2/2] Btrfs: kill root from btrfs_is_free_space_inode Liu Bo
2012-07-18 10:02 ` [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode Alex Lyakas
0 siblings, 2 replies; 7+ messages in thread
From: Liu Bo @ 2012-07-10 11:28 UTC (permalink / raw)
To: linux-btrfs
For btree inode, its root is also 'tree root', so btree inode can be
misunderstood as a free space inode.
We should add one more check for btree inode.
Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
---
fs/btrfs/btrfs_inode.h | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index 12394a9..b168238 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -194,8 +194,10 @@ static inline void btrfs_i_size_write(struct inode *inode, u64 size)
static inline bool btrfs_is_free_space_inode(struct btrfs_root *root,
struct inode *inode)
{
- if (root == root->fs_info->tree_root ||
- BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
+ if (root == root->fs_info->tree_root &&
+ btrfs_ino(inode) != BTRFS_BTREE_INODE_OBJECTID)
+ return true;
+ if (BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
return true;
return false;
}
--
1.6.5.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] Btrfs: kill root from btrfs_is_free_space_inode
2012-07-10 11:28 [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode Liu Bo
@ 2012-07-10 11:28 ` Liu Bo
2012-07-17 13:43 ` David Sterba
2012-07-18 10:02 ` [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode Alex Lyakas
1 sibling, 1 reply; 7+ messages in thread
From: Liu Bo @ 2012-07-10 11:28 UTC (permalink / raw)
To: linux-btrfs
Since root can be fetched via BTRFS_I macro directly, we can save an args
for btrfs_is_free_space_inode().
Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
---
fs/btrfs/btrfs_inode.h | 5 +++--
fs/btrfs/extent-tree.c | 2 +-
fs/btrfs/file-item.c | 2 +-
fs/btrfs/inode.c | 22 +++++++++++-----------
4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index b168238..21b8cfe 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -191,9 +191,10 @@ static inline void btrfs_i_size_write(struct inode *inode, u64 size)
BTRFS_I(inode)->disk_i_size = size;
}
-static inline bool btrfs_is_free_space_inode(struct btrfs_root *root,
- struct inode *inode)
+static inline bool btrfs_is_free_space_inode(struct inode *inode)
{
+ struct btrfs_root *root = BTRFS_I(inode)->root;
+
if (root == root->fs_info->tree_root &&
btrfs_ino(inode) != BTRFS_BTREE_INODE_OBJECTID)
return true;
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 6e1d367..07087f6 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -4444,7 +4444,7 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
int ret;
/* Need to be holding the i_mutex here if we aren't free space cache */
- if (btrfs_is_free_space_inode(root, inode))
+ if (btrfs_is_free_space_inode(inode))
flush = 0;
if (flush && btrfs_transaction_in_commit(root->fs_info))
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index 5d158d3..af87025 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -183,7 +183,7 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root,
* read from the commit root and sidestep a nasty deadlock
* between reading the free space cache and updating the csum tree.
*/
- if (btrfs_is_free_space_inode(root, inode)) {
+ if (btrfs_is_free_space_inode(inode)) {
path->search_commit_root = 1;
path->skip_locking = 1;
}
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index a7d1921..5d463d4 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -825,7 +825,7 @@ static noinline int cow_file_range(struct inode *inode,
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
int ret = 0;
- BUG_ON(btrfs_is_free_space_inode(root, inode));
+ BUG_ON(btrfs_is_free_space_inode(inode));
trans = btrfs_join_transaction(root);
if (IS_ERR(trans)) {
extent_clear_unlock_delalloc(inode,
@@ -1153,7 +1153,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
return -ENOMEM;
}
- nolock = btrfs_is_free_space_inode(root, inode);
+ nolock = btrfs_is_free_space_inode(inode);
if (nolock)
trans = btrfs_join_transaction_nolock(root);
@@ -1466,7 +1466,7 @@ static void btrfs_set_bit_hook(struct inode *inode,
if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
struct btrfs_root *root = BTRFS_I(inode)->root;
u64 len = state->end + 1 - state->start;
- bool do_list = !btrfs_is_free_space_inode(root, inode);
+ bool do_list = !btrfs_is_free_space_inode(inode);
if (*bits & EXTENT_FIRST_DELALLOC) {
*bits &= ~EXTENT_FIRST_DELALLOC;
@@ -1501,7 +1501,7 @@ static void btrfs_clear_bit_hook(struct inode *inode,
if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
struct btrfs_root *root = BTRFS_I(inode)->root;
u64 len = state->end + 1 - state->start;
- bool do_list = !btrfs_is_free_space_inode(root, inode);
+ bool do_list = !btrfs_is_free_space_inode(inode);
if (*bits & EXTENT_FIRST_DELALLOC) {
*bits &= ~EXTENT_FIRST_DELALLOC;
@@ -1612,7 +1612,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
- if (btrfs_is_free_space_inode(root, inode))
+ if (btrfs_is_free_space_inode(inode))
metadata = 2;
if (!(rw & REQ_WRITE)) {
@@ -1869,7 +1869,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
int ret;
bool nolock;
- nolock = btrfs_is_free_space_inode(root, inode);
+ nolock = btrfs_is_free_space_inode(inode);
if (test_bit(BTRFS_ORDERED_IOERR, &ordered_extent->flags)) {
ret = -EIO;
@@ -2007,7 +2007,7 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
ordered_extent->work.func = finish_ordered_fn;
ordered_extent->work.flags = 0;
- if (btrfs_is_free_space_inode(root, inode))
+ if (btrfs_is_free_space_inode(inode))
workers = &root->fs_info->endio_freespace_worker;
else
workers = &root->fs_info->endio_write_workers;
@@ -2732,7 +2732,7 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans,
* The data relocation inode should also be directly updated
* without delay
*/
- if (!btrfs_is_free_space_inode(root, inode)
+ if (!btrfs_is_free_space_inode(inode)
&& root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) {
ret = btrfs_delayed_update_inode(trans, root, inode);
if (!ret)
@@ -3743,7 +3743,7 @@ void btrfs_evict_inode(struct inode *inode)
truncate_inode_pages(&inode->i_data, 0);
if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 ||
- btrfs_is_free_space_inode(root, inode)))
+ btrfs_is_free_space_inode(inode)))
goto no_delete;
if (is_bad_inode(inode)) {
@@ -4457,7 +4457,7 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc)
if (test_bit(BTRFS_INODE_DUMMY, &BTRFS_I(inode)->runtime_flags))
return 0;
- if (btrfs_fs_closing(root->fs_info) && btrfs_is_free_space_inode(root, inode))
+ if (btrfs_fs_closing(root->fs_info) && btrfs_is_free_space_inode(inode))
nolock = true;
if (wbc->sync_mode == WB_SYNC_ALL) {
@@ -7046,7 +7046,7 @@ int btrfs_drop_inode(struct inode *inode)
struct btrfs_root *root = BTRFS_I(inode)->root;
if (btrfs_root_refs(&root->root_item) == 0 &&
- !btrfs_is_free_space_inode(root, inode))
+ !btrfs_is_free_space_inode(inode))
return 1;
else
return generic_drop_inode(inode);
--
1.6.5.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] Btrfs: kill root from btrfs_is_free_space_inode
2012-07-10 11:28 ` [PATCH 2/2] Btrfs: kill root from btrfs_is_free_space_inode Liu Bo
@ 2012-07-17 13:43 ` David Sterba
2012-07-18 1:03 ` Liu Bo
0 siblings, 1 reply; 7+ messages in thread
From: David Sterba @ 2012-07-17 13:43 UTC (permalink / raw)
To: Liu Bo; +Cc: linux-btrfs
On Tue, Jul 10, 2012 at 07:28:39PM +0800, Liu Bo wrote:
> Since root can be fetched via BTRFS_I macro directly, we can save an args
> for btrfs_is_free_space_inode().
I see a great opportunity to rename the function :) It does not cover
just the free space inode anymore and it'll be more confusing with the
btree inode case.
I don't have a better name than btrfs_is_special_inode, but am not
completely satisfied.
david
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] Btrfs: kill root from btrfs_is_free_space_inode
2012-07-17 13:43 ` David Sterba
@ 2012-07-18 1:03 ` Liu Bo
0 siblings, 0 replies; 7+ messages in thread
From: Liu Bo @ 2012-07-18 1:03 UTC (permalink / raw)
To: David Sterba; +Cc: linux-btrfs
On 07/17/2012 09:43 PM, David Sterba wrote:
> On Tue, Jul 10, 2012 at 07:28:39PM +0800, Liu Bo wrote:
>> Since root can be fetched via BTRFS_I macro directly, we can save an args
>> for btrfs_is_free_space_inode().
>
> I see a great opportunity to rename the function :) It does not cover
> just the free space inode anymore and it'll be more confusing with the
> btree inode case.
>
> I don't have a better name than btrfs_is_special_inode, but am not
> completely satisfied.
>
Hi David,
Seems that my patch's title is confusing you...
I made these patches to make this function return true if the inode is a free space inode
or an inode cache inode, but not the btree inode.
Or am I missing something? :)
thanks,
liubo
>
> david
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode
2012-07-10 11:28 [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode Liu Bo
2012-07-10 11:28 ` [PATCH 2/2] Btrfs: kill root from btrfs_is_free_space_inode Liu Bo
@ 2012-07-18 10:02 ` Alex Lyakas
2012-07-18 12:02 ` Liu Bo
1 sibling, 1 reply; 7+ messages in thread
From: Alex Lyakas @ 2012-07-18 10:02 UTC (permalink / raw)
To: Liu Bo; +Cc: linux-btrfs
Hi Liu,
can you pls explain this a bit more to me.
I see in my fs that there are (FREE_SPACE,0, offset) items in the root
tree. It seems that offset here is the objectid of the appropriate
BLOCK_GROUP_ITEM. Also, I see that each FREE_SPACE points at some
INODE_ITEM within the root tree, and this INODE_ITEM also has extents.
I presume that these extents contain the free space cache in some
format, is that correct?
However, I don't see any FREE_INO entries, what are they? Are they
perhaps used only when "inode_cache" mount option is used, so inode
numbers are not always incremented in btrfs_find_free_ino(), but
smaller unused numbers are reused?
Also, I don't see anywhere BTRFS_BTREE_INODE_OBJECTID in the tree root
tree. So what is this "btree inode" that you mention?
Thanks,
Alex.
On Tue, Jul 10, 2012 at 2:28 PM, Liu Bo <liubo2009@cn.fujitsu.com> wrote:
> For btree inode, its root is also 'tree root', so btree inode can be
> misunderstood as a free space inode.
>
> We should add one more check for btree inode.
>
> Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
> ---
> fs/btrfs/btrfs_inode.h | 6 ++++--
> 1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
> index 12394a9..b168238 100644
> --- a/fs/btrfs/btrfs_inode.h
> +++ b/fs/btrfs/btrfs_inode.h
> @@ -194,8 +194,10 @@ static inline void btrfs_i_size_write(struct inode *inode, u64 size)
> static inline bool btrfs_is_free_space_inode(struct btrfs_root *root,
> struct inode *inode)
> {
> - if (root == root->fs_info->tree_root ||
> - BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
> + if (root == root->fs_info->tree_root &&
> + btrfs_ino(inode) != BTRFS_BTREE_INODE_OBJECTID)
> + return true;
> + if (BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
> return true;
> return false;
> }
> --
> 1.6.5.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode
2012-07-18 10:02 ` [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode Alex Lyakas
@ 2012-07-18 12:02 ` Liu Bo
2012-07-18 12:39 ` Alex Lyakas
0 siblings, 1 reply; 7+ messages in thread
From: Liu Bo @ 2012-07-18 12:02 UTC (permalink / raw)
To: Alex Lyakas; +Cc: linux-btrfs
On 07/18/2012 06:02 PM, Alex Lyakas wrote:
> Hi Liu,
> can you pls explain this a bit more to me.
> I see in my fs that there are (FREE_SPACE,0, offset) items in the root
> tree. It seems that offset here is the objectid of the appropriate
> BLOCK_GROUP_ITEM. Also, I see that each FREE_SPACE points at some
> INODE_ITEM within the root tree, and this INODE_ITEM also has extents.
> I presume that these extents contain the free space cache in some
> format, is that correct?
>
More or less.
As its name shows, a free space inode's data (you name it extents) consists of
free space info, meanwhile, a free space inode is issued to a block group,
so the free space info actually stands for free space in the block group:
|<- a block group len ->|
|----vvv----vvv-------vvv-----|
'v' : occupied.
'-' : available. (free space)
these free space info are indexed in a rbtree in memory, and each entry has [start, len].
> However, I don't see any FREE_INO entries, what are they? Are they
> perhaps used only when "inode_cache" mount option is used, so inode
> numbers are not always incremented in btrfs_find_free_ino(), but
> smaller unused numbers are reused?
>
Yes, that's what it is used for.
> Also, I don't see anywhere BTRFS_BTREE_INODE_OBJECTID in the tree root
> tree. So what is this "btree inode" that you mention?
>
The code refers to disk_io.c, in the function 'open_ctree()' you can see the definition.
Basically btree inode's data stands for btrfs's metadata, I think you can find something
in btrfs's wiki page?
And thanks for your energy on btrfs! :)
thanks,
liubo
> Thanks,
> Alex.
>
>
> On Tue, Jul 10, 2012 at 2:28 PM, Liu Bo <liubo2009@cn.fujitsu.com> wrote:
>> For btree inode, its root is also 'tree root', so btree inode can be
>> misunderstood as a free space inode.
>>
>> We should add one more check for btree inode.
>>
>> Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
>> ---
>> fs/btrfs/btrfs_inode.h | 6 ++++--
>> 1 files changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
>> index 12394a9..b168238 100644
>> --- a/fs/btrfs/btrfs_inode.h
>> +++ b/fs/btrfs/btrfs_inode.h
>> @@ -194,8 +194,10 @@ static inline void btrfs_i_size_write(struct inode *inode, u64 size)
>> static inline bool btrfs_is_free_space_inode(struct btrfs_root *root,
>> struct inode *inode)
>> {
>> - if (root == root->fs_info->tree_root ||
>> - BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
>> + if (root == root->fs_info->tree_root &&
>> + btrfs_ino(inode) != BTRFS_BTREE_INODE_OBJECTID)
>> + return true;
>> + if (BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
>> return true;
>> return false;
>> }
>> --
>> 1.6.5.2
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode
2012-07-18 12:02 ` Liu Bo
@ 2012-07-18 12:39 ` Alex Lyakas
0 siblings, 0 replies; 7+ messages in thread
From: Alex Lyakas @ 2012-07-18 12:39 UTC (permalink / raw)
To: Liu Bo; +Cc: linux-btrfs
On Wed, Jul 18, 2012 at 3:02 PM, Liu Bo <liubo2009@cn.fujitsu.com> wrote:
> On 07/18/2012 06:02 PM, Alex Lyakas wrote:
>
> More or less.
>
> As its name shows, a free space inode's data (you name it extents) consists of
> free space info, meanwhile, a free space inode is issued to a block group,
> so the free space info actually stands for free space in the block group:
>
> |<- a block group len ->|
> |----vvv----vvv-------vvv-----|
>
> 'v' : occupied.
> '-' : available. (free space)
>
> these free space info are indexed in a rbtree in memory, and each entry has [start, len].
Thanks, it makes sense with what I saw in the code, just could not
figure how this free-space inode's data is being read into memory.
>
>> Also, I don't see anywhere BTRFS_BTREE_INODE_OBJECTID in the tree root
>> tree. So what is this "btree inode" that you mention?
>>
>
>
> The code refers to disk_io.c, in the function 'open_ctree()' you can see the definition.
>
I saw it there, but not on disk. So now I see that it's kind of a
special "top" inode, used for ... something, and this inode is not
stored anywhere on-disk.
Thanks, now I understand your patch. Also, I understand now that
FREE_INO items sit in the subvolume file tree (and perhaps also in the
root tree), because they need to track free inos for distinct ino
spaces.
> Basically btree inode's data stands for btrfs's metadata, I think you can find something
> in btrfs's wiki page?
>
>
> And thanks for your energy on btrfs! :)
Thanks for helping.
Alex.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-07-18 12:39 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-10 11:28 [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode Liu Bo
2012-07-10 11:28 ` [PATCH 2/2] Btrfs: kill root from btrfs_is_free_space_inode Liu Bo
2012-07-17 13:43 ` David Sterba
2012-07-18 1:03 ` Liu Bo
2012-07-18 10:02 ` [PATCH 1/2] Btrfs: fix btrfs_is_free_space_inode to recognize btree inode Alex Lyakas
2012-07-18 12:02 ` Liu Bo
2012-07-18 12:39 ` Alex Lyakas
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).