On 3/14/2017 02:23, Jaegeuk Kim wrote:
> On 03/10, Kinglong Mee wrote:
>> As discuss with Jaegeuk and Chao,
>> "Once checkpoint is done, f2fs doesn't need to update there-in filename at 
>> all."
>>
>> The disk-level filename is used only one case,
>> 1. create a file A under a dir
>> 2. sync A
>> 3. godown
>> 4. umount
>> 5. mount (roll_forward)
>>
>> Only the rename/cross_rename changes the filename, if it happens,
>> a. between step 1 and 2, the sync A will caused checkpoint, so that,
>>    the roll_forward at step 5 never happens.
>> b. after step 2, the roll_forward happens, file A will roll forward
>>    to the result as after step 1.
> 
> I've checked the roll-forward recovery again and found, if pino is recovered,
> it tries to recover dentry with the written filename.
> 
> So,
> 1. create a
> 2. rename a b
> 3. fsync b, will trigger checkpoint and recover pino
> 4. fsync b
> 5. godown
> 
> Then, roll-forward recovery will do recover_dentry with "a". So, correct pino
> should have valid filename.

Is it the right operation? but the f2fs code doesn't do like that, see below.

> 
> Thoughts?

If b isn't exist when renaming, f2fs creates a new directory entry
(f2fs_add_link with name "b"), but no new inode or nid created.

The recover_dentry depends on FSYNC_BIT_SHIFT and DENT_BIT_SHIFT, as your 
procedures,
a roll-forward recovery will do, but no recover_dentry happens.

[ 3607.068713] do_read_inode: ino 3, name (0:0)
[ 3607.090464] do_read_inode: ino 56398, name (0:1) b
[ 3607.110743] F2FS-fs (sdb1): recover_inode: ino = dc4e, name = b
[ 3607.111802] F2FS-fs (sdb1): recover_data: ino = dc4e (i_size: recover) 
recovered = 0, err = 0
[ 3607.117374] F2FS-fs (sdb1): checkpoint: version = 31d5d90f
[ 3607.118384] F2FS-fs (sdb1): Mounted with checkpoint version = 31d5d90f
[ 3607.288552] NFSD: starting 90-second grace period (net ffffffffbeefd140)

After the first fsync at step 3, the IS_CHECKPOINTED is set, after that,
IS_CHECKPOINTED will exist in the nat entry forever, so DENT_BIT_SHIFT never be 
set.

1397 int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
1398                         struct writeback_control *wbc, bool atomic)

1460                         if (!atomic || page == last_page) {
1461                                 set_fsync_mark(page, 1);
1462                                 if (IS_INODE(page)) {
1463                                         if (is_inode_flag_set(inode,
1464                                                                 
FI_DIRTY_INODE))
1465                                                 update_inode(inode, page);
1466                                         set_dentry_mark(page,
1467                                                 need_dentry_mark(sbi, 
ino));
1468                                 }
1469                                 /*  may be written by other thread */
1470                                 if (!PageDirty(page))
1471                                         set_page_dirty(page);
1472                         }

 195 int need_dentry_mark(struct f2fs_sb_info *sbi, nid_t nid)
 196 {
 197         struct f2fs_nm_info *nm_i = NM_I(sbi);
 198         struct nat_entry *e;
 199         bool need = false;
 200
 201         down_read(&nm_i->nat_tree_lock);
 202         e = __lookup_nat_cache(nm_i, nid);
 203         if (e) {
 204                 if (!get_nat_flag(e, IS_CHECKPOINTED) &&
 205                                 !get_nat_flag(e, HAS_FSYNCED_INODE))
 206                         need = true;
 207         }
 208         up_read(&nm_i->nat_tree_lock);
 209         return need;
 210 }

thanks,
Kinglong Mee

> 
> Thanks,
> 
>>
>> So that, any updating the disk filename is useless, just cleanup it.
>>
>> Signed-off-by: Kinglong Mee <kinglong...@gmail.com>
>> ---
>>  fs/f2fs/dir.c    | 25 ++++---------------------
>>  fs/f2fs/f2fs.h   |  2 --
>>  fs/f2fs/file.c   |  8 --------
>>  fs/f2fs/inline.c |  2 --
>>  fs/f2fs/namei.c  | 29 -----------------------------
>>  5 files changed, 4 insertions(+), 62 deletions(-)
>>
>> diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
>> index 8d5c62b..058c4f3 100644
>> --- a/fs/f2fs/dir.c
>> +++ b/fs/f2fs/dir.c
>> @@ -337,24 +337,6 @@ static void init_dent_inode(const struct qstr *name, 
>> struct page *ipage)
>>      set_page_dirty(ipage);
>>  }
>>  
>> -int update_dent_inode(struct inode *inode, struct inode *to,
>> -                                    const struct qstr *name)
>> -{
>> -    struct page *page;
>> -
>> -    if (file_enc_name(to))
>> -            return 0;
>> -
>> -    page = get_node_page(F2FS_I_SB(inode), inode->i_ino);
>> -    if (IS_ERR(page))
>> -            return PTR_ERR(page);
>> -
>> -    init_dent_inode(name, page);
>> -    f2fs_put_page(page, 1);
>> -
>> -    return 0;
>> -}
>> -
>>  void do_make_empty_dir(struct inode *inode, struct inode *parent,
>>                                      struct f2fs_dentry_ptr *d)
>>  {
>> @@ -438,8 +420,11 @@ struct page *init_inode_metadata(struct inode *inode, 
>> struct inode *dir,
>>              set_cold_node(inode, page);
>>      }
>>  
>> -    if (new_name)
>> +    if (new_name) {
>>              init_dent_inode(new_name, page);
>> +            if (f2fs_encrypted_inode(dir))
>> +                    file_set_enc_name(inode);
>> +    }
>>  
>>      /*
>>       * This file should be checkpointed during fsync.
>> @@ -599,8 +584,6 @@ int f2fs_add_regular_entry(struct inode *dir, const 
>> struct qstr *new_name,
>>                      err = PTR_ERR(page);
>>                      goto fail;
>>              }
>> -            if (f2fs_encrypted_inode(dir))
>> -                    file_set_enc_name(inode);
>>      }
>>  
>>      make_dentry_ptr(NULL, &d, (void *)dentry_blk, 1);
>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>> index 7edb3be..5dbc0c0 100644
>> --- a/fs/f2fs/f2fs.h
>> +++ b/fs/f2fs/f2fs.h
>> @@ -2093,8 +2093,6 @@ ino_t f2fs_inode_by_name(struct inode *dir, const 
>> struct qstr *qstr,
>>                      struct page **page);
>>  void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
>>                      struct page *page, struct inode *inode);
>> -int update_dent_inode(struct inode *inode, struct inode *to,
>> -                    const struct qstr *name);
>>  void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d,
>>                      const struct qstr *name, f2fs_hash_t name_hash,
>>                      unsigned int bit_pos);
>> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
>> index 4ec764e..8c7923f 100644
>> --- a/fs/f2fs/file.c
>> +++ b/fs/f2fs/file.c
>> @@ -110,20 +110,12 @@ static int get_parent_ino(struct inode *inode, nid_t 
>> *pino)
>>  {
>>      struct dentry *dentry;
>>  
>> -    if (file_enc_name(inode))
>> -            return 0;
>> -
>>      inode = igrab(inode);
>>      dentry = d_find_any_alias(inode);
>>      iput(inode);
>>      if (!dentry)
>>              return 0;
>>  
>> -    if (update_dent_inode(inode, inode, &dentry->d_name)) {
>> -            dput(dentry);
>> -            return 0;
>> -    }
>> -
>>      *pino = parent_ino(dentry);
>>      dput(dentry);
>>      return 1;
>> diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
>> index e32a9e5..41fe27d 100644
>> --- a/fs/f2fs/inline.c
>> +++ b/fs/f2fs/inline.c
>> @@ -527,8 +527,6 @@ int f2fs_add_inline_entry(struct inode *dir, const 
>> struct qstr *new_name,
>>                      err = PTR_ERR(page);
>>                      goto fail;
>>              }
>> -            if (f2fs_encrypted_inode(dir))
>> -                    file_set_enc_name(inode);
>>      }
>>  
>>      f2fs_wait_on_page_writeback(ipage, NODE, true);
>> diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
>> index 25c073f..8906c9f 100644
>> --- a/fs/f2fs/namei.c
>> +++ b/fs/f2fs/namei.c
>> @@ -720,13 +720,6 @@ static int f2fs_rename(struct inode *old_dir, struct 
>> dentry *old_dentry,
>>              if (err)
>>                      goto put_out_dir;
>>  
>> -            err = update_dent_inode(old_inode, new_inode,
>> -                                            &new_dentry->d_name);
>> -            if (err) {
>> -                    release_orphan_inode(sbi);
>> -                    goto put_out_dir;
>> -            }
>> -
>>              f2fs_set_link(new_dir, new_entry, new_page, old_inode);
>>  
>>              new_inode->i_ctime = current_time(new_inode);
>> @@ -779,8 +772,6 @@ static int f2fs_rename(struct inode *old_dir, struct 
>> dentry *old_dentry,
>>  
>>      down_write(&F2FS_I(old_inode)->i_sem);
>>      file_lost_pino(old_inode);
>> -    if (new_inode && file_enc_name(new_inode))
>> -            file_set_enc_name(old_inode);
>>      up_write(&F2FS_I(old_inode)->i_sem);
>>  
>>      old_inode->i_ctime = current_time(old_inode);
>> @@ -917,18 +908,6 @@ static int f2fs_cross_rename(struct inode *old_dir, 
>> struct dentry *old_dentry,
>>  
>>      f2fs_lock_op(sbi);
>>  
>> -    err = update_dent_inode(old_inode, new_inode, &new_dentry->d_name);
>> -    if (err)
>> -            goto out_unlock;
>> -    if (file_enc_name(new_inode))
>> -            file_set_enc_name(old_inode);
>> -
>> -    err = update_dent_inode(new_inode, old_inode, &old_dentry->d_name);
>> -    if (err)
>> -            goto out_undo;
>> -    if (file_enc_name(old_inode))
>> -            file_set_enc_name(new_inode);
>> -
>>      /* update ".." directory entry info of old dentry */
>>      if (old_dir_entry)
>>              f2fs_set_link(old_inode, old_dir_entry, old_dir_page, new_dir);
>> @@ -972,14 +951,6 @@ static int f2fs_cross_rename(struct inode *old_dir, 
>> struct dentry *old_dentry,
>>      if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
>>              f2fs_sync_fs(sbi->sb, 1);
>>      return 0;
>> -out_undo:
>> -    /*
>> -     * Still we may fail to recover name info of f2fs_inode here
>> -     * Drop it, once its name is set as encrypted
>> -     */
>> -    update_dent_inode(old_inode, old_inode, &old_dentry->d_name);
>> -out_unlock:
>> -    f2fs_unlock_op(sbi);
>>  out_new_dir:
>>      if (new_dir_entry) {
>>              f2fs_dentry_kunmap(new_inode, new_dir_page);
>> -- 
>> 2.9.3
> 

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

Reply via email to