dir.c (5298d4bfe80f6ae6ae2777bcd1357b0022d98573) dir.c (e4544b63a7ee49e7fbebf35ece0a6acd3b9617ae)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/dir.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <asm/unaligned.h>
9#include <linux/fs.h>
10#include <linux/f2fs_fs.h>
11#include <linux/sched/signal.h>
12#include <linux/unicode.h>
13#include "f2fs.h"
14#include "node.h"
15#include "acl.h"
16#include "xattr.h"
17#include <trace/events/f2fs.h>
18
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/dir.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <asm/unaligned.h>
9#include <linux/fs.h>
10#include <linux/f2fs_fs.h>
11#include <linux/sched/signal.h>
12#include <linux/unicode.h>
13#include "f2fs.h"
14#include "node.h"
15#include "acl.h"
16#include "xattr.h"
17#include <trace/events/f2fs.h>
18
19#if IS_ENABLED(CONFIG_UNICODE)
19#ifdef CONFIG_UNICODE
20extern struct kmem_cache *f2fs_cf_name_slab;
21#endif
22
23static unsigned long dir_blocks(struct inode *inode)
24{
25 return ((unsigned long long) (i_size_read(inode) + PAGE_SIZE - 1))
26 >> PAGE_SHIFT;
27}

--- 46 unchanged lines hidden (view full) ---

74 return f2fs_filetype_table[de->file_type];
75 return DT_UNKNOWN;
76}
77
78/* If @dir is casefolded, initialize @fname->cf_name from @fname->usr_fname. */
79int f2fs_init_casefolded_name(const struct inode *dir,
80 struct f2fs_filename *fname)
81{
20extern struct kmem_cache *f2fs_cf_name_slab;
21#endif
22
23static unsigned long dir_blocks(struct inode *inode)
24{
25 return ((unsigned long long) (i_size_read(inode) + PAGE_SIZE - 1))
26 >> PAGE_SHIFT;
27}

--- 46 unchanged lines hidden (view full) ---

74 return f2fs_filetype_table[de->file_type];
75 return DT_UNKNOWN;
76}
77
78/* If @dir is casefolded, initialize @fname->cf_name from @fname->usr_fname. */
79int f2fs_init_casefolded_name(const struct inode *dir,
80 struct f2fs_filename *fname)
81{
82#if IS_ENABLED(CONFIG_UNICODE)
82#ifdef CONFIG_UNICODE
83 struct super_block *sb = dir->i_sb;
84
85 if (IS_CASEFOLDED(dir)) {
86 fname->cf_name.name = f2fs_kmem_cache_alloc(f2fs_cf_name_slab,
87 GFP_NOFS, false, F2FS_SB(sb));
88 if (!fname->cf_name.name)
89 return -ENOMEM;
90 fname->cf_name.len = utf8_casefold(sb->s_encoding,

--- 78 unchanged lines hidden (view full) ---

169}
170
171void f2fs_free_filename(struct f2fs_filename *fname)
172{
173#ifdef CONFIG_FS_ENCRYPTION
174 kfree(fname->crypto_buf.name);
175 fname->crypto_buf.name = NULL;
176#endif
83 struct super_block *sb = dir->i_sb;
84
85 if (IS_CASEFOLDED(dir)) {
86 fname->cf_name.name = f2fs_kmem_cache_alloc(f2fs_cf_name_slab,
87 GFP_NOFS, false, F2FS_SB(sb));
88 if (!fname->cf_name.name)
89 return -ENOMEM;
90 fname->cf_name.len = utf8_casefold(sb->s_encoding,

--- 78 unchanged lines hidden (view full) ---

169}
170
171void f2fs_free_filename(struct f2fs_filename *fname)
172{
173#ifdef CONFIG_FS_ENCRYPTION
174 kfree(fname->crypto_buf.name);
175 fname->crypto_buf.name = NULL;
176#endif
177#if IS_ENABLED(CONFIG_UNICODE)
177#ifdef CONFIG_UNICODE
178 if (fname->cf_name.name) {
179 kmem_cache_free(f2fs_cf_name_slab, fname->cf_name.name);
180 fname->cf_name.name = NULL;
181 }
182#endif
183}
184
185static unsigned long dir_block_index(unsigned int level,

--- 17 unchanged lines hidden (view full) ---

203 struct f2fs_dentry_ptr d;
204
205 dentry_blk = (struct f2fs_dentry_block *)page_address(dentry_page);
206
207 make_dentry_ptr_block(dir, &d, dentry_blk);
208 return f2fs_find_target_dentry(&d, fname, max_slots);
209}
210
178 if (fname->cf_name.name) {
179 kmem_cache_free(f2fs_cf_name_slab, fname->cf_name.name);
180 fname->cf_name.name = NULL;
181 }
182#endif
183}
184
185static unsigned long dir_block_index(unsigned int level,

--- 17 unchanged lines hidden (view full) ---

203 struct f2fs_dentry_ptr d;
204
205 dentry_blk = (struct f2fs_dentry_block *)page_address(dentry_page);
206
207 make_dentry_ptr_block(dir, &d, dentry_blk);
208 return f2fs_find_target_dentry(&d, fname, max_slots);
209}
210
211#if IS_ENABLED(CONFIG_UNICODE)
211#ifdef CONFIG_UNICODE
212/*
213 * Test whether a case-insensitive directory entry matches the filename
214 * being searched for.
215 *
216 * Returns 1 for a match, 0 for no match, and -errno on an error.
217 */
218static int f2fs_match_ci_name(const struct inode *dir, const struct qstr *name,
219 const u8 *de_name, u32 de_name_len)

--- 41 unchanged lines hidden (view full) ---

261#endif /* CONFIG_UNICODE */
262
263static inline int f2fs_match_name(const struct inode *dir,
264 const struct f2fs_filename *fname,
265 const u8 *de_name, u32 de_name_len)
266{
267 struct fscrypt_name f;
268
212/*
213 * Test whether a case-insensitive directory entry matches the filename
214 * being searched for.
215 *
216 * Returns 1 for a match, 0 for no match, and -errno on an error.
217 */
218static int f2fs_match_ci_name(const struct inode *dir, const struct qstr *name,
219 const u8 *de_name, u32 de_name_len)

--- 41 unchanged lines hidden (view full) ---

261#endif /* CONFIG_UNICODE */
262
263static inline int f2fs_match_name(const struct inode *dir,
264 const struct f2fs_filename *fname,
265 const u8 *de_name, u32 de_name_len)
266{
267 struct fscrypt_name f;
268
269#if IS_ENABLED(CONFIG_UNICODE)
269#ifdef CONFIG_UNICODE
270 if (fname->cf_name.name) {
271 struct qstr cf = FSTR_TO_QSTR(&fname->cf_name);
272
273 return f2fs_match_ci_name(dir, &cf, de_name, de_name_len);
274 }
275#endif
276 f.usr_fname = fname->usr_fname;
277 f.disk_name = fname->disk_name;

--- 483 unchanged lines hidden (view full) ---

761
762 /* Move to next level to find the empty slot for new dentry */
763 ++level;
764 goto start;
765add_dentry:
766 f2fs_wait_on_page_writeback(dentry_page, DATA, true, true);
767
768 if (inode) {
270 if (fname->cf_name.name) {
271 struct qstr cf = FSTR_TO_QSTR(&fname->cf_name);
272
273 return f2fs_match_ci_name(dir, &cf, de_name, de_name_len);
274 }
275#endif
276 f.usr_fname = fname->usr_fname;
277 f.disk_name = fname->disk_name;

--- 483 unchanged lines hidden (view full) ---

761
762 /* Move to next level to find the empty slot for new dentry */
763 ++level;
764 goto start;
765add_dentry:
766 f2fs_wait_on_page_writeback(dentry_page, DATA, true, true);
767
768 if (inode) {
769 down_write(&F2FS_I(inode)->i_sem);
769 f2fs_down_write(&F2FS_I(inode)->i_sem);
770 page = f2fs_init_inode_metadata(inode, dir, fname, NULL);
771 if (IS_ERR(page)) {
772 err = PTR_ERR(page);
773 goto fail;
774 }
775 }
776
777 make_dentry_ptr_block(NULL, &d, dentry_blk);

--- 10 unchanged lines hidden (view full) ---

788 f2fs_update_inode(inode, page);
789
790 f2fs_put_page(page, 1);
791 }
792
793 f2fs_update_parent_metadata(dir, inode, current_depth);
794fail:
795 if (inode)
770 page = f2fs_init_inode_metadata(inode, dir, fname, NULL);
771 if (IS_ERR(page)) {
772 err = PTR_ERR(page);
773 goto fail;
774 }
775 }
776
777 make_dentry_ptr_block(NULL, &d, dentry_blk);

--- 10 unchanged lines hidden (view full) ---

788 f2fs_update_inode(inode, page);
789
790 f2fs_put_page(page, 1);
791 }
792
793 f2fs_update_parent_metadata(dir, inode, current_depth);
794fail:
795 if (inode)
796 up_write(&F2FS_I(inode)->i_sem);
796 f2fs_up_write(&F2FS_I(inode)->i_sem);
797
798 f2fs_put_page(dentry_page, 1);
799
800 return err;
801}
802
803int f2fs_add_dentry(struct inode *dir, const struct f2fs_filename *fname,
804 struct inode *inode, nid_t ino, umode_t mode)

--- 48 unchanged lines hidden (view full) ---

853 return err;
854}
855
856int f2fs_do_tmpfile(struct inode *inode, struct inode *dir)
857{
858 struct page *page;
859 int err = 0;
860
797
798 f2fs_put_page(dentry_page, 1);
799
800 return err;
801}
802
803int f2fs_add_dentry(struct inode *dir, const struct f2fs_filename *fname,
804 struct inode *inode, nid_t ino, umode_t mode)

--- 48 unchanged lines hidden (view full) ---

853 return err;
854}
855
856int f2fs_do_tmpfile(struct inode *inode, struct inode *dir)
857{
858 struct page *page;
859 int err = 0;
860
861 down_write(&F2FS_I(inode)->i_sem);
861 f2fs_down_write(&F2FS_I(inode)->i_sem);
862 page = f2fs_init_inode_metadata(inode, dir, NULL, NULL);
863 if (IS_ERR(page)) {
864 err = PTR_ERR(page);
865 goto fail;
866 }
867 f2fs_put_page(page, 1);
868
869 clear_inode_flag(inode, FI_NEW_INODE);
870 f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
871fail:
862 page = f2fs_init_inode_metadata(inode, dir, NULL, NULL);
863 if (IS_ERR(page)) {
864 err = PTR_ERR(page);
865 goto fail;
866 }
867 f2fs_put_page(page, 1);
868
869 clear_inode_flag(inode, FI_NEW_INODE);
870 f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
871fail:
872 up_write(&F2FS_I(inode)->i_sem);
872 f2fs_up_write(&F2FS_I(inode)->i_sem);
873 return err;
874}
875
876void f2fs_drop_nlink(struct inode *dir, struct inode *inode)
877{
878 struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
879
873 return err;
874}
875
876void f2fs_drop_nlink(struct inode *dir, struct inode *inode)
877{
878 struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
879
880 down_write(&F2FS_I(inode)->i_sem);
880 f2fs_down_write(&F2FS_I(inode)->i_sem);
881
882 if (S_ISDIR(inode->i_mode))
883 f2fs_i_links_write(dir, false);
884 inode->i_ctime = current_time(inode);
885
886 f2fs_i_links_write(inode, false);
887 if (S_ISDIR(inode->i_mode)) {
888 f2fs_i_links_write(inode, false);
889 f2fs_i_size_write(inode, 0);
890 }
881
882 if (S_ISDIR(inode->i_mode))
883 f2fs_i_links_write(dir, false);
884 inode->i_ctime = current_time(inode);
885
886 f2fs_i_links_write(inode, false);
887 if (S_ISDIR(inode->i_mode)) {
888 f2fs_i_links_write(inode, false);
889 f2fs_i_size_write(inode, 0);
890 }
891 up_write(&F2FS_I(inode)->i_sem);
891 f2fs_up_write(&F2FS_I(inode)->i_sem);
892
893 if (inode->i_nlink == 0)
894 f2fs_add_orphan_inode(inode);
895 else
896 f2fs_release_orphan_inode(sbi);
897}
898
899/*

--- 260 unchanged lines hidden ---
892
893 if (inode->i_nlink == 0)
894 f2fs_add_orphan_inode(inode);
895 else
896 f2fs_release_orphan_inode(sbi);
897}
898
899/*

--- 260 unchanged lines hidden ---