linux-f2fs-devel.lists.sourceforge.net archive mirror
 help / color / mirror / Atom feed
* [f2fs-dev] [PATCH 1/1] f2fs: fix fallocate failed under pinned block situation
@ 2023-10-30  9:40 Wu Bo via Linux-f2fs-devel
  2023-11-07 14:39 ` Chao Yu
  0 siblings, 1 reply; 9+ messages in thread
From: Wu Bo via Linux-f2fs-devel @ 2023-10-30  9:40 UTC (permalink / raw)
  To: Jaegeuk Kim, Chao Yu; +Cc: Wu Bo, linux-kernel, Wu Bo, linux-f2fs-devel

If GC victim has pinned block, it can't be recycled.
And if GC is foreground running, after many failure try, the pinned file
is expected to be clear pin flag. To enable the section be recycled.

But when fallocate trigger FG_GC, GC can never recycle the pinned
section. Because GC will go to stop before the failure try meet the threshold:
	if (has_enough_free_secs(sbi, sec_freed, 0)) {
		if (!gc_control->no_bg_gc &&
		    total_sec_freed < gc_control->nr_free_secs)
			goto go_gc_more;
		goto stop;
	}

So when fallocate trigger FG_GC, at least recycle one.

This issue can be reproduced by filling f2fs space as following layout.
Every segment has one block is pinned:
+-+-+-+-+-+-+-----+-+
| | |p| | | | ... | | seg_n
+-+-+-+-+-+-+-----+-+
+-+-+-+-+-+-+-----+-+
| | |p| | | | ... | | seg_n+1
+-+-+-+-+-+-+-----+-+
...
+-+-+-+-+-+-+-----+-+
| | |p| | | | ... | | seg_n+k
+-+-+-+-+-+-+-----+-+

And following are steps to reproduce this issue:
dd if=/dev/zero of=./f2fs_pin.img bs=2M count=1024
mkfs.f2fs f2fs_pin.img
mkdir f2fs
mount f2fs_pin.img ./f2fs
cd f2fs
dd if=/dev/zero of=./large_padding bs=1M count=1760
./pin_filling.sh
rm padding*
sync
touch fallocate_40m
f2fs_io pinfile set fallocate_40m
fallocate -l 41943040 fallocate_40m

fallocate always fail with EAGAIN even there has enough free space.

'pin_filling.sh' is:
count=1
while :
do
    # filling the seg space
    for i in {1..511}:
    do
        name=padding_$count-$i
        echo write $name
        dd if=/dev/zero of=./$name bs=4K count=1 > /dev/null 2>&1
        if [ $? -ne 0 ]; then
                exit 0
        fi
    done
    sync

    # pin one block in a segment
    name=pin_file$count
    dd if=/dev/zero of=./$name bs=4K count=1 > /dev/null 2>&1
    sync
    f2fs_io pinfile set $name
    count=$(($count + 1))
done

Signed-off-by: Wu Bo <bo.wu@vivo.com>
---
 fs/f2fs/file.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index ca5904129b16..e8a13616543f 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1690,7 +1690,7 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset,
 			.init_gc_type = FG_GC,
 			.should_migrate_blocks = false,
 			.err_gc_skipped = true,
-			.nr_free_secs = 0 };
+			.nr_free_secs = 1 };
 	pgoff_t pg_start, pg_end;
 	loff_t new_size;
 	loff_t off_end;
-- 
2.35.3



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-12-10 12:55 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-30  9:40 [f2fs-dev] [PATCH 1/1] f2fs: fix fallocate failed under pinned block situation Wu Bo via Linux-f2fs-devel
2023-11-07 14:39 ` Chao Yu
2023-11-08 13:48   ` Wu Bo
2023-11-11  4:49     ` Chao Yu
2023-11-16 23:34       ` Wu Bo
2023-11-28  6:22         ` Chao Yu
2023-11-28 12:51           ` Wu Bo
2023-12-09  9:46             ` Chao Yu
2023-12-10 12:55               ` Wu Bo

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).