Re: [f2fs-dev] [PATCH] resize.f2fs: skip cursegs when finding next free block

2018-06-04 Thread Junling Zheng
On 2018/6/5 4:55, Jaegeuk Kim wrote:
> On 06/04, Sheng Yong wrote:
>> resize.f2fs (f2fs_defragment) tries to migrate blocks to new positions.
>> However, if a curseg is selected, and f2fs_defragment is broken by any
>> error, curseg->next_blkoff is left not updated.
>>
>> To avoid this, we skip cursegs when finding next free block.
> 
> Don't we update the curseg at the end of resize/defrag?
> 

Yeah, currently, at the beginning of resize, we finds the next free block
from the beginning of main instead of from cursegs. So, we needn't to update
the curseg if we skip cursegs while finding next free block.

Besides, the logic of IS_CUR_SEGNO is puzzling, does it mean to check the
type of curseg? If the type of curseg with specified segno is not that we
need, then returns nonzero?

>>
>> Signed-off-by: Sheng Yong 
>> ---
>>  fsck/f2fs.h  | 5 +
>>  fsck/fsck.c  | 2 +-
>>  fsck/mount.c | 8 +++-
>>  3 files changed, 5 insertions(+), 10 deletions(-)
>>
>> diff --git a/fsck/f2fs.h b/fsck/f2fs.h
>> index d0e08aa..d216444 100644
>> --- a/fsck/f2fs.h
>> +++ b/fsck/f2fs.h
>> @@ -380,16 +380,13 @@ static inline bool IS_VALID_BLK_ADDR(struct 
>> f2fs_sb_info *sbi, u32 addr)
>>  return 1;
>>  }
>>  
>> -static inline int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno, int 
>> type)
>> +static inline int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno)
>>  {
>>  int i;
>>  
>>  for (i = 0; i < NO_CHECK_TYPE; i++) {
>>  struct curseg_info *curseg = CURSEG_I(sbi, i);
>>  
>> -if (type == i)
>> -continue;
>> -
>>  if (segno == curseg->segno)
>>  return 1;
>>  }
>> diff --git a/fsck/fsck.c b/fsck/fsck.c
>> index 5b6dbc8..8145199 100644
>> --- a/fsck/fsck.c
>> +++ b/fsck/fsck.c
>> @@ -1741,7 +1741,7 @@ int fsck_chk_meta(struct f2fs_sb_info *sbi)
>>  se = get_seg_entry(sbi, i);
>>  if (se->valid_blocks != 0)
>>  sit_valid_segs++;
>> -else if (IS_CUR_SEGNO(sbi, i, NO_CHECK_TYPE)) {
>> +else if (IS_CUR_SEGNO(sbi, i)) {
>>  /* curseg has not been written back to device */
>>  MSG(1, "\tInfo: curseg %u is counted in valid segs\n", 
>> i);
>>  sit_valid_segs++;
>> diff --git a/fsck/mount.c b/fsck/mount.c
>> index 0a30adb..8d4704e 100644
>> --- a/fsck/mount.c
>> +++ b/fsck/mount.c
>> @@ -35,8 +35,7 @@ u32 get_free_segments(struct f2fs_sb_info *sbi)
>>  for (i = 0; i < TOTAL_SEGS(sbi); i++) {
>>  struct seg_entry *se = get_seg_entry(sbi, i);
>>  
>> -if (se->valid_blocks == 0x0 &&
>> -!IS_CUR_SEGNO(sbi, i, NO_CHECK_TYPE))
>> +if (se->valid_blocks == 0x0 && !IS_CUR_SEGNO(sbi, i))
>>  free_segs++;
>>  }
>>  return free_segs;
>> @@ -1891,8 +1890,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi)
>>  se->valid_blocks);
>>  rewrite_current_sit_page(sbi, segno, sit_blk);
>>  
>> -if (se->valid_blocks == 0x0 &&
>> -!IS_CUR_SEGNO(sbi, segno, NO_CHECK_TYPE))
>> +if (se->valid_blocks == 0x0 && !IS_CUR_SEGNO(sbi, segno))
>>  free_segs++;
>>  }
>>  
>> @@ -1922,7 +1920,7 @@ int find_next_free_block(struct f2fs_sb_info *sbi, u64 
>> *to, int left, int type)
>>  se = get_seg_entry(sbi, segno);
>>  
>>  if (se->valid_blocks == sbi->blocks_per_seg ||
>> -IS_CUR_SEGNO(sbi, segno, type)) {
>> +IS_CUR_SEGNO(sbi, segno)) {
>>  *to = left ? START_BLOCK(sbi, segno) - 1:
>>  START_BLOCK(sbi, segno + 1);
>>  continue;
>> -- 
>> 2.17.0
> 
> --
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> ___
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
> 
> 



--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH] resize.f2fs: skip cursegs when finding next free block

2018-06-04 Thread Sheng Yong

Hi, Jaegeuk

On 2018/6/5 4:55, Jaegeuk Kim wrote:

On 06/04, Sheng Yong wrote:

resize.f2fs (f2fs_defragment) tries to migrate blocks to new positions.
However, if a curseg is selected, and f2fs_defragment is broken by any
error, curseg->next_blkoff is left not updated.

To avoid this, we skip cursegs when finding next free block.


Don't we update the curseg at the end of resize/defrag?


Yes, we will if f2fs_defragment successfully moves all blocks. However,
if find_next_free_block fails because not enough space left (this happens
when sload fills too much data into the image), f2fs_defragment returns
without updating CP or cursegs.

thanks,
Sheng




Signed-off-by: Sheng Yong 
---
  fsck/f2fs.h  | 5 +
  fsck/fsck.c  | 2 +-
  fsck/mount.c | 8 +++-
  3 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/fsck/f2fs.h b/fsck/f2fs.h
index d0e08aa..d216444 100644
--- a/fsck/f2fs.h
+++ b/fsck/f2fs.h
@@ -380,16 +380,13 @@ static inline bool IS_VALID_BLK_ADDR(struct f2fs_sb_info 
*sbi, u32 addr)
return 1;
  }
  
-static inline int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno, int type)

+static inline int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno)
  {
int i;
  
  	for (i = 0; i < NO_CHECK_TYPE; i++) {

struct curseg_info *curseg = CURSEG_I(sbi, i);
  
-		if (type == i)

-   continue;
-
if (segno == curseg->segno)
return 1;
}
diff --git a/fsck/fsck.c b/fsck/fsck.c
index 5b6dbc8..8145199 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -1741,7 +1741,7 @@ int fsck_chk_meta(struct f2fs_sb_info *sbi)
se = get_seg_entry(sbi, i);
if (se->valid_blocks != 0)
sit_valid_segs++;
-   else if (IS_CUR_SEGNO(sbi, i, NO_CHECK_TYPE)) {
+   else if (IS_CUR_SEGNO(sbi, i)) {
/* curseg has not been written back to device */
MSG(1, "\tInfo: curseg %u is counted in valid segs\n", 
i);
sit_valid_segs++;
diff --git a/fsck/mount.c b/fsck/mount.c
index 0a30adb..8d4704e 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -35,8 +35,7 @@ u32 get_free_segments(struct f2fs_sb_info *sbi)
for (i = 0; i < TOTAL_SEGS(sbi); i++) {
struct seg_entry *se = get_seg_entry(sbi, i);
  
-		if (se->valid_blocks == 0x0 &&

-   !IS_CUR_SEGNO(sbi, i, NO_CHECK_TYPE))
+   if (se->valid_blocks == 0x0 && !IS_CUR_SEGNO(sbi, i))
free_segs++;
}
return free_segs;
@@ -1891,8 +1890,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi)
se->valid_blocks);
rewrite_current_sit_page(sbi, segno, sit_blk);
  
-		if (se->valid_blocks == 0x0 &&

-   !IS_CUR_SEGNO(sbi, segno, NO_CHECK_TYPE))
+   if (se->valid_blocks == 0x0 && !IS_CUR_SEGNO(sbi, segno))
free_segs++;
}
  
@@ -1922,7 +1920,7 @@ int find_next_free_block(struct f2fs_sb_info *sbi, u64 *to, int left, int type)

se = get_seg_entry(sbi, segno);
  
  		if (se->valid_blocks == sbi->blocks_per_seg ||

-   IS_CUR_SEGNO(sbi, segno, type)) {
+   IS_CUR_SEGNO(sbi, segno)) {
*to = left ? START_BLOCK(sbi, segno) - 1:
START_BLOCK(sbi, segno + 1);
continue;
--
2.17.0


.




--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH] resize.f2fs: skip cursegs when finding next free block

2018-06-04 Thread Jaegeuk Kim
On 06/04, Sheng Yong wrote:
> resize.f2fs (f2fs_defragment) tries to migrate blocks to new positions.
> However, if a curseg is selected, and f2fs_defragment is broken by any
> error, curseg->next_blkoff is left not updated.
> 
> To avoid this, we skip cursegs when finding next free block.

Don't we update the curseg at the end of resize/defrag?

> 
> Signed-off-by: Sheng Yong 
> ---
>  fsck/f2fs.h  | 5 +
>  fsck/fsck.c  | 2 +-
>  fsck/mount.c | 8 +++-
>  3 files changed, 5 insertions(+), 10 deletions(-)
> 
> diff --git a/fsck/f2fs.h b/fsck/f2fs.h
> index d0e08aa..d216444 100644
> --- a/fsck/f2fs.h
> +++ b/fsck/f2fs.h
> @@ -380,16 +380,13 @@ static inline bool IS_VALID_BLK_ADDR(struct 
> f2fs_sb_info *sbi, u32 addr)
>   return 1;
>  }
>  
> -static inline int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno, int type)
> +static inline int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno)
>  {
>   int i;
>  
>   for (i = 0; i < NO_CHECK_TYPE; i++) {
>   struct curseg_info *curseg = CURSEG_I(sbi, i);
>  
> - if (type == i)
> - continue;
> -
>   if (segno == curseg->segno)
>   return 1;
>   }
> diff --git a/fsck/fsck.c b/fsck/fsck.c
> index 5b6dbc8..8145199 100644
> --- a/fsck/fsck.c
> +++ b/fsck/fsck.c
> @@ -1741,7 +1741,7 @@ int fsck_chk_meta(struct f2fs_sb_info *sbi)
>   se = get_seg_entry(sbi, i);
>   if (se->valid_blocks != 0)
>   sit_valid_segs++;
> - else if (IS_CUR_SEGNO(sbi, i, NO_CHECK_TYPE)) {
> + else if (IS_CUR_SEGNO(sbi, i)) {
>   /* curseg has not been written back to device */
>   MSG(1, "\tInfo: curseg %u is counted in valid segs\n", 
> i);
>   sit_valid_segs++;
> diff --git a/fsck/mount.c b/fsck/mount.c
> index 0a30adb..8d4704e 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -35,8 +35,7 @@ u32 get_free_segments(struct f2fs_sb_info *sbi)
>   for (i = 0; i < TOTAL_SEGS(sbi); i++) {
>   struct seg_entry *se = get_seg_entry(sbi, i);
>  
> - if (se->valid_blocks == 0x0 &&
> - !IS_CUR_SEGNO(sbi, i, NO_CHECK_TYPE))
> + if (se->valid_blocks == 0x0 && !IS_CUR_SEGNO(sbi, i))
>   free_segs++;
>   }
>   return free_segs;
> @@ -1891,8 +1890,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi)
>   se->valid_blocks);
>   rewrite_current_sit_page(sbi, segno, sit_blk);
>  
> - if (se->valid_blocks == 0x0 &&
> - !IS_CUR_SEGNO(sbi, segno, NO_CHECK_TYPE))
> + if (se->valid_blocks == 0x0 && !IS_CUR_SEGNO(sbi, segno))
>   free_segs++;
>   }
>  
> @@ -1922,7 +1920,7 @@ int find_next_free_block(struct f2fs_sb_info *sbi, u64 
> *to, int left, int type)
>   se = get_seg_entry(sbi, segno);
>  
>   if (se->valid_blocks == sbi->blocks_per_seg ||
> - IS_CUR_SEGNO(sbi, segno, type)) {
> + IS_CUR_SEGNO(sbi, segno)) {
>   *to = left ? START_BLOCK(sbi, segno) - 1:
>   START_BLOCK(sbi, segno + 1);
>   continue;
> -- 
> 2.17.0

--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH] resize.f2fs: skip cursegs when finding next free block

2018-06-04 Thread Chao Yu
On 2018/6/4 16:14, Sheng Yong wrote:
> resize.f2fs (f2fs_defragment) tries to migrate blocks to new positions.
> However, if a curseg is selected, and f2fs_defragment is broken by any
> error, curseg->next_blkoff is left not updated.
> 
> To avoid this, we skip cursegs when finding next free block.
> 
> Signed-off-by: Sheng Yong 

Reviewed-by: Chao Yu 

Thanks,


--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel