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