* [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole
@ 2015-02-02 7:31 Forrest Liu
2015-02-02 14:39 ` Ed Tomlinson
2015-02-04 7:14 ` Liu Bo
0 siblings, 2 replies; 6+ messages in thread
From: Forrest Liu @ 2015-02-02 7:31 UTC (permalink / raw)
To: linux-btrfs; +Cc: Forrest Liu
If device tree has hole, find_free_dev_extent() cannot find available
address properly.
The example below, has one BIG hole in device tree, and can only
allocate just one chunk in a transaction.
item 9 key (1 DEV_EXTENT 273841913856) itemoff 15811 itemsize 48
dev extent chunk_tree 3
chunk objectid 256 chunk offset 272759783424 length 1073741824
item 10 key (1 DEV_EXTENT 1071632089088) itemoff 15763 itemsize 48
dev extent chunk_tree 3
chunk objectid 256 chunk offset 1070549958656 length 1073741824
item 11 key (1 DEV_EXTENT 1072705830912) itemoff 15715 itemsize 48
dev extent chunk_tree 3
chunk objectid 256 chunk offset 1071623700480 length
Signed-off-by: Forrest Liu <forrestl@synology.com>
---
fs/btrfs/volumes.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index da7e0e1..61be789 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1060,6 +1060,7 @@ static int contains_pending_extent(struct btrfs_trans_handle *trans,
struct extent_map *em;
struct list_head *search_list = &trans->transaction->pending_chunks;
int ret = 0;
+ u64 physical_start = *start;
again:
list_for_each_entry(em, search_list, list) {
@@ -1070,9 +1071,9 @@ again:
for (i = 0; i < map->num_stripes; i++) {
if (map->stripes[i].dev != device)
continue;
- if (map->stripes[i].physical >= *start + len ||
+ if (map->stripes[i].physical >= physical_start + len ||
map->stripes[i].physical + em->orig_block_len <=
- *start)
+ physical_start)
continue;
*start = map->stripes[i].physical +
em->orig_block_len;
@@ -1195,8 +1196,14 @@ again:
*/
if (contains_pending_extent(trans, device,
&search_start,
- hole_size))
- hole_size = 0;
+ hole_size)) {
+ if (key.offset >= search_start)
+ hole_size = key_offset - search_start;
+ else {
+ WARN_ON(1);
+ hole_size = 0;
+ }
+ }
if (hole_size > max_hole_size) {
max_hole_start = search_start;
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole
2015-02-02 7:31 [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole Forrest Liu
@ 2015-02-02 14:39 ` Ed Tomlinson
2015-02-02 18:40 ` Ed Tomlinson
2015-02-04 7:14 ` Liu Bo
1 sibling, 1 reply; 6+ messages in thread
From: Ed Tomlinson @ 2015-02-02 14:39 UTC (permalink / raw)
To: Forrest Liu; +Cc: linux-btrfs
Hi,
Found a problem compile testing this.
hole_size = key_offset - search_start;
Should not that be key.offset ?
TIA
Ed Tomlinson
On Monday, February 2, 2015 2:31:39 AM EST, Forrest Liu wrote:
> If device tree has hole, find_free_dev_extent() cannot find available
> address properly.
>
> The example below, has one BIG hole in device tree, and can only
> allocate just one chunk in a transaction.
>
> item 9 key (1 DEV_EXTENT 273841913856) itemoff 15811 itemsize 48
> dev extent chunk_tree 3
> chunk objectid 256 chunk offset 272759783424 length 1073741824
> item 10 key (1 DEV_EXTENT 1071632089088) itemoff 15763 itemsize 48
> dev extent chunk_tree 3
> chunk objectid 256 chunk offset 1070549958656 length 1073741824
> item 11 key (1 DEV_EXTENT 1072705830912) itemoff 15715 itemsize 48
> dev extent chunk_tree 3
> chunk objectid 256 chunk offset 1071623700480 length
>
> Signed-off-by: Forrest Liu <forrestl@synology.com>
> ---
> fs/btrfs/volumes.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index da7e0e1..61be789 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1060,6 +1060,7 @@ static int contains_pending_extent(struct
> btrfs_trans_handle *trans,
> struct extent_map *em;
> struct list_head *search_list = &trans->transaction->pending_chunks;
> int ret = 0;
> + u64 physical_start = *start;
>
> again:
> list_for_each_entry(em, search_list, list) {
> @@ -1070,9 +1071,9 @@ again:
> for (i = 0; i < map->num_stripes; i++) {
> if (map->stripes[i].dev != device)
> continue;
> - if (map->stripes[i].physical >= *start + len ||
> + if (map->stripes[i].physical >= physical_start + len ||
> map->stripes[i].physical + em->orig_block_len <=
> - *start)
> + physical_start)
> continue;
> *start = map->stripes[i].physical +
> em->orig_block_len;
> @@ -1195,8 +1196,14 @@ again:
> */
> if (contains_pending_extent(trans, device,
> &search_start,
> - hole_size))
> - hole_size = 0;
> + hole_size)) {
> + if (key.offset >= search_start)
> + hole_size = key_offset - search_start;
> + else {
> + WARN_ON(1);
> + hole_size = 0;
> + }
> + }
>
> if (hole_size > max_hole_size) {
> max_hole_start = search_start;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole
2015-02-02 14:39 ` Ed Tomlinson
@ 2015-02-02 18:40 ` Ed Tomlinson
2015-02-03 11:36 ` Forrest Liu
0 siblings, 1 reply; 6+ messages in thread
From: Ed Tomlinson @ 2015-02-02 18:40 UTC (permalink / raw)
To: Forrest Liu; +Cc: linux-btrfs
On Monday, February 2, 2015 9:39:06 AM EST, Ed Tomlinson wrote:
Hi
Booting a kernel with the three patches:
[PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree
has hole
[PATCH] Btrfs: btrfs_release_extent_buffer_page() didn't free pages of
dummy extent
[PATCH] Btrfs: fix BUG_ON in btrfs_orphan_add() when delete unused block
group
generates lots of opps here (I hate to post an anemic report but my serial
console was not recording so I do not have the opps). They occured when
starting X and, If I read them correctly, had something to do with extents.
Anyone else?
Thanks
Ed Tomlinson
> Hi,
>
> Found a problem compile testing this.
>
> hole_size = key_offset - search_start;
>
> Should not that be key.offset ?
>
> TIA
> Ed Tomlinson
>
>
> On Monday, February 2, 2015 2:31:39 AM EST, Forrest Liu wrote:
>> If device tree has hole, find_free_dev_extent() cannot find available
>> address properly.
>>
>> The example below, has one BIG hole in device tree, and can only
>> allocate just one chunk in a transaction.
>>
>> item 9 key (1 DEV_EXTENT 273841913856) itemoff 15811 itemsize 48 ...
>
> --
> 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] 6+ messages in thread
* Re: [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole
2015-02-02 18:40 ` Ed Tomlinson
@ 2015-02-03 11:36 ` Forrest Liu
2015-02-03 18:01 ` Ed Tomlinson
0 siblings, 1 reply; 6+ messages in thread
From: Forrest Liu @ 2015-02-03 11:36 UTC (permalink / raw)
To: Ed Tomlinson; +Cc: linux-btrfs
2015-02-03 2:40 GMT+08:00 Ed Tomlinson <edt@aei.ca>:
> On Monday, February 2, 2015 9:39:06 AM EST, Ed Tomlinson wrote:
>
> Hi
>
> Booting a kernel with the three patches:
> [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree
> has hole
> [PATCH] Btrfs: btrfs_release_extent_buffer_page() didn't free pages of dummy
> extent
> [PATCH] Btrfs: fix BUG_ON in btrfs_orphan_add() when delete unused block
> group
>
> generates lots of opps here (I hate to post an anemic report but my serial
> console was not recording so I do not have the opps). They occured when
> starting X and, If I read them correctly, had something to do with extents.
>
My fault, i should test these patches before i submit these patches.
The oops was caused by patch
"Btrfs: btrfs_release_extent_buffer_page() didn't free pages of dummy extent"
I will resend these patches after test on linux-3.19-rc7.
Thanks
Forrest
> Anyone else?
>
> Thanks
> Ed Tomlinson
>
>> Hi,
>>
>> Found a problem compile testing this.
>> hole_size = key_offset - search_start;
>>
>> Should not that be key.offset ?
>>
>> TIA
>> Ed Tomlinson
>>
>>
>> On Monday, February 2, 2015 2:31:39 AM EST, Forrest Liu wrote:
>>>
>>> If device tree has hole, find_free_dev_extent() cannot find available
>>> address properly.
>>>
>>> The example below, has one BIG hole in device tree, and can only
>>> allocate just one chunk in a transaction.
>>>
>>> item 9 key (1 DEV_EXTENT 273841913856) itemoff 15811 itemsize 48 ...
>>
>>
>> --
>> 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] 6+ messages in thread
* Re: [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole
2015-02-03 11:36 ` Forrest Liu
@ 2015-02-03 18:01 ` Ed Tomlinson
0 siblings, 0 replies; 6+ messages in thread
From: Ed Tomlinson @ 2015-02-03 18:01 UTC (permalink / raw)
To: Forrest Liu; +Cc: linux-btrfs
Hi,
Its a great idea to test the patches before submitting. However I think
its even more importent to tell us the state of testing. eg. this is an
RFC or in production in abc's kernel, and this version is untested or has
been compile tested, boot tested, improves xfstests (before x failures out
of z, after the patch the number of failures was y, where y<x).
A little bit of info like this will help those of us using the info in the
lists and should aid getting your patches into the kernel faster.
Thanks
Ed
On Tuesday, February 3, 2015 6:36:40 AM EST, Forrest Liu wrote:
> 2015-02-03 2:40 GMT+08:00 Ed Tomlinson <edt@aei.ca>:
>> On Monday, February 2, 2015 9:39:06 AM EST, Ed Tomlinson wrote:
>>
>> Hi
>>
>> Booting a kernel with the three patches:
>> [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree
>> has hole ...
>
> My fault, i should test these patches before i submit these patches.
> The oops was caused by patch
> "Btrfs: btrfs_release_extent_buffer_page() didn't free pages of
> dummy extent"
>
> I will resend these patches after test on linux-3.19-rc7.
>
> Thanks
> Forrest
>
>> Anyone else?
>>
>> Thanks
>> Ed Tomlinson
>> ...
> --
> 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] 6+ messages in thread
* Re: [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole
2015-02-02 7:31 [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole Forrest Liu
2015-02-02 14:39 ` Ed Tomlinson
@ 2015-02-04 7:14 ` Liu Bo
1 sibling, 0 replies; 6+ messages in thread
From: Liu Bo @ 2015-02-04 7:14 UTC (permalink / raw)
To: Forrest Liu; +Cc: linux-btrfs
On Mon, Feb 02, 2015 at 03:31:39PM +0800, Forrest Liu wrote:
> If device tree has hole, find_free_dev_extent() cannot find available
> address properly.
>
> The example below, has one BIG hole in device tree, and can only
> allocate just one chunk in a transaction.
>
> item 9 key (1 DEV_EXTENT 273841913856) itemoff 15811 itemsize 48
> dev extent chunk_tree 3
> chunk objectid 256 chunk offset 272759783424 length 1073741824
> item 10 key (1 DEV_EXTENT 1071632089088) itemoff 15763 itemsize 48
> dev extent chunk_tree 3
> chunk objectid 256 chunk offset 1070549958656 length 1073741824
> item 11 key (1 DEV_EXTENT 1072705830912) itemoff 15715 itemsize 48
> dev extent chunk_tree 3
> chunk objectid 256 chunk offset 1071623700480 length
>
> Signed-off-by: Forrest Liu <forrestl@synology.com>
> ---
> fs/btrfs/volumes.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index da7e0e1..61be789 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1060,6 +1060,7 @@ static int contains_pending_extent(struct btrfs_trans_handle *trans,
> struct extent_map *em;
> struct list_head *search_list = &trans->transaction->pending_chunks;
> int ret = 0;
> + u64 physical_start = *start;
>
> again:
> list_for_each_entry(em, search_list, list) {
> @@ -1070,9 +1071,9 @@ again:
> for (i = 0; i < map->num_stripes; i++) {
> if (map->stripes[i].dev != device)
> continue;
> - if (map->stripes[i].physical >= *start + len ||
> + if (map->stripes[i].physical >= physical_start + len ||
> map->stripes[i].physical + em->orig_block_len <=
> - *start)
> + physical_start)
> continue;
> *start = map->stripes[i].physical +
> em->orig_block_len;
This part looks good.
> @@ -1195,8 +1196,14 @@ again:
> */
> if (contains_pending_extent(trans, device,
> &search_start,
> - hole_size))
> - hole_size = 0;
> + hole_size)) {
> + if (key.offset >= search_start)
> + hole_size = key_offset - search_start;
> + else {
> + WARN_ON(1);
> + hole_size = 0;
I'd prefer WARN_ON_ONCE(1) since key.offset should not be less than search_start by design.
Other looks good.
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Thanks,
-liubo
> + }
> + }
>
> if (hole_size > max_hole_size) {
> max_hole_start = search_start;
> --
> 1.9.1
>
> --
> 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] 6+ messages in thread
end of thread, other threads:[~2015-02-04 7:14 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-02 7:31 [PATCH] Btrfs: fix find_free_dev_extent() malfunction in case device tree has hole Forrest Liu
2015-02-02 14:39 ` Ed Tomlinson
2015-02-02 18:40 ` Ed Tomlinson
2015-02-03 11:36 ` Forrest Liu
2015-02-03 18:01 ` Ed Tomlinson
2015-02-04 7:14 ` Liu Bo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.