> -----Original Message-----
> From: [email protected] <[email protected]> On Behalf Of
> Chao Yu
> Sent: Wednesday, October 27, 2021 11:31 AM
> To: fengnan chang <[email protected]>
> Cc: 常凤楠 <[email protected]>; Jaegeuk Kim <[email protected]>;
> [email protected]
> Subject: Re: [f2fs-dev] [PATCH v5 2/2] f2fs: fix missing inplace count in
> overwrite with direct io
> 
> On 2021/10/16 16:01, fengnan chang wrote:
> > Chao Yu <[email protected]> 于2021年10月13日周三 下午11:19写道:
> >>
> >> On 2021/10/9 19:27, Fengnan Chang wrote:
> >>> For now, overwrite file with direct io use inplace policy, but not
> >>> counted, fix it. And use stat_add_inplace_blocks(sbi, 1, ) instead
> >>> of stat_inc_inplace_blocks(sb, ).
> >>>
> >>> Signed-off-by: Fengnan Chang <[email protected]>
> >>> ---
> >>>    fs/f2fs/data.c    | 4 +++-
> >>>    fs/f2fs/f2fs.h    | 8 ++++----
> >>>    fs/f2fs/segment.c | 2 +-
> >>>    3 files changed, 8 insertions(+), 6 deletions(-)
> >>>
> >>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index
> >>> c1490b9a1345..7798f7236376 100644
> >>> --- a/fs/f2fs/data.c
> >>> +++ b/fs/f2fs/data.c
> >>> @@ -1553,7 +1553,9 @@ int f2fs_map_blocks(struct inode *inode,
> struct f2fs_map_blocks *map,
> >>>                                goto sync_out;
> >>>                        blkaddr = dn.data_blkaddr;
> >>>                        set_inode_flag(inode, FI_APPEND_WRITE);
> >>> -             }
> >>> +             } else if (!f2fs_lfs_mode(sbi) && flag ==
> F2FS_GET_BLOCK_PRE_DIO &&
> >>> +                             map->m_may_create && create)
> >>> +                     stat_add_inplace_blocks(sbi, 1, true);
> >>
> >> What about this case?
> >>
> >> - f2fs_preallocate_blocks
> >>    - f2fs_map_blocks
> >>     - stat_add_inplace_blocks
> >>     map.m_len > 0 && err == -ENOSPC
> >>     err = 0;
> >> - __generic_file_write_iter
> >>    - generic_file_direct_write
> >>     - f2fs_direct_IO
> >>      - get_data_block_dio_write
> >>       - __allocate_data_block
> >>        - stat_inc_block_count
> >>
> >> DIO blocks will be accounted into different type? IIUC.
> > Yes, it will be accounted into different type,  IPU and LFS, but it
> > will not accounted into both in same time for one block.
> 
> Not sure this is right, since all writes should be accounted into LFS.

Sorry, I didn't get your point, why all writes should be accounted into LFS ? 
even overwrite with direct io ?

> 
> >
> > root@kvm-xfstests:/mnt# cat /sys/kernel/debug/f2fs/status |grep SSR -C 2
> >             buffer     direct   segments
> > IPU:           16         32        N/A
> > SSR:            0          0          0
> > LFS:           38         48          0
> > root@kvm-xfstests:/mnt# dd if=/dev/zero of=./1 bs=32K count=1
> > oflag=direct root@kvm-xfstests:/mnt# cat /sys/kernel/debug/f2fs/status
> |grep SSR -C 2
> >             buffer     direct   segments
> > IPU:           16         32        N/A
> > SSR:            0          0          0
> > LFS:           38         56          0
> >
> > root@kvm-xfstests:/mnt# dd if=/dev/zero of=./1 bs=32K count=1
> > oflag=direct conv=notrunc root@kvm-xfstests:/mnt# cat
> > /sys/kernel/debug/f2fs/status |grep SSR -C 2
> >             buffer     direct   segments
> > IPU:           16         40        N/A
> > SSR:            0          0          0
> > LFS:           38         56          0
> >
> > root@kvm-xfstests:/mnt# dd if=/dev/zero of=./1 bs=32K count=2
> > oflag=direct conv=notrunc root@kvm-xfstests:/mnt# cat
> > /sys/kernel/debug/f2fs/status |grep SSR -C 2
> >             buffer     direct   segments
> > IPU:           16         48        N/A
> > SSR:            0          0          0
> > LFS:           41         64          0
> >
> >
> >>
> >>>        } else {
> >>>                if (create) {
> >>>                        if (unlikely(f2fs_cp_error(sbi))) { diff
> >>> --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index
> >>> bf2e73e46304..a7da836ca64f 100644
> >>> --- a/fs/f2fs/f2fs.h
> >>> +++ b/fs/f2fs/f2fs.h
> >>> @@ -3785,12 +3785,12 @@ static inline struct f2fs_stat_info
> *F2FS_STAT(struct f2fs_sb_info *sbi)
> >>>                else
> \
> >>>
> ((sbi)->block_count[1][(curseg)->alloc_type]++);        \
> >>>        } while (0)
> >>> -#define stat_inc_inplace_blocks(sbi, direct_io)
> \
> >>> +#define stat_add_inplace_blocks(sbi, count, direct_io)
> \
> >>>        do
> {                                                            \
> >>>                if (direct_io)
> \
> >>> -                     (atomic_inc(&(sbi)->inplace_count[0]));
> \
> >>> +                     (atomic_add(count, &(sbi)->inplace_count[0]));
> >>> + \
> >>>                else
> \
> >>> -                     (atomic_inc(&(sbi)->inplace_count[1]));
> \
> >>> +                     (atomic_add(count, &(sbi)->inplace_count[1]));
> >>> + \
> >>
> >> If count always be one, we can just keep to use atomic_inc() here?
> >>
> > I suggest not, we may use this in later patch, not ready for now.
> 
> I don't thinks this is the right way, why not including above change in your
> later patch?
> 
> Thanks,
> 
> >
> >> Thanks,
> >>
> >>>        } while (0)
> >>>    #define stat_update_max_atomic_write(inode)
> \
> >>>        do
> {                                                            \
> >>> @@ -3877,7 +3877,7 @@ void f2fs_update_sit_info(struct f2fs_sb_info
> *sbi);
> >>>    #define stat_inc_meta_count(sbi, blkaddr)           do { } while (0)
> >>>    #define stat_inc_seg_type(sbi, curseg)                      do { }
> while (0)
> >>>    #define stat_inc_block_count(sbi, curseg, direct_io)        do { }
> while (0)
> >>> -#define stat_inc_inplace_blocks(sbi, direct_io)              do { } while
> (0)
> >>> +#define stat_add_inplace_blocks(sbi, count, direct_io)       do { }
> while (0)
> >>>    #define stat_inc_seg_count(sbi, type, gc_type)              do { }
> while (0)
> >>>    #define stat_inc_tot_blk_count(si, blks)            do { } while (0)
> >>>    #define stat_inc_data_blk_count(sbi, blks, gc_type) do { } while
> >>> (0) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index
> >>> ded744e880d0..c542c4b687ca 100644
> >>> --- a/fs/f2fs/segment.c
> >>> +++ b/fs/f2fs/segment.c
> >>> @@ -3611,7 +3611,7 @@ int f2fs_inplace_write_data(struct f2fs_io_info
> *fio)
> >>>                goto drop_bio;
> >>>        }
> >>>
> >>> -     stat_inc_inplace_blocks(fio->sbi, false);
> >>> +     stat_add_inplace_blocks(sbi, 1, false);
> >>>
> >>>        if (fio->bio && !(SM_I(sbi)->ipu_policy & (1 <<
> F2FS_IPU_NOCACHE)))
> >>>                err = f2fs_merge_page_bio(fio);
> >>>
> >>
> >>
> >> _______________________________________________
> >> Linux-f2fs-devel mailing list
> >> [email protected]
> >> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
> >

_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to