On 2017/10/20 2:54, Jaegeuk Kim wrote: > On 10/18, Chao Yu wrote: >> On 2017/10/18 0:41, Jaegeuk Kim wrote: >>> On 10/17, Chao Yu wrote: >>>> On 2017/10/17 7:06, Jaegeuk Kim wrote: >>>>> This patch fixes recovering incomplete xattr entries remaining in inline xattr >>>>> and xattr block, caused by any kind of errors. >>>>> >>>>> Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx> >>>>> --- >>>>> fs/f2fs/xattr.c | 48 ++++++++++++++++++++++++++++-------------------- >>>>> 1 file changed, 28 insertions(+), 20 deletions(-) >>>>> >>>>> diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c >>>>> index e74a4d7f744a..5a9c5e6ad714 100644 >>>>> --- a/fs/f2fs/xattr.c >>>>> +++ b/fs/f2fs/xattr.c >>>>> @@ -389,10 +389,11 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, >>>>> { >>>>> struct f2fs_sb_info *sbi = F2FS_I_SB(inode); >>>>> size_t inline_size = inline_xattr_size(inode); >>>>> - void *xattr_addr; >>>>> + struct page *in_page = NULL; >>>>> + void *xattr_addr, *inline_addr; >>>>> struct page *xpage; >>>>> nid_t new_nid = 0; >>>>> - int err; >>>>> + int err = 0; >>>>> >>>>> if (hsize > inline_size && !F2FS_I(inode)->i_xattr_nid) >>>>> if (!alloc_nid(sbi, &new_nid)) >>>>> @@ -400,30 +401,30 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, >>>>> >>>>> /* write to inline xattr */ >>>>> if (inline_size) { >>>>> - struct page *page = NULL; >>>>> - void *inline_addr; >>>>> - >>>>> if (ipage) { >>>>> inline_addr = inline_xattr_addr(inode, ipage); >>>>> - f2fs_wait_on_page_writeback(ipage, NODE, true); >>>>> - set_page_dirty(ipage); >>>>> } else { >>>>> - page = get_node_page(sbi, inode->i_ino); >>>>> - if (IS_ERR(page)) { >>>>> + in_page = get_node_page(sbi, inode->i_ino); >>>>> + if (IS_ERR(in_page)) { >>>>> alloc_nid_failed(sbi, new_nid); >>>>> - return PTR_ERR(page); >>>>> + return PTR_ERR(in_page); >>>>> } >>>>> - inline_addr = inline_xattr_addr(inode, page); >>>>> - f2fs_wait_on_page_writeback(page, NODE, true); >>>>> + inline_addr = inline_xattr_addr(inode, in_page); >>>>> } >>>>> - memcpy(inline_addr, txattr_addr, inline_size); >>>>> - f2fs_put_page(page, 1); >>>>> >>>>> + f2fs_wait_on_page_writeback(ipage ? ipage : in_page, >>>>> + NODE, true); >>>>> /* no need to use xattr node block */ >>>>> if (hsize <= inline_size) { >>>>> err = truncate_xattr_node(inode, ipage); >>>> >>>> truncate_xattr_node(inode, ipage ? ipage : in_page); >>> >>> No, that should be ipage. >> >> I just noted that dn.inode_page_locked in truncate_xattr_node will be set wrong, >> but, anyway, it looks that won't be problem because we didn't use inode_page_locked >> later. >> >> There is no more users of ipage in truncate_xattr_node, so no matter we passing, >> there will be safe for us, right? > > Oh, yes, like this? Yup, ;) Thanks, > > From e5ae89e3c20c1c6a12cee27f6265427d99412dc8 Mon Sep 17 00:00:00 2001 > From: Jaegeuk Kim <jaegeuk@xxxxxxxxxx> > Date: Thu, 19 Oct 2017 11:48:57 -0700 > Subject: [PATCH] f2fs: remove obsolete pointer for truncate_xattr_node > > This patch removes obosolete parameter for truncate_xattr_node. > > Suggested-by: Chao Yu <yuchao0@xxxxxxxxxx> > Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx> > --- > fs/f2fs/f2fs.h | 2 +- > fs/f2fs/node.c | 10 ++++------ > fs/f2fs/xattr.c | 2 +- > 3 files changed, 6 insertions(+), 8 deletions(-) > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index 6301ccca8888..2a97cc5e3cd8 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -2523,7 +2523,7 @@ void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni); > pgoff_t get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs); > int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode); > int truncate_inode_blocks(struct inode *inode, pgoff_t from); > -int truncate_xattr_node(struct inode *inode, struct page *page); > +int truncate_xattr_node(struct inode *inode); > int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino); > int remove_inode_page(struct inode *inode); > struct page *new_inode_page(struct inode *inode); > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > index ac629d6258ca..f44d83705245 100644 > --- a/fs/f2fs/node.c > +++ b/fs/f2fs/node.c > @@ -962,7 +962,8 @@ int truncate_inode_blocks(struct inode *inode, pgoff_t from) > return err > 0 ? 0 : err; > } > > -int truncate_xattr_node(struct inode *inode, struct page *page) > +/* caller must lock inode page */ > +int truncate_xattr_node(struct inode *inode) > { > struct f2fs_sb_info *sbi = F2FS_I_SB(inode); > nid_t nid = F2FS_I(inode)->i_xattr_nid; > @@ -978,10 +979,7 @@ int truncate_xattr_node(struct inode *inode, struct page *page) > > f2fs_i_xnid_write(inode, 0); > > - set_new_dnode(&dn, inode, page, npage, nid); > - > - if (page) > - dn.inode_page_locked = true; > + set_new_dnode(&dn, inode, NULL, npage, nid); > truncate_node(&dn); > return 0; > } > @@ -1000,7 +998,7 @@ int remove_inode_page(struct inode *inode) > if (err) > return err; > > - err = truncate_xattr_node(inode, dn.inode_page); > + err = truncate_xattr_node(inode); > if (err) { > f2fs_put_dnode(&dn); > return err; > diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c > index 5a9c5e6ad714..147b481c6902 100644 > --- a/fs/f2fs/xattr.c > +++ b/fs/f2fs/xattr.c > @@ -416,7 +416,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, > NODE, true); > /* no need to use xattr node block */ > if (hsize <= inline_size) { > - err = truncate_xattr_node(inode, ipage); > + err = truncate_xattr_node(inode); > alloc_nid_failed(sbi, new_nid); > if (err) { > f2fs_put_page(in_page, 1); >