xref: /OK3568_Linux_fs/kernel/fs/f2fs/namei.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * fs/f2fs/namei.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6*4882a593Smuzhiyun  *             http://www.samsung.com/
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun #include <linux/fs.h>
9*4882a593Smuzhiyun #include <linux/f2fs_fs.h>
10*4882a593Smuzhiyun #include <linux/pagemap.h>
11*4882a593Smuzhiyun #include <linux/sched.h>
12*4882a593Smuzhiyun #include <linux/ctype.h>
13*4882a593Smuzhiyun #include <linux/random.h>
14*4882a593Smuzhiyun #include <linux/dcache.h>
15*4882a593Smuzhiyun #include <linux/namei.h>
16*4882a593Smuzhiyun #include <linux/quotaops.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include "f2fs.h"
19*4882a593Smuzhiyun #include "node.h"
20*4882a593Smuzhiyun #include "segment.h"
21*4882a593Smuzhiyun #include "xattr.h"
22*4882a593Smuzhiyun #include "acl.h"
23*4882a593Smuzhiyun #include <trace/events/f2fs.h>
24*4882a593Smuzhiyun 
f2fs_new_inode(struct inode * dir,umode_t mode)25*4882a593Smuzhiyun static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
28*4882a593Smuzhiyun 	nid_t ino;
29*4882a593Smuzhiyun 	struct inode *inode;
30*4882a593Smuzhiyun 	bool nid_free = false;
31*4882a593Smuzhiyun 	bool encrypt = false;
32*4882a593Smuzhiyun 	int xattr_size = 0;
33*4882a593Smuzhiyun 	int err;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	inode = new_inode(dir->i_sb);
36*4882a593Smuzhiyun 	if (!inode)
37*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
40*4882a593Smuzhiyun 	if (!f2fs_alloc_nid(sbi, &ino)) {
41*4882a593Smuzhiyun 		f2fs_unlock_op(sbi);
42*4882a593Smuzhiyun 		err = -ENOSPC;
43*4882a593Smuzhiyun 		goto fail;
44*4882a593Smuzhiyun 	}
45*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	nid_free = true;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	inode_init_owner(inode, dir, mode);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	inode->i_ino = ino;
52*4882a593Smuzhiyun 	inode->i_blocks = 0;
53*4882a593Smuzhiyun 	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
54*4882a593Smuzhiyun 	F2FS_I(inode)->i_crtime = inode->i_mtime;
55*4882a593Smuzhiyun 	inode->i_generation = prandom_u32();
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	if (S_ISDIR(inode->i_mode))
58*4882a593Smuzhiyun 		F2FS_I(inode)->i_current_depth = 1;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	err = insert_inode_locked(inode);
61*4882a593Smuzhiyun 	if (err) {
62*4882a593Smuzhiyun 		err = -EINVAL;
63*4882a593Smuzhiyun 		goto fail;
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	if (f2fs_sb_has_project_quota(sbi) &&
67*4882a593Smuzhiyun 		(F2FS_I(dir)->i_flags & F2FS_PROJINHERIT_FL))
68*4882a593Smuzhiyun 		F2FS_I(inode)->i_projid = F2FS_I(dir)->i_projid;
69*4882a593Smuzhiyun 	else
70*4882a593Smuzhiyun 		F2FS_I(inode)->i_projid = make_kprojid(&init_user_ns,
71*4882a593Smuzhiyun 							F2FS_DEF_PROJID);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	err = fscrypt_prepare_new_inode(dir, inode, &encrypt);
74*4882a593Smuzhiyun 	if (err)
75*4882a593Smuzhiyun 		goto fail_drop;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	err = dquot_initialize(inode);
78*4882a593Smuzhiyun 	if (err)
79*4882a593Smuzhiyun 		goto fail_drop;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	set_inode_flag(inode, FI_NEW_INODE);
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	if (encrypt)
84*4882a593Smuzhiyun 		f2fs_set_encrypted_inode(inode);
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	if (f2fs_sb_has_extra_attr(sbi)) {
87*4882a593Smuzhiyun 		set_inode_flag(inode, FI_EXTRA_ATTR);
88*4882a593Smuzhiyun 		F2FS_I(inode)->i_extra_isize = F2FS_TOTAL_EXTRA_ATTR_SIZE;
89*4882a593Smuzhiyun 	}
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	if (test_opt(sbi, INLINE_XATTR))
92*4882a593Smuzhiyun 		set_inode_flag(inode, FI_INLINE_XATTR);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	if (f2fs_may_inline_dentry(inode))
95*4882a593Smuzhiyun 		set_inode_flag(inode, FI_INLINE_DENTRY);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	if (f2fs_sb_has_flexible_inline_xattr(sbi)) {
98*4882a593Smuzhiyun 		f2fs_bug_on(sbi, !f2fs_has_extra_attr(inode));
99*4882a593Smuzhiyun 		if (f2fs_has_inline_xattr(inode))
100*4882a593Smuzhiyun 			xattr_size = F2FS_OPTION(sbi).inline_xattr_size;
101*4882a593Smuzhiyun 		/* Otherwise, will be 0 */
102*4882a593Smuzhiyun 	} else if (f2fs_has_inline_xattr(inode) ||
103*4882a593Smuzhiyun 				f2fs_has_inline_dentry(inode)) {
104*4882a593Smuzhiyun 		xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
105*4882a593Smuzhiyun 	}
106*4882a593Smuzhiyun 	F2FS_I(inode)->i_inline_xattr_size = xattr_size;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	F2FS_I(inode)->i_flags =
109*4882a593Smuzhiyun 		f2fs_mask_flags(mode, F2FS_I(dir)->i_flags & F2FS_FL_INHERITED);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	if (S_ISDIR(inode->i_mode))
112*4882a593Smuzhiyun 		F2FS_I(inode)->i_flags |= F2FS_INDEX_FL;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	if (F2FS_I(inode)->i_flags & F2FS_PROJINHERIT_FL)
115*4882a593Smuzhiyun 		set_inode_flag(inode, FI_PROJ_INHERIT);
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	if (f2fs_sb_has_compression(sbi)) {
118*4882a593Smuzhiyun 		/* Inherit the compression flag in directory */
119*4882a593Smuzhiyun 		if ((F2FS_I(dir)->i_flags & F2FS_COMPR_FL) &&
120*4882a593Smuzhiyun 					f2fs_may_compress(inode))
121*4882a593Smuzhiyun 			set_compress_context(inode);
122*4882a593Smuzhiyun 	}
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	/* Should enable inline_data after compression set */
125*4882a593Smuzhiyun 	if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
126*4882a593Smuzhiyun 		set_inode_flag(inode, FI_INLINE_DATA);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	stat_inc_inline_xattr(inode);
129*4882a593Smuzhiyun 	stat_inc_inline_inode(inode);
130*4882a593Smuzhiyun 	stat_inc_inline_dir(inode);
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	f2fs_set_inode_flags(inode);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	f2fs_init_extent_tree(inode);
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	trace_f2fs_new_inode(inode, 0);
137*4882a593Smuzhiyun 	return inode;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun fail:
140*4882a593Smuzhiyun 	trace_f2fs_new_inode(inode, err);
141*4882a593Smuzhiyun 	make_bad_inode(inode);
142*4882a593Smuzhiyun 	if (nid_free)
143*4882a593Smuzhiyun 		set_inode_flag(inode, FI_FREE_NID);
144*4882a593Smuzhiyun 	iput(inode);
145*4882a593Smuzhiyun 	return ERR_PTR(err);
146*4882a593Smuzhiyun fail_drop:
147*4882a593Smuzhiyun 	trace_f2fs_new_inode(inode, err);
148*4882a593Smuzhiyun 	dquot_drop(inode);
149*4882a593Smuzhiyun 	inode->i_flags |= S_NOQUOTA;
150*4882a593Smuzhiyun 	if (nid_free)
151*4882a593Smuzhiyun 		set_inode_flag(inode, FI_FREE_NID);
152*4882a593Smuzhiyun 	clear_nlink(inode);
153*4882a593Smuzhiyun 	unlock_new_inode(inode);
154*4882a593Smuzhiyun 	iput(inode);
155*4882a593Smuzhiyun 	return ERR_PTR(err);
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun 
is_extension_exist(const unsigned char * s,const char * sub,bool tmp_ext)158*4882a593Smuzhiyun static inline int is_extension_exist(const unsigned char *s, const char *sub,
159*4882a593Smuzhiyun 						bool tmp_ext)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	size_t slen = strlen(s);
162*4882a593Smuzhiyun 	size_t sublen = strlen(sub);
163*4882a593Smuzhiyun 	int i;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	if (sublen == 1 && *sub == '*')
166*4882a593Smuzhiyun 		return 1;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	/*
169*4882a593Smuzhiyun 	 * filename format of multimedia file should be defined as:
170*4882a593Smuzhiyun 	 * "filename + '.' + extension + (optional: '.' + temp extension)".
171*4882a593Smuzhiyun 	 */
172*4882a593Smuzhiyun 	if (slen < sublen + 2)
173*4882a593Smuzhiyun 		return 0;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	if (!tmp_ext) {
176*4882a593Smuzhiyun 		/* file has no temp extension */
177*4882a593Smuzhiyun 		if (s[slen - sublen - 1] != '.')
178*4882a593Smuzhiyun 			return 0;
179*4882a593Smuzhiyun 		return !strncasecmp(s + slen - sublen, sub, sublen);
180*4882a593Smuzhiyun 	}
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	for (i = 1; i < slen - sublen; i++) {
183*4882a593Smuzhiyun 		if (s[i] != '.')
184*4882a593Smuzhiyun 			continue;
185*4882a593Smuzhiyun 		if (!strncasecmp(s + i + 1, sub, sublen))
186*4882a593Smuzhiyun 			return 1;
187*4882a593Smuzhiyun 	}
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	return 0;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun /*
193*4882a593Smuzhiyun  * Set file's temperature for hot/cold data separation
194*4882a593Smuzhiyun  */
set_file_temperature(struct f2fs_sb_info * sbi,struct inode * inode,const unsigned char * name)195*4882a593Smuzhiyun static inline void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode,
196*4882a593Smuzhiyun 		const unsigned char *name)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun 	__u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
199*4882a593Smuzhiyun 	int i, cold_count, hot_count;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	f2fs_down_read(&sbi->sb_lock);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	cold_count = le32_to_cpu(sbi->raw_super->extension_count);
204*4882a593Smuzhiyun 	hot_count = sbi->raw_super->hot_ext_count;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	for (i = 0; i < cold_count + hot_count; i++) {
207*4882a593Smuzhiyun 		if (is_extension_exist(name, extlist[i], true))
208*4882a593Smuzhiyun 			break;
209*4882a593Smuzhiyun 	}
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	f2fs_up_read(&sbi->sb_lock);
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	if (i == cold_count + hot_count)
214*4882a593Smuzhiyun 		return;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	if (i < cold_count)
217*4882a593Smuzhiyun 		file_set_cold(inode);
218*4882a593Smuzhiyun 	else
219*4882a593Smuzhiyun 		file_set_hot(inode);
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun 
f2fs_update_extension_list(struct f2fs_sb_info * sbi,const char * name,bool hot,bool set)222*4882a593Smuzhiyun int f2fs_update_extension_list(struct f2fs_sb_info *sbi, const char *name,
223*4882a593Smuzhiyun 							bool hot, bool set)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	__u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
226*4882a593Smuzhiyun 	int cold_count = le32_to_cpu(sbi->raw_super->extension_count);
227*4882a593Smuzhiyun 	int hot_count = sbi->raw_super->hot_ext_count;
228*4882a593Smuzhiyun 	int total_count = cold_count + hot_count;
229*4882a593Smuzhiyun 	int start, count;
230*4882a593Smuzhiyun 	int i;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	if (set) {
233*4882a593Smuzhiyun 		if (total_count == F2FS_MAX_EXTENSION)
234*4882a593Smuzhiyun 			return -EINVAL;
235*4882a593Smuzhiyun 	} else {
236*4882a593Smuzhiyun 		if (!hot && !cold_count)
237*4882a593Smuzhiyun 			return -EINVAL;
238*4882a593Smuzhiyun 		if (hot && !hot_count)
239*4882a593Smuzhiyun 			return -EINVAL;
240*4882a593Smuzhiyun 	}
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	if (hot) {
243*4882a593Smuzhiyun 		start = cold_count;
244*4882a593Smuzhiyun 		count = total_count;
245*4882a593Smuzhiyun 	} else {
246*4882a593Smuzhiyun 		start = 0;
247*4882a593Smuzhiyun 		count = cold_count;
248*4882a593Smuzhiyun 	}
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	for (i = start; i < count; i++) {
251*4882a593Smuzhiyun 		if (strcmp(name, extlist[i]))
252*4882a593Smuzhiyun 			continue;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 		if (set)
255*4882a593Smuzhiyun 			return -EINVAL;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 		memcpy(extlist[i], extlist[i + 1],
258*4882a593Smuzhiyun 				F2FS_EXTENSION_LEN * (total_count - i - 1));
259*4882a593Smuzhiyun 		memset(extlist[total_count - 1], 0, F2FS_EXTENSION_LEN);
260*4882a593Smuzhiyun 		if (hot)
261*4882a593Smuzhiyun 			sbi->raw_super->hot_ext_count = hot_count - 1;
262*4882a593Smuzhiyun 		else
263*4882a593Smuzhiyun 			sbi->raw_super->extension_count =
264*4882a593Smuzhiyun 						cpu_to_le32(cold_count - 1);
265*4882a593Smuzhiyun 		return 0;
266*4882a593Smuzhiyun 	}
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	if (!set)
269*4882a593Smuzhiyun 		return -EINVAL;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	if (hot) {
272*4882a593Smuzhiyun 		memcpy(extlist[count], name, strlen(name));
273*4882a593Smuzhiyun 		sbi->raw_super->hot_ext_count = hot_count + 1;
274*4882a593Smuzhiyun 	} else {
275*4882a593Smuzhiyun 		char buf[F2FS_MAX_EXTENSION][F2FS_EXTENSION_LEN];
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 		memcpy(buf, &extlist[cold_count],
278*4882a593Smuzhiyun 				F2FS_EXTENSION_LEN * hot_count);
279*4882a593Smuzhiyun 		memset(extlist[cold_count], 0, F2FS_EXTENSION_LEN);
280*4882a593Smuzhiyun 		memcpy(extlist[cold_count], name, strlen(name));
281*4882a593Smuzhiyun 		memcpy(&extlist[cold_count + 1], buf,
282*4882a593Smuzhiyun 				F2FS_EXTENSION_LEN * hot_count);
283*4882a593Smuzhiyun 		sbi->raw_super->extension_count = cpu_to_le32(cold_count + 1);
284*4882a593Smuzhiyun 	}
285*4882a593Smuzhiyun 	return 0;
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun 
set_compress_inode(struct f2fs_sb_info * sbi,struct inode * inode,const unsigned char * name)288*4882a593Smuzhiyun static void set_compress_inode(struct f2fs_sb_info *sbi, struct inode *inode,
289*4882a593Smuzhiyun 						const unsigned char *name)
290*4882a593Smuzhiyun {
291*4882a593Smuzhiyun 	__u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
292*4882a593Smuzhiyun 	unsigned char (*ext)[F2FS_EXTENSION_LEN];
293*4882a593Smuzhiyun 	unsigned int ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;
294*4882a593Smuzhiyun 	int i, cold_count, hot_count;
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun 	if (!f2fs_sb_has_compression(sbi) ||
297*4882a593Smuzhiyun 			is_inode_flag_set(inode, FI_COMPRESSED_FILE) ||
298*4882a593Smuzhiyun 			F2FS_I(inode)->i_flags & F2FS_NOCOMP_FL ||
299*4882a593Smuzhiyun 			!f2fs_may_compress(inode))
300*4882a593Smuzhiyun 		return;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	f2fs_down_read(&sbi->sb_lock);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	cold_count = le32_to_cpu(sbi->raw_super->extension_count);
305*4882a593Smuzhiyun 	hot_count = sbi->raw_super->hot_ext_count;
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	for (i = cold_count; i < cold_count + hot_count; i++) {
308*4882a593Smuzhiyun 		if (is_extension_exist(name, extlist[i], false)) {
309*4882a593Smuzhiyun 			f2fs_up_read(&sbi->sb_lock);
310*4882a593Smuzhiyun 			return;
311*4882a593Smuzhiyun 		}
312*4882a593Smuzhiyun 	}
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	f2fs_up_read(&sbi->sb_lock);
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	ext = F2FS_OPTION(sbi).extensions;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	for (i = 0; i < ext_cnt; i++) {
319*4882a593Smuzhiyun 		if (!is_extension_exist(name, ext[i], false))
320*4882a593Smuzhiyun 			continue;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 		/* Do not use inline_data with compression */
323*4882a593Smuzhiyun 		stat_dec_inline_inode(inode);
324*4882a593Smuzhiyun 		clear_inode_flag(inode, FI_INLINE_DATA);
325*4882a593Smuzhiyun 		set_compress_context(inode);
326*4882a593Smuzhiyun 		return;
327*4882a593Smuzhiyun 	}
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun 
f2fs_create(struct inode * dir,struct dentry * dentry,umode_t mode,bool excl)330*4882a593Smuzhiyun static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
331*4882a593Smuzhiyun 						bool excl)
332*4882a593Smuzhiyun {
333*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
334*4882a593Smuzhiyun 	struct inode *inode;
335*4882a593Smuzhiyun 	nid_t ino = 0;
336*4882a593Smuzhiyun 	int err;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
339*4882a593Smuzhiyun 		return -EIO;
340*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi))
341*4882a593Smuzhiyun 		return -ENOSPC;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	err = dquot_initialize(dir);
344*4882a593Smuzhiyun 	if (err)
345*4882a593Smuzhiyun 		return err;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	inode = f2fs_new_inode(dir, mode);
348*4882a593Smuzhiyun 	if (IS_ERR(inode))
349*4882a593Smuzhiyun 		return PTR_ERR(inode);
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	if (!test_opt(sbi, DISABLE_EXT_IDENTIFY))
352*4882a593Smuzhiyun 		set_file_temperature(sbi, inode, dentry->d_name.name);
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	set_compress_inode(sbi, inode, dentry->d_name.name);
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	inode->i_op = &f2fs_file_inode_operations;
357*4882a593Smuzhiyun 	inode->i_fop = &f2fs_file_operations;
358*4882a593Smuzhiyun 	inode->i_mapping->a_ops = &f2fs_dblock_aops;
359*4882a593Smuzhiyun 	ino = inode->i_ino;
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
362*4882a593Smuzhiyun 	err = f2fs_add_link(dentry, inode);
363*4882a593Smuzhiyun 	if (err)
364*4882a593Smuzhiyun 		goto out;
365*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	f2fs_alloc_nid_done(sbi, ino);
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	d_instantiate_new(dentry, inode);
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	if (IS_DIRSYNC(dir))
372*4882a593Smuzhiyun 		f2fs_sync_fs(sbi->sb, 1);
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
375*4882a593Smuzhiyun 	return 0;
376*4882a593Smuzhiyun out:
377*4882a593Smuzhiyun 	f2fs_handle_failed_inode(inode);
378*4882a593Smuzhiyun 	return err;
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun 
f2fs_link(struct dentry * old_dentry,struct inode * dir,struct dentry * dentry)381*4882a593Smuzhiyun static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
382*4882a593Smuzhiyun 		struct dentry *dentry)
383*4882a593Smuzhiyun {
384*4882a593Smuzhiyun 	struct inode *inode = d_inode(old_dentry);
385*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
386*4882a593Smuzhiyun 	int err;
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
389*4882a593Smuzhiyun 		return -EIO;
390*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi))
391*4882a593Smuzhiyun 		return -ENOSPC;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	err = fscrypt_prepare_link(old_dentry, dir, dentry);
394*4882a593Smuzhiyun 	if (err)
395*4882a593Smuzhiyun 		return err;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	if (is_inode_flag_set(dir, FI_PROJ_INHERIT) &&
398*4882a593Smuzhiyun 			(!projid_eq(F2FS_I(dir)->i_projid,
399*4882a593Smuzhiyun 			F2FS_I(old_dentry->d_inode)->i_projid)))
400*4882a593Smuzhiyun 		return -EXDEV;
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	err = dquot_initialize(dir);
403*4882a593Smuzhiyun 	if (err)
404*4882a593Smuzhiyun 		return err;
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	inode->i_ctime = current_time(inode);
409*4882a593Smuzhiyun 	ihold(inode);
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	set_inode_flag(inode, FI_INC_LINK);
412*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
413*4882a593Smuzhiyun 	err = f2fs_add_link(dentry, inode);
414*4882a593Smuzhiyun 	if (err)
415*4882a593Smuzhiyun 		goto out;
416*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	d_instantiate(dentry, inode);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	if (IS_DIRSYNC(dir))
421*4882a593Smuzhiyun 		f2fs_sync_fs(sbi->sb, 1);
422*4882a593Smuzhiyun 	return 0;
423*4882a593Smuzhiyun out:
424*4882a593Smuzhiyun 	clear_inode_flag(inode, FI_INC_LINK);
425*4882a593Smuzhiyun 	iput(inode);
426*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
427*4882a593Smuzhiyun 	return err;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun 
f2fs_get_parent(struct dentry * child)430*4882a593Smuzhiyun struct dentry *f2fs_get_parent(struct dentry *child)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun 	struct qstr dotdot = QSTR_INIT("..", 2);
433*4882a593Smuzhiyun 	struct page *page;
434*4882a593Smuzhiyun 	unsigned long ino = f2fs_inode_by_name(d_inode(child), &dotdot, &page);
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	if (!ino) {
437*4882a593Smuzhiyun 		if (IS_ERR(page))
438*4882a593Smuzhiyun 			return ERR_CAST(page);
439*4882a593Smuzhiyun 		return ERR_PTR(-ENOENT);
440*4882a593Smuzhiyun 	}
441*4882a593Smuzhiyun 	return d_obtain_alias(f2fs_iget(child->d_sb, ino));
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun 
__recover_dot_dentries(struct inode * dir,nid_t pino)444*4882a593Smuzhiyun static int __recover_dot_dentries(struct inode *dir, nid_t pino)
445*4882a593Smuzhiyun {
446*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
447*4882a593Smuzhiyun 	struct qstr dot = QSTR_INIT(".", 1);
448*4882a593Smuzhiyun 	struct qstr dotdot = QSTR_INIT("..", 2);
449*4882a593Smuzhiyun 	struct f2fs_dir_entry *de;
450*4882a593Smuzhiyun 	struct page *page;
451*4882a593Smuzhiyun 	int err = 0;
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	if (f2fs_readonly(sbi->sb)) {
454*4882a593Smuzhiyun 		f2fs_info(sbi, "skip recovering inline_dots inode (ino:%lu, pino:%u) in readonly mountpoint",
455*4882a593Smuzhiyun 			  dir->i_ino, pino);
456*4882a593Smuzhiyun 		return 0;
457*4882a593Smuzhiyun 	}
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	err = dquot_initialize(dir);
460*4882a593Smuzhiyun 	if (err)
461*4882a593Smuzhiyun 		return err;
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	de = f2fs_find_entry(dir, &dot, &page);
468*4882a593Smuzhiyun 	if (de) {
469*4882a593Smuzhiyun 		f2fs_put_page(page, 0);
470*4882a593Smuzhiyun 	} else if (IS_ERR(page)) {
471*4882a593Smuzhiyun 		err = PTR_ERR(page);
472*4882a593Smuzhiyun 		goto out;
473*4882a593Smuzhiyun 	} else {
474*4882a593Smuzhiyun 		err = f2fs_do_add_link(dir, &dot, NULL, dir->i_ino, S_IFDIR);
475*4882a593Smuzhiyun 		if (err)
476*4882a593Smuzhiyun 			goto out;
477*4882a593Smuzhiyun 	}
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	de = f2fs_find_entry(dir, &dotdot, &page);
480*4882a593Smuzhiyun 	if (de)
481*4882a593Smuzhiyun 		f2fs_put_page(page, 0);
482*4882a593Smuzhiyun 	else if (IS_ERR(page))
483*4882a593Smuzhiyun 		err = PTR_ERR(page);
484*4882a593Smuzhiyun 	else
485*4882a593Smuzhiyun 		err = f2fs_do_add_link(dir, &dotdot, NULL, pino, S_IFDIR);
486*4882a593Smuzhiyun out:
487*4882a593Smuzhiyun 	if (!err)
488*4882a593Smuzhiyun 		clear_inode_flag(dir, FI_INLINE_DOTS);
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
491*4882a593Smuzhiyun 	return err;
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun 
f2fs_lookup(struct inode * dir,struct dentry * dentry,unsigned int flags)494*4882a593Smuzhiyun static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
495*4882a593Smuzhiyun 		unsigned int flags)
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun 	struct inode *inode = NULL;
498*4882a593Smuzhiyun 	struct f2fs_dir_entry *de;
499*4882a593Smuzhiyun 	struct page *page;
500*4882a593Smuzhiyun 	struct dentry *new;
501*4882a593Smuzhiyun 	nid_t ino = -1;
502*4882a593Smuzhiyun 	int err = 0;
503*4882a593Smuzhiyun 	unsigned int root_ino = F2FS_ROOT_INO(F2FS_I_SB(dir));
504*4882a593Smuzhiyun 	struct f2fs_filename fname;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	trace_f2fs_lookup_start(dir, dentry, flags);
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 	if (dentry->d_name.len > F2FS_NAME_LEN) {
509*4882a593Smuzhiyun 		err = -ENAMETOOLONG;
510*4882a593Smuzhiyun 		goto out;
511*4882a593Smuzhiyun 	}
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	err = f2fs_prepare_lookup(dir, dentry, &fname);
514*4882a593Smuzhiyun 	generic_set_encrypted_ci_d_ops(dentry);
515*4882a593Smuzhiyun 	if (err == -ENOENT)
516*4882a593Smuzhiyun 		goto out_splice;
517*4882a593Smuzhiyun 	if (err)
518*4882a593Smuzhiyun 		goto out;
519*4882a593Smuzhiyun 	de = __f2fs_find_entry(dir, &fname, &page);
520*4882a593Smuzhiyun 	f2fs_free_filename(&fname);
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	if (!de) {
523*4882a593Smuzhiyun 		if (IS_ERR(page)) {
524*4882a593Smuzhiyun 			err = PTR_ERR(page);
525*4882a593Smuzhiyun 			goto out;
526*4882a593Smuzhiyun 		}
527*4882a593Smuzhiyun 		err = -ENOENT;
528*4882a593Smuzhiyun 		goto out_splice;
529*4882a593Smuzhiyun 	}
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	ino = le32_to_cpu(de->ino);
532*4882a593Smuzhiyun 	f2fs_put_page(page, 0);
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	inode = f2fs_iget(dir->i_sb, ino);
535*4882a593Smuzhiyun 	if (IS_ERR(inode)) {
536*4882a593Smuzhiyun 		err = PTR_ERR(inode);
537*4882a593Smuzhiyun 		goto out;
538*4882a593Smuzhiyun 	}
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	if ((dir->i_ino == root_ino) && f2fs_has_inline_dots(dir)) {
541*4882a593Smuzhiyun 		err = __recover_dot_dentries(dir, root_ino);
542*4882a593Smuzhiyun 		if (err)
543*4882a593Smuzhiyun 			goto out_iput;
544*4882a593Smuzhiyun 	}
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun 	if (f2fs_has_inline_dots(inode)) {
547*4882a593Smuzhiyun 		err = __recover_dot_dentries(inode, dir->i_ino);
548*4882a593Smuzhiyun 		if (err)
549*4882a593Smuzhiyun 			goto out_iput;
550*4882a593Smuzhiyun 	}
551*4882a593Smuzhiyun 	if (IS_ENCRYPTED(dir) &&
552*4882a593Smuzhiyun 	    (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
553*4882a593Smuzhiyun 	    !fscrypt_has_permitted_context(dir, inode)) {
554*4882a593Smuzhiyun 		f2fs_warn(F2FS_I_SB(inode), "Inconsistent encryption contexts: %lu/%lu",
555*4882a593Smuzhiyun 			  dir->i_ino, inode->i_ino);
556*4882a593Smuzhiyun 		err = -EPERM;
557*4882a593Smuzhiyun 		goto out_iput;
558*4882a593Smuzhiyun 	}
559*4882a593Smuzhiyun out_splice:
560*4882a593Smuzhiyun #ifdef CONFIG_UNICODE
561*4882a593Smuzhiyun 	if (!inode && IS_CASEFOLDED(dir)) {
562*4882a593Smuzhiyun 		/* Eventually we want to call d_add_ci(dentry, NULL)
563*4882a593Smuzhiyun 		 * for negative dentries in the encoding case as
564*4882a593Smuzhiyun 		 * well.  For now, prevent the negative dentry
565*4882a593Smuzhiyun 		 * from being cached.
566*4882a593Smuzhiyun 		 */
567*4882a593Smuzhiyun 		trace_f2fs_lookup_end(dir, dentry, ino, err);
568*4882a593Smuzhiyun 		return NULL;
569*4882a593Smuzhiyun 	}
570*4882a593Smuzhiyun #endif
571*4882a593Smuzhiyun 	new = d_splice_alias(inode, dentry);
572*4882a593Smuzhiyun 	err = PTR_ERR_OR_ZERO(new);
573*4882a593Smuzhiyun 	trace_f2fs_lookup_end(dir, dentry, ino, !new ? -ENOENT : err);
574*4882a593Smuzhiyun 	return new;
575*4882a593Smuzhiyun out_iput:
576*4882a593Smuzhiyun 	iput(inode);
577*4882a593Smuzhiyun out:
578*4882a593Smuzhiyun 	trace_f2fs_lookup_end(dir, dentry, ino, err);
579*4882a593Smuzhiyun 	return ERR_PTR(err);
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun 
f2fs_unlink(struct inode * dir,struct dentry * dentry)582*4882a593Smuzhiyun static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
583*4882a593Smuzhiyun {
584*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
585*4882a593Smuzhiyun 	struct inode *inode = d_inode(dentry);
586*4882a593Smuzhiyun 	struct f2fs_dir_entry *de;
587*4882a593Smuzhiyun 	struct page *page;
588*4882a593Smuzhiyun 	int err;
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	trace_f2fs_unlink_enter(dir, dentry);
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi))) {
593*4882a593Smuzhiyun 		err = -EIO;
594*4882a593Smuzhiyun 		goto fail;
595*4882a593Smuzhiyun 	}
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	err = dquot_initialize(dir);
598*4882a593Smuzhiyun 	if (err)
599*4882a593Smuzhiyun 		goto fail;
600*4882a593Smuzhiyun 	err = dquot_initialize(inode);
601*4882a593Smuzhiyun 	if (err)
602*4882a593Smuzhiyun 		goto fail;
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun 	de = f2fs_find_entry(dir, &dentry->d_name, &page);
605*4882a593Smuzhiyun 	if (!de) {
606*4882a593Smuzhiyun 		if (IS_ERR(page))
607*4882a593Smuzhiyun 			err = PTR_ERR(page);
608*4882a593Smuzhiyun 		goto fail;
609*4882a593Smuzhiyun 	}
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
614*4882a593Smuzhiyun 	err = f2fs_acquire_orphan_inode(sbi);
615*4882a593Smuzhiyun 	if (err) {
616*4882a593Smuzhiyun 		f2fs_unlock_op(sbi);
617*4882a593Smuzhiyun 		f2fs_put_page(page, 0);
618*4882a593Smuzhiyun 		goto fail;
619*4882a593Smuzhiyun 	}
620*4882a593Smuzhiyun 	f2fs_delete_entry(de, page, dir, inode);
621*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun #ifdef CONFIG_UNICODE
624*4882a593Smuzhiyun 	/* VFS negative dentries are incompatible with Encoding and
625*4882a593Smuzhiyun 	 * Case-insensitiveness. Eventually we'll want avoid
626*4882a593Smuzhiyun 	 * invalidating the dentries here, alongside with returning the
627*4882a593Smuzhiyun 	 * negative dentries at f2fs_lookup(), when it is better
628*4882a593Smuzhiyun 	 * supported by the VFS for the CI case.
629*4882a593Smuzhiyun 	 */
630*4882a593Smuzhiyun 	if (IS_CASEFOLDED(dir))
631*4882a593Smuzhiyun 		d_invalidate(dentry);
632*4882a593Smuzhiyun #endif
633*4882a593Smuzhiyun 	if (IS_DIRSYNC(dir))
634*4882a593Smuzhiyun 		f2fs_sync_fs(sbi->sb, 1);
635*4882a593Smuzhiyun fail:
636*4882a593Smuzhiyun 	trace_f2fs_unlink_exit(inode, err);
637*4882a593Smuzhiyun 	return err;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun 
f2fs_get_link(struct dentry * dentry,struct inode * inode,struct delayed_call * done)640*4882a593Smuzhiyun static const char *f2fs_get_link(struct dentry *dentry,
641*4882a593Smuzhiyun 				 struct inode *inode,
642*4882a593Smuzhiyun 				 struct delayed_call *done)
643*4882a593Smuzhiyun {
644*4882a593Smuzhiyun 	const char *link = page_get_link(dentry, inode, done);
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun 	if (!IS_ERR(link) && !*link) {
647*4882a593Smuzhiyun 		/* this is broken symlink case */
648*4882a593Smuzhiyun 		do_delayed_call(done);
649*4882a593Smuzhiyun 		clear_delayed_call(done);
650*4882a593Smuzhiyun 		link = ERR_PTR(-ENOENT);
651*4882a593Smuzhiyun 	}
652*4882a593Smuzhiyun 	return link;
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun 
f2fs_symlink(struct inode * dir,struct dentry * dentry,const char * symname)655*4882a593Smuzhiyun static int f2fs_symlink(struct inode *dir, struct dentry *dentry,
656*4882a593Smuzhiyun 					const char *symname)
657*4882a593Smuzhiyun {
658*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
659*4882a593Smuzhiyun 	struct inode *inode;
660*4882a593Smuzhiyun 	size_t len = strlen(symname);
661*4882a593Smuzhiyun 	struct fscrypt_str disk_link;
662*4882a593Smuzhiyun 	int err;
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
665*4882a593Smuzhiyun 		return -EIO;
666*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi))
667*4882a593Smuzhiyun 		return -ENOSPC;
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 	err = fscrypt_prepare_symlink(dir, symname, len, dir->i_sb->s_blocksize,
670*4882a593Smuzhiyun 				      &disk_link);
671*4882a593Smuzhiyun 	if (err)
672*4882a593Smuzhiyun 		return err;
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 	err = dquot_initialize(dir);
675*4882a593Smuzhiyun 	if (err)
676*4882a593Smuzhiyun 		return err;
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	inode = f2fs_new_inode(dir, S_IFLNK | S_IRWXUGO);
679*4882a593Smuzhiyun 	if (IS_ERR(inode))
680*4882a593Smuzhiyun 		return PTR_ERR(inode);
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	if (IS_ENCRYPTED(inode))
683*4882a593Smuzhiyun 		inode->i_op = &f2fs_encrypted_symlink_inode_operations;
684*4882a593Smuzhiyun 	else
685*4882a593Smuzhiyun 		inode->i_op = &f2fs_symlink_inode_operations;
686*4882a593Smuzhiyun 	inode_nohighmem(inode);
687*4882a593Smuzhiyun 	inode->i_mapping->a_ops = &f2fs_dblock_aops;
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
690*4882a593Smuzhiyun 	err = f2fs_add_link(dentry, inode);
691*4882a593Smuzhiyun 	if (err)
692*4882a593Smuzhiyun 		goto out_f2fs_handle_failed_inode;
693*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
694*4882a593Smuzhiyun 	f2fs_alloc_nid_done(sbi, inode->i_ino);
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 	err = fscrypt_encrypt_symlink(inode, symname, len, &disk_link);
697*4882a593Smuzhiyun 	if (err)
698*4882a593Smuzhiyun 		goto err_out;
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	err = page_symlink(inode, disk_link.name, disk_link.len);
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun err_out:
703*4882a593Smuzhiyun 	d_instantiate_new(dentry, inode);
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 	/*
706*4882a593Smuzhiyun 	 * Let's flush symlink data in order to avoid broken symlink as much as
707*4882a593Smuzhiyun 	 * possible. Nevertheless, fsyncing is the best way, but there is no
708*4882a593Smuzhiyun 	 * way to get a file descriptor in order to flush that.
709*4882a593Smuzhiyun 	 *
710*4882a593Smuzhiyun 	 * Note that, it needs to do dir->fsync to make this recoverable.
711*4882a593Smuzhiyun 	 * If the symlink path is stored into inline_data, there is no
712*4882a593Smuzhiyun 	 * performance regression.
713*4882a593Smuzhiyun 	 */
714*4882a593Smuzhiyun 	if (!err) {
715*4882a593Smuzhiyun 		filemap_write_and_wait_range(inode->i_mapping, 0,
716*4882a593Smuzhiyun 							disk_link.len - 1);
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 		if (IS_DIRSYNC(dir))
719*4882a593Smuzhiyun 			f2fs_sync_fs(sbi->sb, 1);
720*4882a593Smuzhiyun 	} else {
721*4882a593Smuzhiyun 		f2fs_unlink(dir, dentry);
722*4882a593Smuzhiyun 	}
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
725*4882a593Smuzhiyun 	goto out_free_encrypted_link;
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun out_f2fs_handle_failed_inode:
728*4882a593Smuzhiyun 	f2fs_handle_failed_inode(inode);
729*4882a593Smuzhiyun out_free_encrypted_link:
730*4882a593Smuzhiyun 	if (disk_link.name != (unsigned char *)symname)
731*4882a593Smuzhiyun 		kfree(disk_link.name);
732*4882a593Smuzhiyun 	return err;
733*4882a593Smuzhiyun }
734*4882a593Smuzhiyun 
f2fs_mkdir(struct inode * dir,struct dentry * dentry,umode_t mode)735*4882a593Smuzhiyun static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
736*4882a593Smuzhiyun {
737*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
738*4882a593Smuzhiyun 	struct inode *inode;
739*4882a593Smuzhiyun 	int err;
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
742*4882a593Smuzhiyun 		return -EIO;
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun 	err = dquot_initialize(dir);
745*4882a593Smuzhiyun 	if (err)
746*4882a593Smuzhiyun 		return err;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 	inode = f2fs_new_inode(dir, S_IFDIR | mode);
749*4882a593Smuzhiyun 	if (IS_ERR(inode))
750*4882a593Smuzhiyun 		return PTR_ERR(inode);
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	inode->i_op = &f2fs_dir_inode_operations;
753*4882a593Smuzhiyun 	inode->i_fop = &f2fs_dir_operations;
754*4882a593Smuzhiyun 	inode->i_mapping->a_ops = &f2fs_dblock_aops;
755*4882a593Smuzhiyun 	mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun 	set_inode_flag(inode, FI_INC_LINK);
758*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
759*4882a593Smuzhiyun 	err = f2fs_add_link(dentry, inode);
760*4882a593Smuzhiyun 	if (err)
761*4882a593Smuzhiyun 		goto out_fail;
762*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	f2fs_alloc_nid_done(sbi, inode->i_ino);
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	d_instantiate_new(dentry, inode);
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 	if (IS_DIRSYNC(dir))
769*4882a593Smuzhiyun 		f2fs_sync_fs(sbi->sb, 1);
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
772*4882a593Smuzhiyun 	return 0;
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun out_fail:
775*4882a593Smuzhiyun 	clear_inode_flag(inode, FI_INC_LINK);
776*4882a593Smuzhiyun 	f2fs_handle_failed_inode(inode);
777*4882a593Smuzhiyun 	return err;
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun 
f2fs_rmdir(struct inode * dir,struct dentry * dentry)780*4882a593Smuzhiyun static int f2fs_rmdir(struct inode *dir, struct dentry *dentry)
781*4882a593Smuzhiyun {
782*4882a593Smuzhiyun 	struct inode *inode = d_inode(dentry);
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	if (f2fs_empty_dir(inode))
785*4882a593Smuzhiyun 		return f2fs_unlink(dir, dentry);
786*4882a593Smuzhiyun 	return -ENOTEMPTY;
787*4882a593Smuzhiyun }
788*4882a593Smuzhiyun 
f2fs_mknod(struct inode * dir,struct dentry * dentry,umode_t mode,dev_t rdev)789*4882a593Smuzhiyun static int f2fs_mknod(struct inode *dir, struct dentry *dentry,
790*4882a593Smuzhiyun 				umode_t mode, dev_t rdev)
791*4882a593Smuzhiyun {
792*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
793*4882a593Smuzhiyun 	struct inode *inode;
794*4882a593Smuzhiyun 	int err = 0;
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
797*4882a593Smuzhiyun 		return -EIO;
798*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi))
799*4882a593Smuzhiyun 		return -ENOSPC;
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	err = dquot_initialize(dir);
802*4882a593Smuzhiyun 	if (err)
803*4882a593Smuzhiyun 		return err;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	inode = f2fs_new_inode(dir, mode);
806*4882a593Smuzhiyun 	if (IS_ERR(inode))
807*4882a593Smuzhiyun 		return PTR_ERR(inode);
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	init_special_inode(inode, inode->i_mode, rdev);
810*4882a593Smuzhiyun 	inode->i_op = &f2fs_special_inode_operations;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
813*4882a593Smuzhiyun 	err = f2fs_add_link(dentry, inode);
814*4882a593Smuzhiyun 	if (err)
815*4882a593Smuzhiyun 		goto out;
816*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	f2fs_alloc_nid_done(sbi, inode->i_ino);
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun 	d_instantiate_new(dentry, inode);
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun 	if (IS_DIRSYNC(dir))
823*4882a593Smuzhiyun 		f2fs_sync_fs(sbi->sb, 1);
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
826*4882a593Smuzhiyun 	return 0;
827*4882a593Smuzhiyun out:
828*4882a593Smuzhiyun 	f2fs_handle_failed_inode(inode);
829*4882a593Smuzhiyun 	return err;
830*4882a593Smuzhiyun }
831*4882a593Smuzhiyun 
__f2fs_tmpfile(struct inode * dir,struct dentry * dentry,umode_t mode,struct inode ** whiteout)832*4882a593Smuzhiyun static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
833*4882a593Smuzhiyun 					umode_t mode, struct inode **whiteout)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
836*4882a593Smuzhiyun 	struct inode *inode;
837*4882a593Smuzhiyun 	int err;
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 	err = dquot_initialize(dir);
840*4882a593Smuzhiyun 	if (err)
841*4882a593Smuzhiyun 		return err;
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun 	inode = f2fs_new_inode(dir, mode);
844*4882a593Smuzhiyun 	if (IS_ERR(inode))
845*4882a593Smuzhiyun 		return PTR_ERR(inode);
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	if (whiteout) {
848*4882a593Smuzhiyun 		init_special_inode(inode, inode->i_mode, WHITEOUT_DEV);
849*4882a593Smuzhiyun 		inode->i_op = &f2fs_special_inode_operations;
850*4882a593Smuzhiyun 	} else {
851*4882a593Smuzhiyun 		inode->i_op = &f2fs_file_inode_operations;
852*4882a593Smuzhiyun 		inode->i_fop = &f2fs_file_operations;
853*4882a593Smuzhiyun 		inode->i_mapping->a_ops = &f2fs_dblock_aops;
854*4882a593Smuzhiyun 	}
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
857*4882a593Smuzhiyun 	err = f2fs_acquire_orphan_inode(sbi);
858*4882a593Smuzhiyun 	if (err)
859*4882a593Smuzhiyun 		goto out;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	err = f2fs_do_tmpfile(inode, dir);
862*4882a593Smuzhiyun 	if (err)
863*4882a593Smuzhiyun 		goto release_out;
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun 	/*
866*4882a593Smuzhiyun 	 * add this non-linked tmpfile to orphan list, in this way we could
867*4882a593Smuzhiyun 	 * remove all unused data of tmpfile after abnormal power-off.
868*4882a593Smuzhiyun 	 */
869*4882a593Smuzhiyun 	f2fs_add_orphan_inode(inode);
870*4882a593Smuzhiyun 	f2fs_alloc_nid_done(sbi, inode->i_ino);
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 	if (whiteout) {
873*4882a593Smuzhiyun 		f2fs_i_links_write(inode, false);
874*4882a593Smuzhiyun 
875*4882a593Smuzhiyun 		spin_lock(&inode->i_lock);
876*4882a593Smuzhiyun 		inode->i_state |= I_LINKABLE;
877*4882a593Smuzhiyun 		spin_unlock(&inode->i_lock);
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun 		*whiteout = inode;
880*4882a593Smuzhiyun 	} else {
881*4882a593Smuzhiyun 		d_tmpfile(dentry, inode);
882*4882a593Smuzhiyun 	}
883*4882a593Smuzhiyun 	/* link_count was changed by d_tmpfile as well. */
884*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
885*4882a593Smuzhiyun 	unlock_new_inode(inode);
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
888*4882a593Smuzhiyun 	return 0;
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun release_out:
891*4882a593Smuzhiyun 	f2fs_release_orphan_inode(sbi);
892*4882a593Smuzhiyun out:
893*4882a593Smuzhiyun 	f2fs_handle_failed_inode(inode);
894*4882a593Smuzhiyun 	return err;
895*4882a593Smuzhiyun }
896*4882a593Smuzhiyun 
f2fs_tmpfile(struct inode * dir,struct dentry * dentry,umode_t mode)897*4882a593Smuzhiyun static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
898*4882a593Smuzhiyun {
899*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
902*4882a593Smuzhiyun 		return -EIO;
903*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi))
904*4882a593Smuzhiyun 		return -ENOSPC;
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun 	return __f2fs_tmpfile(dir, dentry, mode, NULL);
907*4882a593Smuzhiyun }
908*4882a593Smuzhiyun 
f2fs_create_whiteout(struct inode * dir,struct inode ** whiteout)909*4882a593Smuzhiyun static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout)
910*4882a593Smuzhiyun {
911*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
912*4882a593Smuzhiyun 		return -EIO;
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun 	return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout);
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun 
f2fs_rename(struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry,unsigned int flags)917*4882a593Smuzhiyun static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
918*4882a593Smuzhiyun 			struct inode *new_dir, struct dentry *new_dentry,
919*4882a593Smuzhiyun 			unsigned int flags)
920*4882a593Smuzhiyun {
921*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);
922*4882a593Smuzhiyun 	struct inode *old_inode = d_inode(old_dentry);
923*4882a593Smuzhiyun 	struct inode *new_inode = d_inode(new_dentry);
924*4882a593Smuzhiyun 	struct inode *whiteout = NULL;
925*4882a593Smuzhiyun 	struct page *old_dir_page = NULL;
926*4882a593Smuzhiyun 	struct page *old_page, *new_page = NULL;
927*4882a593Smuzhiyun 	struct f2fs_dir_entry *old_dir_entry = NULL;
928*4882a593Smuzhiyun 	struct f2fs_dir_entry *old_entry;
929*4882a593Smuzhiyun 	struct f2fs_dir_entry *new_entry;
930*4882a593Smuzhiyun 	int err;
931*4882a593Smuzhiyun 
932*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
933*4882a593Smuzhiyun 		return -EIO;
934*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi))
935*4882a593Smuzhiyun 		return -ENOSPC;
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun 	if (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
938*4882a593Smuzhiyun 			(!projid_eq(F2FS_I(new_dir)->i_projid,
939*4882a593Smuzhiyun 			F2FS_I(old_dentry->d_inode)->i_projid)))
940*4882a593Smuzhiyun 		return -EXDEV;
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 	/*
943*4882a593Smuzhiyun 	 * If new_inode is null, the below renaming flow will
944*4882a593Smuzhiyun 	 * add a link in old_dir which can conver inline_dir.
945*4882a593Smuzhiyun 	 * After then, if we failed to get the entry due to other
946*4882a593Smuzhiyun 	 * reasons like ENOMEM, we had to remove the new entry.
947*4882a593Smuzhiyun 	 * Instead of adding such the error handling routine, let's
948*4882a593Smuzhiyun 	 * simply convert first here.
949*4882a593Smuzhiyun 	 */
950*4882a593Smuzhiyun 	if (old_dir == new_dir && !new_inode) {
951*4882a593Smuzhiyun 		err = f2fs_try_convert_inline_dir(old_dir, new_dentry);
952*4882a593Smuzhiyun 		if (err)
953*4882a593Smuzhiyun 			return err;
954*4882a593Smuzhiyun 	}
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun 	if (flags & RENAME_WHITEOUT) {
957*4882a593Smuzhiyun 		err = f2fs_create_whiteout(old_dir, &whiteout);
958*4882a593Smuzhiyun 		if (err)
959*4882a593Smuzhiyun 			return err;
960*4882a593Smuzhiyun 	}
961*4882a593Smuzhiyun 
962*4882a593Smuzhiyun 	err = dquot_initialize(old_dir);
963*4882a593Smuzhiyun 	if (err)
964*4882a593Smuzhiyun 		goto out;
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 	err = dquot_initialize(new_dir);
967*4882a593Smuzhiyun 	if (err)
968*4882a593Smuzhiyun 		goto out;
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun 	if (new_inode) {
971*4882a593Smuzhiyun 		err = dquot_initialize(new_inode);
972*4882a593Smuzhiyun 		if (err)
973*4882a593Smuzhiyun 			goto out;
974*4882a593Smuzhiyun 	}
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun 	err = -ENOENT;
977*4882a593Smuzhiyun 	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
978*4882a593Smuzhiyun 	if (!old_entry) {
979*4882a593Smuzhiyun 		if (IS_ERR(old_page))
980*4882a593Smuzhiyun 			err = PTR_ERR(old_page);
981*4882a593Smuzhiyun 		goto out;
982*4882a593Smuzhiyun 	}
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun 	if (S_ISDIR(old_inode->i_mode)) {
985*4882a593Smuzhiyun 		old_dir_entry = f2fs_parent_dir(old_inode, &old_dir_page);
986*4882a593Smuzhiyun 		if (!old_dir_entry) {
987*4882a593Smuzhiyun 			if (IS_ERR(old_dir_page))
988*4882a593Smuzhiyun 				err = PTR_ERR(old_dir_page);
989*4882a593Smuzhiyun 			goto out_old;
990*4882a593Smuzhiyun 		}
991*4882a593Smuzhiyun 	}
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun 	if (new_inode) {
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun 		err = -ENOTEMPTY;
996*4882a593Smuzhiyun 		if (old_dir_entry && !f2fs_empty_dir(new_inode))
997*4882a593Smuzhiyun 			goto out_dir;
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun 		err = -ENOENT;
1000*4882a593Smuzhiyun 		new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name,
1001*4882a593Smuzhiyun 						&new_page);
1002*4882a593Smuzhiyun 		if (!new_entry) {
1003*4882a593Smuzhiyun 			if (IS_ERR(new_page))
1004*4882a593Smuzhiyun 				err = PTR_ERR(new_page);
1005*4882a593Smuzhiyun 			goto out_dir;
1006*4882a593Smuzhiyun 		}
1007*4882a593Smuzhiyun 
1008*4882a593Smuzhiyun 		f2fs_balance_fs(sbi, true);
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun 		f2fs_lock_op(sbi);
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun 		err = f2fs_acquire_orphan_inode(sbi);
1013*4882a593Smuzhiyun 		if (err)
1014*4882a593Smuzhiyun 			goto put_out_dir;
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun 		f2fs_set_link(new_dir, new_entry, new_page, old_inode);
1017*4882a593Smuzhiyun 		new_page = NULL;
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun 		new_inode->i_ctime = current_time(new_inode);
1020*4882a593Smuzhiyun 		f2fs_down_write(&F2FS_I(new_inode)->i_sem);
1021*4882a593Smuzhiyun 		if (old_dir_entry)
1022*4882a593Smuzhiyun 			f2fs_i_links_write(new_inode, false);
1023*4882a593Smuzhiyun 		f2fs_i_links_write(new_inode, false);
1024*4882a593Smuzhiyun 		f2fs_up_write(&F2FS_I(new_inode)->i_sem);
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun 		if (!new_inode->i_nlink)
1027*4882a593Smuzhiyun 			f2fs_add_orphan_inode(new_inode);
1028*4882a593Smuzhiyun 		else
1029*4882a593Smuzhiyun 			f2fs_release_orphan_inode(sbi);
1030*4882a593Smuzhiyun 	} else {
1031*4882a593Smuzhiyun 		f2fs_balance_fs(sbi, true);
1032*4882a593Smuzhiyun 
1033*4882a593Smuzhiyun 		f2fs_lock_op(sbi);
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 		err = f2fs_add_link(new_dentry, old_inode);
1036*4882a593Smuzhiyun 		if (err) {
1037*4882a593Smuzhiyun 			f2fs_unlock_op(sbi);
1038*4882a593Smuzhiyun 			goto out_dir;
1039*4882a593Smuzhiyun 		}
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun 		if (old_dir_entry)
1042*4882a593Smuzhiyun 			f2fs_i_links_write(new_dir, true);
1043*4882a593Smuzhiyun 	}
1044*4882a593Smuzhiyun 
1045*4882a593Smuzhiyun 	f2fs_down_write(&F2FS_I(old_inode)->i_sem);
1046*4882a593Smuzhiyun 	if (!old_dir_entry || whiteout)
1047*4882a593Smuzhiyun 		file_lost_pino(old_inode);
1048*4882a593Smuzhiyun 	else
1049*4882a593Smuzhiyun 		/* adjust dir's i_pino to pass fsck check */
1050*4882a593Smuzhiyun 		f2fs_i_pino_write(old_inode, new_dir->i_ino);
1051*4882a593Smuzhiyun 	f2fs_up_write(&F2FS_I(old_inode)->i_sem);
1052*4882a593Smuzhiyun 
1053*4882a593Smuzhiyun 	old_inode->i_ctime = current_time(old_inode);
1054*4882a593Smuzhiyun 	f2fs_mark_inode_dirty_sync(old_inode, false);
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun 	f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
1057*4882a593Smuzhiyun 	old_page = NULL;
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 	if (whiteout) {
1060*4882a593Smuzhiyun 		set_inode_flag(whiteout, FI_INC_LINK);
1061*4882a593Smuzhiyun 		err = f2fs_add_link(old_dentry, whiteout);
1062*4882a593Smuzhiyun 		if (err)
1063*4882a593Smuzhiyun 			goto put_out_dir;
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun 		spin_lock(&whiteout->i_lock);
1066*4882a593Smuzhiyun 		whiteout->i_state &= ~I_LINKABLE;
1067*4882a593Smuzhiyun 		spin_unlock(&whiteout->i_lock);
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun 		iput(whiteout);
1070*4882a593Smuzhiyun 	}
1071*4882a593Smuzhiyun 
1072*4882a593Smuzhiyun 	if (old_dir_entry) {
1073*4882a593Smuzhiyun 		if (old_dir != new_dir && !whiteout)
1074*4882a593Smuzhiyun 			f2fs_set_link(old_inode, old_dir_entry,
1075*4882a593Smuzhiyun 						old_dir_page, new_dir);
1076*4882a593Smuzhiyun 		else
1077*4882a593Smuzhiyun 			f2fs_put_page(old_dir_page, 0);
1078*4882a593Smuzhiyun 		f2fs_i_links_write(old_dir, false);
1079*4882a593Smuzhiyun 	}
1080*4882a593Smuzhiyun 	if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT) {
1081*4882a593Smuzhiyun 		f2fs_add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);
1082*4882a593Smuzhiyun 		if (S_ISDIR(old_inode->i_mode))
1083*4882a593Smuzhiyun 			f2fs_add_ino_entry(sbi, old_inode->i_ino,
1084*4882a593Smuzhiyun 							TRANS_DIR_INO);
1085*4882a593Smuzhiyun 	}
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 	if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
1090*4882a593Smuzhiyun 		f2fs_sync_fs(sbi->sb, 1);
1091*4882a593Smuzhiyun 
1092*4882a593Smuzhiyun 	f2fs_update_time(sbi, REQ_TIME);
1093*4882a593Smuzhiyun 	return 0;
1094*4882a593Smuzhiyun 
1095*4882a593Smuzhiyun put_out_dir:
1096*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
1097*4882a593Smuzhiyun 	f2fs_put_page(new_page, 0);
1098*4882a593Smuzhiyun out_dir:
1099*4882a593Smuzhiyun 	if (old_dir_entry)
1100*4882a593Smuzhiyun 		f2fs_put_page(old_dir_page, 0);
1101*4882a593Smuzhiyun out_old:
1102*4882a593Smuzhiyun 	f2fs_put_page(old_page, 0);
1103*4882a593Smuzhiyun out:
1104*4882a593Smuzhiyun 	if (whiteout)
1105*4882a593Smuzhiyun 		iput(whiteout);
1106*4882a593Smuzhiyun 	return err;
1107*4882a593Smuzhiyun }
1108*4882a593Smuzhiyun 
f2fs_cross_rename(struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry)1109*4882a593Smuzhiyun static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
1110*4882a593Smuzhiyun 			     struct inode *new_dir, struct dentry *new_dentry)
1111*4882a593Smuzhiyun {
1112*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);
1113*4882a593Smuzhiyun 	struct inode *old_inode = d_inode(old_dentry);
1114*4882a593Smuzhiyun 	struct inode *new_inode = d_inode(new_dentry);
1115*4882a593Smuzhiyun 	struct page *old_dir_page, *new_dir_page;
1116*4882a593Smuzhiyun 	struct page *old_page, *new_page;
1117*4882a593Smuzhiyun 	struct f2fs_dir_entry *old_dir_entry = NULL, *new_dir_entry = NULL;
1118*4882a593Smuzhiyun 	struct f2fs_dir_entry *old_entry, *new_entry;
1119*4882a593Smuzhiyun 	int old_nlink = 0, new_nlink = 0;
1120*4882a593Smuzhiyun 	int err;
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi)))
1123*4882a593Smuzhiyun 		return -EIO;
1124*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi))
1125*4882a593Smuzhiyun 		return -ENOSPC;
1126*4882a593Smuzhiyun 
1127*4882a593Smuzhiyun 	if ((is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
1128*4882a593Smuzhiyun 			!projid_eq(F2FS_I(new_dir)->i_projid,
1129*4882a593Smuzhiyun 			F2FS_I(old_dentry->d_inode)->i_projid)) ||
1130*4882a593Smuzhiyun 	    (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
1131*4882a593Smuzhiyun 			!projid_eq(F2FS_I(old_dir)->i_projid,
1132*4882a593Smuzhiyun 			F2FS_I(new_dentry->d_inode)->i_projid)))
1133*4882a593Smuzhiyun 		return -EXDEV;
1134*4882a593Smuzhiyun 
1135*4882a593Smuzhiyun 	err = dquot_initialize(old_dir);
1136*4882a593Smuzhiyun 	if (err)
1137*4882a593Smuzhiyun 		goto out;
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun 	err = dquot_initialize(new_dir);
1140*4882a593Smuzhiyun 	if (err)
1141*4882a593Smuzhiyun 		goto out;
1142*4882a593Smuzhiyun 
1143*4882a593Smuzhiyun 	err = -ENOENT;
1144*4882a593Smuzhiyun 	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
1145*4882a593Smuzhiyun 	if (!old_entry) {
1146*4882a593Smuzhiyun 		if (IS_ERR(old_page))
1147*4882a593Smuzhiyun 			err = PTR_ERR(old_page);
1148*4882a593Smuzhiyun 		goto out;
1149*4882a593Smuzhiyun 	}
1150*4882a593Smuzhiyun 
1151*4882a593Smuzhiyun 	new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, &new_page);
1152*4882a593Smuzhiyun 	if (!new_entry) {
1153*4882a593Smuzhiyun 		if (IS_ERR(new_page))
1154*4882a593Smuzhiyun 			err = PTR_ERR(new_page);
1155*4882a593Smuzhiyun 		goto out_old;
1156*4882a593Smuzhiyun 	}
1157*4882a593Smuzhiyun 
1158*4882a593Smuzhiyun 	/* prepare for updating ".." directory entry info later */
1159*4882a593Smuzhiyun 	if (old_dir != new_dir) {
1160*4882a593Smuzhiyun 		if (S_ISDIR(old_inode->i_mode)) {
1161*4882a593Smuzhiyun 			old_dir_entry = f2fs_parent_dir(old_inode,
1162*4882a593Smuzhiyun 							&old_dir_page);
1163*4882a593Smuzhiyun 			if (!old_dir_entry) {
1164*4882a593Smuzhiyun 				if (IS_ERR(old_dir_page))
1165*4882a593Smuzhiyun 					err = PTR_ERR(old_dir_page);
1166*4882a593Smuzhiyun 				goto out_new;
1167*4882a593Smuzhiyun 			}
1168*4882a593Smuzhiyun 		}
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun 		if (S_ISDIR(new_inode->i_mode)) {
1171*4882a593Smuzhiyun 			new_dir_entry = f2fs_parent_dir(new_inode,
1172*4882a593Smuzhiyun 							&new_dir_page);
1173*4882a593Smuzhiyun 			if (!new_dir_entry) {
1174*4882a593Smuzhiyun 				if (IS_ERR(new_dir_page))
1175*4882a593Smuzhiyun 					err = PTR_ERR(new_dir_page);
1176*4882a593Smuzhiyun 				goto out_old_dir;
1177*4882a593Smuzhiyun 			}
1178*4882a593Smuzhiyun 		}
1179*4882a593Smuzhiyun 	}
1180*4882a593Smuzhiyun 
1181*4882a593Smuzhiyun 	/*
1182*4882a593Smuzhiyun 	 * If cross rename between file and directory those are not
1183*4882a593Smuzhiyun 	 * in the same directory, we will inc nlink of file's parent
1184*4882a593Smuzhiyun 	 * later, so we should check upper boundary of its nlink.
1185*4882a593Smuzhiyun 	 */
1186*4882a593Smuzhiyun 	if ((!old_dir_entry || !new_dir_entry) &&
1187*4882a593Smuzhiyun 				old_dir_entry != new_dir_entry) {
1188*4882a593Smuzhiyun 		old_nlink = old_dir_entry ? -1 : 1;
1189*4882a593Smuzhiyun 		new_nlink = -old_nlink;
1190*4882a593Smuzhiyun 		err = -EMLINK;
1191*4882a593Smuzhiyun 		if ((old_nlink > 0 && old_dir->i_nlink >= F2FS_LINK_MAX) ||
1192*4882a593Smuzhiyun 			(new_nlink > 0 && new_dir->i_nlink >= F2FS_LINK_MAX))
1193*4882a593Smuzhiyun 			goto out_new_dir;
1194*4882a593Smuzhiyun 	}
1195*4882a593Smuzhiyun 
1196*4882a593Smuzhiyun 	f2fs_balance_fs(sbi, true);
1197*4882a593Smuzhiyun 
1198*4882a593Smuzhiyun 	f2fs_lock_op(sbi);
1199*4882a593Smuzhiyun 
1200*4882a593Smuzhiyun 	/* update ".." directory entry info of old dentry */
1201*4882a593Smuzhiyun 	if (old_dir_entry)
1202*4882a593Smuzhiyun 		f2fs_set_link(old_inode, old_dir_entry, old_dir_page, new_dir);
1203*4882a593Smuzhiyun 
1204*4882a593Smuzhiyun 	/* update ".." directory entry info of new dentry */
1205*4882a593Smuzhiyun 	if (new_dir_entry)
1206*4882a593Smuzhiyun 		f2fs_set_link(new_inode, new_dir_entry, new_dir_page, old_dir);
1207*4882a593Smuzhiyun 
1208*4882a593Smuzhiyun 	/* update directory entry info of old dir inode */
1209*4882a593Smuzhiyun 	f2fs_set_link(old_dir, old_entry, old_page, new_inode);
1210*4882a593Smuzhiyun 
1211*4882a593Smuzhiyun 	f2fs_down_write(&F2FS_I(old_inode)->i_sem);
1212*4882a593Smuzhiyun 	if (!old_dir_entry)
1213*4882a593Smuzhiyun 		file_lost_pino(old_inode);
1214*4882a593Smuzhiyun 	else
1215*4882a593Smuzhiyun 		/* adjust dir's i_pino to pass fsck check */
1216*4882a593Smuzhiyun 		f2fs_i_pino_write(old_inode, new_dir->i_ino);
1217*4882a593Smuzhiyun 	f2fs_up_write(&F2FS_I(old_inode)->i_sem);
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun 	old_dir->i_ctime = current_time(old_dir);
1220*4882a593Smuzhiyun 	if (old_nlink) {
1221*4882a593Smuzhiyun 		f2fs_down_write(&F2FS_I(old_dir)->i_sem);
1222*4882a593Smuzhiyun 		f2fs_i_links_write(old_dir, old_nlink > 0);
1223*4882a593Smuzhiyun 		f2fs_up_write(&F2FS_I(old_dir)->i_sem);
1224*4882a593Smuzhiyun 	}
1225*4882a593Smuzhiyun 	f2fs_mark_inode_dirty_sync(old_dir, false);
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun 	/* update directory entry info of new dir inode */
1228*4882a593Smuzhiyun 	f2fs_set_link(new_dir, new_entry, new_page, old_inode);
1229*4882a593Smuzhiyun 
1230*4882a593Smuzhiyun 	f2fs_down_write(&F2FS_I(new_inode)->i_sem);
1231*4882a593Smuzhiyun 	if (!new_dir_entry)
1232*4882a593Smuzhiyun 		file_lost_pino(new_inode);
1233*4882a593Smuzhiyun 	else
1234*4882a593Smuzhiyun 		/* adjust dir's i_pino to pass fsck check */
1235*4882a593Smuzhiyun 		f2fs_i_pino_write(new_inode, old_dir->i_ino);
1236*4882a593Smuzhiyun 	f2fs_up_write(&F2FS_I(new_inode)->i_sem);
1237*4882a593Smuzhiyun 
1238*4882a593Smuzhiyun 	new_dir->i_ctime = current_time(new_dir);
1239*4882a593Smuzhiyun 	if (new_nlink) {
1240*4882a593Smuzhiyun 		f2fs_down_write(&F2FS_I(new_dir)->i_sem);
1241*4882a593Smuzhiyun 		f2fs_i_links_write(new_dir, new_nlink > 0);
1242*4882a593Smuzhiyun 		f2fs_up_write(&F2FS_I(new_dir)->i_sem);
1243*4882a593Smuzhiyun 	}
1244*4882a593Smuzhiyun 	f2fs_mark_inode_dirty_sync(new_dir, false);
1245*4882a593Smuzhiyun 
1246*4882a593Smuzhiyun 	if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT) {
1247*4882a593Smuzhiyun 		f2fs_add_ino_entry(sbi, old_dir->i_ino, TRANS_DIR_INO);
1248*4882a593Smuzhiyun 		f2fs_add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);
1249*4882a593Smuzhiyun 	}
1250*4882a593Smuzhiyun 
1251*4882a593Smuzhiyun 	f2fs_unlock_op(sbi);
1252*4882a593Smuzhiyun 
1253*4882a593Smuzhiyun 	if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
1254*4882a593Smuzhiyun 		f2fs_sync_fs(sbi->sb, 1);
1255*4882a593Smuzhiyun 
1256*4882a593Smuzhiyun 	f2fs_update_time(sbi, REQ_TIME);
1257*4882a593Smuzhiyun 	return 0;
1258*4882a593Smuzhiyun out_new_dir:
1259*4882a593Smuzhiyun 	if (new_dir_entry) {
1260*4882a593Smuzhiyun 		f2fs_put_page(new_dir_page, 0);
1261*4882a593Smuzhiyun 	}
1262*4882a593Smuzhiyun out_old_dir:
1263*4882a593Smuzhiyun 	if (old_dir_entry) {
1264*4882a593Smuzhiyun 		f2fs_put_page(old_dir_page, 0);
1265*4882a593Smuzhiyun 	}
1266*4882a593Smuzhiyun out_new:
1267*4882a593Smuzhiyun 	f2fs_put_page(new_page, 0);
1268*4882a593Smuzhiyun out_old:
1269*4882a593Smuzhiyun 	f2fs_put_page(old_page, 0);
1270*4882a593Smuzhiyun out:
1271*4882a593Smuzhiyun 	return err;
1272*4882a593Smuzhiyun }
1273*4882a593Smuzhiyun 
f2fs_rename2(struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry,unsigned int flags)1274*4882a593Smuzhiyun static int f2fs_rename2(struct inode *old_dir, struct dentry *old_dentry,
1275*4882a593Smuzhiyun 			struct inode *new_dir, struct dentry *new_dentry,
1276*4882a593Smuzhiyun 			unsigned int flags)
1277*4882a593Smuzhiyun {
1278*4882a593Smuzhiyun 	int err;
1279*4882a593Smuzhiyun 
1280*4882a593Smuzhiyun 	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
1281*4882a593Smuzhiyun 		return -EINVAL;
1282*4882a593Smuzhiyun 
1283*4882a593Smuzhiyun 	err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
1284*4882a593Smuzhiyun 				     flags);
1285*4882a593Smuzhiyun 	if (err)
1286*4882a593Smuzhiyun 		return err;
1287*4882a593Smuzhiyun 
1288*4882a593Smuzhiyun 	if (flags & RENAME_EXCHANGE) {
1289*4882a593Smuzhiyun 		return f2fs_cross_rename(old_dir, old_dentry,
1290*4882a593Smuzhiyun 					 new_dir, new_dentry);
1291*4882a593Smuzhiyun 	}
1292*4882a593Smuzhiyun 	/*
1293*4882a593Smuzhiyun 	 * VFS has already handled the new dentry existence case,
1294*4882a593Smuzhiyun 	 * here, we just deal with "RENAME_NOREPLACE" as regular rename.
1295*4882a593Smuzhiyun 	 */
1296*4882a593Smuzhiyun 	return f2fs_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
1297*4882a593Smuzhiyun }
1298*4882a593Smuzhiyun 
f2fs_encrypted_get_link(struct dentry * dentry,struct inode * inode,struct delayed_call * done)1299*4882a593Smuzhiyun static const char *f2fs_encrypted_get_link(struct dentry *dentry,
1300*4882a593Smuzhiyun 					   struct inode *inode,
1301*4882a593Smuzhiyun 					   struct delayed_call *done)
1302*4882a593Smuzhiyun {
1303*4882a593Smuzhiyun 	struct page *page;
1304*4882a593Smuzhiyun 	const char *target;
1305*4882a593Smuzhiyun 
1306*4882a593Smuzhiyun 	if (!dentry)
1307*4882a593Smuzhiyun 		return ERR_PTR(-ECHILD);
1308*4882a593Smuzhiyun 
1309*4882a593Smuzhiyun 	page = read_mapping_page(inode->i_mapping, 0, NULL);
1310*4882a593Smuzhiyun 	if (IS_ERR(page))
1311*4882a593Smuzhiyun 		return ERR_CAST(page);
1312*4882a593Smuzhiyun 
1313*4882a593Smuzhiyun 	target = fscrypt_get_symlink(inode, page_address(page),
1314*4882a593Smuzhiyun 				     inode->i_sb->s_blocksize, done);
1315*4882a593Smuzhiyun 	put_page(page);
1316*4882a593Smuzhiyun 	return target;
1317*4882a593Smuzhiyun }
1318*4882a593Smuzhiyun 
f2fs_encrypted_symlink_getattr(const struct path * path,struct kstat * stat,u32 request_mask,unsigned int query_flags)1319*4882a593Smuzhiyun static int f2fs_encrypted_symlink_getattr(const struct path *path,
1320*4882a593Smuzhiyun 					  struct kstat *stat, u32 request_mask,
1321*4882a593Smuzhiyun 					  unsigned int query_flags)
1322*4882a593Smuzhiyun {
1323*4882a593Smuzhiyun 	f2fs_getattr(path, stat, request_mask, query_flags);
1324*4882a593Smuzhiyun 
1325*4882a593Smuzhiyun 	return fscrypt_symlink_getattr(path, stat);
1326*4882a593Smuzhiyun }
1327*4882a593Smuzhiyun 
1328*4882a593Smuzhiyun const struct inode_operations f2fs_encrypted_symlink_inode_operations = {
1329*4882a593Smuzhiyun 	.get_link	= f2fs_encrypted_get_link,
1330*4882a593Smuzhiyun 	.getattr	= f2fs_encrypted_symlink_getattr,
1331*4882a593Smuzhiyun 	.setattr	= f2fs_setattr,
1332*4882a593Smuzhiyun 	.listxattr	= f2fs_listxattr,
1333*4882a593Smuzhiyun };
1334*4882a593Smuzhiyun 
1335*4882a593Smuzhiyun const struct inode_operations f2fs_dir_inode_operations = {
1336*4882a593Smuzhiyun 	.create		= f2fs_create,
1337*4882a593Smuzhiyun 	.lookup		= f2fs_lookup,
1338*4882a593Smuzhiyun 	.link		= f2fs_link,
1339*4882a593Smuzhiyun 	.unlink		= f2fs_unlink,
1340*4882a593Smuzhiyun 	.symlink	= f2fs_symlink,
1341*4882a593Smuzhiyun 	.mkdir		= f2fs_mkdir,
1342*4882a593Smuzhiyun 	.rmdir		= f2fs_rmdir,
1343*4882a593Smuzhiyun 	.mknod		= f2fs_mknod,
1344*4882a593Smuzhiyun 	.rename		= f2fs_rename2,
1345*4882a593Smuzhiyun 	.tmpfile	= f2fs_tmpfile,
1346*4882a593Smuzhiyun 	.getattr	= f2fs_getattr,
1347*4882a593Smuzhiyun 	.setattr	= f2fs_setattr,
1348*4882a593Smuzhiyun 	.get_acl	= f2fs_get_acl,
1349*4882a593Smuzhiyun 	.set_acl	= f2fs_set_acl,
1350*4882a593Smuzhiyun 	.listxattr	= f2fs_listxattr,
1351*4882a593Smuzhiyun 	.fiemap		= f2fs_fiemap,
1352*4882a593Smuzhiyun };
1353*4882a593Smuzhiyun 
1354*4882a593Smuzhiyun const struct inode_operations f2fs_symlink_inode_operations = {
1355*4882a593Smuzhiyun 	.get_link	= f2fs_get_link,
1356*4882a593Smuzhiyun 	.getattr	= f2fs_getattr,
1357*4882a593Smuzhiyun 	.setattr	= f2fs_setattr,
1358*4882a593Smuzhiyun 	.listxattr	= f2fs_listxattr,
1359*4882a593Smuzhiyun };
1360*4882a593Smuzhiyun 
1361*4882a593Smuzhiyun const struct inode_operations f2fs_special_inode_operations = {
1362*4882a593Smuzhiyun 	.getattr	= f2fs_getattr,
1363*4882a593Smuzhiyun 	.setattr	= f2fs_setattr,
1364*4882a593Smuzhiyun 	.get_acl	= f2fs_get_acl,
1365*4882a593Smuzhiyun 	.set_acl	= f2fs_set_acl,
1366*4882a593Smuzhiyun 	.listxattr	= f2fs_listxattr,
1367*4882a593Smuzhiyun };
1368