xref: /linux/fs/f2fs/dir.c (revision 0fcb9d21b4e18ede3727b8905e74acd0d1daef56)
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