10a8165d7SJaegeuk Kim /* 26b4ea016SJaegeuk Kim * fs/f2fs/dir.c 36b4ea016SJaegeuk Kim * 46b4ea016SJaegeuk Kim * Copyright (c) 2012 Samsung Electronics Co., Ltd. 56b4ea016SJaegeuk Kim * http://www.samsung.com/ 66b4ea016SJaegeuk Kim * 76b4ea016SJaegeuk Kim * This program is free software; you can redistribute it and/or modify 86b4ea016SJaegeuk Kim * it under the terms of the GNU General Public License version 2 as 96b4ea016SJaegeuk Kim * published by the Free Software Foundation. 106b4ea016SJaegeuk Kim */ 116b4ea016SJaegeuk Kim #include <linux/fs.h> 126b4ea016SJaegeuk Kim #include <linux/f2fs_fs.h> 136b4ea016SJaegeuk Kim #include "f2fs.h" 14398b1ac5SJaegeuk Kim #include "node.h" 156b4ea016SJaegeuk Kim #include "acl.h" 168ae8f162SJaegeuk Kim #include "xattr.h" 176b4ea016SJaegeuk Kim 186b4ea016SJaegeuk Kim static unsigned long dir_blocks(struct inode *inode) 196b4ea016SJaegeuk Kim { 206b4ea016SJaegeuk Kim return ((unsigned long long) (i_size_read(inode) + PAGE_CACHE_SIZE - 1)) 216b4ea016SJaegeuk Kim >> PAGE_CACHE_SHIFT; 226b4ea016SJaegeuk Kim } 236b4ea016SJaegeuk Kim 2438431545SJaegeuk Kim static unsigned int dir_buckets(unsigned int level, int dir_level) 256b4ea016SJaegeuk Kim { 26bfec07d0SChao Yu if (level + dir_level < MAX_DIR_HASH_DEPTH / 2) 2738431545SJaegeuk Kim return 1 << (level + dir_level); 286b4ea016SJaegeuk Kim else 29bfec07d0SChao Yu return MAX_DIR_BUCKETS; 306b4ea016SJaegeuk Kim } 316b4ea016SJaegeuk Kim 326b4ea016SJaegeuk Kim static unsigned int bucket_blocks(unsigned int level) 336b4ea016SJaegeuk Kim { 346b4ea016SJaegeuk Kim if (level < MAX_DIR_HASH_DEPTH / 2) 356b4ea016SJaegeuk Kim return 2; 366b4ea016SJaegeuk Kim else 376b4ea016SJaegeuk Kim return 4; 386b4ea016SJaegeuk Kim } 396b4ea016SJaegeuk Kim 40dbeacf02SChao Yu unsigned char f2fs_filetype_table[F2FS_FT_MAX] = { 416b4ea016SJaegeuk Kim [F2FS_FT_UNKNOWN] = DT_UNKNOWN, 426b4ea016SJaegeuk Kim [F2FS_FT_REG_FILE] = DT_REG, 436b4ea016SJaegeuk Kim [F2FS_FT_DIR] = DT_DIR, 446b4ea016SJaegeuk Kim [F2FS_FT_CHRDEV] = DT_CHR, 456b4ea016SJaegeuk Kim [F2FS_FT_BLKDEV] = DT_BLK, 466b4ea016SJaegeuk Kim [F2FS_FT_FIFO] = DT_FIFO, 476b4ea016SJaegeuk Kim [F2FS_FT_SOCK] = DT_SOCK, 486b4ea016SJaegeuk Kim [F2FS_FT_SYMLINK] = DT_LNK, 496b4ea016SJaegeuk Kim }; 506b4ea016SJaegeuk Kim 516b4ea016SJaegeuk Kim #define S_SHIFT 12 526b4ea016SJaegeuk Kim static unsigned char f2fs_type_by_mode[S_IFMT >> S_SHIFT] = { 536b4ea016SJaegeuk Kim [S_IFREG >> S_SHIFT] = F2FS_FT_REG_FILE, 546b4ea016SJaegeuk Kim [S_IFDIR >> S_SHIFT] = F2FS_FT_DIR, 556b4ea016SJaegeuk Kim [S_IFCHR >> S_SHIFT] = F2FS_FT_CHRDEV, 566b4ea016SJaegeuk Kim [S_IFBLK >> S_SHIFT] = F2FS_FT_BLKDEV, 576b4ea016SJaegeuk Kim [S_IFIFO >> S_SHIFT] = F2FS_FT_FIFO, 586b4ea016SJaegeuk Kim [S_IFSOCK >> S_SHIFT] = F2FS_FT_SOCK, 596b4ea016SJaegeuk Kim [S_IFLNK >> S_SHIFT] = F2FS_FT_SYMLINK, 606b4ea016SJaegeuk Kim }; 616b4ea016SJaegeuk Kim 62510022a8SJaegeuk Kim void set_de_type(struct f2fs_dir_entry *de, umode_t mode) 636b4ea016SJaegeuk Kim { 646b4ea016SJaegeuk Kim de->file_type = f2fs_type_by_mode[(mode & S_IFMT) >> S_SHIFT]; 656b4ea016SJaegeuk Kim } 666b4ea016SJaegeuk Kim 6738431545SJaegeuk Kim static unsigned long dir_block_index(unsigned int level, 6838431545SJaegeuk Kim int dir_level, unsigned int idx) 696b4ea016SJaegeuk Kim { 706b4ea016SJaegeuk Kim unsigned long i; 716b4ea016SJaegeuk Kim unsigned long bidx = 0; 726b4ea016SJaegeuk Kim 736b4ea016SJaegeuk Kim for (i = 0; i < level; i++) 7438431545SJaegeuk Kim bidx += dir_buckets(i, dir_level) * bucket_blocks(i); 756b4ea016SJaegeuk Kim bidx += idx * bucket_blocks(level); 766b4ea016SJaegeuk Kim return bidx; 776b4ea016SJaegeuk Kim } 786b4ea016SJaegeuk Kim 796b4ea016SJaegeuk Kim static struct f2fs_dir_entry *find_in_block(struct page *dentry_page, 806e22c691SJaegeuk Kim struct f2fs_filename *fname, 816e22c691SJaegeuk Kim f2fs_hash_t namehash, 826e22c691SJaegeuk Kim int *max_slots, 834e6ebf6dSJaegeuk Kim struct page **res_page) 846b4ea016SJaegeuk Kim { 854e6ebf6dSJaegeuk Kim struct f2fs_dentry_block *dentry_blk; 866b4ea016SJaegeuk Kim struct f2fs_dir_entry *de; 877b3cd7d6SJaegeuk Kim struct f2fs_dentry_ptr d; 884e6ebf6dSJaegeuk Kim 894e6ebf6dSJaegeuk Kim dentry_blk = (struct f2fs_dentry_block *)kmap(dentry_page); 907b3cd7d6SJaegeuk Kim 91d8c6822aSJaegeuk Kim make_dentry_ptr(NULL, &d, (void *)dentry_blk, 1); 926e22c691SJaegeuk Kim de = find_target_dentry(fname, namehash, max_slots, &d); 934e6ebf6dSJaegeuk Kim if (de) 946b4ea016SJaegeuk Kim *res_page = dentry_page; 954e6ebf6dSJaegeuk Kim else 964e6ebf6dSJaegeuk Kim kunmap(dentry_page); 9781e366f8SChao Yu 9881e366f8SChao Yu /* 9981e366f8SChao Yu * For the most part, it should be a bug when name_len is zero. 100e1c42045Sarter97 * We stop here for figuring out where the bugs has occurred. 10181e366f8SChao Yu */ 1027b3cd7d6SJaegeuk Kim f2fs_bug_on(F2FS_P_SB(dentry_page), d.max < 0); 1034e6ebf6dSJaegeuk Kim return de; 1044e6ebf6dSJaegeuk Kim } 1054e6ebf6dSJaegeuk Kim 1066e22c691SJaegeuk Kim struct f2fs_dir_entry *find_target_dentry(struct f2fs_filename *fname, 1076e22c691SJaegeuk Kim f2fs_hash_t namehash, int *max_slots, 1087b3cd7d6SJaegeuk Kim struct f2fs_dentry_ptr *d) 1094e6ebf6dSJaegeuk Kim { 1104e6ebf6dSJaegeuk Kim struct f2fs_dir_entry *de; 1114e6ebf6dSJaegeuk Kim unsigned long bit_pos = 0; 1124e6ebf6dSJaegeuk Kim int max_len = 0; 1136e22c691SJaegeuk Kim struct f2fs_str de_name = FSTR_INIT(NULL, 0); 1146e22c691SJaegeuk Kim struct f2fs_str *name = &fname->disk_name; 1154e6ebf6dSJaegeuk Kim 1167b3cd7d6SJaegeuk Kim if (max_slots) 1174e6ebf6dSJaegeuk Kim *max_slots = 0; 1187b3cd7d6SJaegeuk Kim while (bit_pos < d->max) { 1197b3cd7d6SJaegeuk Kim if (!test_bit_le(bit_pos, d->bitmap)) { 1204e6ebf6dSJaegeuk Kim bit_pos++; 121bda19076SChao Yu max_len++; 1224e6ebf6dSJaegeuk Kim continue; 1234e6ebf6dSJaegeuk Kim } 124bda19076SChao Yu 1257b3cd7d6SJaegeuk Kim de = &d->dentry[bit_pos]; 1266e22c691SJaegeuk Kim 1276e22c691SJaegeuk Kim /* encrypted case */ 1286e22c691SJaegeuk Kim de_name.name = d->filename[bit_pos]; 1296e22c691SJaegeuk Kim de_name.len = le16_to_cpu(de->name_len); 1306e22c691SJaegeuk Kim 1316e22c691SJaegeuk Kim /* show encrypted name */ 1326e22c691SJaegeuk Kim if (fname->hash) { 1336e22c691SJaegeuk Kim if (de->hash_code == fname->hash) 1346e22c691SJaegeuk Kim goto found; 1356e22c691SJaegeuk Kim } else if (de_name.len == name->len && 1366e22c691SJaegeuk Kim de->hash_code == namehash && 1376e22c691SJaegeuk Kim !memcmp(de_name.name, name->name, name->len)) 1384e6ebf6dSJaegeuk Kim goto found; 1394e6ebf6dSJaegeuk Kim 140bda19076SChao Yu if (max_slots && max_len > *max_slots) 1414e6ebf6dSJaegeuk Kim *max_slots = max_len; 1424e6ebf6dSJaegeuk Kim max_len = 0; 1434e6ebf6dSJaegeuk Kim 1444e6ebf6dSJaegeuk Kim /* remain bug on condition */ 1454e6ebf6dSJaegeuk Kim if (unlikely(!de->name_len)) 1467b3cd7d6SJaegeuk Kim d->max = -1; 14781e366f8SChao Yu 1485d0c6671SJaegeuk Kim bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len)); 1496b4ea016SJaegeuk Kim } 1506b4ea016SJaegeuk Kim 1516b4ea016SJaegeuk Kim de = NULL; 1526b4ea016SJaegeuk Kim found: 1537b3cd7d6SJaegeuk Kim if (max_slots && max_len > *max_slots) 1545d0c6671SJaegeuk Kim *max_slots = max_len; 1556b4ea016SJaegeuk Kim return de; 1566b4ea016SJaegeuk Kim } 1576b4ea016SJaegeuk Kim 1586b4ea016SJaegeuk Kim static struct f2fs_dir_entry *find_in_level(struct inode *dir, 1596e22c691SJaegeuk Kim unsigned int level, 1606e22c691SJaegeuk Kim struct f2fs_filename *fname, 1616e22c691SJaegeuk Kim struct page **res_page) 1626b4ea016SJaegeuk Kim { 1636e22c691SJaegeuk Kim struct qstr name = FSTR_TO_QSTR(&fname->disk_name); 1646e22c691SJaegeuk Kim int s = GET_DENTRY_SLOTS(name.len); 1656b4ea016SJaegeuk Kim unsigned int nbucket, nblock; 1666b4ea016SJaegeuk Kim unsigned int bidx, end_block; 1676b4ea016SJaegeuk Kim struct page *dentry_page; 1686b4ea016SJaegeuk Kim struct f2fs_dir_entry *de = NULL; 1696b4ea016SJaegeuk Kim bool room = false; 1704e6ebf6dSJaegeuk Kim int max_slots; 1716e22c691SJaegeuk Kim f2fs_hash_t namehash; 1726e22c691SJaegeuk Kim 1736e22c691SJaegeuk Kim namehash = f2fs_dentry_hash(&name); 1746b4ea016SJaegeuk Kim 1759850cf4aSJaegeuk Kim f2fs_bug_on(F2FS_I_SB(dir), level > MAX_DIR_HASH_DEPTH); 1766b4ea016SJaegeuk Kim 17738431545SJaegeuk Kim nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level); 1786b4ea016SJaegeuk Kim nblock = bucket_blocks(level); 1796b4ea016SJaegeuk Kim 18038431545SJaegeuk Kim bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level, 18138431545SJaegeuk Kim le32_to_cpu(namehash) % nbucket); 1826b4ea016SJaegeuk Kim end_block = bidx + nblock; 1836b4ea016SJaegeuk Kim 1846b4ea016SJaegeuk Kim for (; bidx < end_block; bidx++) { 1856b4ea016SJaegeuk Kim /* no need to allocate new dentry pages to all the indices */ 18643f3eae1SJaegeuk Kim dentry_page = find_data_page(dir, bidx); 1876b4ea016SJaegeuk Kim if (IS_ERR(dentry_page)) { 1886b4ea016SJaegeuk Kim room = true; 1896b4ea016SJaegeuk Kim continue; 1906b4ea016SJaegeuk Kim } 1916b4ea016SJaegeuk Kim 1926e22c691SJaegeuk Kim de = find_in_block(dentry_page, fname, namehash, &max_slots, 1936e22c691SJaegeuk Kim res_page); 1946b4ea016SJaegeuk Kim if (de) 1956b4ea016SJaegeuk Kim break; 1966b4ea016SJaegeuk Kim 1976b4ea016SJaegeuk Kim if (max_slots >= s) 1986b4ea016SJaegeuk Kim room = true; 1996b4ea016SJaegeuk Kim f2fs_put_page(dentry_page, 0); 2006b4ea016SJaegeuk Kim } 2016b4ea016SJaegeuk Kim 2026b4ea016SJaegeuk Kim if (!de && room && F2FS_I(dir)->chash != namehash) { 2036b4ea016SJaegeuk Kim F2FS_I(dir)->chash = namehash; 2046b4ea016SJaegeuk Kim F2FS_I(dir)->clevel = level; 2056b4ea016SJaegeuk Kim } 2066b4ea016SJaegeuk Kim 2076b4ea016SJaegeuk Kim return de; 2086b4ea016SJaegeuk Kim } 2096b4ea016SJaegeuk Kim 2106b4ea016SJaegeuk Kim /* 2116b4ea016SJaegeuk Kim * Find an entry in the specified directory with the wanted name. 2126b4ea016SJaegeuk Kim * It returns the page where the entry was found (as a parameter - res_page), 2136b4ea016SJaegeuk Kim * and the entry itself. Page is returned mapped and unlocked. 2146b4ea016SJaegeuk Kim * Entry is guaranteed to be valid. 2156b4ea016SJaegeuk Kim */ 2166b4ea016SJaegeuk Kim struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir, 2176b4ea016SJaegeuk Kim struct qstr *child, struct page **res_page) 2186b4ea016SJaegeuk Kim { 2196b4ea016SJaegeuk Kim unsigned long npages = dir_blocks(dir); 2206b4ea016SJaegeuk Kim struct f2fs_dir_entry *de = NULL; 2216b4ea016SJaegeuk Kim unsigned int max_depth; 2226b4ea016SJaegeuk Kim unsigned int level; 2236e22c691SJaegeuk Kim struct f2fs_filename fname; 2246e22c691SJaegeuk Kim int err; 2256b4ea016SJaegeuk Kim 226b1f73b79SYuan Zhong *res_page = NULL; 227b1f73b79SYuan Zhong 2286e22c691SJaegeuk Kim err = f2fs_fname_setup_filename(dir, child, 1, &fname); 2296e22c691SJaegeuk Kim if (err) 2306b4ea016SJaegeuk Kim return NULL; 2316b4ea016SJaegeuk Kim 2326e22c691SJaegeuk Kim if (f2fs_has_inline_dentry(dir)) { 2336e22c691SJaegeuk Kim de = find_in_inline_dir(dir, &fname, res_page); 2346e22c691SJaegeuk Kim goto out; 2356e22c691SJaegeuk Kim } 2366e22c691SJaegeuk Kim 2376e22c691SJaegeuk Kim if (npages == 0) 2386e22c691SJaegeuk Kim goto out; 2396e22c691SJaegeuk Kim 2406b4ea016SJaegeuk Kim max_depth = F2FS_I(dir)->i_current_depth; 2416b4ea016SJaegeuk Kim 2426b4ea016SJaegeuk Kim for (level = 0; level < max_depth; level++) { 2436e22c691SJaegeuk Kim de = find_in_level(dir, level, &fname, res_page); 2446b4ea016SJaegeuk Kim if (de) 2456b4ea016SJaegeuk Kim break; 2466b4ea016SJaegeuk Kim } 2476e22c691SJaegeuk Kim out: 2486e22c691SJaegeuk Kim f2fs_fname_free_filename(&fname); 2496b4ea016SJaegeuk Kim return de; 2506b4ea016SJaegeuk Kim } 2516b4ea016SJaegeuk Kim 2526b4ea016SJaegeuk Kim struct f2fs_dir_entry *f2fs_parent_dir(struct inode *dir, struct page **p) 2536b4ea016SJaegeuk Kim { 2544777f86bSNamjae Jeon struct page *page; 2554777f86bSNamjae Jeon struct f2fs_dir_entry *de; 2564777f86bSNamjae Jeon struct f2fs_dentry_block *dentry_blk; 2576b4ea016SJaegeuk Kim 258622f28aeSChao Yu if (f2fs_has_inline_dentry(dir)) 259622f28aeSChao Yu return f2fs_parent_inline_dir(dir, p); 260622f28aeSChao Yu 261a56c7c6fSJaegeuk Kim page = get_lock_data_page(dir, 0, false); 2626b4ea016SJaegeuk Kim if (IS_ERR(page)) 2636b4ea016SJaegeuk Kim return NULL; 2646b4ea016SJaegeuk Kim 2656b4ea016SJaegeuk Kim dentry_blk = kmap(page); 2666b4ea016SJaegeuk Kim de = &dentry_blk->dentry[1]; 2676b4ea016SJaegeuk Kim *p = page; 2686b4ea016SJaegeuk Kim unlock_page(page); 2696b4ea016SJaegeuk Kim return de; 2706b4ea016SJaegeuk Kim } 2716b4ea016SJaegeuk Kim 2726b4ea016SJaegeuk Kim ino_t f2fs_inode_by_name(struct inode *dir, struct qstr *qstr) 2736b4ea016SJaegeuk Kim { 2746b4ea016SJaegeuk Kim ino_t res = 0; 2756b4ea016SJaegeuk Kim struct f2fs_dir_entry *de; 2766b4ea016SJaegeuk Kim struct page *page; 2776b4ea016SJaegeuk Kim 2786b4ea016SJaegeuk Kim de = f2fs_find_entry(dir, qstr, &page); 2796b4ea016SJaegeuk Kim if (de) { 2806b4ea016SJaegeuk Kim res = le32_to_cpu(de->ino); 2819486ba44SJaegeuk Kim f2fs_dentry_kunmap(dir, page); 2826b4ea016SJaegeuk Kim f2fs_put_page(page, 0); 2836b4ea016SJaegeuk Kim } 2846b4ea016SJaegeuk Kim 2856b4ea016SJaegeuk Kim return res; 2866b4ea016SJaegeuk Kim } 2876b4ea016SJaegeuk Kim 2886b4ea016SJaegeuk Kim void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de, 2896b4ea016SJaegeuk Kim struct page *page, struct inode *inode) 2906b4ea016SJaegeuk Kim { 29159a06155SJaegeuk Kim enum page_type type = f2fs_has_inline_dentry(dir) ? NODE : DATA; 2926b4ea016SJaegeuk Kim lock_page(page); 29359a06155SJaegeuk Kim f2fs_wait_on_page_writeback(page, type); 2946b4ea016SJaegeuk Kim de->ino = cpu_to_le32(inode->i_ino); 295510022a8SJaegeuk Kim set_de_type(de, inode->i_mode); 2965df1f1daSJaegeuk Kim f2fs_dentry_kunmap(dir, page); 2976b4ea016SJaegeuk Kim set_page_dirty(page); 2986b4ea016SJaegeuk Kim dir->i_mtime = dir->i_ctime = CURRENT_TIME; 2996b4ea016SJaegeuk Kim mark_inode_dirty(dir); 3006666e6aaSJaegeuk Kim 3016b4ea016SJaegeuk Kim f2fs_put_page(page, 1); 3026b4ea016SJaegeuk Kim } 3036b4ea016SJaegeuk Kim 30444a83ff6SJaegeuk Kim static void init_dent_inode(const struct qstr *name, struct page *ipage) 3056b4ea016SJaegeuk Kim { 30658bfaf44SJaegeuk Kim struct f2fs_inode *ri; 3076b4ea016SJaegeuk Kim 30854b591dfSJaegeuk Kim f2fs_wait_on_page_writeback(ipage, NODE); 30954b591dfSJaegeuk Kim 31053dc9a67SAl Viro /* copy name info. to this inode page */ 31158bfaf44SJaegeuk Kim ri = F2FS_INODE(ipage); 31258bfaf44SJaegeuk Kim ri->i_namelen = cpu_to_le32(name->len); 31358bfaf44SJaegeuk Kim memcpy(ri->i_name, name->name, name->len); 3146b4ea016SJaegeuk Kim set_page_dirty(ipage); 3156b4ea016SJaegeuk Kim } 3166b4ea016SJaegeuk Kim 317e7d55452SJaegeuk Kim int update_dent_inode(struct inode *inode, struct inode *to, 318e7d55452SJaegeuk Kim const struct qstr *name) 3191cd14cafSJaegeuk Kim { 3201cd14cafSJaegeuk Kim struct page *page; 3211cd14cafSJaegeuk Kim 322e7d55452SJaegeuk Kim if (file_enc_name(to)) 323e7d55452SJaegeuk Kim return 0; 324e7d55452SJaegeuk Kim 3254081363fSJaegeuk Kim page = get_node_page(F2FS_I_SB(inode), inode->i_ino); 3261cd14cafSJaegeuk Kim if (IS_ERR(page)) 3271cd14cafSJaegeuk Kim return PTR_ERR(page); 3281cd14cafSJaegeuk Kim 3291cd14cafSJaegeuk Kim init_dent_inode(name, page); 3301cd14cafSJaegeuk Kim f2fs_put_page(page, 1); 3311cd14cafSJaegeuk Kim 3321cd14cafSJaegeuk Kim return 0; 3331cd14cafSJaegeuk Kim } 3341cd14cafSJaegeuk Kim 335062a3e7bSJaegeuk Kim void do_make_empty_dir(struct inode *inode, struct inode *parent, 336062a3e7bSJaegeuk Kim struct f2fs_dentry_ptr *d) 337062a3e7bSJaegeuk Kim { 338062a3e7bSJaegeuk Kim struct f2fs_dir_entry *de; 339062a3e7bSJaegeuk Kim 340062a3e7bSJaegeuk Kim de = &d->dentry[0]; 341062a3e7bSJaegeuk Kim de->name_len = cpu_to_le16(1); 342062a3e7bSJaegeuk Kim de->hash_code = 0; 343062a3e7bSJaegeuk Kim de->ino = cpu_to_le32(inode->i_ino); 344062a3e7bSJaegeuk Kim memcpy(d->filename[0], ".", 1); 345510022a8SJaegeuk Kim set_de_type(de, inode->i_mode); 346062a3e7bSJaegeuk Kim 347062a3e7bSJaegeuk Kim de = &d->dentry[1]; 348062a3e7bSJaegeuk Kim de->hash_code = 0; 349062a3e7bSJaegeuk Kim de->name_len = cpu_to_le16(2); 350062a3e7bSJaegeuk Kim de->ino = cpu_to_le32(parent->i_ino); 351062a3e7bSJaegeuk Kim memcpy(d->filename[1], "..", 2); 352cb58463bSJaegeuk Kim set_de_type(de, parent->i_mode); 353062a3e7bSJaegeuk Kim 354062a3e7bSJaegeuk Kim test_and_set_bit_le(0, (void *)d->bitmap); 355062a3e7bSJaegeuk Kim test_and_set_bit_le(1, (void *)d->bitmap); 356062a3e7bSJaegeuk Kim } 357062a3e7bSJaegeuk Kim 35844a83ff6SJaegeuk Kim static int make_empty_dir(struct inode *inode, 35944a83ff6SJaegeuk Kim struct inode *parent, struct page *page) 36039936837SJaegeuk Kim { 36139936837SJaegeuk Kim struct page *dentry_page; 36239936837SJaegeuk Kim struct f2fs_dentry_block *dentry_blk; 363062a3e7bSJaegeuk Kim struct f2fs_dentry_ptr d; 36439936837SJaegeuk Kim 365622f28aeSChao Yu if (f2fs_has_inline_dentry(inode)) 366622f28aeSChao Yu return make_empty_inline_dir(inode, parent, page); 367622f28aeSChao Yu 36844a83ff6SJaegeuk Kim dentry_page = get_new_data_page(inode, page, 0, true); 36939936837SJaegeuk Kim if (IS_ERR(dentry_page)) 37039936837SJaegeuk Kim return PTR_ERR(dentry_page); 37139936837SJaegeuk Kim 3721c3bb978SGu Zheng dentry_blk = kmap_atomic(dentry_page); 37339936837SJaegeuk Kim 374d8c6822aSJaegeuk Kim make_dentry_ptr(NULL, &d, (void *)dentry_blk, 1); 375062a3e7bSJaegeuk Kim do_make_empty_dir(inode, parent, &d); 37639936837SJaegeuk Kim 3771c3bb978SGu Zheng kunmap_atomic(dentry_blk); 37839936837SJaegeuk Kim 37939936837SJaegeuk Kim set_page_dirty(dentry_page); 38039936837SJaegeuk Kim f2fs_put_page(dentry_page, 1); 38139936837SJaegeuk Kim return 0; 38239936837SJaegeuk Kim } 38339936837SJaegeuk Kim 384bce8d112SJaegeuk Kim struct page *init_inode_metadata(struct inode *inode, struct inode *dir, 385bce8d112SJaegeuk Kim const struct qstr *name, struct page *dpage) 3866b4ea016SJaegeuk Kim { 38744a83ff6SJaegeuk Kim struct page *page; 3886b4ea016SJaegeuk Kim int err; 38944a83ff6SJaegeuk Kim 390b97a9b5dSJaegeuk Kim if (is_inode_flag_set(F2FS_I(inode), FI_NEW_INODE)) { 391a014e037SJaegeuk Kim page = new_inode_page(inode); 39244a83ff6SJaegeuk Kim if (IS_ERR(page)) 39344a83ff6SJaegeuk Kim return page; 3946b4ea016SJaegeuk Kim 3956b4ea016SJaegeuk Kim if (S_ISDIR(inode->i_mode)) { 39644a83ff6SJaegeuk Kim err = make_empty_dir(inode, dir, page); 39744a83ff6SJaegeuk Kim if (err) 39844a83ff6SJaegeuk Kim goto error; 3996b4ea016SJaegeuk Kim } 4006b4ea016SJaegeuk Kim 401bce8d112SJaegeuk Kim err = f2fs_init_acl(inode, dir, page, dpage); 40244a83ff6SJaegeuk Kim if (err) 403a8865372SJaegeuk Kim goto put_error; 40444a83ff6SJaegeuk Kim 4058ae8f162SJaegeuk Kim err = f2fs_init_security(inode, dir, name, page); 4068ae8f162SJaegeuk Kim if (err) 407a8865372SJaegeuk Kim goto put_error; 408fcc85a4dSJaegeuk Kim 409fcc85a4dSJaegeuk Kim if (f2fs_encrypted_inode(dir) && f2fs_may_encrypt(inode)) { 410fcc85a4dSJaegeuk Kim err = f2fs_inherit_context(dir, inode, page); 411fcc85a4dSJaegeuk Kim if (err) 412fcc85a4dSJaegeuk Kim goto put_error; 413fcc85a4dSJaegeuk Kim } 4146b4ea016SJaegeuk Kim } else { 4154081363fSJaegeuk Kim page = get_node_page(F2FS_I_SB(dir), inode->i_ino); 41644a83ff6SJaegeuk Kim if (IS_ERR(page)) 41744a83ff6SJaegeuk Kim return page; 41844a83ff6SJaegeuk Kim 41944a83ff6SJaegeuk Kim set_cold_node(inode, page); 4206b4ea016SJaegeuk Kim } 42144a83ff6SJaegeuk Kim 422b97a9b5dSJaegeuk Kim if (name) 42344a83ff6SJaegeuk Kim init_dent_inode(name, page); 42444a83ff6SJaegeuk Kim 42583d5d6f6SJaegeuk Kim /* 42683d5d6f6SJaegeuk Kim * This file should be checkpointed during fsync. 42783d5d6f6SJaegeuk Kim * We lost i_pino from now on. 42883d5d6f6SJaegeuk Kim */ 4296b4ea016SJaegeuk Kim if (is_inode_flag_set(F2FS_I(inode), FI_INC_LINK)) { 430354a3399SJaegeuk Kim file_lost_pino(inode); 43150732df0SChao Yu /* 43250732df0SChao Yu * If link the tmpfile to alias through linkat path, 43350732df0SChao Yu * we should remove this inode from orphan list. 43450732df0SChao Yu */ 43550732df0SChao Yu if (inode->i_nlink == 0) 4364081363fSJaegeuk Kim remove_orphan_inode(F2FS_I_SB(dir), inode->i_ino); 4376b4ea016SJaegeuk Kim inc_nlink(inode); 4386b4ea016SJaegeuk Kim } 43944a83ff6SJaegeuk Kim return page; 44044a83ff6SJaegeuk Kim 441a8865372SJaegeuk Kim put_error: 44244a83ff6SJaegeuk Kim f2fs_put_page(page, 1); 44390d72459SChao Yu error: 444bd859c65SJaegeuk Kim /* once the failed inode becomes a bad inode, i_mode is S_IFREG */ 445bd859c65SJaegeuk Kim truncate_inode_pages(&inode->i_data, 0); 446764aa3e9SJaegeuk Kim truncate_blocks(inode, 0, false); 447bd859c65SJaegeuk Kim remove_dirty_dir_inode(inode); 44844a83ff6SJaegeuk Kim remove_inode_page(inode); 44944a83ff6SJaegeuk Kim return ERR_PTR(err); 4506b4ea016SJaegeuk Kim } 4516b4ea016SJaegeuk Kim 452dbeacf02SChao Yu void update_parent_metadata(struct inode *dir, struct inode *inode, 4536b4ea016SJaegeuk Kim unsigned int current_depth) 4546b4ea016SJaegeuk Kim { 455510022a8SJaegeuk Kim if (inode && is_inode_flag_set(F2FS_I(inode), FI_NEW_INODE)) { 4566b4ea016SJaegeuk Kim if (S_ISDIR(inode->i_mode)) { 4576b4ea016SJaegeuk Kim inc_nlink(dir); 458699489bbSJaegeuk Kim set_inode_flag(F2FS_I(dir), FI_UPDATE_DIR); 4596b4ea016SJaegeuk Kim } 4606b4ea016SJaegeuk Kim clear_inode_flag(F2FS_I(inode), FI_NEW_INODE); 4616b4ea016SJaegeuk Kim } 4626b4ea016SJaegeuk Kim dir->i_mtime = dir->i_ctime = CURRENT_TIME; 463a18ff063SJaegeuk Kim mark_inode_dirty(dir); 464a18ff063SJaegeuk Kim 4656b4ea016SJaegeuk Kim if (F2FS_I(dir)->i_current_depth != current_depth) { 4666b4ea016SJaegeuk Kim F2FS_I(dir)->i_current_depth = current_depth; 467699489bbSJaegeuk Kim set_inode_flag(F2FS_I(dir), FI_UPDATE_DIR); 4686b4ea016SJaegeuk Kim } 4696b4ea016SJaegeuk Kim 470510022a8SJaegeuk Kim if (inode && is_inode_flag_set(F2FS_I(inode), FI_INC_LINK)) 4716b4ea016SJaegeuk Kim clear_inode_flag(F2FS_I(inode), FI_INC_LINK); 4726b4ea016SJaegeuk Kim } 4736b4ea016SJaegeuk Kim 474a82afa20SJaegeuk Kim int room_for_filename(const void *bitmap, int slots, int max_slots) 4756b4ea016SJaegeuk Kim { 4766b4ea016SJaegeuk Kim int bit_start = 0; 4776b4ea016SJaegeuk Kim int zero_start, zero_end; 4786b4ea016SJaegeuk Kim next: 479a82afa20SJaegeuk Kim zero_start = find_next_zero_bit_le(bitmap, max_slots, bit_start); 480a82afa20SJaegeuk Kim if (zero_start >= max_slots) 481a82afa20SJaegeuk Kim return max_slots; 4826b4ea016SJaegeuk Kim 483a82afa20SJaegeuk Kim zero_end = find_next_bit_le(bitmap, max_slots, zero_start); 4846b4ea016SJaegeuk Kim if (zero_end - zero_start >= slots) 4856b4ea016SJaegeuk Kim return zero_start; 4866b4ea016SJaegeuk Kim 4876b4ea016SJaegeuk Kim bit_start = zero_end + 1; 4886b4ea016SJaegeuk Kim 489a82afa20SJaegeuk Kim if (zero_end + 1 >= max_slots) 490a82afa20SJaegeuk Kim return max_slots; 4916b4ea016SJaegeuk Kim goto next; 4926b4ea016SJaegeuk Kim } 4936b4ea016SJaegeuk Kim 494510022a8SJaegeuk Kim void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d, 4953b4d732aSChao Yu const struct qstr *name, f2fs_hash_t name_hash, 4963b4d732aSChao Yu unsigned int bit_pos) 4973b4d732aSChao Yu { 4983b4d732aSChao Yu struct f2fs_dir_entry *de; 4993b4d732aSChao Yu int slots = GET_DENTRY_SLOTS(name->len); 5003b4d732aSChao Yu int i; 5013b4d732aSChao Yu 5023b4d732aSChao Yu de = &d->dentry[bit_pos]; 5033b4d732aSChao Yu de->hash_code = name_hash; 5043b4d732aSChao Yu de->name_len = cpu_to_le16(name->len); 5053b4d732aSChao Yu memcpy(d->filename[bit_pos], name->name, name->len); 506510022a8SJaegeuk Kim de->ino = cpu_to_le32(ino); 507510022a8SJaegeuk Kim set_de_type(de, mode); 5083b4d732aSChao Yu for (i = 0; i < slots; i++) 5093b4d732aSChao Yu test_and_set_bit_le(bit_pos + i, (void *)d->bitmap); 5103b4d732aSChao Yu } 5113b4d732aSChao Yu 51239936837SJaegeuk Kim /* 5134f4124d0SChao Yu * Caller should grab and release a rwsem by calling f2fs_lock_op() and 5144f4124d0SChao Yu * f2fs_unlock_op(). 51539936837SJaegeuk Kim */ 5166c311ec6SChris Fries int __f2fs_add_link(struct inode *dir, const struct qstr *name, 517510022a8SJaegeuk Kim struct inode *inode, nid_t ino, umode_t mode) 5186b4ea016SJaegeuk Kim { 5196b4ea016SJaegeuk Kim unsigned int bit_pos; 5206b4ea016SJaegeuk Kim unsigned int level; 5216b4ea016SJaegeuk Kim unsigned int current_depth; 5226b4ea016SJaegeuk Kim unsigned long bidx, block; 5236b4ea016SJaegeuk Kim f2fs_hash_t dentry_hash; 5246b4ea016SJaegeuk Kim unsigned int nbucket, nblock; 5256b4ea016SJaegeuk Kim struct page *dentry_page = NULL; 5266b4ea016SJaegeuk Kim struct f2fs_dentry_block *dentry_blk = NULL; 5273b4d732aSChao Yu struct f2fs_dentry_ptr d; 528510022a8SJaegeuk Kim struct page *page = NULL; 5299ea97163SJaegeuk Kim struct f2fs_filename fname; 5309ea97163SJaegeuk Kim struct qstr new_name; 5319ea97163SJaegeuk Kim int slots, err; 5329ea97163SJaegeuk Kim 5339ea97163SJaegeuk Kim err = f2fs_fname_setup_filename(dir, name, 0, &fname); 5349ea97163SJaegeuk Kim if (err) 5359ea97163SJaegeuk Kim return err; 5369ea97163SJaegeuk Kim 5379ea97163SJaegeuk Kim new_name.name = fname_name(&fname); 5389ea97163SJaegeuk Kim new_name.len = fname_len(&fname); 5396b4ea016SJaegeuk Kim 540622f28aeSChao Yu if (f2fs_has_inline_dentry(dir)) { 5419ea97163SJaegeuk Kim err = f2fs_add_inline_entry(dir, &new_name, inode, ino, mode); 542622f28aeSChao Yu if (!err || err != -EAGAIN) 5439ea97163SJaegeuk Kim goto out; 544622f28aeSChao Yu else 545622f28aeSChao Yu err = 0; 546622f28aeSChao Yu } 547622f28aeSChao Yu 5486b4ea016SJaegeuk Kim level = 0; 5499ea97163SJaegeuk Kim slots = GET_DENTRY_SLOTS(new_name.len); 5509ea97163SJaegeuk Kim dentry_hash = f2fs_dentry_hash(&new_name); 5519ea97163SJaegeuk Kim 5526b4ea016SJaegeuk Kim current_depth = F2FS_I(dir)->i_current_depth; 5536b4ea016SJaegeuk Kim if (F2FS_I(dir)->chash == dentry_hash) { 5546b4ea016SJaegeuk Kim level = F2FS_I(dir)->clevel; 5556b4ea016SJaegeuk Kim F2FS_I(dir)->chash = 0; 5566b4ea016SJaegeuk Kim } 5576b4ea016SJaegeuk Kim 5586b4ea016SJaegeuk Kim start: 5599ea97163SJaegeuk Kim if (unlikely(current_depth == MAX_DIR_HASH_DEPTH)) { 5609ea97163SJaegeuk Kim err = -ENOSPC; 5619ea97163SJaegeuk Kim goto out; 5629ea97163SJaegeuk Kim } 5636b4ea016SJaegeuk Kim 5646b4ea016SJaegeuk Kim /* Increase the depth, if required */ 5656b4ea016SJaegeuk Kim if (level == current_depth) 5666b4ea016SJaegeuk Kim ++current_depth; 5676b4ea016SJaegeuk Kim 56838431545SJaegeuk Kim nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level); 5696b4ea016SJaegeuk Kim nblock = bucket_blocks(level); 5706b4ea016SJaegeuk Kim 57138431545SJaegeuk Kim bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level, 57238431545SJaegeuk Kim (le32_to_cpu(dentry_hash) % nbucket)); 5736b4ea016SJaegeuk Kim 5746b4ea016SJaegeuk Kim for (block = bidx; block <= (bidx + nblock - 1); block++) { 57564aa7ed9SJaegeuk Kim dentry_page = get_new_data_page(dir, NULL, block, true); 5769ea97163SJaegeuk Kim if (IS_ERR(dentry_page)) { 5779ea97163SJaegeuk Kim err = PTR_ERR(dentry_page); 5789ea97163SJaegeuk Kim goto out; 5799ea97163SJaegeuk Kim } 5806b4ea016SJaegeuk Kim 5816b4ea016SJaegeuk Kim dentry_blk = kmap(dentry_page); 582a82afa20SJaegeuk Kim bit_pos = room_for_filename(&dentry_blk->dentry_bitmap, 583a82afa20SJaegeuk Kim slots, NR_DENTRY_IN_BLOCK); 5846b4ea016SJaegeuk Kim if (bit_pos < NR_DENTRY_IN_BLOCK) 5856b4ea016SJaegeuk Kim goto add_dentry; 5866b4ea016SJaegeuk Kim 5876b4ea016SJaegeuk Kim kunmap(dentry_page); 5886b4ea016SJaegeuk Kim f2fs_put_page(dentry_page, 1); 5896b4ea016SJaegeuk Kim } 5906b4ea016SJaegeuk Kim 5916b4ea016SJaegeuk Kim /* Move to next level to find the empty slot for new dentry */ 5926b4ea016SJaegeuk Kim ++level; 5936b4ea016SJaegeuk Kim goto start; 5946b4ea016SJaegeuk Kim add_dentry: 5953cb5ad15SJaegeuk Kim f2fs_wait_on_page_writeback(dentry_page, DATA); 5966b4ea016SJaegeuk Kim 597510022a8SJaegeuk Kim if (inode) { 598d928bfbfSJaegeuk Kim down_write(&F2FS_I(inode)->i_sem); 5999ea97163SJaegeuk Kim page = init_inode_metadata(inode, dir, &new_name, NULL); 60044a83ff6SJaegeuk Kim if (IS_ERR(page)) { 60144a83ff6SJaegeuk Kim err = PTR_ERR(page); 60244a83ff6SJaegeuk Kim goto fail; 60344a83ff6SJaegeuk Kim } 604e7d55452SJaegeuk Kim if (f2fs_encrypted_inode(dir)) 605e7d55452SJaegeuk Kim file_set_enc_name(inode); 606510022a8SJaegeuk Kim } 6073b4d732aSChao Yu 608d8c6822aSJaegeuk Kim make_dentry_ptr(NULL, &d, (void *)dentry_blk, 1); 6099ea97163SJaegeuk Kim f2fs_update_dentry(ino, mode, &d, &new_name, dentry_hash, bit_pos); 6103b4d732aSChao Yu 6116b4ea016SJaegeuk Kim set_page_dirty(dentry_page); 6126666e6aaSJaegeuk Kim 613510022a8SJaegeuk Kim if (inode) { 61444a83ff6SJaegeuk Kim /* we don't need to mark_inode_dirty now */ 6156666e6aaSJaegeuk Kim F2FS_I(inode)->i_pino = dir->i_ino; 61644a83ff6SJaegeuk Kim update_inode(inode, page); 61744a83ff6SJaegeuk Kim f2fs_put_page(page, 1); 618510022a8SJaegeuk Kim } 61944a83ff6SJaegeuk Kim 62044a83ff6SJaegeuk Kim update_parent_metadata(dir, inode, current_depth); 6216b4ea016SJaegeuk Kim fail: 622510022a8SJaegeuk Kim if (inode) 623d928bfbfSJaegeuk Kim up_write(&F2FS_I(inode)->i_sem); 624d928bfbfSJaegeuk Kim 625924a2ddbSJaegeuk Kim if (is_inode_flag_set(F2FS_I(dir), FI_UPDATE_DIR)) { 626924a2ddbSJaegeuk Kim update_inode_page(dir); 627699489bbSJaegeuk Kim clear_inode_flag(F2FS_I(dir), FI_UPDATE_DIR); 628924a2ddbSJaegeuk Kim } 6296b4ea016SJaegeuk Kim kunmap(dentry_page); 6306b4ea016SJaegeuk Kim f2fs_put_page(dentry_page, 1); 6319ea97163SJaegeuk Kim out: 6329ea97163SJaegeuk Kim f2fs_fname_free_filename(&fname); 6336b4ea016SJaegeuk Kim return err; 6346b4ea016SJaegeuk Kim } 6356b4ea016SJaegeuk Kim 636b97a9b5dSJaegeuk Kim int f2fs_do_tmpfile(struct inode *inode, struct inode *dir) 637b97a9b5dSJaegeuk Kim { 638b97a9b5dSJaegeuk Kim struct page *page; 639b97a9b5dSJaegeuk Kim int err = 0; 640b97a9b5dSJaegeuk Kim 641b97a9b5dSJaegeuk Kim down_write(&F2FS_I(inode)->i_sem); 642bce8d112SJaegeuk Kim page = init_inode_metadata(inode, dir, NULL, NULL); 643b97a9b5dSJaegeuk Kim if (IS_ERR(page)) { 644b97a9b5dSJaegeuk Kim err = PTR_ERR(page); 645b97a9b5dSJaegeuk Kim goto fail; 646b97a9b5dSJaegeuk Kim } 647b97a9b5dSJaegeuk Kim /* we don't need to mark_inode_dirty now */ 648b97a9b5dSJaegeuk Kim update_inode(inode, page); 649b97a9b5dSJaegeuk Kim f2fs_put_page(page, 1); 650b97a9b5dSJaegeuk Kim 651b97a9b5dSJaegeuk Kim clear_inode_flag(F2FS_I(inode), FI_NEW_INODE); 652b97a9b5dSJaegeuk Kim fail: 653b97a9b5dSJaegeuk Kim up_write(&F2FS_I(inode)->i_sem); 654b97a9b5dSJaegeuk Kim return err; 655b97a9b5dSJaegeuk Kim } 656b97a9b5dSJaegeuk Kim 657dbeacf02SChao Yu void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page) 658dbeacf02SChao Yu { 659dbeacf02SChao Yu struct f2fs_sb_info *sbi = F2FS_I_SB(dir); 660dbeacf02SChao Yu 661dbeacf02SChao Yu down_write(&F2FS_I(inode)->i_sem); 662dbeacf02SChao Yu 663dbeacf02SChao Yu if (S_ISDIR(inode->i_mode)) { 664dbeacf02SChao Yu drop_nlink(dir); 665dbeacf02SChao Yu if (page) 666dbeacf02SChao Yu update_inode(dir, page); 667dbeacf02SChao Yu else 668dbeacf02SChao Yu update_inode_page(dir); 669dbeacf02SChao Yu } 670dbeacf02SChao Yu inode->i_ctime = CURRENT_TIME; 671dbeacf02SChao Yu 672dbeacf02SChao Yu drop_nlink(inode); 673dbeacf02SChao Yu if (S_ISDIR(inode->i_mode)) { 674dbeacf02SChao Yu drop_nlink(inode); 675dbeacf02SChao Yu i_size_write(inode, 0); 676dbeacf02SChao Yu } 677dbeacf02SChao Yu up_write(&F2FS_I(inode)->i_sem); 678dbeacf02SChao Yu update_inode_page(inode); 679dbeacf02SChao Yu 680dbeacf02SChao Yu if (inode->i_nlink == 0) 681dbeacf02SChao Yu add_orphan_inode(sbi, inode->i_ino); 682dbeacf02SChao Yu else 683dbeacf02SChao Yu release_orphan_inode(sbi); 684dbeacf02SChao Yu } 685dbeacf02SChao Yu 6860a8165d7SJaegeuk Kim /* 6876b4ea016SJaegeuk Kim * It only removes the dentry from the dentry page, corresponding name 6886b4ea016SJaegeuk Kim * entry in name page does not need to be touched during deletion. 6896b4ea016SJaegeuk Kim */ 6906b4ea016SJaegeuk Kim void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page, 691dbeacf02SChao Yu struct inode *dir, struct inode *inode) 6926b4ea016SJaegeuk Kim { 6936b4ea016SJaegeuk Kim struct f2fs_dentry_block *dentry_blk; 6946b4ea016SJaegeuk Kim unsigned int bit_pos; 695457d08eeSNamjae Jeon int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len)); 6966b4ea016SJaegeuk Kim int i; 6976b4ea016SJaegeuk Kim 698622f28aeSChao Yu if (f2fs_has_inline_dentry(dir)) 699622f28aeSChao Yu return f2fs_delete_inline_entry(dentry, page, dir, inode); 700622f28aeSChao Yu 7016b4ea016SJaegeuk Kim lock_page(page); 7023cb5ad15SJaegeuk Kim f2fs_wait_on_page_writeback(page, DATA); 7036b4ea016SJaegeuk Kim 7041c3bb978SGu Zheng dentry_blk = page_address(page); 7051c3bb978SGu Zheng bit_pos = dentry - dentry_blk->dentry; 7066b4ea016SJaegeuk Kim for (i = 0; i < slots; i++) 7071f7732feSJan Kara clear_bit_le(bit_pos + i, &dentry_blk->dentry_bitmap); 7086b4ea016SJaegeuk Kim 7096b4ea016SJaegeuk Kim /* Let's check and deallocate this dentry page */ 7106b4ea016SJaegeuk Kim bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap, 7116b4ea016SJaegeuk Kim NR_DENTRY_IN_BLOCK, 7126b4ea016SJaegeuk Kim 0); 7136b4ea016SJaegeuk Kim kunmap(page); /* kunmap - pair of f2fs_find_entry */ 7146b4ea016SJaegeuk Kim set_page_dirty(page); 7156b4ea016SJaegeuk Kim 7166b4ea016SJaegeuk Kim dir->i_ctime = dir->i_mtime = CURRENT_TIME; 7176b4ea016SJaegeuk Kim 718dbeacf02SChao Yu if (inode) 719dbeacf02SChao Yu f2fs_drop_nlink(dir, inode, NULL); 7206b4ea016SJaegeuk Kim 721206e61beSChao Yu if (bit_pos == NR_DENTRY_IN_BLOCK && 722206e61beSChao Yu !truncate_hole(dir, page->index, page->index + 1)) { 7236b4ea016SJaegeuk Kim clear_page_dirty_for_io(page); 7242bca1e23SJaegeuk Kim ClearPagePrivate(page); 7256b4ea016SJaegeuk Kim ClearPageUptodate(page); 726a7ffdbe2SJaegeuk Kim inode_dec_dirty_pages(dir); 7276b4ea016SJaegeuk Kim } 728508198beSNamjae Jeon f2fs_put_page(page, 1); 7296b4ea016SJaegeuk Kim } 7306b4ea016SJaegeuk Kim 7316b4ea016SJaegeuk Kim bool f2fs_empty_dir(struct inode *dir) 7326b4ea016SJaegeuk Kim { 7336b4ea016SJaegeuk Kim unsigned long bidx; 7346b4ea016SJaegeuk Kim struct page *dentry_page; 7356b4ea016SJaegeuk Kim unsigned int bit_pos; 7366b4ea016SJaegeuk Kim struct f2fs_dentry_block *dentry_blk; 7376b4ea016SJaegeuk Kim unsigned long nblock = dir_blocks(dir); 7386b4ea016SJaegeuk Kim 739622f28aeSChao Yu if (f2fs_has_inline_dentry(dir)) 740622f28aeSChao Yu return f2fs_empty_inline_dir(dir); 741622f28aeSChao Yu 7426b4ea016SJaegeuk Kim for (bidx = 0; bidx < nblock; bidx++) { 743a56c7c6fSJaegeuk Kim dentry_page = get_lock_data_page(dir, bidx, false); 7446b4ea016SJaegeuk Kim if (IS_ERR(dentry_page)) { 7456b4ea016SJaegeuk Kim if (PTR_ERR(dentry_page) == -ENOENT) 7466b4ea016SJaegeuk Kim continue; 7476b4ea016SJaegeuk Kim else 7486b4ea016SJaegeuk Kim return false; 7496b4ea016SJaegeuk Kim } 7506b4ea016SJaegeuk Kim 7511c3bb978SGu Zheng dentry_blk = kmap_atomic(dentry_page); 7526b4ea016SJaegeuk Kim if (bidx == 0) 7536b4ea016SJaegeuk Kim bit_pos = 2; 7546b4ea016SJaegeuk Kim else 7556b4ea016SJaegeuk Kim bit_pos = 0; 7566b4ea016SJaegeuk Kim bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap, 7576b4ea016SJaegeuk Kim NR_DENTRY_IN_BLOCK, 7586b4ea016SJaegeuk Kim bit_pos); 7591c3bb978SGu Zheng kunmap_atomic(dentry_blk); 7606b4ea016SJaegeuk Kim 7616b4ea016SJaegeuk Kim f2fs_put_page(dentry_page, 1); 7626b4ea016SJaegeuk Kim 7636b4ea016SJaegeuk Kim if (bit_pos < NR_DENTRY_IN_BLOCK) 7646b4ea016SJaegeuk Kim return false; 7656b4ea016SJaegeuk Kim } 7666b4ea016SJaegeuk Kim return true; 7676b4ea016SJaegeuk Kim } 7686b4ea016SJaegeuk Kim 7697b3cd7d6SJaegeuk Kim bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, 770d8c6822aSJaegeuk Kim unsigned int start_pos, struct f2fs_str *fstr) 77138594de7SJaegeuk Kim { 77238594de7SJaegeuk Kim unsigned char d_type = DT_UNKNOWN; 77338594de7SJaegeuk Kim unsigned int bit_pos; 77438594de7SJaegeuk Kim struct f2fs_dir_entry *de = NULL; 775d8c6822aSJaegeuk Kim struct f2fs_str de_name = FSTR_INIT(NULL, 0); 77638594de7SJaegeuk Kim 7777b3cd7d6SJaegeuk Kim bit_pos = ((unsigned long)ctx->pos % d->max); 77838594de7SJaegeuk Kim 7797b3cd7d6SJaegeuk Kim while (bit_pos < d->max) { 7807b3cd7d6SJaegeuk Kim bit_pos = find_next_bit_le(d->bitmap, d->max, bit_pos); 7817b3cd7d6SJaegeuk Kim if (bit_pos >= d->max) 78238594de7SJaegeuk Kim break; 78338594de7SJaegeuk Kim 7847b3cd7d6SJaegeuk Kim de = &d->dentry[bit_pos]; 78538594de7SJaegeuk Kim if (de->file_type < F2FS_FT_MAX) 78638594de7SJaegeuk Kim d_type = f2fs_filetype_table[de->file_type]; 78738594de7SJaegeuk Kim else 78838594de7SJaegeuk Kim d_type = DT_UNKNOWN; 789d8c6822aSJaegeuk Kim 790d8c6822aSJaegeuk Kim de_name.name = d->filename[bit_pos]; 791d8c6822aSJaegeuk Kim de_name.len = le16_to_cpu(de->name_len); 792d8c6822aSJaegeuk Kim 793d8c6822aSJaegeuk Kim if (f2fs_encrypted_inode(d->inode)) { 794d8c6822aSJaegeuk Kim int save_len = fstr->len; 795d8c6822aSJaegeuk Kim int ret; 796d8c6822aSJaegeuk Kim 797569cf187SJaegeuk Kim de_name.name = kmalloc(de_name.len, GFP_NOFS); 798569cf187SJaegeuk Kim if (!de_name.name) 799569cf187SJaegeuk Kim return false; 800569cf187SJaegeuk Kim 801569cf187SJaegeuk Kim memcpy(de_name.name, d->filename[bit_pos], de_name.len); 802569cf187SJaegeuk Kim 803d8c6822aSJaegeuk Kim ret = f2fs_fname_disk_to_usr(d->inode, &de->hash_code, 804d8c6822aSJaegeuk Kim &de_name, fstr); 805569cf187SJaegeuk Kim kfree(de_name.name); 806d8c6822aSJaegeuk Kim if (ret < 0) 807d8c6822aSJaegeuk Kim return true; 808569cf187SJaegeuk Kim 809569cf187SJaegeuk Kim de_name = *fstr; 810569cf187SJaegeuk Kim fstr->len = save_len; 811d8c6822aSJaegeuk Kim } 812d8c6822aSJaegeuk Kim 813d8c6822aSJaegeuk Kim if (!dir_emit(ctx, de_name.name, de_name.len, 81438594de7SJaegeuk Kim le32_to_cpu(de->ino), d_type)) 81538594de7SJaegeuk Kim return true; 81638594de7SJaegeuk Kim 81738594de7SJaegeuk Kim bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len)); 81838594de7SJaegeuk Kim ctx->pos = start_pos + bit_pos; 81938594de7SJaegeuk Kim } 82038594de7SJaegeuk Kim return false; 82138594de7SJaegeuk Kim } 82238594de7SJaegeuk Kim 8236f7f231eSAl Viro static int f2fs_readdir(struct file *file, struct dir_context *ctx) 8246b4ea016SJaegeuk Kim { 825496ad9aaSAl Viro struct inode *inode = file_inode(file); 8266b4ea016SJaegeuk Kim unsigned long npages = dir_blocks(inode); 8276b4ea016SJaegeuk Kim struct f2fs_dentry_block *dentry_blk = NULL; 8286b4ea016SJaegeuk Kim struct page *dentry_page = NULL; 829817202d9SChao Yu struct file_ra_state *ra = &file->f_ra; 8306f7f231eSAl Viro unsigned int n = ((unsigned long)ctx->pos / NR_DENTRY_IN_BLOCK); 8317b3cd7d6SJaegeuk Kim struct f2fs_dentry_ptr d; 832d8c6822aSJaegeuk Kim struct f2fs_str fstr = FSTR_INIT(NULL, 0); 833d8c6822aSJaegeuk Kim int err = 0; 8346b4ea016SJaegeuk Kim 83526bf3dc7SJaegeuk Kim if (f2fs_encrypted_inode(inode)) { 83626bf3dc7SJaegeuk Kim err = f2fs_get_encryption_info(inode); 837d8c6822aSJaegeuk Kim if (err) 838d8c6822aSJaegeuk Kim return err; 839d8c6822aSJaegeuk Kim 840d8c6822aSJaegeuk Kim err = f2fs_fname_crypto_alloc_buffer(inode, F2FS_NAME_LEN, 841d8c6822aSJaegeuk Kim &fstr); 842d8c6822aSJaegeuk Kim if (err < 0) 843d8c6822aSJaegeuk Kim return err; 844d8c6822aSJaegeuk Kim } 845d8c6822aSJaegeuk Kim 846d8c6822aSJaegeuk Kim if (f2fs_has_inline_dentry(inode)) { 847d8c6822aSJaegeuk Kim err = f2fs_read_inline_dir(file, ctx, &fstr); 848d8c6822aSJaegeuk Kim goto out; 849d8c6822aSJaegeuk Kim } 850622f28aeSChao Yu 851817202d9SChao Yu /* readahead for multi pages of dir */ 852817202d9SChao Yu if (npages - n > 1 && !ra_has_index(ra, n)) 853817202d9SChao Yu page_cache_sync_readahead(inode->i_mapping, ra, file, n, 854817202d9SChao Yu min(npages - n, (pgoff_t)MAX_DIR_RA_PAGES)); 855817202d9SChao Yu 8566b4ea016SJaegeuk Kim for (; n < npages; n++) { 857a56c7c6fSJaegeuk Kim dentry_page = get_lock_data_page(inode, n, false); 8586b4ea016SJaegeuk Kim if (IS_ERR(dentry_page)) 8596b4ea016SJaegeuk Kim continue; 8606b4ea016SJaegeuk Kim 8616b4ea016SJaegeuk Kim dentry_blk = kmap(dentry_page); 8626b4ea016SJaegeuk Kim 863d8c6822aSJaegeuk Kim make_dentry_ptr(inode, &d, (void *)dentry_blk, 1); 8647b3cd7d6SJaegeuk Kim 865d8c6822aSJaegeuk Kim if (f2fs_fill_dentries(ctx, &d, n * NR_DENTRY_IN_BLOCK, &fstr)) 86699b072bbSJaegeuk Kim goto stop; 86799b072bbSJaegeuk Kim 8686f7f231eSAl Viro ctx->pos = (n + 1) * NR_DENTRY_IN_BLOCK; 8696b4ea016SJaegeuk Kim kunmap(dentry_page); 8706b4ea016SJaegeuk Kim f2fs_put_page(dentry_page, 1); 8716b4ea016SJaegeuk Kim dentry_page = NULL; 8726b4ea016SJaegeuk Kim } 87399b072bbSJaegeuk Kim stop: 8746b4ea016SJaegeuk Kim if (dentry_page && !IS_ERR(dentry_page)) { 8756b4ea016SJaegeuk Kim kunmap(dentry_page); 8766b4ea016SJaegeuk Kim f2fs_put_page(dentry_page, 1); 8776b4ea016SJaegeuk Kim } 878d8c6822aSJaegeuk Kim out: 879d8c6822aSJaegeuk Kim f2fs_fname_crypto_free_buffer(&fstr); 880d8c6822aSJaegeuk Kim return err; 8816b4ea016SJaegeuk Kim } 8826b4ea016SJaegeuk Kim 8836b4ea016SJaegeuk Kim const struct file_operations f2fs_dir_operations = { 8846b4ea016SJaegeuk Kim .llseek = generic_file_llseek, 8856b4ea016SJaegeuk Kim .read = generic_read_dir, 8866f7f231eSAl Viro .iterate = f2fs_readdir, 8876b4ea016SJaegeuk Kim .fsync = f2fs_sync_file, 8886b4ea016SJaegeuk Kim .unlocked_ioctl = f2fs_ioctl, 88908b95126Shujianyang #ifdef CONFIG_COMPAT 89008b95126Shujianyang .compat_ioctl = f2fs_compat_ioctl, 89108b95126Shujianyang #endif 8926b4ea016SJaegeuk Kim }; 893