linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).