diff options
Diffstat (limited to 'fs/f2fs/inline.c')
-rw-r--r-- | fs/f2fs/inline.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index ccea8735de59..34234d84a38b 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
@@ -424,7 +424,7 @@ static int f2fs_add_inline_entries(struct inode *dir, | |||
424 | ino = le32_to_cpu(de->ino); | 424 | ino = le32_to_cpu(de->ino); |
425 | fake_mode = get_de_type(de) << S_SHIFT; | 425 | fake_mode = get_de_type(de) << S_SHIFT; |
426 | 426 | ||
427 | err = f2fs_add_regular_entry(dir, &new_name, NULL, | 427 | err = f2fs_add_regular_entry(dir, &new_name, NULL, NULL, |
428 | ino, fake_mode); | 428 | ino, fake_mode); |
429 | if (err) | 429 | if (err) |
430 | goto punch_dentry_pages; | 430 | goto punch_dentry_pages; |
@@ -445,8 +445,8 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage, | |||
445 | struct f2fs_inline_dentry *backup_dentry; | 445 | struct f2fs_inline_dentry *backup_dentry; |
446 | int err; | 446 | int err; |
447 | 447 | ||
448 | backup_dentry = f2fs_kmalloc(sizeof(struct f2fs_inline_dentry), | 448 | backup_dentry = f2fs_kmalloc(F2FS_I_SB(dir), |
449 | GFP_F2FS_ZERO); | 449 | sizeof(struct f2fs_inline_dentry), GFP_F2FS_ZERO); |
450 | if (!backup_dentry) { | 450 | if (!backup_dentry) { |
451 | f2fs_put_page(ipage, 1); | 451 | f2fs_put_page(ipage, 1); |
452 | return -ENOMEM; | 452 | return -ENOMEM; |
@@ -488,17 +488,17 @@ static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage, | |||
488 | return f2fs_move_rehashed_dirents(dir, ipage, inline_dentry); | 488 | return f2fs_move_rehashed_dirents(dir, ipage, inline_dentry); |
489 | } | 489 | } |
490 | 490 | ||
491 | int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name, | 491 | int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name, |
492 | struct inode *inode, nid_t ino, umode_t mode) | 492 | const struct qstr *orig_name, |
493 | struct inode *inode, nid_t ino, umode_t mode) | ||
493 | { | 494 | { |
494 | struct f2fs_sb_info *sbi = F2FS_I_SB(dir); | 495 | struct f2fs_sb_info *sbi = F2FS_I_SB(dir); |
495 | struct page *ipage; | 496 | struct page *ipage; |
496 | unsigned int bit_pos; | 497 | unsigned int bit_pos; |
497 | f2fs_hash_t name_hash; | 498 | f2fs_hash_t name_hash; |
498 | size_t namelen = name->len; | ||
499 | struct f2fs_inline_dentry *dentry_blk = NULL; | 499 | struct f2fs_inline_dentry *dentry_blk = NULL; |
500 | struct f2fs_dentry_ptr d; | 500 | struct f2fs_dentry_ptr d; |
501 | int slots = GET_DENTRY_SLOTS(namelen); | 501 | int slots = GET_DENTRY_SLOTS(new_name->len); |
502 | struct page *page = NULL; | 502 | struct page *page = NULL; |
503 | int err = 0; | 503 | int err = 0; |
504 | 504 | ||
@@ -519,18 +519,21 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name, | |||
519 | 519 | ||
520 | if (inode) { | 520 | if (inode) { |
521 | down_write(&F2FS_I(inode)->i_sem); | 521 | down_write(&F2FS_I(inode)->i_sem); |
522 | page = init_inode_metadata(inode, dir, name, ipage); | 522 | page = init_inode_metadata(inode, dir, new_name, |
523 | orig_name, ipage); | ||
523 | if (IS_ERR(page)) { | 524 | if (IS_ERR(page)) { |
524 | err = PTR_ERR(page); | 525 | err = PTR_ERR(page); |
525 | goto fail; | 526 | goto fail; |
526 | } | 527 | } |
528 | if (f2fs_encrypted_inode(dir)) | ||
529 | file_set_enc_name(inode); | ||
527 | } | 530 | } |
528 | 531 | ||
529 | f2fs_wait_on_page_writeback(ipage, NODE, true); | 532 | f2fs_wait_on_page_writeback(ipage, NODE, true); |
530 | 533 | ||
531 | name_hash = f2fs_dentry_hash(name); | 534 | name_hash = f2fs_dentry_hash(new_name); |
532 | make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2); | 535 | make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2); |
533 | f2fs_update_dentry(ino, mode, &d, name, name_hash, bit_pos); | 536 | f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos); |
534 | 537 | ||
535 | set_page_dirty(ipage); | 538 | set_page_dirty(ipage); |
536 | 539 | ||
@@ -563,7 +566,7 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page, | |||
563 | inline_dentry = inline_data_addr(page); | 566 | inline_dentry = inline_data_addr(page); |
564 | bit_pos = dentry - inline_dentry->dentry; | 567 | bit_pos = dentry - inline_dentry->dentry; |
565 | for (i = 0; i < slots; i++) | 568 | for (i = 0; i < slots; i++) |
566 | test_and_clear_bit_le(bit_pos + i, | 569 | __clear_bit_le(bit_pos + i, |
567 | &inline_dentry->dentry_bitmap); | 570 | &inline_dentry->dentry_bitmap); |
568 | 571 | ||
569 | set_page_dirty(page); | 572 | set_page_dirty(page); |