xref: /linux/fs/ubifs/dir.c (revision bc401c29)
12b27bdccSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21e51764aSArtem Bityutskiy /* * This file is part of UBIFS.
31e51764aSArtem Bityutskiy  *
41e51764aSArtem Bityutskiy  * Copyright (C) 2006-2008 Nokia Corporation.
51e51764aSArtem Bityutskiy  * Copyright (C) 2006, 2007 University of Szeged, Hungary
61e51764aSArtem Bityutskiy  *
71e51764aSArtem Bityutskiy  * Authors: Artem Bityutskiy (Битюцкий Артём)
81e51764aSArtem Bityutskiy  *          Adrian Hunter
91e51764aSArtem Bityutskiy  *          Zoltan Sogor
101e51764aSArtem Bityutskiy  */
111e51764aSArtem Bityutskiy 
121e51764aSArtem Bityutskiy /*
131e51764aSArtem Bityutskiy  * This file implements directory operations.
141e51764aSArtem Bityutskiy  *
151e51764aSArtem Bityutskiy  * All FS operations in this file allocate budget before writing anything to the
161e51764aSArtem Bityutskiy  * media. If they fail to allocate it, the error is returned. The only
171e51764aSArtem Bityutskiy  * exceptions are 'ubifs_unlink()' and 'ubifs_rmdir()' which keep working even
181e51764aSArtem Bityutskiy  * if they unable to allocate the budget, because deletion %-ENOSPC failure is
191e51764aSArtem Bityutskiy  * not what users are usually ready to get. UBIFS budgeting subsystem has some
201e51764aSArtem Bityutskiy  * space reserved for these purposes.
211e51764aSArtem Bityutskiy  *
221e51764aSArtem Bityutskiy  * All operations in this file write all inodes which they change straight
231e51764aSArtem Bityutskiy  * away, instead of marking them dirty. For example, 'ubifs_link()' changes
241e51764aSArtem Bityutskiy  * @i_size of the parent inode and writes the parent inode together with the
251e51764aSArtem Bityutskiy  * target inode. This was done to simplify file-system recovery which would
261e51764aSArtem Bityutskiy  * otherwise be very difficult to do. The only exception is rename which marks
271e51764aSArtem Bityutskiy  * the re-named inode dirty (because its @i_ctime is updated) but does not
281e51764aSArtem Bityutskiy  * write it, but just marks it as dirty.
291e51764aSArtem Bityutskiy  */
301e51764aSArtem Bityutskiy 
311e51764aSArtem Bityutskiy #include "ubifs.h"
321e51764aSArtem Bityutskiy 
331e51764aSArtem Bityutskiy /**
341e51764aSArtem Bityutskiy  * inherit_flags - inherit flags of the parent inode.
351e51764aSArtem Bityutskiy  * @dir: parent inode
361e51764aSArtem Bityutskiy  * @mode: new inode mode flags
371e51764aSArtem Bityutskiy  *
381e51764aSArtem Bityutskiy  * This is a helper function for 'ubifs_new_inode()' which inherits flag of the
391e51764aSArtem Bityutskiy  * parent directory inode @dir. UBIFS inodes inherit the following flags:
401e51764aSArtem Bityutskiy  * o %UBIFS_COMPR_FL, which is useful to switch compression on/of on
411e51764aSArtem Bityutskiy  *   sub-directory basis;
421e51764aSArtem Bityutskiy  * o %UBIFS_SYNC_FL - useful for the same reasons;
431e51764aSArtem Bityutskiy  * o %UBIFS_DIRSYNC_FL - similar, but relevant only to directories.
441e51764aSArtem Bityutskiy  *
451e51764aSArtem Bityutskiy  * This function returns the inherited flags.
461e51764aSArtem Bityutskiy  */
inherit_flags(const struct inode * dir,umode_t mode)47ad44be5cSAl Viro static int inherit_flags(const struct inode *dir, umode_t mode)
481e51764aSArtem Bityutskiy {
491e51764aSArtem Bityutskiy 	int flags;
501e51764aSArtem Bityutskiy 	const struct ubifs_inode *ui = ubifs_inode(dir);
511e51764aSArtem Bityutskiy 
521e51764aSArtem Bityutskiy 	if (!S_ISDIR(dir->i_mode))
531e51764aSArtem Bityutskiy 		/*
541e51764aSArtem Bityutskiy 		 * The parent is not a directory, which means that an extended
551e51764aSArtem Bityutskiy 		 * attribute inode is being created. No flags.
561e51764aSArtem Bityutskiy 		 */
571e51764aSArtem Bityutskiy 		return 0;
581e51764aSArtem Bityutskiy 
591e51764aSArtem Bityutskiy 	flags = ui->flags & (UBIFS_COMPR_FL | UBIFS_SYNC_FL | UBIFS_DIRSYNC_FL);
601e51764aSArtem Bityutskiy 	if (!S_ISDIR(mode))
611e51764aSArtem Bityutskiy 		/* The "DIRSYNC" flag only applies to directories */
621e51764aSArtem Bityutskiy 		flags &= ~UBIFS_DIRSYNC_FL;
631e51764aSArtem Bityutskiy 	return flags;
641e51764aSArtem Bityutskiy }
651e51764aSArtem Bityutskiy 
661e51764aSArtem Bityutskiy /**
671e51764aSArtem Bityutskiy  * ubifs_new_inode - allocate new UBIFS inode object.
681e51764aSArtem Bityutskiy  * @c: UBIFS file-system description object
691e51764aSArtem Bityutskiy  * @dir: parent directory inode
701e51764aSArtem Bityutskiy  * @mode: inode mode flags
71a0c51565SZhihao Cheng  * @is_xattr: whether the inode is xattr inode
721e51764aSArtem Bityutskiy  *
731e51764aSArtem Bityutskiy  * This function finds an unused inode number, allocates new inode and
741e51764aSArtem Bityutskiy  * initializes it. Returns new inode in case of success and an error code in
751e51764aSArtem Bityutskiy  * case of failure.
761e51764aSArtem Bityutskiy  */
ubifs_new_inode(struct ubifs_info * c,struct inode * dir,umode_t mode,bool is_xattr)77d475a507SRichard Weinberger struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
78a0c51565SZhihao Cheng 			      umode_t mode, bool is_xattr)
791e51764aSArtem Bityutskiy {
80d475a507SRichard Weinberger 	int err;
811e51764aSArtem Bityutskiy 	struct inode *inode;
821e51764aSArtem Bityutskiy 	struct ubifs_inode *ui;
83d475a507SRichard Weinberger 	bool encrypted = false;
84d475a507SRichard Weinberger 
851e51764aSArtem Bityutskiy 	inode = new_inode(c->vfs_sb);
861e51764aSArtem Bityutskiy 	ui = ubifs_inode(inode);
871e51764aSArtem Bityutskiy 	if (!inode)
881e51764aSArtem Bityutskiy 		return ERR_PTR(-ENOMEM);
891e51764aSArtem Bityutskiy 
901e51764aSArtem Bityutskiy 	/*
911e51764aSArtem Bityutskiy 	 * Set 'S_NOCMTIME' to prevent VFS form updating [mc]time of inodes and
921e51764aSArtem Bityutskiy 	 * marking them dirty in file write path (see 'file_update_time()').
931e51764aSArtem Bityutskiy 	 * UBIFS has to fully control "clean <-> dirty" transitions of inodes
941e51764aSArtem Bityutskiy 	 * to make budgeting work.
951e51764aSArtem Bityutskiy 	 */
9612e776a0SArtem Bityutskiy 	inode->i_flags |= S_NOCMTIME;
971e51764aSArtem Bityutskiy 
98f2d40141SChristian Brauner 	inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
99e4cfef33SJeff Layton 	simple_inode_init_ts(inode);
1001e51764aSArtem Bityutskiy 	inode->i_mapping->nrpages = 0;
1011e51764aSArtem Bityutskiy 
102a0c51565SZhihao Cheng 	if (!is_xattr) {
1034c030fa8SEric Biggers 		err = fscrypt_prepare_new_inode(dir, inode, &encrypted);
1044c030fa8SEric Biggers 		if (err) {
1054c030fa8SEric Biggers 			ubifs_err(c, "fscrypt_prepare_new_inode failed: %i", err);
1064c030fa8SEric Biggers 			goto out_iput;
1074c030fa8SEric Biggers 		}
108a0c51565SZhihao Cheng 	}
1094c030fa8SEric Biggers 
1101e51764aSArtem Bityutskiy 	switch (mode & S_IFMT) {
1111e51764aSArtem Bityutskiy 	case S_IFREG:
1121e51764aSArtem Bityutskiy 		inode->i_mapping->a_ops = &ubifs_file_address_operations;
1131e51764aSArtem Bityutskiy 		inode->i_op = &ubifs_file_inode_operations;
1141e51764aSArtem Bityutskiy 		inode->i_fop = &ubifs_file_operations;
1151e51764aSArtem Bityutskiy 		break;
1161e51764aSArtem Bityutskiy 	case S_IFDIR:
1171e51764aSArtem Bityutskiy 		inode->i_op  = &ubifs_dir_inode_operations;
1181e51764aSArtem Bityutskiy 		inode->i_fop = &ubifs_dir_operations;
1191e51764aSArtem Bityutskiy 		inode->i_size = ui->ui_size = UBIFS_INO_NODE_SZ;
1201e51764aSArtem Bityutskiy 		break;
1211e51764aSArtem Bityutskiy 	case S_IFLNK:
1221e51764aSArtem Bityutskiy 		inode->i_op = &ubifs_symlink_inode_operations;
1231e51764aSArtem Bityutskiy 		break;
1241e51764aSArtem Bityutskiy 	case S_IFSOCK:
1251e51764aSArtem Bityutskiy 	case S_IFIFO:
1261e51764aSArtem Bityutskiy 	case S_IFBLK:
1271e51764aSArtem Bityutskiy 	case S_IFCHR:
1281e51764aSArtem Bityutskiy 		inode->i_op  = &ubifs_file_inode_operations;
1291e51764aSArtem Bityutskiy 		break;
1301e51764aSArtem Bityutskiy 	default:
1311e51764aSArtem Bityutskiy 		BUG();
1321e51764aSArtem Bityutskiy 	}
1331e51764aSArtem Bityutskiy 
1341e51764aSArtem Bityutskiy 	ui->flags = inherit_flags(dir, mode);
1351e51764aSArtem Bityutskiy 	ubifs_set_inode_flags(inode);
1361e51764aSArtem Bityutskiy 	if (S_ISREG(mode))
1371e51764aSArtem Bityutskiy 		ui->compr_type = c->default_compr;
1381e51764aSArtem Bityutskiy 	else
1391e51764aSArtem Bityutskiy 		ui->compr_type = UBIFS_COMPR_NONE;
1401e51764aSArtem Bityutskiy 	ui->synced_i_size = 0;
1411e51764aSArtem Bityutskiy 
1421e51764aSArtem Bityutskiy 	spin_lock(&c->cnt_lock);
1431e51764aSArtem Bityutskiy 	/* Inode number overflow is currently not supported */
1441e51764aSArtem Bityutskiy 	if (c->highest_inum >= INUM_WARN_WATERMARK) {
1451e51764aSArtem Bityutskiy 		if (c->highest_inum >= INUM_WATERMARK) {
1461e51764aSArtem Bityutskiy 			spin_unlock(&c->cnt_lock);
147235c362bSSheng Yong 			ubifs_err(c, "out of inode numbers");
1484c030fa8SEric Biggers 			err = -EINVAL;
1494c030fa8SEric Biggers 			goto out_iput;
1501e51764aSArtem Bityutskiy 		}
1511a7e985dSSheng Yong 		ubifs_warn(c, "running out of inode numbers (current %lu, max %u)",
152e84461adSArtem Bityutskiy 			   (unsigned long)c->highest_inum, INUM_WATERMARK);
1531e51764aSArtem Bityutskiy 	}
1541e51764aSArtem Bityutskiy 
1551e51764aSArtem Bityutskiy 	inode->i_ino = ++c->highest_inum;
1561e51764aSArtem Bityutskiy 	/*
1571e51764aSArtem Bityutskiy 	 * The creation sequence number remains with this inode for its
1581e51764aSArtem Bityutskiy 	 * lifetime. All nodes for this inode have a greater sequence number,
1591e51764aSArtem Bityutskiy 	 * and so it is possible to distinguish obsolete nodes belonging to a
1601e51764aSArtem Bityutskiy 	 * previous incarnation of the same inode number - for example, for the
1611e51764aSArtem Bityutskiy 	 * purpose of rebuilding the index.
1621e51764aSArtem Bityutskiy 	 */
1631e51764aSArtem Bityutskiy 	ui->creat_sqnum = ++c->max_sqnum;
1641e51764aSArtem Bityutskiy 	spin_unlock(&c->cnt_lock);
165d475a507SRichard Weinberger 
166d475a507SRichard Weinberger 	if (encrypted) {
1674c030fa8SEric Biggers 		err = fscrypt_set_context(inode, NULL);
168d475a507SRichard Weinberger 		if (err) {
1694c030fa8SEric Biggers 			ubifs_err(c, "fscrypt_set_context failed: %i", err);
1704c030fa8SEric Biggers 			goto out_iput;
171d475a507SRichard Weinberger 		}
172d475a507SRichard Weinberger 	}
173d475a507SRichard Weinberger 
1741e51764aSArtem Bityutskiy 	return inode;
1754c030fa8SEric Biggers 
1764c030fa8SEric Biggers out_iput:
1774c030fa8SEric Biggers 	make_bad_inode(inode);
1784c030fa8SEric Biggers 	iput(inode);
1794c030fa8SEric Biggers 	return ERR_PTR(err);
1801e51764aSArtem Bityutskiy }
1811e51764aSArtem Bityutskiy 
dbg_check_name(const struct ubifs_info * c,const struct ubifs_dent_node * dent,const struct fscrypt_name * nm)182bb2615d4SArtem Bityutskiy static int dbg_check_name(const struct ubifs_info *c,
183bb2615d4SArtem Bityutskiy 			  const struct ubifs_dent_node *dent,
184f4f61d2cSRichard Weinberger 			  const struct fscrypt_name *nm)
1851e51764aSArtem Bityutskiy {
1862b1844a8SArtem Bityutskiy 	if (!dbg_is_chk_gen(c))
1871e51764aSArtem Bityutskiy 		return 0;
188f4f61d2cSRichard Weinberger 	if (le16_to_cpu(dent->nlen) != fname_len(nm))
1891e51764aSArtem Bityutskiy 		return -EINVAL;
190f4f61d2cSRichard Weinberger 	if (memcmp(dent->name, fname_name(nm), fname_len(nm)))
1911e51764aSArtem Bityutskiy 		return -EINVAL;
1921e51764aSArtem Bityutskiy 	return 0;
1931e51764aSArtem Bityutskiy }
1941e51764aSArtem Bityutskiy 
ubifs_lookup(struct inode * dir,struct dentry * dentry,unsigned int flags)1951e51764aSArtem Bityutskiy static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry,
19600cd8dd3SAl Viro 				   unsigned int flags)
1971e51764aSArtem Bityutskiy {
1981e51764aSArtem Bityutskiy 	int err;
1991e51764aSArtem Bityutskiy 	union ubifs_key key;
2001e51764aSArtem Bityutskiy 	struct inode *inode = NULL;
201191ac107SAl Viro 	struct ubifs_dent_node *dent = NULL;
2021e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
203f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
2041e51764aSArtem Bityutskiy 
2054cb2a01dSAl Viro 	dbg_gen("'%pd' in dir ino %lu", dentry, dir->i_ino);
2061e51764aSArtem Bityutskiy 
207b01531dbSEric Biggers 	err = fscrypt_prepare_lookup(dir, dentry, &nm);
208b01531dbSEric Biggers 	if (err == -ENOENT)
209b01531dbSEric Biggers 		return d_splice_alias(NULL, dentry);
210f4f61d2cSRichard Weinberger 	if (err)
211f4f61d2cSRichard Weinberger 		return ERR_PTR(err);
212f4f61d2cSRichard Weinberger 
213f4f61d2cSRichard Weinberger 	if (fname_len(&nm) > UBIFS_MAX_NLEN) {
214191ac107SAl Viro 		inode = ERR_PTR(-ENAMETOOLONG);
215191ac107SAl Viro 		goto done;
216f4f61d2cSRichard Weinberger 	}
2171e51764aSArtem Bityutskiy 
2181e51764aSArtem Bityutskiy 	dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS);
219f4f61d2cSRichard Weinberger 	if (!dent) {
220191ac107SAl Viro 		inode = ERR_PTR(-ENOMEM);
221191ac107SAl Viro 		goto done;
222f4f61d2cSRichard Weinberger 	}
2231e51764aSArtem Bityutskiy 
224aec992aaSEric Biggers 	if (fname_name(&nm) == NULL) {
225f0d07a98SEric Biggers 		if (nm.hash & ~UBIFS_S_KEY_HASH_MASK)
226f0d07a98SEric Biggers 			goto done; /* ENOENT */
227f4f61d2cSRichard Weinberger 		dent_key_init_hash(c, &key, dir->i_ino, nm.hash);
228528e3d17SRichard Weinberger 		err = ubifs_tnc_lookup_dh(c, &key, dent, nm.minor_hash);
229f4f61d2cSRichard Weinberger 	} else {
230f4f61d2cSRichard Weinberger 		dent_key_init(c, &key, dir->i_ino, &nm);
231f4f61d2cSRichard Weinberger 		err = ubifs_tnc_lookup_nm(c, &key, dent, &nm);
232f4f61d2cSRichard Weinberger 	}
2331e51764aSArtem Bityutskiy 
2341e51764aSArtem Bityutskiy 	if (err) {
235191ac107SAl Viro 		if (err == -ENOENT)
2361e51764aSArtem Bityutskiy 			dbg_gen("not found");
237191ac107SAl Viro 		else
238191ac107SAl Viro 			inode = ERR_PTR(err);
2391e51764aSArtem Bityutskiy 		goto done;
2401e51764aSArtem Bityutskiy 	}
2411e51764aSArtem Bityutskiy 
242f4f61d2cSRichard Weinberger 	if (dbg_check_name(c, dent, &nm)) {
243191ac107SAl Viro 		inode = ERR_PTR(-EINVAL);
244191ac107SAl Viro 		goto done;
2451e51764aSArtem Bityutskiy 	}
2461e51764aSArtem Bityutskiy 
2471e51764aSArtem Bityutskiy 	inode = ubifs_iget(dir->i_sb, le64_to_cpu(dent->inum));
2481e51764aSArtem Bityutskiy 	if (IS_ERR(inode)) {
2491e51764aSArtem Bityutskiy 		/*
2501e51764aSArtem Bityutskiy 		 * This should not happen. Probably the file-system needs
2511e51764aSArtem Bityutskiy 		 * checking.
2521e51764aSArtem Bityutskiy 		 */
2531e51764aSArtem Bityutskiy 		err = PTR_ERR(inode);
254235c362bSSheng Yong 		ubifs_err(c, "dead directory entry '%pd', error %d",
2554cb2a01dSAl Viro 			  dentry, err);
2561e51764aSArtem Bityutskiy 		ubifs_ro_mode(c, err);
257191ac107SAl Viro 		goto done;
2581e51764aSArtem Bityutskiy 	}
2591e51764aSArtem Bityutskiy 
26050d9fad7SEric Biggers 	if (IS_ENCRYPTED(dir) &&
261413d5a9eSEric Biggers 	    (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
262413d5a9eSEric Biggers 	    !fscrypt_has_permitted_context(dir, inode)) {
263413d5a9eSEric Biggers 		ubifs_warn(c, "Inconsistent encryption contexts: %lu/%lu",
264413d5a9eSEric Biggers 			   dir->i_ino, inode->i_ino);
265191ac107SAl Viro 		iput(inode);
266191ac107SAl Viro 		inode = ERR_PTR(-EPERM);
267413d5a9eSEric Biggers 	}
268413d5a9eSEric Biggers 
2691e51764aSArtem Bityutskiy done:
2701e51764aSArtem Bityutskiy 	kfree(dent);
271f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
272191ac107SAl Viro 	return d_splice_alias(inode, dentry);
2731e51764aSArtem Bityutskiy }
2741e51764aSArtem Bityutskiy 
ubifs_prepare_create(struct inode * dir,struct dentry * dentry,struct fscrypt_name * nm)27576786a0fSEric Biggers static int ubifs_prepare_create(struct inode *dir, struct dentry *dentry,
27676786a0fSEric Biggers 				struct fscrypt_name *nm)
27776786a0fSEric Biggers {
27876786a0fSEric Biggers 	if (fscrypt_is_nokey_name(dentry))
27976786a0fSEric Biggers 		return -ENOKEY;
28076786a0fSEric Biggers 
28176786a0fSEric Biggers 	return fscrypt_setup_filename(dir, &dentry->d_name, 0, nm);
28276786a0fSEric Biggers }
28376786a0fSEric Biggers 
ubifs_create(struct mnt_idmap * idmap,struct inode * dir,struct dentry * dentry,umode_t mode,bool excl)2846c960e68SChristian Brauner static int ubifs_create(struct mnt_idmap *idmap, struct inode *dir,
285549c7297SChristian Brauner 			struct dentry *dentry, umode_t mode, bool excl)
2861e51764aSArtem Bityutskiy {
2871e51764aSArtem Bityutskiy 	struct inode *inode;
2881e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
2891e51764aSArtem Bityutskiy 	struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
2901e51764aSArtem Bityutskiy 					.dirtied_ino = 1 };
2911e51764aSArtem Bityutskiy 	struct ubifs_inode *dir_ui = ubifs_inode(dir);
292f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
293f4f61d2cSRichard Weinberger 	int err, sz_change;
2941e51764aSArtem Bityutskiy 
2951e51764aSArtem Bityutskiy 	/*
2961e51764aSArtem Bityutskiy 	 * Budget request settings: new inode, new direntry, changing the
2971e51764aSArtem Bityutskiy 	 * parent directory inode.
2981e51764aSArtem Bityutskiy 	 */
2991e51764aSArtem Bityutskiy 
3004cb2a01dSAl Viro 	dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
3014cb2a01dSAl Viro 		dentry, mode, dir->i_ino);
3021e51764aSArtem Bityutskiy 
3031e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &req);
3041e51764aSArtem Bityutskiy 	if (err)
3051e51764aSArtem Bityutskiy 		return err;
3061e51764aSArtem Bityutskiy 
30776786a0fSEric Biggers 	err = ubifs_prepare_create(dir, dentry, &nm);
308f4f61d2cSRichard Weinberger 	if (err)
309f4f61d2cSRichard Weinberger 		goto out_budg;
310f4f61d2cSRichard Weinberger 
311f4f61d2cSRichard Weinberger 	sz_change = CALC_DENT_SIZE(fname_len(&nm));
312f4f61d2cSRichard Weinberger 
313a0c51565SZhihao Cheng 	inode = ubifs_new_inode(c, dir, mode, false);
3141e51764aSArtem Bityutskiy 	if (IS_ERR(inode)) {
3151e51764aSArtem Bityutskiy 		err = PTR_ERR(inode);
316f4f61d2cSRichard Weinberger 		goto out_fname;
3171e51764aSArtem Bityutskiy 	}
3181e51764aSArtem Bityutskiy 
319d7f0b70dSSubodh Nijsure 	err = ubifs_init_security(dir, inode, &dentry->d_name);
320d7f0b70dSSubodh Nijsure 	if (err)
3219401a795STaesoo Kim 		goto out_inode;
322d7f0b70dSSubodh Nijsure 
3231e51764aSArtem Bityutskiy 	mutex_lock(&dir_ui->ui_mutex);
3241e51764aSArtem Bityutskiy 	dir->i_size += sz_change;
3251e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
326e4cfef33SJeff Layton 	inode_set_mtime_to_ts(dir,
327e4cfef33SJeff Layton 			      inode_set_ctime_to_ts(dir, inode_get_ctime(inode)));
328f4f61d2cSRichard Weinberger 	err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
3291e51764aSArtem Bityutskiy 	if (err)
3301e51764aSArtem Bityutskiy 		goto out_cancel;
3311e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
3321e51764aSArtem Bityutskiy 
3331e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
334f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
3351e51764aSArtem Bityutskiy 	insert_inode_hash(inode);
3361e51764aSArtem Bityutskiy 	d_instantiate(dentry, inode);
3371e51764aSArtem Bityutskiy 	return 0;
3381e51764aSArtem Bityutskiy 
3391e51764aSArtem Bityutskiy out_cancel:
3401e51764aSArtem Bityutskiy 	dir->i_size -= sz_change;
3411e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
3421e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
3439401a795STaesoo Kim out_inode:
3441e51764aSArtem Bityutskiy 	make_bad_inode(inode);
3451e51764aSArtem Bityutskiy 	iput(inode);
346f4f61d2cSRichard Weinberger out_fname:
347f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
3481e51764aSArtem Bityutskiy out_budg:
3491e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
350235c362bSSheng Yong 	ubifs_err(c, "cannot create regular file, error %d", err);
3511e51764aSArtem Bityutskiy 	return err;
3521e51764aSArtem Bityutskiy }
3531e51764aSArtem Bityutskiy 
create_whiteout(struct inode * dir,struct dentry * dentry)354278d9a24SZhihao Cheng static struct inode *create_whiteout(struct inode *dir, struct dentry *dentry)
355278d9a24SZhihao Cheng {
356278d9a24SZhihao Cheng 	int err;
357278d9a24SZhihao Cheng 	umode_t mode = S_IFCHR | WHITEOUT_MODE;
358278d9a24SZhihao Cheng 	struct inode *inode;
359278d9a24SZhihao Cheng 	struct ubifs_info *c = dir->i_sb->s_fs_info;
360278d9a24SZhihao Cheng 
361278d9a24SZhihao Cheng 	/*
362278d9a24SZhihao Cheng 	 * Create an inode('nlink = 1') for whiteout without updating journal,
363278d9a24SZhihao Cheng 	 * let ubifs_jnl_rename() store it on flash to complete rename whiteout
364278d9a24SZhihao Cheng 	 * atomically.
365278d9a24SZhihao Cheng 	 */
366278d9a24SZhihao Cheng 
367278d9a24SZhihao Cheng 	dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
368278d9a24SZhihao Cheng 		dentry, mode, dir->i_ino);
369278d9a24SZhihao Cheng 
370a0c51565SZhihao Cheng 	inode = ubifs_new_inode(c, dir, mode, false);
371278d9a24SZhihao Cheng 	if (IS_ERR(inode)) {
372278d9a24SZhihao Cheng 		err = PTR_ERR(inode);
373278d9a24SZhihao Cheng 		goto out_free;
374278d9a24SZhihao Cheng 	}
375278d9a24SZhihao Cheng 
376278d9a24SZhihao Cheng 	init_special_inode(inode, inode->i_mode, WHITEOUT_DEV);
377278d9a24SZhihao Cheng 	ubifs_assert(c, inode->i_op == &ubifs_file_inode_operations);
378278d9a24SZhihao Cheng 
379278d9a24SZhihao Cheng 	err = ubifs_init_security(dir, inode, &dentry->d_name);
380278d9a24SZhihao Cheng 	if (err)
381278d9a24SZhihao Cheng 		goto out_inode;
382278d9a24SZhihao Cheng 
383278d9a24SZhihao Cheng 	/* The dir size is updated by do_rename. */
384278d9a24SZhihao Cheng 	insert_inode_hash(inode);
385278d9a24SZhihao Cheng 
386278d9a24SZhihao Cheng 	return inode;
387278d9a24SZhihao Cheng 
388278d9a24SZhihao Cheng out_inode:
389278d9a24SZhihao Cheng 	make_bad_inode(inode);
390278d9a24SZhihao Cheng 	iput(inode);
391278d9a24SZhihao Cheng out_free:
392278d9a24SZhihao Cheng 	ubifs_err(c, "cannot create whiteout file, error %d", err);
393278d9a24SZhihao Cheng 	return ERR_PTR(err);
394278d9a24SZhihao Cheng }
395278d9a24SZhihao Cheng 
39660eb3b9cSZhihao Cheng /**
39760eb3b9cSZhihao Cheng  * lock_2_inodes - a wrapper for locking two UBIFS inodes.
39860eb3b9cSZhihao Cheng  * @inode1: first inode
39960eb3b9cSZhihao Cheng  * @inode2: second inode
40060eb3b9cSZhihao Cheng  *
40160eb3b9cSZhihao Cheng  * We do not implement any tricks to guarantee strict lock ordering, because
40260eb3b9cSZhihao Cheng  * VFS has already done it for us on the @i_mutex. So this is just a simple
40360eb3b9cSZhihao Cheng  * wrapper function.
40460eb3b9cSZhihao Cheng  */
lock_2_inodes(struct inode * inode1,struct inode * inode2)40560eb3b9cSZhihao Cheng static void lock_2_inodes(struct inode *inode1, struct inode *inode2)
40660eb3b9cSZhihao Cheng {
40760eb3b9cSZhihao Cheng 	mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
40860eb3b9cSZhihao Cheng 	mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
40960eb3b9cSZhihao Cheng }
41060eb3b9cSZhihao Cheng 
41160eb3b9cSZhihao Cheng /**
41260eb3b9cSZhihao Cheng  * unlock_2_inodes - a wrapper for unlocking two UBIFS inodes.
41360eb3b9cSZhihao Cheng  * @inode1: first inode
41460eb3b9cSZhihao Cheng  * @inode2: second inode
41560eb3b9cSZhihao Cheng  */
unlock_2_inodes(struct inode * inode1,struct inode * inode2)41660eb3b9cSZhihao Cheng static void unlock_2_inodes(struct inode *inode1, struct inode *inode2)
41760eb3b9cSZhihao Cheng {
41860eb3b9cSZhihao Cheng 	mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
41960eb3b9cSZhihao Cheng 	mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
42060eb3b9cSZhihao Cheng }
42160eb3b9cSZhihao Cheng 
ubifs_tmpfile(struct mnt_idmap * idmap,struct inode * dir,struct file * file,umode_t mode)422011e2b71SChristian Brauner static int ubifs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
423863f144fSMiklos Szeredi 			 struct file *file, umode_t mode)
424474b9370SRichard Weinberger {
425863f144fSMiklos Szeredi 	struct dentry *dentry = file->f_path.dentry;
426474b9370SRichard Weinberger 	struct inode *inode;
427474b9370SRichard Weinberger 	struct ubifs_info *c = dir->i_sb->s_fs_info;
428a6dab660SZhihao Cheng 	struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
429a6dab660SZhihao Cheng 					.dirtied_ino = 1};
430474b9370SRichard Weinberger 	struct ubifs_budget_req ino_req = { .dirtied_ino = 1 };
43160eb3b9cSZhihao Cheng 	struct ubifs_inode *ui;
432474b9370SRichard Weinberger 	int err, instantiated = 0;
433f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
434474b9370SRichard Weinberger 
435474b9370SRichard Weinberger 	/*
436a6dab660SZhihao Cheng 	 * Budget request settings: new inode, new direntry, changing the
437a6dab660SZhihao Cheng 	 * parent directory inode.
438a6dab660SZhihao Cheng 	 * Allocate budget separately for new dirtied inode, the budget will
439a6dab660SZhihao Cheng 	 * be released via writeback.
440474b9370SRichard Weinberger 	 */
441474b9370SRichard Weinberger 
442474b9370SRichard Weinberger 	dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
443474b9370SRichard Weinberger 		dentry, mode, dir->i_ino);
444474b9370SRichard Weinberger 
445f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
446f4f61d2cSRichard Weinberger 	if (err)
447f4f61d2cSRichard Weinberger 		return err;
448f4f61d2cSRichard Weinberger 
449f4f61d2cSRichard Weinberger 	err = ubifs_budget_space(c, &req);
450f4f61d2cSRichard Weinberger 	if (err) {
451f4f61d2cSRichard Weinberger 		fscrypt_free_filename(&nm);
452f4f61d2cSRichard Weinberger 		return err;
453f4f61d2cSRichard Weinberger 	}
454f4f61d2cSRichard Weinberger 
455474b9370SRichard Weinberger 	err = ubifs_budget_space(c, &ino_req);
456474b9370SRichard Weinberger 	if (err) {
457474b9370SRichard Weinberger 		ubifs_release_budget(c, &req);
458f4f61d2cSRichard Weinberger 		fscrypt_free_filename(&nm);
459474b9370SRichard Weinberger 		return err;
460474b9370SRichard Weinberger 	}
461474b9370SRichard Weinberger 
462a0c51565SZhihao Cheng 	inode = ubifs_new_inode(c, dir, mode, false);
463474b9370SRichard Weinberger 	if (IS_ERR(inode)) {
464474b9370SRichard Weinberger 		err = PTR_ERR(inode);
465474b9370SRichard Weinberger 		goto out_budg;
466474b9370SRichard Weinberger 	}
467474b9370SRichard Weinberger 	ui = ubifs_inode(inode);
468474b9370SRichard Weinberger 
469474b9370SRichard Weinberger 	err = ubifs_init_security(dir, inode, &dentry->d_name);
470474b9370SRichard Weinberger 	if (err)
471474b9370SRichard Weinberger 		goto out_inode;
472474b9370SRichard Weinberger 
473474b9370SRichard Weinberger 	mutex_lock(&ui->ui_mutex);
474474b9370SRichard Weinberger 	insert_inode_hash(inode);
475863f144fSMiklos Szeredi 	d_tmpfile(file, inode);
4766eb61d58SRichard Weinberger 	ubifs_assert(c, ui->dirty);
4779e0a1fffSRichard Weinberger 
478474b9370SRichard Weinberger 	instantiated = 1;
479474b9370SRichard Weinberger 	mutex_unlock(&ui->ui_mutex);
480474b9370SRichard Weinberger 
48160eb3b9cSZhihao Cheng 	lock_2_inodes(dir, inode);
482f4f61d2cSRichard Weinberger 	err = ubifs_jnl_update(c, dir, &nm, inode, 1, 0);
483474b9370SRichard Weinberger 	if (err)
484474b9370SRichard Weinberger 		goto out_cancel;
48560eb3b9cSZhihao Cheng 	unlock_2_inodes(dir, inode);
486474b9370SRichard Weinberger 
487474b9370SRichard Weinberger 	ubifs_release_budget(c, &req);
4881fb815b3SMårten Lindahl 	fscrypt_free_filename(&nm);
489474b9370SRichard Weinberger 
490863f144fSMiklos Szeredi 	return finish_open_simple(file, 0);
491474b9370SRichard Weinberger 
492474b9370SRichard Weinberger out_cancel:
49360eb3b9cSZhihao Cheng 	unlock_2_inodes(dir, inode);
494474b9370SRichard Weinberger out_inode:
495474b9370SRichard Weinberger 	make_bad_inode(inode);
496474b9370SRichard Weinberger 	if (!instantiated)
497474b9370SRichard Weinberger 		iput(inode);
498474b9370SRichard Weinberger out_budg:
499474b9370SRichard Weinberger 	ubifs_release_budget(c, &req);
500474b9370SRichard Weinberger 	if (!instantiated)
501474b9370SRichard Weinberger 		ubifs_release_budget(c, &ino_req);
502f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
503474b9370SRichard Weinberger 	ubifs_err(c, "cannot create temporary file, error %d", err);
504474b9370SRichard Weinberger 	return err;
505474b9370SRichard Weinberger }
506474b9370SRichard Weinberger 
5071e51764aSArtem Bityutskiy /**
5081e51764aSArtem Bityutskiy  * vfs_dent_type - get VFS directory entry type.
5091e51764aSArtem Bityutskiy  * @type: UBIFS directory entry type
5101e51764aSArtem Bityutskiy  *
5111e51764aSArtem Bityutskiy  * This function converts UBIFS directory entry type into VFS directory entry
5121e51764aSArtem Bityutskiy  * type.
5131e51764aSArtem Bityutskiy  */
vfs_dent_type(uint8_t type)5141e51764aSArtem Bityutskiy static unsigned int vfs_dent_type(uint8_t type)
5151e51764aSArtem Bityutskiy {
5161e51764aSArtem Bityutskiy 	switch (type) {
5171e51764aSArtem Bityutskiy 	case UBIFS_ITYPE_REG:
5181e51764aSArtem Bityutskiy 		return DT_REG;
5191e51764aSArtem Bityutskiy 	case UBIFS_ITYPE_DIR:
5201e51764aSArtem Bityutskiy 		return DT_DIR;
5211e51764aSArtem Bityutskiy 	case UBIFS_ITYPE_LNK:
5221e51764aSArtem Bityutskiy 		return DT_LNK;
5231e51764aSArtem Bityutskiy 	case UBIFS_ITYPE_BLK:
5241e51764aSArtem Bityutskiy 		return DT_BLK;
5251e51764aSArtem Bityutskiy 	case UBIFS_ITYPE_CHR:
5261e51764aSArtem Bityutskiy 		return DT_CHR;
5271e51764aSArtem Bityutskiy 	case UBIFS_ITYPE_FIFO:
5281e51764aSArtem Bityutskiy 		return DT_FIFO;
5291e51764aSArtem Bityutskiy 	case UBIFS_ITYPE_SOCK:
5301e51764aSArtem Bityutskiy 		return DT_SOCK;
5311e51764aSArtem Bityutskiy 	default:
5321e51764aSArtem Bityutskiy 		BUG();
5331e51764aSArtem Bityutskiy 	}
5341e51764aSArtem Bityutskiy 	return 0;
5351e51764aSArtem Bityutskiy }
5361e51764aSArtem Bityutskiy 
5371e51764aSArtem Bityutskiy /*
5381e51764aSArtem Bityutskiy  * The classical Unix view for directory is that it is a linear array of
5391e51764aSArtem Bityutskiy  * (name, inode number) entries. Linux/VFS assumes this model as well.
5401e51764aSArtem Bityutskiy  * Particularly, 'readdir()' call wants us to return a directory entry offset
5411e51764aSArtem Bityutskiy  * which later may be used to continue 'readdir()'ing the directory or to
5421e51764aSArtem Bityutskiy  * 'seek()' to that specific direntry. Obviously UBIFS does not really fit this
5431e51764aSArtem Bityutskiy  * model because directory entries are identified by keys, which may collide.
5441e51764aSArtem Bityutskiy  *
5451e51764aSArtem Bityutskiy  * UBIFS uses directory entry hash value for directory offsets, so
5461e51764aSArtem Bityutskiy  * 'seekdir()'/'telldir()' may not always work because of possible key
5471e51764aSArtem Bityutskiy  * collisions. But UBIFS guarantees that consecutive 'readdir()' calls work
5481e51764aSArtem Bityutskiy  * properly by means of saving full directory entry name in the private field
5491e51764aSArtem Bityutskiy  * of the file description object.
5501e51764aSArtem Bityutskiy  *
5511e51764aSArtem Bityutskiy  * This means that UBIFS cannot support NFS which requires full
5521e51764aSArtem Bityutskiy  * 'seekdir()'/'telldir()' support.
5531e51764aSArtem Bityutskiy  */
ubifs_readdir(struct file * file,struct dir_context * ctx)55401122e06SAl Viro static int ubifs_readdir(struct file *file, struct dir_context *ctx)
5551e51764aSArtem Bityutskiy {
556ba75d570SRichard Weinberger 	int fstr_real_len = 0, err = 0;
557f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
558f4f61d2cSRichard Weinberger 	struct fscrypt_str fstr = {0};
5591e51764aSArtem Bityutskiy 	union ubifs_key key;
5601e51764aSArtem Bityutskiy 	struct ubifs_dent_node *dent;
561496ad9aaSAl Viro 	struct inode *dir = file_inode(file);
5621e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
56350d9fad7SEric Biggers 	bool encrypted = IS_ENCRYPTED(dir);
5641e51764aSArtem Bityutskiy 
56501122e06SAl Viro 	dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, ctx->pos);
5661e51764aSArtem Bityutskiy 
56701122e06SAl Viro 	if (ctx->pos > UBIFS_S_KEY_HASH_MASK || ctx->pos == 2)
5681e51764aSArtem Bityutskiy 		/*
5691e51764aSArtem Bityutskiy 		 * The directory was seek'ed to a senseless position or there
5701e51764aSArtem Bityutskiy 		 * are no more entries.
5711e51764aSArtem Bityutskiy 		 */
5721e51764aSArtem Bityutskiy 		return 0;
5731e51764aSArtem Bityutskiy 
574f4f61d2cSRichard Weinberger 	if (encrypted) {
575ec0caa97SEric Biggers 		err = fscrypt_prepare_readdir(dir);
5763b1ada55SEric Biggers 		if (err)
577f4f61d2cSRichard Weinberger 			return err;
578f4f61d2cSRichard Weinberger 
5798b10fe68SJeff Layton 		err = fscrypt_fname_alloc_buffer(UBIFS_MAX_NLEN, &fstr);
580f4f61d2cSRichard Weinberger 		if (err)
581f4f61d2cSRichard Weinberger 			return err;
582f4f61d2cSRichard Weinberger 
583f4f61d2cSRichard Weinberger 		fstr_real_len = fstr.len;
584f4f61d2cSRichard Weinberger 	}
585f4f61d2cSRichard Weinberger 
586605c912bSArtem Bityutskiy 	if (file->f_version == 0) {
587605c912bSArtem Bityutskiy 		/*
588605c912bSArtem Bityutskiy 		 * The file was seek'ed, which means that @file->private_data
589605c912bSArtem Bityutskiy 		 * is now invalid. This may also be just the first
590605c912bSArtem Bityutskiy 		 * 'ubifs_readdir()' invocation, in which case
591605c912bSArtem Bityutskiy 		 * @file->private_data is NULL, and the below code is
592605c912bSArtem Bityutskiy 		 * basically a no-op.
593605c912bSArtem Bityutskiy 		 */
594605c912bSArtem Bityutskiy 		kfree(file->private_data);
595605c912bSArtem Bityutskiy 		file->private_data = NULL;
596605c912bSArtem Bityutskiy 	}
597605c912bSArtem Bityutskiy 
598605c912bSArtem Bityutskiy 	/*
599605c912bSArtem Bityutskiy 	 * 'generic_file_llseek()' unconditionally sets @file->f_version to
600605c912bSArtem Bityutskiy 	 * zero, and we use this for detecting whether the file was seek'ed.
601605c912bSArtem Bityutskiy 	 */
602605c912bSArtem Bityutskiy 	file->f_version = 1;
603605c912bSArtem Bityutskiy 
6041e51764aSArtem Bityutskiy 	/* File positions 0 and 1 correspond to "." and ".." */
60501122e06SAl Viro 	if (ctx->pos < 2) {
6066eb61d58SRichard Weinberger 		ubifs_assert(c, !file->private_data);
607f4f61d2cSRichard Weinberger 		if (!dir_emit_dots(file, ctx)) {
608f4f61d2cSRichard Weinberger 			if (encrypted)
609f4f61d2cSRichard Weinberger 				fscrypt_fname_free_buffer(&fstr);
6101e51764aSArtem Bityutskiy 			return 0;
611f4f61d2cSRichard Weinberger 		}
6121e51764aSArtem Bityutskiy 
6131e51764aSArtem Bityutskiy 		/* Find the first entry in TNC and save it */
6141e51764aSArtem Bityutskiy 		lowest_dent_key(c, &key, dir->i_ino);
615f4f61d2cSRichard Weinberger 		fname_len(&nm) = 0;
6161e51764aSArtem Bityutskiy 		dent = ubifs_tnc_next_ent(c, &key, &nm);
6171e51764aSArtem Bityutskiy 		if (IS_ERR(dent)) {
6181e51764aSArtem Bityutskiy 			err = PTR_ERR(dent);
6191e51764aSArtem Bityutskiy 			goto out;
6201e51764aSArtem Bityutskiy 		}
6211e51764aSArtem Bityutskiy 
62201122e06SAl Viro 		ctx->pos = key_hash_flash(c, &dent->key);
6231e51764aSArtem Bityutskiy 		file->private_data = dent;
6241e51764aSArtem Bityutskiy 	}
6251e51764aSArtem Bityutskiy 
6261e51764aSArtem Bityutskiy 	dent = file->private_data;
6271e51764aSArtem Bityutskiy 	if (!dent) {
6281e51764aSArtem Bityutskiy 		/*
6291e51764aSArtem Bityutskiy 		 * The directory was seek'ed to and is now readdir'ed.
63001122e06SAl Viro 		 * Find the entry corresponding to @ctx->pos or the closest one.
6311e51764aSArtem Bityutskiy 		 */
63201122e06SAl Viro 		dent_key_init_hash(c, &key, dir->i_ino, ctx->pos);
633f4f61d2cSRichard Weinberger 		fname_len(&nm) = 0;
6341e51764aSArtem Bityutskiy 		dent = ubifs_tnc_next_ent(c, &key, &nm);
6351e51764aSArtem Bityutskiy 		if (IS_ERR(dent)) {
6361e51764aSArtem Bityutskiy 			err = PTR_ERR(dent);
6371e51764aSArtem Bityutskiy 			goto out;
6381e51764aSArtem Bityutskiy 		}
63901122e06SAl Viro 		ctx->pos = key_hash_flash(c, &dent->key);
6401e51764aSArtem Bityutskiy 		file->private_data = dent;
6411e51764aSArtem Bityutskiy 	}
6421e51764aSArtem Bityutskiy 
6431e51764aSArtem Bityutskiy 	while (1) {
644b20e2d99SHyunchul Lee 		dbg_gen("ino %llu, new f_pos %#x",
645b20e2d99SHyunchul Lee 			(unsigned long long)le64_to_cpu(dent->inum),
6461e51764aSArtem Bityutskiy 			key_hash_flash(c, &dent->key));
6476eb61d58SRichard Weinberger 		ubifs_assert(c, le64_to_cpu(dent->ch.sqnum) >
6480ecb9529SHarvey Harrison 			     ubifs_inode(dir)->creat_sqnum);
6491e51764aSArtem Bityutskiy 
650f4f61d2cSRichard Weinberger 		fname_len(&nm) = le16_to_cpu(dent->nlen);
651f4f61d2cSRichard Weinberger 		fname_name(&nm) = dent->name;
652f4f61d2cSRichard Weinberger 
653f4f61d2cSRichard Weinberger 		if (encrypted) {
654f4f61d2cSRichard Weinberger 			fstr.len = fstr_real_len;
655f4f61d2cSRichard Weinberger 
656528e3d17SRichard Weinberger 			err = fscrypt_fname_disk_to_usr(dir, key_hash_flash(c,
657528e3d17SRichard Weinberger 							&dent->key),
658528e3d17SRichard Weinberger 							le32_to_cpu(dent->cookie),
659528e3d17SRichard Weinberger 							&nm.disk_name, &fstr);
660ca7f85beSRichard Weinberger 			if (err)
661f4f61d2cSRichard Weinberger 				goto out;
662f4f61d2cSRichard Weinberger 		} else {
663f4f61d2cSRichard Weinberger 			fstr.len = fname_len(&nm);
664f4f61d2cSRichard Weinberger 			fstr.name = fname_name(&nm);
665f4f61d2cSRichard Weinberger 		}
666f4f61d2cSRichard Weinberger 
667f4f61d2cSRichard Weinberger 		if (!dir_emit(ctx, fstr.name, fstr.len,
6681e51764aSArtem Bityutskiy 			       le64_to_cpu(dent->inum),
669f4f61d2cSRichard Weinberger 			       vfs_dent_type(dent->type))) {
670f4f61d2cSRichard Weinberger 			if (encrypted)
671f4f61d2cSRichard Weinberger 				fscrypt_fname_free_buffer(&fstr);
6721e51764aSArtem Bityutskiy 			return 0;
673f4f61d2cSRichard Weinberger 		}
6741e51764aSArtem Bityutskiy 
6751e51764aSArtem Bityutskiy 		/* Switch to the next entry */
6761e51764aSArtem Bityutskiy 		key_read(c, &dent->key, &key);
6771e51764aSArtem Bityutskiy 		dent = ubifs_tnc_next_ent(c, &key, &nm);
6781e51764aSArtem Bityutskiy 		if (IS_ERR(dent)) {
6791e51764aSArtem Bityutskiy 			err = PTR_ERR(dent);
6801e51764aSArtem Bityutskiy 			goto out;
6811e51764aSArtem Bityutskiy 		}
6821e51764aSArtem Bityutskiy 
6831e51764aSArtem Bityutskiy 		kfree(file->private_data);
68401122e06SAl Viro 		ctx->pos = key_hash_flash(c, &dent->key);
6851e51764aSArtem Bityutskiy 		file->private_data = dent;
6861e51764aSArtem Bityutskiy 		cond_resched();
6871e51764aSArtem Bityutskiy 	}
6881e51764aSArtem Bityutskiy 
6891e51764aSArtem Bityutskiy out:
690aeeb14f7SRichard Weinberger 	kfree(file->private_data);
691aeeb14f7SRichard Weinberger 	file->private_data = NULL;
692aeeb14f7SRichard Weinberger 
693f4f61d2cSRichard Weinberger 	if (encrypted)
694f4f61d2cSRichard Weinberger 		fscrypt_fname_free_buffer(&fstr);
695f4f61d2cSRichard Weinberger 
696c83ed4c9SRichard Weinberger 	if (err != -ENOENT)
697235c362bSSheng Yong 		ubifs_err(c, "cannot find next direntry, error %d", err);
698a00052a2SRichard Weinberger 	else
699a00052a2SRichard Weinberger 		/*
700a00052a2SRichard Weinberger 		 * -ENOENT is a non-fatal error in this context, the TNC uses
701a00052a2SRichard Weinberger 		 * it to indicate that the cursor moved past the current directory
702a00052a2SRichard Weinberger 		 * and readdir() has to stop.
703a00052a2SRichard Weinberger 		 */
704a00052a2SRichard Weinberger 		err = 0;
705a00052a2SRichard Weinberger 
7061e51764aSArtem Bityutskiy 
707605c912bSArtem Bityutskiy 	/* 2 is a special value indicating that there are no more direntries */
70801122e06SAl Viro 	ctx->pos = 2;
709c83ed4c9SRichard Weinberger 	return err;
7101e51764aSArtem Bityutskiy }
7111e51764aSArtem Bityutskiy 
7121e51764aSArtem Bityutskiy /* Free saved readdir() state when the directory is closed */
ubifs_dir_release(struct inode * dir,struct file * file)7131e51764aSArtem Bityutskiy static int ubifs_dir_release(struct inode *dir, struct file *file)
7141e51764aSArtem Bityutskiy {
7151e51764aSArtem Bityutskiy 	kfree(file->private_data);
7161e51764aSArtem Bityutskiy 	file->private_data = NULL;
7171e51764aSArtem Bityutskiy 	return 0;
7181e51764aSArtem Bityutskiy }
7191e51764aSArtem Bityutskiy 
ubifs_link(struct dentry * old_dentry,struct inode * dir,struct dentry * dentry)7201e51764aSArtem Bityutskiy static int ubifs_link(struct dentry *old_dentry, struct inode *dir,
7211e51764aSArtem Bityutskiy 		      struct dentry *dentry)
7221e51764aSArtem Bityutskiy {
7231e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
7242b0143b5SDavid Howells 	struct inode *inode = d_inode(old_dentry);
7251e51764aSArtem Bityutskiy 	struct ubifs_inode *ui = ubifs_inode(inode);
7261e51764aSArtem Bityutskiy 	struct ubifs_inode *dir_ui = ubifs_inode(dir);
727*75690493SZhihao Cheng 	int err, sz_change;
7281e51764aSArtem Bityutskiy 	struct ubifs_budget_req req = { .new_dent = 1, .dirtied_ino = 2,
729dab4b4d2SArtem Bityutskiy 				.dirtied_ino_d = ALIGN(ui->data_len, 8) };
730f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
7311e51764aSArtem Bityutskiy 
7321e51764aSArtem Bityutskiy 	/*
7331e51764aSArtem Bityutskiy 	 * Budget request settings: new direntry, changing the target inode,
7341e51764aSArtem Bityutskiy 	 * changing the parent inode.
7351e51764aSArtem Bityutskiy 	 */
7361e51764aSArtem Bityutskiy 
7374cb2a01dSAl Viro 	dbg_gen("dent '%pd' to ino %lu (nlink %d) in dir ino %lu",
7384cb2a01dSAl Viro 		dentry, inode->i_ino,
7391e51764aSArtem Bityutskiy 		inode->i_nlink, dir->i_ino);
7406eb61d58SRichard Weinberger 	ubifs_assert(c, inode_is_locked(dir));
7416eb61d58SRichard Weinberger 	ubifs_assert(c, inode_is_locked(inode));
7428b3884a8SHunter Adrian 
7435653878cSEric Biggers 	err = fscrypt_prepare_link(old_dentry, dir, dentry);
7445653878cSEric Biggers 	if (err)
7455653878cSEric Biggers 		return err;
746ac7e47a9SRichard Weinberger 
747f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
748f4f61d2cSRichard Weinberger 	if (err)
749f4f61d2cSRichard Weinberger 		return err;
750f4f61d2cSRichard Weinberger 
751*75690493SZhihao Cheng 	sz_change = CALC_DENT_SIZE(fname_len(&nm));
752*75690493SZhihao Cheng 
753d808efb4SArtem Bityutskiy 	err = dbg_check_synced_i_size(c, inode);
7541e51764aSArtem Bityutskiy 	if (err)
755f4f61d2cSRichard Weinberger 		goto out_fname;
7561e51764aSArtem Bityutskiy 
7571e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &req);
7581e51764aSArtem Bityutskiy 	if (err)
759f4f61d2cSRichard Weinberger 		goto out_fname;
7601e51764aSArtem Bityutskiy 
7611e51764aSArtem Bityutskiy 	lock_2_inodes(dir, inode);
76232fe905cSRichard Weinberger 
76332fe905cSRichard Weinberger 	/* Handle O_TMPFILE corner case, it is allowed to link a O_TMPFILE. */
76432fe905cSRichard Weinberger 	if (inode->i_nlink == 0)
76532fe905cSRichard Weinberger 		ubifs_delete_orphan(c, inode->i_ino);
76632fe905cSRichard Weinberger 
7671e51764aSArtem Bityutskiy 	inc_nlink(inode);
7687de9c6eeSAl Viro 	ihold(inode);
769d07d3a7eSJeff Layton 	inode_set_ctime_current(inode);
7701e51764aSArtem Bityutskiy 	dir->i_size += sz_change;
7711e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
772e4cfef33SJeff Layton 	inode_set_mtime_to_ts(dir,
773e4cfef33SJeff Layton 			      inode_set_ctime_to_ts(dir, inode_get_ctime(inode)));
774f4f61d2cSRichard Weinberger 	err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
7751e51764aSArtem Bityutskiy 	if (err)
7761e51764aSArtem Bityutskiy 		goto out_cancel;
7771e51764aSArtem Bityutskiy 	unlock_2_inodes(dir, inode);
7781e51764aSArtem Bityutskiy 
7791e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
7801e51764aSArtem Bityutskiy 	d_instantiate(dentry, inode);
781f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
7821e51764aSArtem Bityutskiy 	return 0;
7831e51764aSArtem Bityutskiy 
7841e51764aSArtem Bityutskiy out_cancel:
7851e51764aSArtem Bityutskiy 	dir->i_size -= sz_change;
7861e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
7871e51764aSArtem Bityutskiy 	drop_nlink(inode);
78832fe905cSRichard Weinberger 	if (inode->i_nlink == 0)
78932fe905cSRichard Weinberger 		ubifs_add_orphan(c, inode->i_ino);
7901e51764aSArtem Bityutskiy 	unlock_2_inodes(dir, inode);
7911e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
7921e51764aSArtem Bityutskiy 	iput(inode);
793f4f61d2cSRichard Weinberger out_fname:
794f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
7951e51764aSArtem Bityutskiy 	return err;
7961e51764aSArtem Bityutskiy }
7971e51764aSArtem Bityutskiy 
ubifs_unlink(struct inode * dir,struct dentry * dentry)7981e51764aSArtem Bityutskiy static int ubifs_unlink(struct inode *dir, struct dentry *dentry)
7991e51764aSArtem Bityutskiy {
8001e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
8012b0143b5SDavid Howells 	struct inode *inode = d_inode(dentry);
8021e51764aSArtem Bityutskiy 	struct ubifs_inode *dir_ui = ubifs_inode(dir);
803f4f61d2cSRichard Weinberger 	int err, sz_change, budgeted = 1;
8041e51764aSArtem Bityutskiy 	struct ubifs_budget_req req = { .mod_dent = 1, .dirtied_ino = 2 };
805c43be108SArtem Bityutskiy 	unsigned int saved_nlink = inode->i_nlink;
806f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
8071e51764aSArtem Bityutskiy 
8081e51764aSArtem Bityutskiy 	/*
8091e51764aSArtem Bityutskiy 	 * Budget request settings: deletion direntry, deletion inode (+1 for
8101e51764aSArtem Bityutskiy 	 * @dirtied_ino), changing the parent directory inode. If budgeting
8111e51764aSArtem Bityutskiy 	 * fails, go ahead anyway because we have extra space reserved for
8121e51764aSArtem Bityutskiy 	 * deletions.
8131e51764aSArtem Bityutskiy 	 */
8141e51764aSArtem Bityutskiy 
8154cb2a01dSAl Viro 	dbg_gen("dent '%pd' from ino %lu (nlink %d) in dir ino %lu",
8164cb2a01dSAl Viro 		dentry, inode->i_ino,
8171e51764aSArtem Bityutskiy 		inode->i_nlink, dir->i_ino);
818f4f61d2cSRichard Weinberger 
819f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(dir, &dentry->d_name, 1, &nm);
820f4f61d2cSRichard Weinberger 	if (err)
821f4f61d2cSRichard Weinberger 		return err;
822f4f61d2cSRichard Weinberger 
8239ca2d732SRichard Weinberger 	err = ubifs_purge_xattrs(inode);
8249ca2d732SRichard Weinberger 	if (err)
8259ca2d732SRichard Weinberger 		return err;
8269ca2d732SRichard Weinberger 
827f4f61d2cSRichard Weinberger 	sz_change = CALC_DENT_SIZE(fname_len(&nm));
828f4f61d2cSRichard Weinberger 
8296eb61d58SRichard Weinberger 	ubifs_assert(c, inode_is_locked(dir));
8306eb61d58SRichard Weinberger 	ubifs_assert(c, inode_is_locked(inode));
831d808efb4SArtem Bityutskiy 	err = dbg_check_synced_i_size(c, inode);
8321e51764aSArtem Bityutskiy 	if (err)
833f4f61d2cSRichard Weinberger 		goto out_fname;
8341e51764aSArtem Bityutskiy 
8351e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &req);
8361e51764aSArtem Bityutskiy 	if (err) {
8371e51764aSArtem Bityutskiy 		if (err != -ENOSPC)
838f4f61d2cSRichard Weinberger 			goto out_fname;
8391e51764aSArtem Bityutskiy 		budgeted = 0;
8401e51764aSArtem Bityutskiy 	}
8411e51764aSArtem Bityutskiy 
8421e51764aSArtem Bityutskiy 	lock_2_inodes(dir, inode);
843d07d3a7eSJeff Layton 	inode_set_ctime_current(inode);
8441e51764aSArtem Bityutskiy 	drop_nlink(inode);
8451e51764aSArtem Bityutskiy 	dir->i_size -= sz_change;
8461e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
847e4cfef33SJeff Layton 	inode_set_mtime_to_ts(dir,
848e4cfef33SJeff Layton 			      inode_set_ctime_to_ts(dir, inode_get_ctime(inode)));
849f4f61d2cSRichard Weinberger 	err = ubifs_jnl_update(c, dir, &nm, inode, 1, 0);
8501e51764aSArtem Bityutskiy 	if (err)
8511e51764aSArtem Bityutskiy 		goto out_cancel;
8521e51764aSArtem Bityutskiy 	unlock_2_inodes(dir, inode);
8531e51764aSArtem Bityutskiy 
8541e51764aSArtem Bityutskiy 	if (budgeted)
8551e51764aSArtem Bityutskiy 		ubifs_release_budget(c, &req);
8561e51764aSArtem Bityutskiy 	else {
8571e51764aSArtem Bityutskiy 		/* We've deleted something - clean the "no space" flags */
858b137545cSArtem Bityutskiy 		c->bi.nospace = c->bi.nospace_rp = 0;
8591e51764aSArtem Bityutskiy 		smp_wmb();
8601e51764aSArtem Bityutskiy 	}
861f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
8621e51764aSArtem Bityutskiy 	return 0;
8631e51764aSArtem Bityutskiy 
8641e51764aSArtem Bityutskiy out_cancel:
8651e51764aSArtem Bityutskiy 	dir->i_size += sz_change;
8661e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
867c43be108SArtem Bityutskiy 	set_nlink(inode, saved_nlink);
8681e51764aSArtem Bityutskiy 	unlock_2_inodes(dir, inode);
8691e51764aSArtem Bityutskiy 	if (budgeted)
8701e51764aSArtem Bityutskiy 		ubifs_release_budget(c, &req);
871f4f61d2cSRichard Weinberger out_fname:
872f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
8731e51764aSArtem Bityutskiy 	return err;
8741e51764aSArtem Bityutskiy }
8751e51764aSArtem Bityutskiy 
8761e51764aSArtem Bityutskiy /**
87727ef523aSYang Li  * ubifs_check_dir_empty - check if a directory is empty or not.
8781e51764aSArtem Bityutskiy  * @dir: VFS inode object of the directory to check
8791e51764aSArtem Bityutskiy  *
8801e51764aSArtem Bityutskiy  * This function checks if directory @dir is empty. Returns zero if the
8811e51764aSArtem Bityutskiy  * directory is empty, %-ENOTEMPTY if it is not, and other negative error codes
882b8f1da98SRandy Dunlap  * in case of errors.
8831e51764aSArtem Bityutskiy  */
ubifs_check_dir_empty(struct inode * dir)884f6337d84SRichard Weinberger int ubifs_check_dir_empty(struct inode *dir)
8851e51764aSArtem Bityutskiy {
886f6337d84SRichard Weinberger 	struct ubifs_info *c = dir->i_sb->s_fs_info;
887f4f61d2cSRichard Weinberger 	struct fscrypt_name nm = { 0 };
8881e51764aSArtem Bityutskiy 	struct ubifs_dent_node *dent;
8891e51764aSArtem Bityutskiy 	union ubifs_key key;
8901e51764aSArtem Bityutskiy 	int err;
8911e51764aSArtem Bityutskiy 
8921e51764aSArtem Bityutskiy 	lowest_dent_key(c, &key, dir->i_ino);
8931e51764aSArtem Bityutskiy 	dent = ubifs_tnc_next_ent(c, &key, &nm);
8941e51764aSArtem Bityutskiy 	if (IS_ERR(dent)) {
8951e51764aSArtem Bityutskiy 		err = PTR_ERR(dent);
8961e51764aSArtem Bityutskiy 		if (err == -ENOENT)
8971e51764aSArtem Bityutskiy 			err = 0;
8981e51764aSArtem Bityutskiy 	} else {
8991e51764aSArtem Bityutskiy 		kfree(dent);
9001e51764aSArtem Bityutskiy 		err = -ENOTEMPTY;
9011e51764aSArtem Bityutskiy 	}
9021e51764aSArtem Bityutskiy 	return err;
9031e51764aSArtem Bityutskiy }
9041e51764aSArtem Bityutskiy 
ubifs_rmdir(struct inode * dir,struct dentry * dentry)9051e51764aSArtem Bityutskiy static int ubifs_rmdir(struct inode *dir, struct dentry *dentry)
9061e51764aSArtem Bityutskiy {
9071e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
9082b0143b5SDavid Howells 	struct inode *inode = d_inode(dentry);
909f4f61d2cSRichard Weinberger 	int err, sz_change, budgeted = 1;
9101e51764aSArtem Bityutskiy 	struct ubifs_inode *dir_ui = ubifs_inode(dir);
9111e51764aSArtem Bityutskiy 	struct ubifs_budget_req req = { .mod_dent = 1, .dirtied_ino = 2 };
912f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
9131e51764aSArtem Bityutskiy 
9141e51764aSArtem Bityutskiy 	/*
9151e51764aSArtem Bityutskiy 	 * Budget request settings: deletion direntry, deletion inode and
9161e51764aSArtem Bityutskiy 	 * changing the parent inode. If budgeting fails, go ahead anyway
9171e51764aSArtem Bityutskiy 	 * because we have extra space reserved for deletions.
9181e51764aSArtem Bityutskiy 	 */
9191e51764aSArtem Bityutskiy 
9204cb2a01dSAl Viro 	dbg_gen("directory '%pd', ino %lu in dir ino %lu", dentry,
9214cb2a01dSAl Viro 		inode->i_ino, dir->i_ino);
9226eb61d58SRichard Weinberger 	ubifs_assert(c, inode_is_locked(dir));
9236eb61d58SRichard Weinberger 	ubifs_assert(c, inode_is_locked(inode));
924f6337d84SRichard Weinberger 	err = ubifs_check_dir_empty(d_inode(dentry));
9251e51764aSArtem Bityutskiy 	if (err)
9261e51764aSArtem Bityutskiy 		return err;
9271e51764aSArtem Bityutskiy 
928f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(dir, &dentry->d_name, 1, &nm);
929f4f61d2cSRichard Weinberger 	if (err)
930f4f61d2cSRichard Weinberger 		return err;
931f4f61d2cSRichard Weinberger 
9329ca2d732SRichard Weinberger 	err = ubifs_purge_xattrs(inode);
9339ca2d732SRichard Weinberger 	if (err)
9349ca2d732SRichard Weinberger 		return err;
9359ca2d732SRichard Weinberger 
936f4f61d2cSRichard Weinberger 	sz_change = CALC_DENT_SIZE(fname_len(&nm));
937f4f61d2cSRichard Weinberger 
9381e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &req);
9391e51764aSArtem Bityutskiy 	if (err) {
9401e51764aSArtem Bityutskiy 		if (err != -ENOSPC)
941f4f61d2cSRichard Weinberger 			goto out_fname;
9421e51764aSArtem Bityutskiy 		budgeted = 0;
9431e51764aSArtem Bityutskiy 	}
9441e51764aSArtem Bityutskiy 
9451e51764aSArtem Bityutskiy 	lock_2_inodes(dir, inode);
946d07d3a7eSJeff Layton 	inode_set_ctime_current(inode);
9471e51764aSArtem Bityutskiy 	clear_nlink(inode);
9481e51764aSArtem Bityutskiy 	drop_nlink(dir);
9491e51764aSArtem Bityutskiy 	dir->i_size -= sz_change;
9501e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
951e4cfef33SJeff Layton 	inode_set_mtime_to_ts(dir,
952e4cfef33SJeff Layton 			      inode_set_ctime_to_ts(dir, inode_get_ctime(inode)));
953f4f61d2cSRichard Weinberger 	err = ubifs_jnl_update(c, dir, &nm, inode, 1, 0);
9541e51764aSArtem Bityutskiy 	if (err)
9551e51764aSArtem Bityutskiy 		goto out_cancel;
9561e51764aSArtem Bityutskiy 	unlock_2_inodes(dir, inode);
9571e51764aSArtem Bityutskiy 
9581e51764aSArtem Bityutskiy 	if (budgeted)
9591e51764aSArtem Bityutskiy 		ubifs_release_budget(c, &req);
9601e51764aSArtem Bityutskiy 	else {
9611e51764aSArtem Bityutskiy 		/* We've deleted something - clean the "no space" flags */
962b137545cSArtem Bityutskiy 		c->bi.nospace = c->bi.nospace_rp = 0;
9631e51764aSArtem Bityutskiy 		smp_wmb();
9641e51764aSArtem Bityutskiy 	}
965f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
9661e51764aSArtem Bityutskiy 	return 0;
9671e51764aSArtem Bityutskiy 
9681e51764aSArtem Bityutskiy out_cancel:
9691e51764aSArtem Bityutskiy 	dir->i_size += sz_change;
9701e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
9711e51764aSArtem Bityutskiy 	inc_nlink(dir);
972c43be108SArtem Bityutskiy 	set_nlink(inode, 2);
9731e51764aSArtem Bityutskiy 	unlock_2_inodes(dir, inode);
9741e51764aSArtem Bityutskiy 	if (budgeted)
9751e51764aSArtem Bityutskiy 		ubifs_release_budget(c, &req);
976f4f61d2cSRichard Weinberger out_fname:
977f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
9781e51764aSArtem Bityutskiy 	return err;
9791e51764aSArtem Bityutskiy }
9801e51764aSArtem Bityutskiy 
ubifs_mkdir(struct mnt_idmap * idmap,struct inode * dir,struct dentry * dentry,umode_t mode)981c54bd91eSChristian Brauner static int ubifs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
982549c7297SChristian Brauner 		       struct dentry *dentry, umode_t mode)
9831e51764aSArtem Bityutskiy {
9841e51764aSArtem Bityutskiy 	struct inode *inode;
9851e51764aSArtem Bityutskiy 	struct ubifs_inode *dir_ui = ubifs_inode(dir);
9861e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
987f4f61d2cSRichard Weinberger 	int err, sz_change;
988a6dab660SZhihao Cheng 	struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
989a6dab660SZhihao Cheng 					.dirtied_ino = 1};
990f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
9911e51764aSArtem Bityutskiy 
9921e51764aSArtem Bityutskiy 	/*
9931e51764aSArtem Bityutskiy 	 * Budget request settings: new inode, new direntry and changing parent
9941e51764aSArtem Bityutskiy 	 * directory inode.
9951e51764aSArtem Bityutskiy 	 */
9961e51764aSArtem Bityutskiy 
9974cb2a01dSAl Viro 	dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
9984cb2a01dSAl Viro 		dentry, mode, dir->i_ino);
9991e51764aSArtem Bityutskiy 
10001e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &req);
10011e51764aSArtem Bityutskiy 	if (err)
10021e51764aSArtem Bityutskiy 		return err;
10031e51764aSArtem Bityutskiy 
100476786a0fSEric Biggers 	err = ubifs_prepare_create(dir, dentry, &nm);
1005f4f61d2cSRichard Weinberger 	if (err)
1006f4f61d2cSRichard Weinberger 		goto out_budg;
1007f4f61d2cSRichard Weinberger 
1008f4f61d2cSRichard Weinberger 	sz_change = CALC_DENT_SIZE(fname_len(&nm));
1009f4f61d2cSRichard Weinberger 
1010a0c51565SZhihao Cheng 	inode = ubifs_new_inode(c, dir, S_IFDIR | mode, false);
10111e51764aSArtem Bityutskiy 	if (IS_ERR(inode)) {
10121e51764aSArtem Bityutskiy 		err = PTR_ERR(inode);
1013f4f61d2cSRichard Weinberger 		goto out_fname;
10141e51764aSArtem Bityutskiy 	}
10151e51764aSArtem Bityutskiy 
1016d7f0b70dSSubodh Nijsure 	err = ubifs_init_security(dir, inode, &dentry->d_name);
1017d7f0b70dSSubodh Nijsure 	if (err)
10189401a795STaesoo Kim 		goto out_inode;
1019d7f0b70dSSubodh Nijsure 
10201e51764aSArtem Bityutskiy 	mutex_lock(&dir_ui->ui_mutex);
10211e51764aSArtem Bityutskiy 	insert_inode_hash(inode);
10221e51764aSArtem Bityutskiy 	inc_nlink(inode);
10231e51764aSArtem Bityutskiy 	inc_nlink(dir);
10241e51764aSArtem Bityutskiy 	dir->i_size += sz_change;
10251e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
1026e4cfef33SJeff Layton 	inode_set_mtime_to_ts(dir,
1027e4cfef33SJeff Layton 			      inode_set_ctime_to_ts(dir, inode_get_ctime(inode)));
1028f4f61d2cSRichard Weinberger 	err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
10291e51764aSArtem Bityutskiy 	if (err) {
1030235c362bSSheng Yong 		ubifs_err(c, "cannot create directory, error %d", err);
10311e51764aSArtem Bityutskiy 		goto out_cancel;
10321e51764aSArtem Bityutskiy 	}
10331e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
10341e51764aSArtem Bityutskiy 
10351e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
10361e51764aSArtem Bityutskiy 	d_instantiate(dentry, inode);
1037f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
10381e51764aSArtem Bityutskiy 	return 0;
10391e51764aSArtem Bityutskiy 
10401e51764aSArtem Bityutskiy out_cancel:
10411e51764aSArtem Bityutskiy 	dir->i_size -= sz_change;
10421e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
10431e51764aSArtem Bityutskiy 	drop_nlink(dir);
10441e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
10459401a795STaesoo Kim out_inode:
10461e51764aSArtem Bityutskiy 	make_bad_inode(inode);
10471e51764aSArtem Bityutskiy 	iput(inode);
1048f4f61d2cSRichard Weinberger out_fname:
1049f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
10501e51764aSArtem Bityutskiy out_budg:
10511e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
10521e51764aSArtem Bityutskiy 	return err;
10531e51764aSArtem Bityutskiy }
10541e51764aSArtem Bityutskiy 
ubifs_mknod(struct mnt_idmap * idmap,struct inode * dir,struct dentry * dentry,umode_t mode,dev_t rdev)10555ebb29beSChristian Brauner static int ubifs_mknod(struct mnt_idmap *idmap, struct inode *dir,
1056549c7297SChristian Brauner 		       struct dentry *dentry, umode_t mode, dev_t rdev)
10571e51764aSArtem Bityutskiy {
10581e51764aSArtem Bityutskiy 	struct inode *inode;
10591e51764aSArtem Bityutskiy 	struct ubifs_inode *ui;
10601e51764aSArtem Bityutskiy 	struct ubifs_inode *dir_ui = ubifs_inode(dir);
10611e51764aSArtem Bityutskiy 	struct ubifs_info *c = dir->i_sb->s_fs_info;
10621e51764aSArtem Bityutskiy 	union ubifs_dev_desc *dev = NULL;
1063f4f61d2cSRichard Weinberger 	int sz_change;
10641e51764aSArtem Bityutskiy 	int err, devlen = 0;
10651e51764aSArtem Bityutskiy 	struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
1066dab4b4d2SArtem Bityutskiy 					.dirtied_ino = 1 };
1067f4f61d2cSRichard Weinberger 	struct fscrypt_name nm;
10681e51764aSArtem Bityutskiy 
10691e51764aSArtem Bityutskiy 	/*
10701e51764aSArtem Bityutskiy 	 * Budget request settings: new inode, new direntry and changing parent
10711e51764aSArtem Bityutskiy 	 * directory inode.
10721e51764aSArtem Bityutskiy 	 */
10731e51764aSArtem Bityutskiy 
10744cb2a01dSAl Viro 	dbg_gen("dent '%pd' in dir ino %lu", dentry, dir->i_ino);
10751e51764aSArtem Bityutskiy 
10761e51764aSArtem Bityutskiy 	if (S_ISBLK(mode) || S_ISCHR(mode)) {
10771e51764aSArtem Bityutskiy 		dev = kmalloc(sizeof(union ubifs_dev_desc), GFP_NOFS);
10781e51764aSArtem Bityutskiy 		if (!dev)
10791e51764aSArtem Bityutskiy 			return -ENOMEM;
10801e51764aSArtem Bityutskiy 		devlen = ubifs_encode_dev(dev, rdev);
10811e51764aSArtem Bityutskiy 	}
10821e51764aSArtem Bityutskiy 
10834d35ca4fSHyunchul Lee 	req.new_ino_d = ALIGN(devlen, 8);
10841e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &req);
10851e51764aSArtem Bityutskiy 	if (err) {
10861e51764aSArtem Bityutskiy 		kfree(dev);
10871e51764aSArtem Bityutskiy 		return err;
10881e51764aSArtem Bityutskiy 	}
10891e51764aSArtem Bityutskiy 
109076786a0fSEric Biggers 	err = ubifs_prepare_create(dir, dentry, &nm);
109163ed6573SRichard Weinberger 	if (err) {
109263ed6573SRichard Weinberger 		kfree(dev);
1093f4f61d2cSRichard Weinberger 		goto out_budg;
109463ed6573SRichard Weinberger 	}
1095f4f61d2cSRichard Weinberger 
1096f4f61d2cSRichard Weinberger 	sz_change = CALC_DENT_SIZE(fname_len(&nm));
1097f4f61d2cSRichard Weinberger 
1098a0c51565SZhihao Cheng 	inode = ubifs_new_inode(c, dir, mode, false);
10991e51764aSArtem Bityutskiy 	if (IS_ERR(inode)) {
11001e51764aSArtem Bityutskiy 		kfree(dev);
11011e51764aSArtem Bityutskiy 		err = PTR_ERR(inode);
1102f4f61d2cSRichard Weinberger 		goto out_fname;
11031e51764aSArtem Bityutskiy 	}
11041e51764aSArtem Bityutskiy 
11051e51764aSArtem Bityutskiy 	init_special_inode(inode, inode->i_mode, rdev);
11061e51764aSArtem Bityutskiy 	inode->i_size = ubifs_inode(inode)->ui_size = devlen;
11071e51764aSArtem Bityutskiy 	ui = ubifs_inode(inode);
11081e51764aSArtem Bityutskiy 	ui->data = dev;
11091e51764aSArtem Bityutskiy 	ui->data_len = devlen;
11101e51764aSArtem Bityutskiy 
1111d7f0b70dSSubodh Nijsure 	err = ubifs_init_security(dir, inode, &dentry->d_name);
1112d7f0b70dSSubodh Nijsure 	if (err)
11139401a795STaesoo Kim 		goto out_inode;
1114d7f0b70dSSubodh Nijsure 
11151e51764aSArtem Bityutskiy 	mutex_lock(&dir_ui->ui_mutex);
11161e51764aSArtem Bityutskiy 	dir->i_size += sz_change;
11171e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
1118e4cfef33SJeff Layton 	inode_set_mtime_to_ts(dir,
1119e4cfef33SJeff Layton 			      inode_set_ctime_to_ts(dir, inode_get_ctime(inode)));
1120f4f61d2cSRichard Weinberger 	err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
11211e51764aSArtem Bityutskiy 	if (err)
11221e51764aSArtem Bityutskiy 		goto out_cancel;
11231e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
11241e51764aSArtem Bityutskiy 
11251e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
11261e51764aSArtem Bityutskiy 	insert_inode_hash(inode);
11271e51764aSArtem Bityutskiy 	d_instantiate(dentry, inode);
1128f4f61d2cSRichard Weinberger 	fscrypt_free_filename(&nm);
11291e51764aSArtem Bityutskiy 	return 0;
11301e51764aSArtem Bityutskiy 
11311e51764aSArtem Bityutskiy out_cancel:
11321e51764aSArtem Bityutskiy 	dir->i_size -= sz_change;
11331e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
11341e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
11359401a795STaesoo Kim out_inode:
11361e51764aSArtem Bityutskiy 	/* Free inode->i_link before inode is marked as bad. */
11371e51764aSArtem Bityutskiy 	fscrypt_free_inode(inode);
1138f4f61d2cSRichard Weinberger 	make_bad_inode(inode);
1139f4f61d2cSRichard Weinberger 	iput(inode);
11401e51764aSArtem Bityutskiy out_fname:
11411e51764aSArtem Bityutskiy 	fscrypt_free_filename(&nm);
11421e51764aSArtem Bityutskiy out_budg:
11431e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
11441e51764aSArtem Bityutskiy 	return err;
11457a77db95SChristian Brauner }
1146549c7297SChristian Brauner 
ubifs_symlink(struct mnt_idmap * idmap,struct inode * dir,struct dentry * dentry,const char * symname)11471e51764aSArtem Bityutskiy static int ubifs_symlink(struct mnt_idmap *idmap, struct inode *dir,
11481e51764aSArtem Bityutskiy 			 struct dentry *dentry, const char *symname)
11491e51764aSArtem Bityutskiy {
11501e51764aSArtem Bityutskiy 	struct inode *inode;
11511e51764aSArtem Bityutskiy 	struct ubifs_inode *ui;
115200ee8b60SRichard Weinberger 	struct ubifs_inode *dir_ui = ubifs_inode(dir);
11530e4dda29SEric Biggers 	struct ubifs_info *c = dir->i_sb->s_fs_info;
11541e51764aSArtem Bityutskiy 	int err, sz_change, len = strlen(symname);
1155dab4b4d2SArtem Bityutskiy 	struct fscrypt_str disk_link;
1156ca7f85beSRichard Weinberger 	struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
1157ca7f85beSRichard Weinberger 					.dirtied_ino = 1 };
11580e4dda29SEric Biggers 	struct fscrypt_name nm;
11590e4dda29SEric Biggers 
11600e4dda29SEric Biggers 	dbg_gen("dent '%pd', target '%s' in dir ino %lu", dentry,
11610e4dda29SEric Biggers 		symname, dir->i_ino);
11620e4dda29SEric Biggers 
1163ca7f85beSRichard Weinberger 	err = fscrypt_prepare_symlink(dir, symname, len, UBIFS_MAX_INO_DATA,
11640e4dda29SEric Biggers 				      &disk_link);
11651e51764aSArtem Bityutskiy 	if (err)
11661e51764aSArtem Bityutskiy 		return err;
11671e51764aSArtem Bityutskiy 
11681e51764aSArtem Bityutskiy 	/*
11691e51764aSArtem Bityutskiy 	 * Budget request settings: new inode, new direntry and changing parent
1170c2c36cc6SZhihao Cheng 	 * directory inode.
11711e51764aSArtem Bityutskiy 	 */
11721e51764aSArtem Bityutskiy 	req.new_ino_d = ALIGN(disk_link.len - 1, 8);
11731e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &req);
11741e51764aSArtem Bityutskiy 	if (err)
117576786a0fSEric Biggers 		return err;
1176ca7f85beSRichard Weinberger 
1177ca7f85beSRichard Weinberger 	err = ubifs_prepare_create(dir, dentry, &nm);
1178ca7f85beSRichard Weinberger 	if (err)
117900ee8b60SRichard Weinberger 		goto out_budg;
118000ee8b60SRichard Weinberger 
1181a0c51565SZhihao Cheng 	sz_change = CALC_DENT_SIZE(fname_len(&nm));
11821e51764aSArtem Bityutskiy 
11831e51764aSArtem Bityutskiy 	inode = ubifs_new_inode(c, dir, S_IFLNK | S_IRWXUGO, false);
1184ca7f85beSRichard Weinberger 	if (IS_ERR(inode)) {
11851e51764aSArtem Bityutskiy 		err = PTR_ERR(inode);
11861e51764aSArtem Bityutskiy 		goto out_fname;
11871e51764aSArtem Bityutskiy 	}
1188ca7f85beSRichard Weinberger 
11891e51764aSArtem Bityutskiy 	ui = ubifs_inode(inode);
11901e51764aSArtem Bityutskiy 	ui->data = kmalloc(disk_link.len, GFP_NOFS);
11911e51764aSArtem Bityutskiy 	if (!ui->data) {
11921e51764aSArtem Bityutskiy 		err = -ENOMEM;
11931e51764aSArtem Bityutskiy 		goto out_inode;
11940e4dda29SEric Biggers 	}
11950e4dda29SEric Biggers 
11960e4dda29SEric Biggers 	if (IS_ENCRYPTED(inode)) {
11976b46d444SEric Biggers 		disk_link.name = ui->data; /* encrypt directly into ui->data */
1198ca7f85beSRichard Weinberger 		err = fscrypt_encrypt_symlink(inode, symname, len, &disk_link);
1199ca7f85beSRichard Weinberger 		if (err)
12000e4dda29SEric Biggers 			goto out_inode;
12010f301bd3SAl Viro 	} else {
1202ca7f85beSRichard Weinberger 		memcpy(ui->data, disk_link.name, disk_link.len);
1203ca7f85beSRichard Weinberger 		inode->i_link = ui->data;
12041e51764aSArtem Bityutskiy 	}
12051e51764aSArtem Bityutskiy 
12061e51764aSArtem Bityutskiy 	/*
12070e4dda29SEric Biggers 	 * The terminating zero byte is not written to the flash media and it
12081e51764aSArtem Bityutskiy 	 * is put just to make later in-memory string processing simpler. Thus,
1209ca7f85beSRichard Weinberger 	 * data length is @disk_link.len - 1, not @disk_link.len.
1210ca7f85beSRichard Weinberger 	 */
12111e51764aSArtem Bityutskiy 	ui->data_len = disk_link.len - 1;
1212d7f0b70dSSubodh Nijsure 	inode->i_size = ubifs_inode(inode)->ui_size = disk_link.len - 1;
1213d7f0b70dSSubodh Nijsure 
12149401a795STaesoo Kim 	err = ubifs_init_security(dir, inode, &dentry->d_name);
1215d7f0b70dSSubodh Nijsure 	if (err)
12161e51764aSArtem Bityutskiy 		goto out_inode;
12171e51764aSArtem Bityutskiy 
12181e51764aSArtem Bityutskiy 	mutex_lock(&dir_ui->ui_mutex);
1219e4cfef33SJeff Layton 	dir->i_size += sz_change;
1220e4cfef33SJeff Layton 	dir_ui->ui_size = dir->i_size;
1221ca7f85beSRichard Weinberger 	inode_set_mtime_to_ts(dir,
12221e51764aSArtem Bityutskiy 			      inode_set_ctime_to_ts(dir, inode_get_ctime(inode)));
12231e51764aSArtem Bityutskiy 	err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
12241e51764aSArtem Bityutskiy 	if (err)
12251e51764aSArtem Bityutskiy 		goto out_cancel;
12261e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
12271e51764aSArtem Bityutskiy 
12286b46d444SEric Biggers 	insert_inode_hash(inode);
12296b46d444SEric Biggers 	d_instantiate(dentry, inode);
12301e51764aSArtem Bityutskiy 	err = 0;
12311e51764aSArtem Bityutskiy 	goto out_fname;
12321e51764aSArtem Bityutskiy 
12331e51764aSArtem Bityutskiy out_cancel:
12341e51764aSArtem Bityutskiy 	dir->i_size -= sz_change;
12351e51764aSArtem Bityutskiy 	dir_ui->ui_size = dir->i_size;
12361e51764aSArtem Bityutskiy 	mutex_unlock(&dir_ui->ui_mutex);
12371e51764aSArtem Bityutskiy out_inode:
1238ca7f85beSRichard Weinberger 	/* Free inode->i_link before inode is marked as bad. */
1239ca7f85beSRichard Weinberger 	fscrypt_free_inode(inode);
12401e51764aSArtem Bityutskiy 	make_bad_inode(inode);
12411e51764aSArtem Bityutskiy 	iput(inode);
12421e51764aSArtem Bityutskiy out_fname:
12431e51764aSArtem Bityutskiy 	fscrypt_free_filename(&nm);
12441e51764aSArtem Bityutskiy out_budg:
12451e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
12469e0a1fffSRichard Weinberger 	return err;
12471e51764aSArtem Bityutskiy }
12481e51764aSArtem Bityutskiy 
12491e51764aSArtem Bityutskiy /**
12507296c8afSAlexander Dahl  * lock_4_inodes - a wrapper for locking three UBIFS inodes.
12511e51764aSArtem Bityutskiy  * @inode1: first inode
125282c1593cSArtem Bityutskiy  * @inode2: second inode
12539e0a1fffSRichard Weinberger  * @inode3: third inode
125482c1593cSArtem Bityutskiy  * @inode4: fourth inode
125582c1593cSArtem Bityutskiy  *
125682c1593cSArtem Bityutskiy  * This function is used for 'ubifs_rename()' and @inode1 may be the same as
125782c1593cSArtem Bityutskiy  * @inode2 whereas @inode3 and @inode4 may be %NULL.
12581e51764aSArtem Bityutskiy  *
12599e0a1fffSRichard Weinberger  * We do not implement any tricks to guarantee strict lock ordering, because
12609e0a1fffSRichard Weinberger  * VFS has already done it for us on the @i_mutex. So this is just a simple
12611e51764aSArtem Bityutskiy  * wrapper function.
12621e51764aSArtem Bityutskiy  */
lock_4_inodes(struct inode * inode1,struct inode * inode2,struct inode * inode3,struct inode * inode4)126382c1593cSArtem Bityutskiy static void lock_4_inodes(struct inode *inode1, struct inode *inode2,
126482c1593cSArtem Bityutskiy 			  struct inode *inode3, struct inode *inode4)
126582c1593cSArtem Bityutskiy {
126682c1593cSArtem Bityutskiy 	mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
12679e0a1fffSRichard Weinberger 	if (inode2 != inode1)
12689e0a1fffSRichard Weinberger 		mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
12691e51764aSArtem Bityutskiy 	if (inode3)
12701e51764aSArtem Bityutskiy 		mutex_lock_nested(&ubifs_inode(inode3)->ui_mutex, WB_MUTEX_3);
12711e51764aSArtem Bityutskiy 	if (inode4)
12729e0a1fffSRichard Weinberger 		mutex_lock_nested(&ubifs_inode(inode4)->ui_mutex, WB_MUTEX_4);
12731e51764aSArtem Bityutskiy }
12741e51764aSArtem Bityutskiy 
12751e51764aSArtem Bityutskiy /**
12767296c8afSAlexander Dahl  * unlock_4_inodes - a wrapper for unlocking three UBIFS inodes for rename.
12771e51764aSArtem Bityutskiy  * @inode1: first inode
12789e0a1fffSRichard Weinberger  * @inode2: second inode
12799e0a1fffSRichard Weinberger  * @inode3: third inode
12801e51764aSArtem Bityutskiy  * @inode4: fourth inode
12819e0a1fffSRichard Weinberger  */
unlock_4_inodes(struct inode * inode1,struct inode * inode2,struct inode * inode3,struct inode * inode4)12829e0a1fffSRichard Weinberger static void unlock_4_inodes(struct inode *inode1, struct inode *inode2,
12831e51764aSArtem Bityutskiy 			    struct inode *inode3, struct inode *inode4)
12841e51764aSArtem Bityutskiy {
128582c1593cSArtem Bityutskiy 	if (inode4)
128682c1593cSArtem Bityutskiy 		mutex_unlock(&ubifs_inode(inode4)->ui_mutex);
128782c1593cSArtem Bityutskiy 	if (inode3)
12881e51764aSArtem Bityutskiy 		mutex_unlock(&ubifs_inode(inode3)->ui_mutex);
12891e51764aSArtem Bityutskiy 	if (inode1 != inode2)
1290390975acSRichard Weinberger 		mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
1291f03b8ad8SMiklos Szeredi 	mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
1292f03b8ad8SMiklos Szeredi }
12931e51764aSArtem Bityutskiy 
do_rename(struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry,unsigned int flags)12941e51764aSArtem Bityutskiy static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
12952b0143b5SDavid Howells 		     struct inode *new_dir, struct dentry *new_dentry,
12962b0143b5SDavid Howells 		     unsigned int flags)
12979e0a1fffSRichard Weinberger {
12981e51764aSArtem Bityutskiy 	struct ubifs_info *c = old_dir->i_sb->s_fs_info;
12999e0a1fffSRichard Weinberger 	struct inode *old_inode = d_inode(old_dentry);
13001e51764aSArtem Bityutskiy 	struct inode *new_inode = d_inode(new_dentry);
13011e51764aSArtem Bityutskiy 	struct inode *whiteout = NULL;
1302f4f61d2cSRichard Weinberger 	struct ubifs_inode *old_inode_ui = ubifs_inode(old_inode);
13031e51764aSArtem Bityutskiy 	struct ubifs_inode *whiteout_ui = NULL;
13041e51764aSArtem Bityutskiy 	int err, release, sync = 0, move = (new_dir != old_dir);
13051e51764aSArtem Bityutskiy 	int is_dir = S_ISDIR(old_inode->i_mode);
1306dab4b4d2SArtem Bityutskiy 	int unlink = !!new_inode, new_sz, old_sz;
1307278d9a24SZhihao Cheng 	struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1,
13083f649ab7SKees Cook 					.dirtied_ino = 3 };
1309f4f61d2cSRichard Weinberger 	struct ubifs_budget_req ino_req = { .dirtied_ino = 1,
13101e51764aSArtem Bityutskiy 			.dirtied_ino_d = ALIGN(old_inode_ui->data_len, 8) };
13111e51764aSArtem Bityutskiy 	struct ubifs_budget_req wht_req;
1312278d9a24SZhihao Cheng 	unsigned int saved_nlink;
1313278d9a24SZhihao Cheng 	struct fscrypt_name old_nm, new_nm;
1314278d9a24SZhihao Cheng 
13151e51764aSArtem Bityutskiy 	/*
1316278d9a24SZhihao Cheng 	 * Budget request settings:
1317278d9a24SZhihao Cheng 	 *   req: deletion direntry, new direntry, removing the old inode,
1318278d9a24SZhihao Cheng 	 *   and changing old and new parent directory inodes.
13191e51764aSArtem Bityutskiy 	 *
13201e51764aSArtem Bityutskiy 	 *   wht_req: new whiteout inode for RENAME_WHITEOUT.
13219e0a1fffSRichard Weinberger 	 *
13224cb2a01dSAl Viro 	 *   ino_req: marks the target inode as dirty and does not write it.
13239e0a1fffSRichard Weinberger 	 */
13249e0a1fffSRichard Weinberger 
13259ca2d732SRichard Weinberger 	dbg_gen("dent '%pd' ino %lu in dir ino %lu to dent '%pd' in dir ino %lu flags 0x%x",
13266eb61d58SRichard Weinberger 		old_dentry, old_inode->i_ino, old_dir->i_ino,
132782c1593cSArtem Bityutskiy 		new_dentry, new_dir->i_ino, flags);
132825fce616SZhihao Cheng 
132925fce616SZhihao Cheng 	if (unlink) {
13309ca2d732SRichard Weinberger 		ubifs_assert(c, inode_is_locked(new_inode));
13319ca2d732SRichard Weinberger 
13329ca2d732SRichard Weinberger 		/* Budget for old inode's data when its nlink > 1. */
13339ca2d732SRichard Weinberger 		req.dirtied_ino_d = ALIGN(ubifs_inode(new_inode)->data_len, 8);
13349ca2d732SRichard Weinberger 		err = ubifs_purge_xattrs(new_inode);
13351e51764aSArtem Bityutskiy 		if (err)
1336f6337d84SRichard Weinberger 			return err;
13371e51764aSArtem Bityutskiy 	}
13381e51764aSArtem Bityutskiy 
13391e51764aSArtem Bityutskiy 	if (unlink && is_dir) {
13401e51764aSArtem Bityutskiy 		err = ubifs_check_dir_empty(new_inode);
1341f4f61d2cSRichard Weinberger 		if (err)
13421e51764aSArtem Bityutskiy 			return err;
13431e51764aSArtem Bityutskiy 	}
1344f4f61d2cSRichard Weinberger 
1345f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(old_dir, &old_dentry->d_name, 0, &old_nm);
1346f4f61d2cSRichard Weinberger 	if (err)
1347f4f61d2cSRichard Weinberger 		return err;
1348f4f61d2cSRichard Weinberger 
1349f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(new_dir, &new_dentry->d_name, 0, &new_nm);
1350f4f61d2cSRichard Weinberger 	if (err) {
1351f4f61d2cSRichard Weinberger 		fscrypt_free_filename(&old_nm);
1352f4f61d2cSRichard Weinberger 		return err;
1353f4f61d2cSRichard Weinberger 	}
1354f4f61d2cSRichard Weinberger 
1355f4f61d2cSRichard Weinberger 	new_sz = CALC_DENT_SIZE(fname_len(&new_nm));
1356f4f61d2cSRichard Weinberger 	old_sz = CALC_DENT_SIZE(fname_len(&old_nm));
1357f4f61d2cSRichard Weinberger 
1358f4f61d2cSRichard Weinberger 	err = ubifs_budget_space(c, &req);
1359f4f61d2cSRichard Weinberger 	if (err) {
13601e51764aSArtem Bityutskiy 		fscrypt_free_filename(&old_nm);
13611e51764aSArtem Bityutskiy 		fscrypt_free_filename(&new_nm);
1362f4f61d2cSRichard Weinberger 		return err;
1363f4f61d2cSRichard Weinberger 	}
13641e51764aSArtem Bityutskiy 	err = ubifs_budget_space(c, &ino_req);
13651e51764aSArtem Bityutskiy 	if (err) {
13661e51764aSArtem Bityutskiy 		fscrypt_free_filename(&old_nm);
13671e51764aSArtem Bityutskiy 		fscrypt_free_filename(&new_nm);
13689e0a1fffSRichard Weinberger 		ubifs_release_budget(c, &req);
13699e0a1fffSRichard Weinberger 		return err;
13709e0a1fffSRichard Weinberger 	}
13719e0a1fffSRichard Weinberger 
13729e0a1fffSRichard Weinberger 	if (flags & RENAME_WHITEOUT) {
1373bb50c632SHyunchul Lee 		union ubifs_dev_desc *dev = NULL;
1374bb50c632SHyunchul Lee 
13759e0a1fffSRichard Weinberger 		dev = kmalloc(sizeof(union ubifs_dev_desc), GFP_NOFS);
13769e0a1fffSRichard Weinberger 		if (!dev) {
1377278d9a24SZhihao Cheng 			err = -ENOMEM;
1378278d9a24SZhihao Cheng 			goto out_release;
1379278d9a24SZhihao Cheng 		}
1380278d9a24SZhihao Cheng 
1381278d9a24SZhihao Cheng 		/*
1382278d9a24SZhihao Cheng 		 * The whiteout inode without dentry is pinned in memory,
1383278d9a24SZhihao Cheng 		 * umount won't happen during rename process because we
1384278d9a24SZhihao Cheng 		 * got parent dentry.
13859e0a1fffSRichard Weinberger 		 */
1386bb50c632SHyunchul Lee 		whiteout = create_whiteout(old_dir, old_dentry);
13879e0a1fffSRichard Weinberger 		if (IS_ERR(whiteout)) {
13889e0a1fffSRichard Weinberger 			err = PTR_ERR(whiteout);
13899e0a1fffSRichard Weinberger 			kfree(dev);
13909e0a1fffSRichard Weinberger 			goto out_release;
13919e0a1fffSRichard Weinberger 		}
13926eb61d58SRichard Weinberger 
1393afd42704SZhihao Cheng 		whiteout_ui = ubifs_inode(whiteout);
1394afd42704SZhihao Cheng 		whiteout_ui->data = dev;
1395278d9a24SZhihao Cheng 		whiteout_ui->data_len = ubifs_encode_dev(dev, MKDEV(0, 0));
1396278d9a24SZhihao Cheng 		ubifs_assert(c, !whiteout_ui->dirty);
1397afd42704SZhihao Cheng 
1398afd42704SZhihao Cheng 		memset(&wht_req, 0, sizeof(struct ubifs_budget_req));
1399afd42704SZhihao Cheng 		wht_req.new_ino = 1;
1400afd42704SZhihao Cheng 		wht_req.new_ino_d = ALIGN(whiteout_ui->data_len, 8);
1401afd42704SZhihao Cheng 		/*
1402afd42704SZhihao Cheng 		 * To avoid deadlock between space budget (holds ui_mutex and
1403afd42704SZhihao Cheng 		 * waits wb work) and writeback work(waits ui_mutex), do space
1404278d9a24SZhihao Cheng 		 * budget before ubifs inodes locked.
1405278d9a24SZhihao Cheng 		 */
1406278d9a24SZhihao Cheng 		err = ubifs_budget_space(c, &wht_req);
1407278d9a24SZhihao Cheng 		if (err) {
1408278d9a24SZhihao Cheng 			/*
1409afd42704SZhihao Cheng 			 * Whiteout inode can not be written on flash by
1410afd42704SZhihao Cheng 			 * ubifs_jnl_write_inode(), because it's neither
1411afd42704SZhihao Cheng 			 * dirty nor zero-nlink.
141270575727SBaokun Li 			 */
141370575727SBaokun Li 			iput(whiteout);
141470575727SBaokun Li 			goto out_release;
14159e0a1fffSRichard Weinberger 		}
14169e0a1fffSRichard Weinberger 
14179e0a1fffSRichard Weinberger 		/* Add the old_dentry size to the old_dir size. */
14181e51764aSArtem Bityutskiy 		old_sz -= CALC_DENT_SIZE(fname_len(&old_nm));
14191e51764aSArtem Bityutskiy 	}
14201e51764aSArtem Bityutskiy 
14211e51764aSArtem Bityutskiy 	lock_4_inodes(old_dir, new_dir, new_inode, whiteout);
14221e51764aSArtem Bityutskiy 
1423e54c86fdSJeff Layton 	/*
14241e51764aSArtem Bityutskiy 	 * Like most other Unix systems, set the @i_ctime for inodes on a
14251e51764aSArtem Bityutskiy 	 * rename.
14261e51764aSArtem Bityutskiy 	 */
14271e51764aSArtem Bityutskiy 	simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry);
14281e51764aSArtem Bityutskiy 
14291e51764aSArtem Bityutskiy 	/* We must adjust parent link count when renaming directories */
14301e51764aSArtem Bityutskiy 	if (is_dir) {
14311e51764aSArtem Bityutskiy 		if (move) {
14321e51764aSArtem Bityutskiy 			/*
14331e51764aSArtem Bityutskiy 			 * @old_dir loses a link because we are moving
14341e51764aSArtem Bityutskiy 			 * @old_inode to a different directory.
14351e51764aSArtem Bityutskiy 			 */
14361e51764aSArtem Bityutskiy 			drop_nlink(old_dir);
14371e51764aSArtem Bityutskiy 			/*
14381e51764aSArtem Bityutskiy 			 * @new_dir only gains a link if we are not also
14391e51764aSArtem Bityutskiy 			 * overwriting an existing directory.
14401e51764aSArtem Bityutskiy 			 */
14411e51764aSArtem Bityutskiy 			if (!unlink)
14421e51764aSArtem Bityutskiy 				inc_nlink(new_dir);
14431e51764aSArtem Bityutskiy 		} else {
14441e51764aSArtem Bityutskiy 			/*
14451e51764aSArtem Bityutskiy 			 * @old_inode is not moving to a different directory,
14461e51764aSArtem Bityutskiy 			 * but @old_dir still loses a link if we are
14471e51764aSArtem Bityutskiy 			 * overwriting an existing directory.
14481e51764aSArtem Bityutskiy 			 */
14491e51764aSArtem Bityutskiy 			if (unlink)
14501e51764aSArtem Bityutskiy 				drop_nlink(old_dir);
14511e51764aSArtem Bityutskiy 		}
14521e51764aSArtem Bityutskiy 	}
14531e51764aSArtem Bityutskiy 
14541e51764aSArtem Bityutskiy 	old_dir->i_size -= old_sz;
14551e51764aSArtem Bityutskiy 	ubifs_inode(old_dir)->ui_size = old_dir->i_size;
1456e54c86fdSJeff Layton 
14571e51764aSArtem Bityutskiy 	/*
14581e51764aSArtem Bityutskiy 	 * And finally, if we unlinked a direntry which happened to have the
14591e51764aSArtem Bityutskiy 	 * same name as the moved direntry, we have to decrement @i_nlink of
14601e51764aSArtem Bityutskiy 	 * the unlinked inode.
1461c43be108SArtem Bityutskiy 	 */
14621e51764aSArtem Bityutskiy 	if (unlink) {
1463c43be108SArtem Bityutskiy 		/*
14641e51764aSArtem Bityutskiy 		 * Directories cannot have hard-links, so if this is a
1465c43be108SArtem Bityutskiy 		 * directory, just clear @i_nlink.
1466c43be108SArtem Bityutskiy 		 */
14671e51764aSArtem Bityutskiy 		saved_nlink = new_inode->i_nlink;
14681e51764aSArtem Bityutskiy 		if (is_dir)
14691e51764aSArtem Bityutskiy 			clear_nlink(new_inode);
14701e51764aSArtem Bityutskiy 		else
14711e51764aSArtem Bityutskiy 			drop_nlink(new_inode);
14721e51764aSArtem Bityutskiy 	} else {
14731e51764aSArtem Bityutskiy 		new_dir->i_size += new_sz;
14741e51764aSArtem Bityutskiy 		ubifs_inode(new_dir)->ui_size = new_dir->i_size;
14751e51764aSArtem Bityutskiy 	}
14761e51764aSArtem Bityutskiy 
14771e51764aSArtem Bityutskiy 	/*
14781e51764aSArtem Bityutskiy 	 * Do not ask 'ubifs_jnl_rename()' to flush write-buffer if @old_inode
14791e51764aSArtem Bityutskiy 	 * is dirty, because this will be done later on at the end of
14801e51764aSArtem Bityutskiy 	 * 'ubifs_rename()'.
14811e51764aSArtem Bityutskiy 	 */
1482278d9a24SZhihao Cheng 	if (IS_SYNC(old_inode)) {
1483278d9a24SZhihao Cheng 		sync = IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir);
1484278d9a24SZhihao Cheng 		if (unlink && IS_SYNC(new_inode))
1485278d9a24SZhihao Cheng 			sync = 1;
1486278d9a24SZhihao Cheng 		/*
14879e0a1fffSRichard Weinberger 		 * S_SYNC flag of whiteout inherits from the old_dir, and we
14889e0a1fffSRichard Weinberger 		 * have already checked the old dir inode. So there is no need
1489f4f61d2cSRichard Weinberger 		 * to check whiteout.
1490f4f61d2cSRichard Weinberger 		 */
14911e51764aSArtem Bityutskiy 	}
14921e51764aSArtem Bityutskiy 
14931e51764aSArtem Bityutskiy 	err = ubifs_jnl_rename(c, old_dir, old_inode, &old_nm, new_dir,
14949e0a1fffSRichard Weinberger 			       new_inode, &new_nm, whiteout, sync);
14951e51764aSArtem Bityutskiy 	if (err)
14961e51764aSArtem Bityutskiy 		goto out_cancel;
1497278d9a24SZhihao Cheng 
1498278d9a24SZhihao Cheng 	unlock_4_inodes(old_dir, new_dir, new_inode, whiteout);
1499278d9a24SZhihao Cheng 	ubifs_release_budget(c, &req);
1500278d9a24SZhihao Cheng 
1501278d9a24SZhihao Cheng 	if (whiteout) {
15021e51764aSArtem Bityutskiy 		ubifs_release_budget(c, &wht_req);
15031e51764aSArtem Bityutskiy 		iput(whiteout);
15041e51764aSArtem Bityutskiy 	}
15051e51764aSArtem Bityutskiy 
15061e51764aSArtem Bityutskiy 	mutex_lock(&old_inode_ui->ui_mutex);
15071e51764aSArtem Bityutskiy 	release = old_inode_ui->dirty;
15081e51764aSArtem Bityutskiy 	mark_inode_dirty_sync(old_inode);
15091e51764aSArtem Bityutskiy 	mutex_unlock(&old_inode_ui->ui_mutex);
1510278d9a24SZhihao Cheng 
1511278d9a24SZhihao Cheng 	if (release)
1512278d9a24SZhihao Cheng 		ubifs_release_budget(c, &ino_req);
1513278d9a24SZhihao Cheng 	if (IS_SYNC(old_inode))
1514278d9a24SZhihao Cheng 		/*
1515278d9a24SZhihao Cheng 		 * Rename finished here. Although old inode cannot be updated
1516f4f61d2cSRichard Weinberger 		 * on flash, old ctime is not a big problem, don't return err
1517f4f61d2cSRichard Weinberger 		 * code to userspace.
1518f4f61d2cSRichard Weinberger 		 */
1519278d9a24SZhihao Cheng 		old_inode->i_sb->s_op->write_inode(old_inode, NULL);
15201e51764aSArtem Bityutskiy 
15211e51764aSArtem Bityutskiy 	fscrypt_free_filename(&old_nm);
15221e51764aSArtem Bityutskiy 	fscrypt_free_filename(&new_nm);
1523c43be108SArtem Bityutskiy 	return 0;
15241e51764aSArtem Bityutskiy 
15251e51764aSArtem Bityutskiy out_cancel:
15261e51764aSArtem Bityutskiy 	if (unlink) {
15271e51764aSArtem Bityutskiy 		set_nlink(new_inode, saved_nlink);
15281e51764aSArtem Bityutskiy 	} else {
15291e51764aSArtem Bityutskiy 		new_dir->i_size -= new_sz;
15301e51764aSArtem Bityutskiy 		ubifs_inode(new_dir)->ui_size = new_dir->i_size;
15311e51764aSArtem Bityutskiy 	}
15321e51764aSArtem Bityutskiy 	old_dir->i_size += old_sz;
15331e51764aSArtem Bityutskiy 	ubifs_inode(old_dir)->ui_size = old_dir->i_size;
15341e51764aSArtem Bityutskiy 	if (is_dir) {
15351e51764aSArtem Bityutskiy 		if (move) {
15361e51764aSArtem Bityutskiy 			inc_nlink(old_dir);
15371e51764aSArtem Bityutskiy 			if (!unlink)
15381e51764aSArtem Bityutskiy 				drop_nlink(new_dir);
15391e51764aSArtem Bityutskiy 		} else {
1540278d9a24SZhihao Cheng 			if (unlink)
15419e0a1fffSRichard Weinberger 				inc_nlink(old_dir);
1542278d9a24SZhihao Cheng 		}
15439e0a1fffSRichard Weinberger 	}
15449e0a1fffSRichard Weinberger 	unlock_4_inodes(old_dir, new_dir, new_inode, whiteout);
1545bb50c632SHyunchul Lee 	if (whiteout) {
15461e51764aSArtem Bityutskiy 		ubifs_release_budget(c, &wht_req);
15471e51764aSArtem Bityutskiy 		iput(whiteout);
1548f4f61d2cSRichard Weinberger 	}
1549f4f61d2cSRichard Weinberger out_release:
15501e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &ino_req);
15511e51764aSArtem Bityutskiy 	ubifs_release_budget(c, &req);
15521e51764aSArtem Bityutskiy 	fscrypt_free_filename(&old_nm);
15539ec64962SRichard Weinberger 	fscrypt_free_filename(&new_nm);
15549ec64962SRichard Weinberger 	return err;
15559ec64962SRichard Weinberger }
15569ec64962SRichard Weinberger 
ubifs_xrename(struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry)15579ec64962SRichard Weinberger static int ubifs_xrename(struct inode *old_dir, struct dentry *old_dentry,
15589ec64962SRichard Weinberger 			struct inode *new_dir, struct dentry *new_dentry)
15599ec64962SRichard Weinberger {
15609ec64962SRichard Weinberger 	struct ubifs_info *c = old_dir->i_sb->s_fs_info;
15619ec64962SRichard Weinberger 	struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1,
15629ec64962SRichard Weinberger 				.dirtied_ino = 2 };
1563f4f61d2cSRichard Weinberger 	int sync = IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir);
15649ec64962SRichard Weinberger 	struct inode *fst_inode = d_inode(old_dentry);
15656eb61d58SRichard Weinberger 	struct inode *snd_inode = d_inode(new_dentry);
15669ec64962SRichard Weinberger 	int err;
1567c04cc68dSZhihao Cheng 	struct fscrypt_name fst_nm, snd_nm;
1568c04cc68dSZhihao Cheng 
1569c04cc68dSZhihao Cheng 	ubifs_assert(c, fst_inode && snd_inode);
1570c04cc68dSZhihao Cheng 
1571c04cc68dSZhihao Cheng 	/*
1572c04cc68dSZhihao Cheng 	 * Budget request settings: changing two direntries, changing the two
1573c04cc68dSZhihao Cheng 	 * parent directory inodes.
1574c04cc68dSZhihao Cheng 	 */
1575c04cc68dSZhihao Cheng 
1576f4f61d2cSRichard Weinberger 	dbg_gen("dent '%pd' ino %lu in dir ino %lu exchange dent '%pd' ino %lu in dir ino %lu",
1577f4f61d2cSRichard Weinberger 		old_dentry, fst_inode->i_ino, old_dir->i_ino,
1578f4f61d2cSRichard Weinberger 		new_dentry, snd_inode->i_ino, new_dir->i_ino);
1579f4f61d2cSRichard Weinberger 
1580f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(old_dir, &old_dentry->d_name, 0, &fst_nm);
1581f4f61d2cSRichard Weinberger 	if (err)
1582f4f61d2cSRichard Weinberger 		return err;
1583f4f61d2cSRichard Weinberger 
1584f4f61d2cSRichard Weinberger 	err = fscrypt_setup_filename(new_dir, &new_dentry->d_name, 0, &snd_nm);
1585f4f61d2cSRichard Weinberger 	if (err) {
15861b2ba090SZhihao Cheng 		fscrypt_free_filename(&fst_nm);
15871b2ba090SZhihao Cheng 		return err;
15881b2ba090SZhihao Cheng 	}
15891b2ba090SZhihao Cheng 
15909ec64962SRichard Weinberger 	err = ubifs_budget_space(c, &req);
15919ec64962SRichard Weinberger 	if (err)
1592e54c86fdSJeff Layton 		goto out;
15939ec64962SRichard Weinberger 
15949ec64962SRichard Weinberger 	lock_4_inodes(old_dir, new_dir, NULL, NULL);
15959ec64962SRichard Weinberger 
15969ec64962SRichard Weinberger 	simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry);
15979ec64962SRichard Weinberger 
15989ec64962SRichard Weinberger 	if (old_dir != new_dir) {
15999ec64962SRichard Weinberger 		if (S_ISDIR(fst_inode->i_mode) && !S_ISDIR(snd_inode->i_mode)) {
16009ec64962SRichard Weinberger 			inc_nlink(new_dir);
16019ec64962SRichard Weinberger 			drop_nlink(old_dir);
16029ec64962SRichard Weinberger 		}
16039ec64962SRichard Weinberger 		else if (!S_ISDIR(fst_inode->i_mode) && S_ISDIR(snd_inode->i_mode)) {
16049ec64962SRichard Weinberger 			drop_nlink(new_dir);
1605f4f61d2cSRichard Weinberger 			inc_nlink(old_dir);
1606f4f61d2cSRichard Weinberger 		}
16079ec64962SRichard Weinberger 	}
16089ec64962SRichard Weinberger 
16099ec64962SRichard Weinberger 	err = ubifs_jnl_xrename(c, old_dir, fst_inode, &fst_nm, new_dir,
16109ec64962SRichard Weinberger 				snd_inode, &snd_nm, sync);
16111b2ba090SZhihao Cheng 
1612f4f61d2cSRichard Weinberger 	unlock_4_inodes(old_dir, new_dir, NULL, NULL);
1613f4f61d2cSRichard Weinberger 	ubifs_release_budget(c, &req);
16149ec64962SRichard Weinberger 
16159ec64962SRichard Weinberger out:
16169ec64962SRichard Weinberger 	fscrypt_free_filename(&fst_nm);
1617e18275aeSChristian Brauner 	fscrypt_free_filename(&snd_nm);
1618549c7297SChristian Brauner 	return err;
16199ec64962SRichard Weinberger }
16209ec64962SRichard Weinberger 
ubifs_rename(struct mnt_idmap * idmap,struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry,unsigned int flags)16219ec64962SRichard Weinberger static int ubifs_rename(struct mnt_idmap *idmap,
16220c1ad524SEric Biggers 			struct inode *old_dir, struct dentry *old_dentry,
16236eb61d58SRichard Weinberger 			struct inode *new_dir, struct dentry *new_dentry,
16240c1ad524SEric Biggers 			unsigned int flags)
16259ec64962SRichard Weinberger {
16269ec64962SRichard Weinberger 	int err;
16279ec64962SRichard Weinberger 	struct ubifs_info *c = old_dir->i_sb->s_fs_info;
16286eb61d58SRichard Weinberger 
16296eb61d58SRichard Weinberger 	if (flags & ~(RENAME_NOREPLACE | RENAME_WHITEOUT | RENAME_EXCHANGE))
16309ec64962SRichard Weinberger 		return -EINVAL;
16310c1ad524SEric Biggers 
16320c1ad524SEric Biggers 	ubifs_assert(c, inode_is_locked(old_dir));
16330c1ad524SEric Biggers 	ubifs_assert(c, inode_is_locked(new_dir));
16340c1ad524SEric Biggers 
16350c1ad524SEric Biggers 	err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
16369ec64962SRichard Weinberger 				     flags);
16379ec64962SRichard Weinberger 	if (err)
16389ec64962SRichard Weinberger 		return err;
1639390975acSRichard Weinberger 
16409ec64962SRichard Weinberger 	if (flags & RENAME_EXCHANGE)
16419ec64962SRichard Weinberger 		return ubifs_xrename(old_dir, old_dentry, new_dir, new_dentry);
1642b74d24f7SChristian Brauner 
1643549c7297SChristian Brauner 	return do_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
16441e51764aSArtem Bityutskiy }
16451e51764aSArtem Bityutskiy 
ubifs_getattr(struct mnt_idmap * idmap,const struct path * path,struct kstat * stat,u32 request_mask,unsigned int flags)1646a528d35eSDavid Howells int ubifs_getattr(struct mnt_idmap *idmap, const struct path *path,
16471e51764aSArtem Bityutskiy 		  struct kstat *stat, u32 request_mask, unsigned int flags)
16481e51764aSArtem Bityutskiy {
16491e51764aSArtem Bityutskiy 	loff_t size;
1650a02a6ebaSRichard Weinberger 	struct inode *inode = d_inode(path->dentry);
1651a02a6ebaSRichard Weinberger 	struct ubifs_inode *ui = ubifs_inode(inode);
1652a02a6ebaSRichard Weinberger 
1653a02a6ebaSRichard Weinberger 	mutex_lock(&ui->ui_mutex);
1654a02a6ebaSRichard Weinberger 
1655a02a6ebaSRichard Weinberger 	if (ui->flags & UBIFS_APPEND_FL)
1656a02a6ebaSRichard Weinberger 		stat->attributes |= STATX_ATTR_APPEND;
1657a02a6ebaSRichard Weinberger 	if (ui->flags & UBIFS_COMPR_FL)
1658a02a6ebaSRichard Weinberger 		stat->attributes |= STATX_ATTR_COMPRESSED;
1659a02a6ebaSRichard Weinberger 	if (ui->flags & UBIFS_CRYPT_FL)
1660a02a6ebaSRichard Weinberger 		stat->attributes |= STATX_ATTR_ENCRYPTED;
1661a02a6ebaSRichard Weinberger 	if (ui->flags & UBIFS_IMMUTABLE_FL)
1662a02a6ebaSRichard Weinberger 		stat->attributes |= STATX_ATTR_IMMUTABLE;
1663a02a6ebaSRichard Weinberger 
1664a02a6ebaSRichard Weinberger 	stat->attributes_mask |= (STATX_ATTR_APPEND |
16650d72b928SJeff Layton 				STATX_ATTR_COMPRESSED |
16661e51764aSArtem Bityutskiy 				STATX_ATTR_ENCRYPTED |
16671e51764aSArtem Bityutskiy 				STATX_ATTR_IMMUTABLE);
16681e51764aSArtem Bityutskiy 
16691e51764aSArtem Bityutskiy 	generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
16701e51764aSArtem Bityutskiy 	stat->blksize = UBIFS_BLOCK_SIZE;
16711e51764aSArtem Bityutskiy 	stat->size = ui->ui_size;
16721e51764aSArtem Bityutskiy 
16731e51764aSArtem Bityutskiy 	/*
16741e51764aSArtem Bityutskiy 	 * Unfortunately, the 'stat()' system call was designed for block
16751e51764aSArtem Bityutskiy 	 * device based file systems, and it is not appropriate for UBIFS,
16761e51764aSArtem Bityutskiy 	 * because UBIFS does not have notion of "block". For example, it is
16771e51764aSArtem Bityutskiy 	 * difficult to tell how many block a directory takes - it actually
16781e51764aSArtem Bityutskiy 	 * takes less than 300 bytes, but we have to round it to block size,
16791e51764aSArtem Bityutskiy 	 * which introduces large mistake. This makes utilities like 'du' to
16801e51764aSArtem Bityutskiy 	 * report completely senseless numbers. This is the reason why UBIFS
16811e51764aSArtem Bityutskiy 	 * goes the same way as JFFS2 - it reports zero blocks for everything
16821e51764aSArtem Bityutskiy 	 * but regular files, which makes more sense than reporting completely
16831e51764aSArtem Bityutskiy 	 * wrong sizes.
16841e51764aSArtem Bityutskiy 	 */
16851e51764aSArtem Bityutskiy 	if (S_ISREG(inode->i_mode)) {
16861e51764aSArtem Bityutskiy 		size = ui->xattr_size;
16871e51764aSArtem Bityutskiy 		size += stat->size;
16881e51764aSArtem Bityutskiy 		size = ALIGN(size, UBIFS_BLOCK_SIZE);
16891e51764aSArtem Bityutskiy 		/*
16901e51764aSArtem Bityutskiy 		 * Note, user-space expects 512-byte blocks count irrespectively
16911e51764aSArtem Bityutskiy 		 * of what was reported in @stat->size.
16921e51764aSArtem Bityutskiy 		 */
16931e51764aSArtem Bityutskiy 		stat->blocks = size >> 9;
16941e51764aSArtem Bityutskiy 	} else
16951e51764aSArtem Bityutskiy 		stat->blocks = 0;
1696e8b81566SArtem Bityutskiy 	mutex_unlock(&ui->ui_mutex);
16971e51764aSArtem Bityutskiy 	return 0;
16981e51764aSArtem Bityutskiy }
16991e51764aSArtem Bityutskiy 
17001e51764aSArtem Bityutskiy const struct inode_operations ubifs_dir_inode_operations = {
17011e51764aSArtem Bityutskiy 	.lookup      = ubifs_lookup,
17021e51764aSArtem Bityutskiy 	.create      = ubifs_create,
17031e51764aSArtem Bityutskiy 	.link        = ubifs_link,
17041e51764aSArtem Bityutskiy 	.symlink     = ubifs_symlink,
1705390975acSRichard Weinberger 	.unlink      = ubifs_unlink,
17061e51764aSArtem Bityutskiy 	.mkdir       = ubifs_mkdir,
17071e51764aSArtem Bityutskiy 	.rmdir       = ubifs_rmdir,
17081e51764aSArtem Bityutskiy 	.mknod       = ubifs_mknod,
17098c1c5f26SDongsheng Yang 	.rename      = ubifs_rename,
1710474b9370SRichard Weinberger 	.setattr     = ubifs_setattr,
17118871d84cSMiklos Szeredi 	.getattr     = ubifs_getattr,
17128871d84cSMiklos Szeredi 	.listxattr   = ubifs_listxattr,
17131e51764aSArtem Bityutskiy 	.update_time = ubifs_update_time,
17141e51764aSArtem Bityutskiy 	.tmpfile     = ubifs_tmpfile,
1715e8b81566SArtem Bityutskiy 	.fileattr_get = ubifs_fileattr_get,
171601122e06SAl Viro 	.fileattr_set = ubifs_fileattr_set,
17171e51764aSArtem Bityutskiy };
17181e51764aSArtem Bityutskiy 
1719c51da20cSAl Viro const struct file_operations ubifs_dir_operations = {
17201e51764aSArtem Bityutskiy 	.llseek         = generic_file_llseek,
17211e51764aSArtem Bityutskiy 	.release        = ubifs_dir_release,
17221e51764aSArtem Bityutskiy 	.read           = generic_read_dir,
17231e51764aSArtem Bityutskiy 	.iterate_shared = ubifs_readdir,
17241e51764aSArtem Bityutskiy 	.fsync          = ubifs_fsync,
17251e51764aSArtem Bityutskiy 	.unlocked_ioctl = ubifs_ioctl,
1726 #ifdef CONFIG_COMPAT
1727 	.compat_ioctl   = ubifs_compat_ioctl,
1728 #endif
1729 };
1730