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