All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Dan Carpenter <dan.carpenter@linaro.org>
Cc: zhiguo.niu@unisoc.com, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [bug report] f2fs: stop checkpoint when get a out-of-bounds segment
Date: Tue, 27 Feb 2024 09:38:06 -0800	[thread overview]
Message-ID: <Zd4d_qPiG-8-l1J2@google.com> (raw)
In-Reply-To: <bb8814a4-09e1-49b7-ab13-391624a0658c@moroto.mountain>

Hi,

I merged two patches, which addresses this.

f2fs: stop checkpoint when get a out-of-bounds segment
f2fs: fix to don't call f2fs_stop_checkpoint in spinlock coverage

On 02/27, Dan Carpenter wrote:
> Hello Zhiguo Niu,
> 
> The patch 7a0392932f97: "f2fs: stop checkpoint when get a
> out-of-bounds segment" from Feb 20, 2024 (linux-next), leads to the
> following Smatch static checker warning:
> 
> 	fs/f2fs/checkpoint.c:34 f2fs_stop_checkpoint()
> 	warn: sleeping in atomic context
> 
> fs/f2fs/segment.c
>   2650  static void get_new_segment(struct f2fs_sb_info *sbi,
>   2651                          unsigned int *newseg, bool new_sec, bool pinning)
>   2652  {
>   2653          struct free_segmap_info *free_i = FREE_I(sbi);
>   2654          unsigned int segno, secno, zoneno;
>   2655          unsigned int total_zones = MAIN_SECS(sbi) / sbi->secs_per_zone;
>   2656          unsigned int hint = GET_SEC_FROM_SEG(sbi, *newseg);
>   2657          unsigned int old_zoneno = GET_ZONE_FROM_SEG(sbi, *newseg);
>   2658          bool init = true;
>   2659          int i;
>   2660  
>   2661          spin_lock(&free_i->segmap_lock);
>                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> preempt disabled here
> 
>   2662  
>   2663          if (!new_sec && ((*newseg + 1) % SEGS_PER_SEC(sbi))) {
>   2664                  segno = find_next_zero_bit(free_i->free_segmap,
>   2665                          GET_SEG_FROM_SEC(sbi, hint + 1), *newseg + 1);
>   2666                  if (segno < GET_SEG_FROM_SEC(sbi, hint + 1))
>   2667                          goto got_it;
>   2668          }
>   2669  
>   2670          /*
>   2671           * If we format f2fs on zoned storage, let's try to get pinned sections
>   2672           * from beginning of the storage, which should be a conventional one.
>   2673           */
>   2674          if (f2fs_sb_has_blkzoned(sbi)) {
>   2675                  segno = pinning ? 0 : max(first_zoned_segno(sbi), *newseg);
>   2676                  hint = GET_SEC_FROM_SEG(sbi, segno);
>   2677          }
>   2678  
>   2679  find_other_zone:
>   2680          secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint);
>   2681          if (secno >= MAIN_SECS(sbi)) {
>   2682                  secno = find_first_zero_bit(free_i->free_secmap,
>   2683                                                          MAIN_SECS(sbi));
>   2684                  if (secno >= MAIN_SECS(sbi)) {
>   2685                          f2fs_stop_checkpoint(sbi, false,
>                                                           ^^^^^
> This false means we sleep while holding a spin lock.
> 
>   2686                                  STOP_CP_REASON_NO_SEGMENT);
>   2687                          f2fs_bug_on(sbi, 1);
>   2688                  }
>   2689          }
>   2690          segno = GET_SEG_FROM_SEC(sbi, secno);
>   2691          zoneno = GET_ZONE_FROM_SEC(sbi, secno);
> 
> fs/f2fs/checkpoint.c
>     29 void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io,
>     30                                                 unsigned char reason)
>     31 {
>     32         f2fs_build_fault_attr(sbi, 0, 0);
>     33         if (!end_io)
> --> 34                 f2fs_flush_merged_writes(sbi);
>     35         f2fs_handle_critical_error(sbi, reason, end_io);
>     36 }
> 
> regards,
> dan carpenter
> 
> 
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


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

  reply	other threads:[~2024-02-27 17:38 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-27 15:21 [f2fs-dev] [bug report] f2fs: stop checkpoint when get a out-of-bounds segment Dan Carpenter
2024-02-27 17:38 ` Jaegeuk Kim [this message]
2024-02-28  0:55   ` [f2fs-dev] 答复: " 牛志国 (Zhiguo Niu)
2024-02-28  1:25   ` 牛志国 (Zhiguo Niu)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Zd4d_qPiG-8-l1J2@google.com \
    --to=jaegeuk@kernel.org \
    --cc=dan.carpenter@linaro.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=zhiguo.niu@unisoc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.