xref: /openbmc/linux/fs/overlayfs/dir.c (revision 0ee931c4)
1e9be9d5eSMiklos Szeredi /*
2e9be9d5eSMiklos Szeredi  *
3e9be9d5eSMiklos Szeredi  * Copyright (C) 2011 Novell Inc.
4e9be9d5eSMiklos Szeredi  *
5e9be9d5eSMiklos Szeredi  * This program is free software; you can redistribute it and/or modify it
6e9be9d5eSMiklos Szeredi  * under the terms of the GNU General Public License version 2 as published by
7e9be9d5eSMiklos Szeredi  * the Free Software Foundation.
8e9be9d5eSMiklos Szeredi  */
9e9be9d5eSMiklos Szeredi 
10e9be9d5eSMiklos Szeredi #include <linux/fs.h>
11e9be9d5eSMiklos Szeredi #include <linux/namei.h>
12e9be9d5eSMiklos Szeredi #include <linux/xattr.h>
13e9be9d5eSMiklos Szeredi #include <linux/security.h>
14e9be9d5eSMiklos Szeredi #include <linux/cred.h>
153ea22a71SMiklos Szeredi #include <linux/module.h>
1638b25697SMiklos Szeredi #include <linux/posix_acl.h>
1738b25697SMiklos Szeredi #include <linux/posix_acl_xattr.h>
186a45b362SRichard Weinberger #include <linux/atomic.h>
19a6c60655SMiklos Szeredi #include <linux/ratelimit.h>
20e9be9d5eSMiklos Szeredi #include "overlayfs.h"
21e9be9d5eSMiklos Szeredi 
223ea22a71SMiklos Szeredi static unsigned short ovl_redirect_max = 256;
233ea22a71SMiklos Szeredi module_param_named(redirect_max, ovl_redirect_max, ushort, 0644);
243ea22a71SMiklos Szeredi MODULE_PARM_DESC(ovl_redirect_max,
253ea22a71SMiklos Szeredi 		 "Maximum length of absolute redirect xattr value");
263ea22a71SMiklos Szeredi 
27415543d5SAmir Goldstein int ovl_cleanup(struct inode *wdir, struct dentry *wdentry)
28e9be9d5eSMiklos Szeredi {
29e9be9d5eSMiklos Szeredi 	int err;
30e9be9d5eSMiklos Szeredi 
31e9be9d5eSMiklos Szeredi 	dget(wdentry);
32e36cb0b8SDavid Howells 	if (d_is_dir(wdentry))
33e9be9d5eSMiklos Szeredi 		err = ovl_do_rmdir(wdir, wdentry);
34e9be9d5eSMiklos Szeredi 	else
35e9be9d5eSMiklos Szeredi 		err = ovl_do_unlink(wdir, wdentry);
36e9be9d5eSMiklos Szeredi 	dput(wdentry);
37e9be9d5eSMiklos Szeredi 
38e9be9d5eSMiklos Szeredi 	if (err) {
39e9be9d5eSMiklos Szeredi 		pr_err("overlayfs: cleanup of '%pd2' failed (%i)\n",
40e9be9d5eSMiklos Szeredi 		       wdentry, err);
41e9be9d5eSMiklos Szeredi 	}
42415543d5SAmir Goldstein 
43415543d5SAmir Goldstein 	return err;
44e9be9d5eSMiklos Szeredi }
45e9be9d5eSMiklos Szeredi 
463d27573cSMiklos Szeredi struct dentry *ovl_lookup_temp(struct dentry *workdir)
47e9be9d5eSMiklos Szeredi {
48e9be9d5eSMiklos Szeredi 	struct dentry *temp;
49e9be9d5eSMiklos Szeredi 	char name[20];
506a45b362SRichard Weinberger 	static atomic_t temp_id = ATOMIC_INIT(0);
51e9be9d5eSMiklos Szeredi 
526a45b362SRichard Weinberger 	/* counter is allowed to wrap, since temp dentries are ephemeral */
536a45b362SRichard Weinberger 	snprintf(name, sizeof(name), "#%x", atomic_inc_return(&temp_id));
54e9be9d5eSMiklos Szeredi 
55e9be9d5eSMiklos Szeredi 	temp = lookup_one_len(name, workdir, strlen(name));
56e9be9d5eSMiklos Szeredi 	if (!IS_ERR(temp) && temp->d_inode) {
57e9be9d5eSMiklos Szeredi 		pr_err("overlayfs: workdir/%s already exists\n", name);
58e9be9d5eSMiklos Szeredi 		dput(temp);
59e9be9d5eSMiklos Szeredi 		temp = ERR_PTR(-EIO);
60e9be9d5eSMiklos Szeredi 	}
61e9be9d5eSMiklos Szeredi 
62e9be9d5eSMiklos Szeredi 	return temp;
63e9be9d5eSMiklos Szeredi }
64e9be9d5eSMiklos Szeredi 
65e9be9d5eSMiklos Szeredi /* caller holds i_mutex on workdir */
66e9be9d5eSMiklos Szeredi static struct dentry *ovl_whiteout(struct dentry *workdir,
67e9be9d5eSMiklos Szeredi 				   struct dentry *dentry)
68e9be9d5eSMiklos Szeredi {
69e9be9d5eSMiklos Szeredi 	int err;
70e9be9d5eSMiklos Szeredi 	struct dentry *whiteout;
71e9be9d5eSMiklos Szeredi 	struct inode *wdir = workdir->d_inode;
72e9be9d5eSMiklos Szeredi 
733d27573cSMiklos Szeredi 	whiteout = ovl_lookup_temp(workdir);
74e9be9d5eSMiklos Szeredi 	if (IS_ERR(whiteout))
75e9be9d5eSMiklos Szeredi 		return whiteout;
76e9be9d5eSMiklos Szeredi 
77e9be9d5eSMiklos Szeredi 	err = ovl_do_whiteout(wdir, whiteout);
78e9be9d5eSMiklos Szeredi 	if (err) {
79e9be9d5eSMiklos Szeredi 		dput(whiteout);
80e9be9d5eSMiklos Szeredi 		whiteout = ERR_PTR(err);
81e9be9d5eSMiklos Szeredi 	}
82e9be9d5eSMiklos Szeredi 
83e9be9d5eSMiklos Szeredi 	return whiteout;
84e9be9d5eSMiklos Szeredi }
85e9be9d5eSMiklos Szeredi 
86e9be9d5eSMiklos Szeredi int ovl_create_real(struct inode *dir, struct dentry *newdentry,
8732a3d848SAl Viro 		    struct cattr *attr, struct dentry *hardlink, bool debug)
88e9be9d5eSMiklos Szeredi {
89e9be9d5eSMiklos Szeredi 	int err;
90e9be9d5eSMiklos Szeredi 
91e9be9d5eSMiklos Szeredi 	if (newdentry->d_inode)
92e9be9d5eSMiklos Szeredi 		return -ESTALE;
93e9be9d5eSMiklos Szeredi 
94e9be9d5eSMiklos Szeredi 	if (hardlink) {
95e9be9d5eSMiklos Szeredi 		err = ovl_do_link(hardlink, dir, newdentry, debug);
96e9be9d5eSMiklos Szeredi 	} else {
9732a3d848SAl Viro 		switch (attr->mode & S_IFMT) {
98e9be9d5eSMiklos Szeredi 		case S_IFREG:
9932a3d848SAl Viro 			err = ovl_do_create(dir, newdentry, attr->mode, debug);
100e9be9d5eSMiklos Szeredi 			break;
101e9be9d5eSMiklos Szeredi 
102e9be9d5eSMiklos Szeredi 		case S_IFDIR:
10332a3d848SAl Viro 			err = ovl_do_mkdir(dir, newdentry, attr->mode, debug);
104e9be9d5eSMiklos Szeredi 			break;
105e9be9d5eSMiklos Szeredi 
106e9be9d5eSMiklos Szeredi 		case S_IFCHR:
107e9be9d5eSMiklos Szeredi 		case S_IFBLK:
108e9be9d5eSMiklos Szeredi 		case S_IFIFO:
109e9be9d5eSMiklos Szeredi 		case S_IFSOCK:
110e9be9d5eSMiklos Szeredi 			err = ovl_do_mknod(dir, newdentry,
11132a3d848SAl Viro 					   attr->mode, attr->rdev, debug);
112e9be9d5eSMiklos Szeredi 			break;
113e9be9d5eSMiklos Szeredi 
114e9be9d5eSMiklos Szeredi 		case S_IFLNK:
11532a3d848SAl Viro 			err = ovl_do_symlink(dir, newdentry, attr->link, debug);
116e9be9d5eSMiklos Szeredi 			break;
117e9be9d5eSMiklos Szeredi 
118e9be9d5eSMiklos Szeredi 		default:
119e9be9d5eSMiklos Szeredi 			err = -EPERM;
120e9be9d5eSMiklos Szeredi 		}
121e9be9d5eSMiklos Szeredi 	}
122e9be9d5eSMiklos Szeredi 	if (!err && WARN_ON(!newdentry->d_inode)) {
123e9be9d5eSMiklos Szeredi 		/*
124e9be9d5eSMiklos Szeredi 		 * Not quite sure if non-instantiated dentry is legal or not.
125e9be9d5eSMiklos Szeredi 		 * VFS doesn't seem to care so check and warn here.
126e9be9d5eSMiklos Szeredi 		 */
127e9be9d5eSMiklos Szeredi 		err = -ENOENT;
128e9be9d5eSMiklos Szeredi 	}
129e9be9d5eSMiklos Szeredi 	return err;
130e9be9d5eSMiklos Szeredi }
131e9be9d5eSMiklos Szeredi 
13221a22878SAmir Goldstein static int ovl_set_opaque_xerr(struct dentry *dentry, struct dentry *upper,
13321a22878SAmir Goldstein 			       int xerr)
134e9be9d5eSMiklos Szeredi {
1355cf5b477SMiklos Szeredi 	int err;
1365cf5b477SMiklos Szeredi 
13721a22878SAmir Goldstein 	err = ovl_check_setxattr(dentry, upper, OVL_XATTR_OPAQUE, "y", 1, xerr);
1385cf5b477SMiklos Szeredi 	if (!err)
1395cf5b477SMiklos Szeredi 		ovl_dentry_set_opaque(dentry);
1405cf5b477SMiklos Szeredi 
1415cf5b477SMiklos Szeredi 	return err;
142e9be9d5eSMiklos Szeredi }
143e9be9d5eSMiklos Szeredi 
14421a22878SAmir Goldstein static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry)
14521a22878SAmir Goldstein {
14621a22878SAmir Goldstein 	/*
14721a22878SAmir Goldstein 	 * Fail with -EIO when trying to create opaque dir and upper doesn't
14821a22878SAmir Goldstein 	 * support xattrs. ovl_rename() calls ovl_set_opaque_xerr(-EXDEV) to
14921a22878SAmir Goldstein 	 * return a specific error for noxattr case.
15021a22878SAmir Goldstein 	 */
15121a22878SAmir Goldstein 	return ovl_set_opaque_xerr(dentry, upperdentry, -EIO);
15221a22878SAmir Goldstein }
15321a22878SAmir Goldstein 
15472e48481SVivek Goyal /* Common operations required to be done after creation of file on upper */
15572e48481SVivek Goyal static void ovl_instantiate(struct dentry *dentry, struct inode *inode,
15651f7e52dSMiklos Szeredi 			    struct dentry *newdentry, bool hardlink)
15772e48481SVivek Goyal {
1584edb83bbSMiklos Szeredi 	ovl_dentry_version_inc(dentry->d_parent, false);
15955acc661SMiklos Szeredi 	ovl_dentry_set_upper_alias(dentry);
16051f7e52dSMiklos Szeredi 	if (!hardlink) {
16109d8b586SMiklos Szeredi 		ovl_inode_update(inode, newdentry);
16272e48481SVivek Goyal 		ovl_copyattr(newdentry->d_inode, inode);
16351f7e52dSMiklos Szeredi 	} else {
16409d8b586SMiklos Szeredi 		WARN_ON(ovl_inode_real(inode) != d_inode(newdentry));
16509d8b586SMiklos Szeredi 		dput(newdentry);
16651f7e52dSMiklos Szeredi 		inc_nlink(inode);
16751f7e52dSMiklos Szeredi 	}
16872e48481SVivek Goyal 	d_instantiate(dentry, inode);
1695b6c9053SAmir Goldstein 	/* Force lookup of new upper hardlink to find its lower */
1705b6c9053SAmir Goldstein 	if (hardlink)
1715b6c9053SAmir Goldstein 		d_drop(dentry);
17272e48481SVivek Goyal }
17372e48481SVivek Goyal 
17497c684ccSAmir Goldstein static bool ovl_type_merge(struct dentry *dentry)
17597c684ccSAmir Goldstein {
17697c684ccSAmir Goldstein 	return OVL_TYPE_MERGE(ovl_path_type(dentry));
17797c684ccSAmir Goldstein }
17897c684ccSAmir Goldstein 
179ee1d6d37SAmir Goldstein static bool ovl_type_origin(struct dentry *dentry)
180ee1d6d37SAmir Goldstein {
181ee1d6d37SAmir Goldstein 	return OVL_TYPE_ORIGIN(ovl_path_type(dentry));
182ee1d6d37SAmir Goldstein }
183ee1d6d37SAmir Goldstein 
184e9be9d5eSMiklos Szeredi static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
18532a3d848SAl Viro 			    struct cattr *attr, struct dentry *hardlink)
186e9be9d5eSMiklos Szeredi {
187e9be9d5eSMiklos Szeredi 	struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
188e9be9d5eSMiklos Szeredi 	struct inode *udir = upperdir->d_inode;
189e9be9d5eSMiklos Szeredi 	struct dentry *newdentry;
190e9be9d5eSMiklos Szeredi 	int err;
191e9be9d5eSMiklos Szeredi 
19238b25697SMiklos Szeredi 	if (!hardlink && !IS_POSIXACL(udir))
19332a3d848SAl Viro 		attr->mode &= ~current_umask();
19438b25697SMiklos Szeredi 
1955955102cSAl Viro 	inode_lock_nested(udir, I_MUTEX_PARENT);
196e9be9d5eSMiklos Szeredi 	newdentry = lookup_one_len(dentry->d_name.name, upperdir,
197e9be9d5eSMiklos Szeredi 				   dentry->d_name.len);
198e9be9d5eSMiklos Szeredi 	err = PTR_ERR(newdentry);
199e9be9d5eSMiklos Szeredi 	if (IS_ERR(newdentry))
200e9be9d5eSMiklos Szeredi 		goto out_unlock;
20132a3d848SAl Viro 	err = ovl_create_real(udir, newdentry, attr, hardlink, false);
202e9be9d5eSMiklos Szeredi 	if (err)
203e9be9d5eSMiklos Szeredi 		goto out_dput;
204e9be9d5eSMiklos Szeredi 
2054a99f3c8SAmir Goldstein 	if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry)) {
20697c684ccSAmir Goldstein 		/* Setting opaque here is just an optimization, allow to fail */
20797c684ccSAmir Goldstein 		ovl_set_opaque(dentry, newdentry);
20897c684ccSAmir Goldstein 	}
20997c684ccSAmir Goldstein 
21051f7e52dSMiklos Szeredi 	ovl_instantiate(dentry, inode, newdentry, !!hardlink);
211e9be9d5eSMiklos Szeredi 	newdentry = NULL;
212e9be9d5eSMiklos Szeredi out_dput:
213e9be9d5eSMiklos Szeredi 	dput(newdentry);
214e9be9d5eSMiklos Szeredi out_unlock:
2155955102cSAl Viro 	inode_unlock(udir);
216e9be9d5eSMiklos Szeredi 	return err;
217e9be9d5eSMiklos Szeredi }
218e9be9d5eSMiklos Szeredi 
219e9be9d5eSMiklos Szeredi static int ovl_lock_rename_workdir(struct dentry *workdir,
220e9be9d5eSMiklos Szeredi 				   struct dentry *upperdir)
221e9be9d5eSMiklos Szeredi {
222e9be9d5eSMiklos Szeredi 	/* Workdir should not be the same as upperdir */
223e9be9d5eSMiklos Szeredi 	if (workdir == upperdir)
224e9be9d5eSMiklos Szeredi 		goto err;
225e9be9d5eSMiklos Szeredi 
226e9be9d5eSMiklos Szeredi 	/* Workdir should not be subdir of upperdir and vice versa */
227e9be9d5eSMiklos Szeredi 	if (lock_rename(workdir, upperdir) != NULL)
228e9be9d5eSMiklos Szeredi 		goto err_unlock;
229e9be9d5eSMiklos Szeredi 
230e9be9d5eSMiklos Szeredi 	return 0;
231e9be9d5eSMiklos Szeredi 
232e9be9d5eSMiklos Szeredi err_unlock:
233e9be9d5eSMiklos Szeredi 	unlock_rename(workdir, upperdir);
234e9be9d5eSMiklos Szeredi err:
235e9be9d5eSMiklos Szeredi 	pr_err("overlayfs: failed to lock workdir+upperdir\n");
236e9be9d5eSMiklos Szeredi 	return -EIO;
237e9be9d5eSMiklos Szeredi }
238e9be9d5eSMiklos Szeredi 
239e9be9d5eSMiklos Szeredi static struct dentry *ovl_clear_empty(struct dentry *dentry,
240e9be9d5eSMiklos Szeredi 				      struct list_head *list)
241e9be9d5eSMiklos Szeredi {
242e9be9d5eSMiklos Szeredi 	struct dentry *workdir = ovl_workdir(dentry);
243e9be9d5eSMiklos Szeredi 	struct inode *wdir = workdir->d_inode;
244e9be9d5eSMiklos Szeredi 	struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
245e9be9d5eSMiklos Szeredi 	struct inode *udir = upperdir->d_inode;
246e9be9d5eSMiklos Szeredi 	struct path upperpath;
247e9be9d5eSMiklos Szeredi 	struct dentry *upper;
248e9be9d5eSMiklos Szeredi 	struct dentry *opaquedir;
249e9be9d5eSMiklos Szeredi 	struct kstat stat;
250e9be9d5eSMiklos Szeredi 	int err;
251e9be9d5eSMiklos Szeredi 
252cc6f67bcSMiklos Szeredi 	if (WARN_ON(!workdir))
253cc6f67bcSMiklos Szeredi 		return ERR_PTR(-EROFS);
254cc6f67bcSMiklos Szeredi 
255e9be9d5eSMiklos Szeredi 	err = ovl_lock_rename_workdir(workdir, upperdir);
256e9be9d5eSMiklos Szeredi 	if (err)
257e9be9d5eSMiklos Szeredi 		goto out;
258e9be9d5eSMiklos Szeredi 
259e9be9d5eSMiklos Szeredi 	ovl_path_upper(dentry, &upperpath);
260a528d35eSDavid Howells 	err = vfs_getattr(&upperpath, &stat,
261a528d35eSDavid Howells 			  STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT);
262e9be9d5eSMiklos Szeredi 	if (err)
263e9be9d5eSMiklos Szeredi 		goto out_unlock;
264e9be9d5eSMiklos Szeredi 
265e9be9d5eSMiklos Szeredi 	err = -ESTALE;
266e9be9d5eSMiklos Szeredi 	if (!S_ISDIR(stat.mode))
267e9be9d5eSMiklos Szeredi 		goto out_unlock;
268e9be9d5eSMiklos Szeredi 	upper = upperpath.dentry;
269e9be9d5eSMiklos Szeredi 	if (upper->d_parent->d_inode != udir)
270e9be9d5eSMiklos Szeredi 		goto out_unlock;
271e9be9d5eSMiklos Szeredi 
2723d27573cSMiklos Szeredi 	opaquedir = ovl_lookup_temp(workdir);
273e9be9d5eSMiklos Szeredi 	err = PTR_ERR(opaquedir);
274e9be9d5eSMiklos Szeredi 	if (IS_ERR(opaquedir))
275e9be9d5eSMiklos Szeredi 		goto out_unlock;
276e9be9d5eSMiklos Szeredi 
27732a3d848SAl Viro 	err = ovl_create_real(wdir, opaquedir,
27832a3d848SAl Viro 			      &(struct cattr){.mode = stat.mode}, NULL, true);
279e9be9d5eSMiklos Szeredi 	if (err)
280e9be9d5eSMiklos Szeredi 		goto out_dput;
281e9be9d5eSMiklos Szeredi 
282e9be9d5eSMiklos Szeredi 	err = ovl_copy_xattr(upper, opaquedir);
283e9be9d5eSMiklos Szeredi 	if (err)
284e9be9d5eSMiklos Szeredi 		goto out_cleanup;
285e9be9d5eSMiklos Szeredi 
2865cf5b477SMiklos Szeredi 	err = ovl_set_opaque(dentry, opaquedir);
287e9be9d5eSMiklos Szeredi 	if (err)
288e9be9d5eSMiklos Szeredi 		goto out_cleanup;
289e9be9d5eSMiklos Szeredi 
2905955102cSAl Viro 	inode_lock(opaquedir->d_inode);
291e9be9d5eSMiklos Szeredi 	err = ovl_set_attr(opaquedir, &stat);
2925955102cSAl Viro 	inode_unlock(opaquedir->d_inode);
293e9be9d5eSMiklos Szeredi 	if (err)
294e9be9d5eSMiklos Szeredi 		goto out_cleanup;
295e9be9d5eSMiklos Szeredi 
296e9be9d5eSMiklos Szeredi 	err = ovl_do_rename(wdir, opaquedir, udir, upper, RENAME_EXCHANGE);
297e9be9d5eSMiklos Szeredi 	if (err)
298e9be9d5eSMiklos Szeredi 		goto out_cleanup;
299e9be9d5eSMiklos Szeredi 
300e9be9d5eSMiklos Szeredi 	ovl_cleanup_whiteouts(upper, list);
301e9be9d5eSMiklos Szeredi 	ovl_cleanup(wdir, upper);
302e9be9d5eSMiklos Szeredi 	unlock_rename(workdir, upperdir);
303e9be9d5eSMiklos Szeredi 
304e9be9d5eSMiklos Szeredi 	/* dentry's upper doesn't match now, get rid of it */
305e9be9d5eSMiklos Szeredi 	d_drop(dentry);
306e9be9d5eSMiklos Szeredi 
307e9be9d5eSMiklos Szeredi 	return opaquedir;
308e9be9d5eSMiklos Szeredi 
309e9be9d5eSMiklos Szeredi out_cleanup:
310e9be9d5eSMiklos Szeredi 	ovl_cleanup(wdir, opaquedir);
311e9be9d5eSMiklos Szeredi out_dput:
312e9be9d5eSMiklos Szeredi 	dput(opaquedir);
313e9be9d5eSMiklos Szeredi out_unlock:
314e9be9d5eSMiklos Szeredi 	unlock_rename(workdir, upperdir);
315e9be9d5eSMiklos Szeredi out:
316e9be9d5eSMiklos Szeredi 	return ERR_PTR(err);
317e9be9d5eSMiklos Szeredi }
318e9be9d5eSMiklos Szeredi 
319a105d685SMiklos Szeredi static struct dentry *ovl_check_empty_and_clear(struct dentry *dentry)
320e9be9d5eSMiklos Szeredi {
321e9be9d5eSMiklos Szeredi 	int err;
322e9be9d5eSMiklos Szeredi 	struct dentry *ret = NULL;
32330c17ebfSMiklos Szeredi 	enum ovl_path_type type = ovl_path_type(dentry);
324e9be9d5eSMiklos Szeredi 	LIST_HEAD(list);
325e9be9d5eSMiklos Szeredi 
326e9be9d5eSMiklos Szeredi 	err = ovl_check_empty_dir(dentry, &list);
32730c17ebfSMiklos Szeredi 	if (err) {
328e9be9d5eSMiklos Szeredi 		ret = ERR_PTR(err);
32930c17ebfSMiklos Szeredi 		goto out_free;
330a105d685SMiklos Szeredi 	}
331e9be9d5eSMiklos Szeredi 
33230c17ebfSMiklos Szeredi 	/*
33330c17ebfSMiklos Szeredi 	 * When removing an empty opaque directory, then it makes no sense to
33430c17ebfSMiklos Szeredi 	 * replace it with an exact replica of itself.
33530c17ebfSMiklos Szeredi 	 *
33630c17ebfSMiklos Szeredi 	 * If no upperdentry then skip clearing whiteouts.
33730c17ebfSMiklos Szeredi 	 *
33830c17ebfSMiklos Szeredi 	 * Can race with copy-up, since we don't hold the upperdir mutex.
33930c17ebfSMiklos Szeredi 	 * Doesn't matter, since copy-up can't create a non-empty directory
34030c17ebfSMiklos Szeredi 	 * from an empty one.
34130c17ebfSMiklos Szeredi 	 */
34230c17ebfSMiklos Szeredi 	if (OVL_TYPE_UPPER(type) && OVL_TYPE_MERGE(type))
34330c17ebfSMiklos Szeredi 		ret = ovl_clear_empty(dentry, &list);
34430c17ebfSMiklos Szeredi 
34530c17ebfSMiklos Szeredi out_free:
346e9be9d5eSMiklos Szeredi 	ovl_cache_free(&list);
347e9be9d5eSMiklos Szeredi 
348e9be9d5eSMiklos Szeredi 	return ret;
349e9be9d5eSMiklos Szeredi }
350e9be9d5eSMiklos Szeredi 
35138b25697SMiklos Szeredi static int ovl_set_upper_acl(struct dentry *upperdentry, const char *name,
35238b25697SMiklos Szeredi 			     const struct posix_acl *acl)
35338b25697SMiklos Szeredi {
35438b25697SMiklos Szeredi 	void *buffer;
35538b25697SMiklos Szeredi 	size_t size;
35638b25697SMiklos Szeredi 	int err;
35738b25697SMiklos Szeredi 
35838b25697SMiklos Szeredi 	if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !acl)
35938b25697SMiklos Szeredi 		return 0;
36038b25697SMiklos Szeredi 
36138b25697SMiklos Szeredi 	size = posix_acl_to_xattr(NULL, acl, NULL, 0);
36238b25697SMiklos Szeredi 	buffer = kmalloc(size, GFP_KERNEL);
36338b25697SMiklos Szeredi 	if (!buffer)
36438b25697SMiklos Szeredi 		return -ENOMEM;
36538b25697SMiklos Szeredi 
36638b25697SMiklos Szeredi 	size = posix_acl_to_xattr(&init_user_ns, acl, buffer, size);
36738b25697SMiklos Szeredi 	err = size;
36838b25697SMiklos Szeredi 	if (err < 0)
36938b25697SMiklos Szeredi 		goto out_free;
37038b25697SMiklos Szeredi 
37138b25697SMiklos Szeredi 	err = vfs_setxattr(upperdentry, name, buffer, size, XATTR_CREATE);
37238b25697SMiklos Szeredi out_free:
37338b25697SMiklos Szeredi 	kfree(buffer);
37438b25697SMiklos Szeredi 	return err;
37538b25697SMiklos Szeredi }
37638b25697SMiklos Szeredi 
377e9be9d5eSMiklos Szeredi static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
37832a3d848SAl Viro 				    struct cattr *cattr,
379e9be9d5eSMiklos Szeredi 				    struct dentry *hardlink)
380e9be9d5eSMiklos Szeredi {
381e9be9d5eSMiklos Szeredi 	struct dentry *workdir = ovl_workdir(dentry);
382e9be9d5eSMiklos Szeredi 	struct inode *wdir = workdir->d_inode;
383e9be9d5eSMiklos Szeredi 	struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
384e9be9d5eSMiklos Szeredi 	struct inode *udir = upperdir->d_inode;
385e9be9d5eSMiklos Szeredi 	struct dentry *upper;
386e9be9d5eSMiklos Szeredi 	struct dentry *newdentry;
387e9be9d5eSMiklos Szeredi 	int err;
38838b25697SMiklos Szeredi 	struct posix_acl *acl, *default_acl;
389e9be9d5eSMiklos Szeredi 
390cc6f67bcSMiklos Szeredi 	if (WARN_ON(!workdir))
391cc6f67bcSMiklos Szeredi 		return -EROFS;
392cc6f67bcSMiklos Szeredi 
39338b25697SMiklos Szeredi 	if (!hardlink) {
39438b25697SMiklos Szeredi 		err = posix_acl_create(dentry->d_parent->d_inode,
39532a3d848SAl Viro 				       &cattr->mode, &default_acl, &acl);
39638b25697SMiklos Szeredi 		if (err)
39738b25697SMiklos Szeredi 			return err;
39838b25697SMiklos Szeredi 	}
39938b25697SMiklos Szeredi 
400e9be9d5eSMiklos Szeredi 	err = ovl_lock_rename_workdir(workdir, upperdir);
401e9be9d5eSMiklos Szeredi 	if (err)
402e9be9d5eSMiklos Szeredi 		goto out;
403e9be9d5eSMiklos Szeredi 
4043d27573cSMiklos Szeredi 	newdentry = ovl_lookup_temp(workdir);
405e9be9d5eSMiklos Szeredi 	err = PTR_ERR(newdentry);
406e9be9d5eSMiklos Szeredi 	if (IS_ERR(newdentry))
407e9be9d5eSMiklos Szeredi 		goto out_unlock;
408e9be9d5eSMiklos Szeredi 
409e9be9d5eSMiklos Szeredi 	upper = lookup_one_len(dentry->d_name.name, upperdir,
410e9be9d5eSMiklos Szeredi 			       dentry->d_name.len);
411e9be9d5eSMiklos Szeredi 	err = PTR_ERR(upper);
412e9be9d5eSMiklos Szeredi 	if (IS_ERR(upper))
413e9be9d5eSMiklos Szeredi 		goto out_dput;
414e9be9d5eSMiklos Szeredi 
41532a3d848SAl Viro 	err = ovl_create_real(wdir, newdentry, cattr, hardlink, true);
416e9be9d5eSMiklos Szeredi 	if (err)
417e9be9d5eSMiklos Szeredi 		goto out_dput2;
418e9be9d5eSMiklos Szeredi 
419bb0d2b8aSMiklos Szeredi 	/*
420bb0d2b8aSMiklos Szeredi 	 * mode could have been mutilated due to umask (e.g. sgid directory)
421bb0d2b8aSMiklos Szeredi 	 */
42251f7e52dSMiklos Szeredi 	if (!hardlink &&
42332a3d848SAl Viro 	    !S_ISLNK(cattr->mode) &&
42432a3d848SAl Viro 	    newdentry->d_inode->i_mode != cattr->mode) {
425bb0d2b8aSMiklos Szeredi 		struct iattr attr = {
426bb0d2b8aSMiklos Szeredi 			.ia_valid = ATTR_MODE,
42732a3d848SAl Viro 			.ia_mode = cattr->mode,
428bb0d2b8aSMiklos Szeredi 		};
429bb0d2b8aSMiklos Szeredi 		inode_lock(newdentry->d_inode);
430bb0d2b8aSMiklos Szeredi 		err = notify_change(newdentry, &attr, NULL);
431bb0d2b8aSMiklos Szeredi 		inode_unlock(newdentry->d_inode);
432bb0d2b8aSMiklos Szeredi 		if (err)
433bb0d2b8aSMiklos Szeredi 			goto out_cleanup;
434bb0d2b8aSMiklos Szeredi 	}
43538b25697SMiklos Szeredi 	if (!hardlink) {
43638b25697SMiklos Szeredi 		err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_ACCESS,
43738b25697SMiklos Szeredi 					acl);
43838b25697SMiklos Szeredi 		if (err)
43938b25697SMiklos Szeredi 			goto out_cleanup;
44038b25697SMiklos Szeredi 
44138b25697SMiklos Szeredi 		err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_DEFAULT,
44238b25697SMiklos Szeredi 					default_acl);
44338b25697SMiklos Szeredi 		if (err)
44438b25697SMiklos Szeredi 			goto out_cleanup;
44538b25697SMiklos Szeredi 	}
446bb0d2b8aSMiklos Szeredi 
44732a3d848SAl Viro 	if (!hardlink && S_ISDIR(cattr->mode)) {
4485cf5b477SMiklos Szeredi 		err = ovl_set_opaque(dentry, newdentry);
449e9be9d5eSMiklos Szeredi 		if (err)
450e9be9d5eSMiklos Szeredi 			goto out_cleanup;
451e9be9d5eSMiklos Szeredi 
452e9be9d5eSMiklos Szeredi 		err = ovl_do_rename(wdir, newdentry, udir, upper,
453e9be9d5eSMiklos Szeredi 				    RENAME_EXCHANGE);
454e9be9d5eSMiklos Szeredi 		if (err)
455e9be9d5eSMiklos Szeredi 			goto out_cleanup;
456e9be9d5eSMiklos Szeredi 
457e9be9d5eSMiklos Szeredi 		ovl_cleanup(wdir, upper);
458e9be9d5eSMiklos Szeredi 	} else {
459e9be9d5eSMiklos Szeredi 		err = ovl_do_rename(wdir, newdentry, udir, upper, 0);
460e9be9d5eSMiklos Szeredi 		if (err)
461e9be9d5eSMiklos Szeredi 			goto out_cleanup;
462e9be9d5eSMiklos Szeredi 	}
46351f7e52dSMiklos Szeredi 	ovl_instantiate(dentry, inode, newdentry, !!hardlink);
464e9be9d5eSMiklos Szeredi 	newdentry = NULL;
465e9be9d5eSMiklos Szeredi out_dput2:
466e9be9d5eSMiklos Szeredi 	dput(upper);
467e9be9d5eSMiklos Szeredi out_dput:
468e9be9d5eSMiklos Szeredi 	dput(newdentry);
469e9be9d5eSMiklos Szeredi out_unlock:
470e9be9d5eSMiklos Szeredi 	unlock_rename(workdir, upperdir);
471e9be9d5eSMiklos Szeredi out:
47238b25697SMiklos Szeredi 	if (!hardlink) {
47338b25697SMiklos Szeredi 		posix_acl_release(acl);
47438b25697SMiklos Szeredi 		posix_acl_release(default_acl);
47538b25697SMiklos Szeredi 	}
476e9be9d5eSMiklos Szeredi 	return err;
477e9be9d5eSMiklos Szeredi 
478e9be9d5eSMiklos Szeredi out_cleanup:
479e9be9d5eSMiklos Szeredi 	ovl_cleanup(wdir, newdentry);
480e9be9d5eSMiklos Szeredi 	goto out_dput2;
481e9be9d5eSMiklos Szeredi }
482e9be9d5eSMiklos Szeredi 
48351f7e52dSMiklos Szeredi static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
484ea3dad18SAmir Goldstein 			      struct cattr *attr, struct dentry *hardlink,
485ea3dad18SAmir Goldstein 			      bool origin)
486e9be9d5eSMiklos Szeredi {
487e9be9d5eSMiklos Szeredi 	int err;
4881175b6b8SVivek Goyal 	const struct cred *old_cred;
4891175b6b8SVivek Goyal 	struct cred *override_cred;
490ea3dad18SAmir Goldstein 	struct dentry *parent = dentry->d_parent;
491e9be9d5eSMiklos Szeredi 
492ea3dad18SAmir Goldstein 	err = ovl_copy_up(parent);
493e9be9d5eSMiklos Szeredi 	if (err)
49451f7e52dSMiklos Szeredi 		return err;
495bb0d2b8aSMiklos Szeredi 
4963fe6e52fSAntonio Murdaca 	old_cred = ovl_override_creds(dentry->d_sb);
497ea3dad18SAmir Goldstein 
498ea3dad18SAmir Goldstein 	/*
499ea3dad18SAmir Goldstein 	 * When linking a file with copy up origin into a new parent, mark the
500ea3dad18SAmir Goldstein 	 * new parent dir "impure".
501ea3dad18SAmir Goldstein 	 */
502ea3dad18SAmir Goldstein 	if (origin) {
503ea3dad18SAmir Goldstein 		err = ovl_set_impure(parent, ovl_dentry_upper(parent));
504ea3dad18SAmir Goldstein 		if (err)
505ea3dad18SAmir Goldstein 			goto out_revert_creds;
506ea3dad18SAmir Goldstein 	}
507ea3dad18SAmir Goldstein 
508d0e13f5bSMiklos Szeredi 	err = -ENOMEM;
509d0e13f5bSMiklos Szeredi 	override_cred = prepare_creds();
510d0e13f5bSMiklos Szeredi 	if (override_cred) {
511bb0d2b8aSMiklos Szeredi 		override_cred->fsuid = inode->i_uid;
512bb0d2b8aSMiklos Szeredi 		override_cred->fsgid = inode->i_gid;
5132602625bSVivek Goyal 		if (!hardlink) {
5142602625bSVivek Goyal 			err = security_dentry_create_files_as(dentry,
51532a3d848SAl Viro 					attr->mode, &dentry->d_name, old_cred,
5162602625bSVivek Goyal 					override_cred);
5172602625bSVivek Goyal 			if (err) {
5182602625bSVivek Goyal 				put_cred(override_cred);
5192602625bSVivek Goyal 				goto out_revert_creds;
5202602625bSVivek Goyal 			}
5212602625bSVivek Goyal 		}
522d0e13f5bSMiklos Szeredi 		put_cred(override_creds(override_cred));
523d0e13f5bSMiklos Szeredi 		put_cred(override_cred);
524e9be9d5eSMiklos Szeredi 
525c412ce49SMiklos Szeredi 		if (!ovl_dentry_is_whiteout(dentry))
52632a3d848SAl Viro 			err = ovl_create_upper(dentry, inode, attr,
5271175b6b8SVivek Goyal 						hardlink);
5281175b6b8SVivek Goyal 		else
52932a3d848SAl Viro 			err = ovl_create_over_whiteout(dentry, inode, attr,
53032a3d848SAl Viro 							hardlink);
531d0e13f5bSMiklos Szeredi 	}
5322602625bSVivek Goyal out_revert_creds:
533e9be9d5eSMiklos Szeredi 	revert_creds(old_cred);
534bb0d2b8aSMiklos Szeredi 	if (!err) {
535bb0d2b8aSMiklos Szeredi 		struct inode *realinode = d_inode(ovl_dentry_upper(dentry));
536bb0d2b8aSMiklos Szeredi 
537bb0d2b8aSMiklos Szeredi 		WARN_ON(inode->i_mode != realinode->i_mode);
538bb0d2b8aSMiklos Szeredi 		WARN_ON(!uid_eq(inode->i_uid, realinode->i_uid));
539bb0d2b8aSMiklos Szeredi 		WARN_ON(!gid_eq(inode->i_gid, realinode->i_gid));
540bb0d2b8aSMiklos Szeredi 	}
541e9be9d5eSMiklos Szeredi 	return err;
542e9be9d5eSMiklos Szeredi }
543e9be9d5eSMiklos Szeredi 
544e9be9d5eSMiklos Szeredi static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
545e9be9d5eSMiklos Szeredi 			     const char *link)
546e9be9d5eSMiklos Szeredi {
547e9be9d5eSMiklos Szeredi 	int err;
54851f7e52dSMiklos Szeredi 	struct inode *inode;
54932a3d848SAl Viro 	struct cattr attr = {
55051f7e52dSMiklos Szeredi 		.rdev = rdev,
55132a3d848SAl Viro 		.link = link,
55251f7e52dSMiklos Szeredi 	};
553e9be9d5eSMiklos Szeredi 
554e9be9d5eSMiklos Szeredi 	err = ovl_want_write(dentry);
55551f7e52dSMiklos Szeredi 	if (err)
55651f7e52dSMiklos Szeredi 		goto out;
557e9be9d5eSMiklos Szeredi 
55851f7e52dSMiklos Szeredi 	err = -ENOMEM;
559ca4c8a3aSMiklos Szeredi 	inode = ovl_new_inode(dentry->d_sb, mode, rdev);
56051f7e52dSMiklos Szeredi 	if (!inode)
56151f7e52dSMiklos Szeredi 		goto out_drop_write;
56251f7e52dSMiklos Szeredi 
56351f7e52dSMiklos Szeredi 	inode_init_owner(inode, dentry->d_parent->d_inode, mode);
56432a3d848SAl Viro 	attr.mode = inode->i_mode;
56551f7e52dSMiklos Szeredi 
566ea3dad18SAmir Goldstein 	err = ovl_create_or_link(dentry, inode, &attr, NULL, false);
56751f7e52dSMiklos Szeredi 	if (err)
56851f7e52dSMiklos Szeredi 		iput(inode);
56951f7e52dSMiklos Szeredi 
57051f7e52dSMiklos Szeredi out_drop_write:
57151f7e52dSMiklos Szeredi 	ovl_drop_write(dentry);
57251f7e52dSMiklos Szeredi out:
573e9be9d5eSMiklos Szeredi 	return err;
574e9be9d5eSMiklos Szeredi }
575e9be9d5eSMiklos Szeredi 
576e9be9d5eSMiklos Szeredi static int ovl_create(struct inode *dir, struct dentry *dentry, umode_t mode,
577e9be9d5eSMiklos Szeredi 		      bool excl)
578e9be9d5eSMiklos Szeredi {
579e9be9d5eSMiklos Szeredi 	return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL);
580e9be9d5eSMiklos Szeredi }
581e9be9d5eSMiklos Szeredi 
582e9be9d5eSMiklos Szeredi static int ovl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
583e9be9d5eSMiklos Szeredi {
584e9be9d5eSMiklos Szeredi 	return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
585e9be9d5eSMiklos Szeredi }
586e9be9d5eSMiklos Szeredi 
587e9be9d5eSMiklos Szeredi static int ovl_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
588e9be9d5eSMiklos Szeredi 		     dev_t rdev)
589e9be9d5eSMiklos Szeredi {
590e9be9d5eSMiklos Szeredi 	/* Don't allow creation of "whiteout" on overlay */
591e9be9d5eSMiklos Szeredi 	if (S_ISCHR(mode) && rdev == WHITEOUT_DEV)
592e9be9d5eSMiklos Szeredi 		return -EPERM;
593e9be9d5eSMiklos Szeredi 
594e9be9d5eSMiklos Szeredi 	return ovl_create_object(dentry, mode, rdev, NULL);
595e9be9d5eSMiklos Szeredi }
596e9be9d5eSMiklos Szeredi 
597e9be9d5eSMiklos Szeredi static int ovl_symlink(struct inode *dir, struct dentry *dentry,
598e9be9d5eSMiklos Szeredi 		       const char *link)
599e9be9d5eSMiklos Szeredi {
600e9be9d5eSMiklos Szeredi 	return ovl_create_object(dentry, S_IFLNK, 0, link);
601e9be9d5eSMiklos Szeredi }
602e9be9d5eSMiklos Szeredi 
603e9be9d5eSMiklos Szeredi static int ovl_link(struct dentry *old, struct inode *newdir,
604e9be9d5eSMiklos Szeredi 		    struct dentry *new)
605e9be9d5eSMiklos Szeredi {
606e9be9d5eSMiklos Szeredi 	int err;
6075f8415d6SAmir Goldstein 	bool locked = false;
60851f7e52dSMiklos Szeredi 	struct inode *inode;
609e9be9d5eSMiklos Szeredi 
610e9be9d5eSMiklos Szeredi 	err = ovl_want_write(old);
611e9be9d5eSMiklos Szeredi 	if (err)
612e9be9d5eSMiklos Szeredi 		goto out;
613e9be9d5eSMiklos Szeredi 
614e9be9d5eSMiklos Szeredi 	err = ovl_copy_up(old);
615e9be9d5eSMiklos Szeredi 	if (err)
616e9be9d5eSMiklos Szeredi 		goto out_drop_write;
617e9be9d5eSMiklos Szeredi 
6185f8415d6SAmir Goldstein 	err = ovl_nlink_start(old, &locked);
6195f8415d6SAmir Goldstein 	if (err)
6205f8415d6SAmir Goldstein 		goto out_drop_write;
6215f8415d6SAmir Goldstein 
62251f7e52dSMiklos Szeredi 	inode = d_inode(old);
62351f7e52dSMiklos Szeredi 	ihold(inode);
62451f7e52dSMiklos Szeredi 
625ea3dad18SAmir Goldstein 	err = ovl_create_or_link(new, inode, NULL, ovl_dentry_upper(old),
626ea3dad18SAmir Goldstein 				 ovl_type_origin(old));
62751f7e52dSMiklos Szeredi 	if (err)
62851f7e52dSMiklos Szeredi 		iput(inode);
629e9be9d5eSMiklos Szeredi 
6305f8415d6SAmir Goldstein 	ovl_nlink_end(old, locked);
631e9be9d5eSMiklos Szeredi out_drop_write:
632e9be9d5eSMiklos Szeredi 	ovl_drop_write(old);
633e9be9d5eSMiklos Szeredi out:
634e9be9d5eSMiklos Szeredi 	return err;
635e9be9d5eSMiklos Szeredi }
636e9be9d5eSMiklos Szeredi 
6379020df37SMiklos Szeredi static bool ovl_matches_upper(struct dentry *dentry, struct dentry *upper)
6389020df37SMiklos Szeredi {
6399020df37SMiklos Szeredi 	return d_inode(ovl_dentry_upper(dentry)) == d_inode(upper);
6409020df37SMiklos Szeredi }
6419020df37SMiklos Szeredi 
642a105d685SMiklos Szeredi static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
643e9be9d5eSMiklos Szeredi {
644e9be9d5eSMiklos Szeredi 	struct dentry *workdir = ovl_workdir(dentry);
645e9be9d5eSMiklos Szeredi 	struct inode *wdir = workdir->d_inode;
646e9be9d5eSMiklos Szeredi 	struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
647e9be9d5eSMiklos Szeredi 	struct inode *udir = upperdir->d_inode;
648e9be9d5eSMiklos Szeredi 	struct dentry *whiteout;
649e9be9d5eSMiklos Szeredi 	struct dentry *upper;
650e9be9d5eSMiklos Szeredi 	struct dentry *opaquedir = NULL;
651e9be9d5eSMiklos Szeredi 	int err;
652cfc9fde0SMaxim Patlasov 	int flags = 0;
653e9be9d5eSMiklos Szeredi 
654cc6f67bcSMiklos Szeredi 	if (WARN_ON(!workdir))
655cc6f67bcSMiklos Szeredi 		return -EROFS;
656cc6f67bcSMiklos Szeredi 
657d377c5ebSMiklos Szeredi 	if (is_dir) {
658a105d685SMiklos Szeredi 		opaquedir = ovl_check_empty_and_clear(dentry);
659e9be9d5eSMiklos Szeredi 		err = PTR_ERR(opaquedir);
660e9be9d5eSMiklos Szeredi 		if (IS_ERR(opaquedir))
661e9be9d5eSMiklos Szeredi 			goto out;
662e9be9d5eSMiklos Szeredi 	}
663e9be9d5eSMiklos Szeredi 
664e9be9d5eSMiklos Szeredi 	err = ovl_lock_rename_workdir(workdir, upperdir);
665e9be9d5eSMiklos Szeredi 	if (err)
666e9be9d5eSMiklos Szeredi 		goto out_dput;
667e9be9d5eSMiklos Szeredi 
668e9be9d5eSMiklos Szeredi 	upper = lookup_one_len(dentry->d_name.name, upperdir,
669e9be9d5eSMiklos Szeredi 			       dentry->d_name.len);
670e9be9d5eSMiklos Szeredi 	err = PTR_ERR(upper);
671e9be9d5eSMiklos Szeredi 	if (IS_ERR(upper))
672cfc9fde0SMaxim Patlasov 		goto out_unlock;
673e9be9d5eSMiklos Szeredi 
674e9be9d5eSMiklos Szeredi 	err = -ESTALE;
675cfc9fde0SMaxim Patlasov 	if ((opaquedir && upper != opaquedir) ||
676cfc9fde0SMaxim Patlasov 	    (!opaquedir && ovl_dentry_upper(dentry) &&
6779020df37SMiklos Szeredi 	     !ovl_matches_upper(dentry, upper))) {
678cfc9fde0SMaxim Patlasov 		goto out_dput_upper;
679cfc9fde0SMaxim Patlasov 	}
680e9be9d5eSMiklos Szeredi 
681cfc9fde0SMaxim Patlasov 	whiteout = ovl_whiteout(workdir, dentry);
682cfc9fde0SMaxim Patlasov 	err = PTR_ERR(whiteout);
683cfc9fde0SMaxim Patlasov 	if (IS_ERR(whiteout))
684cfc9fde0SMaxim Patlasov 		goto out_dput_upper;
685cfc9fde0SMaxim Patlasov 
686cfc9fde0SMaxim Patlasov 	if (d_is_dir(upper))
687cfc9fde0SMaxim Patlasov 		flags = RENAME_EXCHANGE;
688e9be9d5eSMiklos Szeredi 
689e9be9d5eSMiklos Szeredi 	err = ovl_do_rename(wdir, whiteout, udir, upper, flags);
690e9be9d5eSMiklos Szeredi 	if (err)
691e9be9d5eSMiklos Szeredi 		goto kill_whiteout;
692cfc9fde0SMaxim Patlasov 	if (flags)
693e9be9d5eSMiklos Szeredi 		ovl_cleanup(wdir, upper);
694cfc9fde0SMaxim Patlasov 
6954edb83bbSMiklos Szeredi 	ovl_dentry_version_inc(dentry->d_parent, true);
696e9be9d5eSMiklos Szeredi out_d_drop:
697e9be9d5eSMiklos Szeredi 	d_drop(dentry);
698e9be9d5eSMiklos Szeredi 	dput(whiteout);
699cfc9fde0SMaxim Patlasov out_dput_upper:
700cfc9fde0SMaxim Patlasov 	dput(upper);
701e9be9d5eSMiklos Szeredi out_unlock:
702e9be9d5eSMiklos Szeredi 	unlock_rename(workdir, upperdir);
703e9be9d5eSMiklos Szeredi out_dput:
704e9be9d5eSMiklos Szeredi 	dput(opaquedir);
705e9be9d5eSMiklos Szeredi out:
706e9be9d5eSMiklos Szeredi 	return err;
707e9be9d5eSMiklos Szeredi 
708e9be9d5eSMiklos Szeredi kill_whiteout:
709e9be9d5eSMiklos Szeredi 	ovl_cleanup(wdir, whiteout);
710e9be9d5eSMiklos Szeredi 	goto out_d_drop;
711e9be9d5eSMiklos Szeredi }
712e9be9d5eSMiklos Szeredi 
713e9be9d5eSMiklos Szeredi static int ovl_remove_upper(struct dentry *dentry, bool is_dir)
714e9be9d5eSMiklos Szeredi {
715e9be9d5eSMiklos Szeredi 	struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
716e9be9d5eSMiklos Szeredi 	struct inode *dir = upperdir->d_inode;
71711f37104SMiklos Szeredi 	struct dentry *upper;
718d1595119SAmir Goldstein 	struct dentry *opaquedir = NULL;
719e9be9d5eSMiklos Szeredi 	int err;
720e9be9d5eSMiklos Szeredi 
721d1595119SAmir Goldstein 	/* Redirect dir can be !ovl_lower_positive && OVL_TYPE_MERGE */
722d1595119SAmir Goldstein 	if (is_dir && ovl_dentry_get_redirect(dentry)) {
723d1595119SAmir Goldstein 		opaquedir = ovl_check_empty_and_clear(dentry);
724d1595119SAmir Goldstein 		err = PTR_ERR(opaquedir);
725d1595119SAmir Goldstein 		if (IS_ERR(opaquedir))
726d1595119SAmir Goldstein 			goto out;
727d1595119SAmir Goldstein 	}
728d1595119SAmir Goldstein 
7295955102cSAl Viro 	inode_lock_nested(dir, I_MUTEX_PARENT);
73011f37104SMiklos Szeredi 	upper = lookup_one_len(dentry->d_name.name, upperdir,
73111f37104SMiklos Szeredi 			       dentry->d_name.len);
73211f37104SMiklos Szeredi 	err = PTR_ERR(upper);
73311f37104SMiklos Szeredi 	if (IS_ERR(upper))
73411f37104SMiklos Szeredi 		goto out_unlock;
73511f37104SMiklos Szeredi 
736e9be9d5eSMiklos Szeredi 	err = -ESTALE;
737d1595119SAmir Goldstein 	if ((opaquedir && upper != opaquedir) ||
7389020df37SMiklos Szeredi 	    (!opaquedir && !ovl_matches_upper(dentry, upper)))
739d1595119SAmir Goldstein 		goto out_dput_upper;
740d1595119SAmir Goldstein 
741e9be9d5eSMiklos Szeredi 	if (is_dir)
742e9be9d5eSMiklos Szeredi 		err = vfs_rmdir(dir, upper);
743e9be9d5eSMiklos Szeredi 	else
744e9be9d5eSMiklos Szeredi 		err = vfs_unlink(dir, upper, NULL);
7454edb83bbSMiklos Szeredi 	ovl_dentry_version_inc(dentry->d_parent, ovl_type_origin(dentry));
746e9be9d5eSMiklos Szeredi 
747e9be9d5eSMiklos Szeredi 	/*
748e9be9d5eSMiklos Szeredi 	 * Keeping this dentry hashed would mean having to release
749e9be9d5eSMiklos Szeredi 	 * upperpath/lowerpath, which could only be done if we are the
750e9be9d5eSMiklos Szeredi 	 * sole user of this dentry.  Too tricky...  Just unhash for
751e9be9d5eSMiklos Szeredi 	 * now.
752e9be9d5eSMiklos Szeredi 	 */
753ce9113bbSRui Wang 	if (!err)
754e9be9d5eSMiklos Szeredi 		d_drop(dentry);
755d1595119SAmir Goldstein out_dput_upper:
756d1595119SAmir Goldstein 	dput(upper);
75711f37104SMiklos Szeredi out_unlock:
7585955102cSAl Viro 	inode_unlock(dir);
759d1595119SAmir Goldstein 	dput(opaquedir);
760d1595119SAmir Goldstein out:
761e9be9d5eSMiklos Szeredi 	return err;
762e9be9d5eSMiklos Szeredi }
763e9be9d5eSMiklos Szeredi 
764e9be9d5eSMiklos Szeredi static int ovl_do_remove(struct dentry *dentry, bool is_dir)
765e9be9d5eSMiklos Szeredi {
766e9be9d5eSMiklos Szeredi 	int err;
7675f8415d6SAmir Goldstein 	bool locked = false;
7681175b6b8SVivek Goyal 	const struct cred *old_cred;
7691175b6b8SVivek Goyal 
770e9be9d5eSMiklos Szeredi 	err = ovl_want_write(dentry);
771e9be9d5eSMiklos Szeredi 	if (err)
772e9be9d5eSMiklos Szeredi 		goto out;
773e9be9d5eSMiklos Szeredi 
774e9be9d5eSMiklos Szeredi 	err = ovl_copy_up(dentry->d_parent);
775e9be9d5eSMiklos Szeredi 	if (err)
776e9be9d5eSMiklos Szeredi 		goto out_drop_write;
777e9be9d5eSMiklos Szeredi 
7785f8415d6SAmir Goldstein 	err = ovl_nlink_start(dentry, &locked);
7795f8415d6SAmir Goldstein 	if (err)
7805f8415d6SAmir Goldstein 		goto out_drop_write;
7811175b6b8SVivek Goyal 
7821175b6b8SVivek Goyal 	old_cred = ovl_override_creds(dentry->d_sb);
7832aff4534SMiklos Szeredi 	if (!ovl_lower_positive(dentry))
784e9be9d5eSMiklos Szeredi 		err = ovl_remove_upper(dentry, is_dir);
7851175b6b8SVivek Goyal 	else
786a105d685SMiklos Szeredi 		err = ovl_remove_and_whiteout(dentry, is_dir);
787e9be9d5eSMiklos Szeredi 	revert_creds(old_cred);
788dbc816d0SMiklos Szeredi 	if (!err) {
789dbc816d0SMiklos Szeredi 		if (is_dir)
790dbc816d0SMiklos Szeredi 			clear_nlink(dentry->d_inode);
791dbc816d0SMiklos Szeredi 		else
79251f7e52dSMiklos Szeredi 			drop_nlink(dentry->d_inode);
793dbc816d0SMiklos Szeredi 	}
7945f8415d6SAmir Goldstein 	ovl_nlink_end(dentry, locked);
795e9be9d5eSMiklos Szeredi out_drop_write:
796e9be9d5eSMiklos Szeredi 	ovl_drop_write(dentry);
797e9be9d5eSMiklos Szeredi out:
798e9be9d5eSMiklos Szeredi 	return err;
799e9be9d5eSMiklos Szeredi }
800e9be9d5eSMiklos Szeredi 
801e9be9d5eSMiklos Szeredi static int ovl_unlink(struct inode *dir, struct dentry *dentry)
802e9be9d5eSMiklos Szeredi {
803e9be9d5eSMiklos Szeredi 	return ovl_do_remove(dentry, false);
804e9be9d5eSMiklos Szeredi }
805e9be9d5eSMiklos Szeredi 
806e9be9d5eSMiklos Szeredi static int ovl_rmdir(struct inode *dir, struct dentry *dentry)
807e9be9d5eSMiklos Szeredi {
808e9be9d5eSMiklos Szeredi 	return ovl_do_remove(dentry, true);
809e9be9d5eSMiklos Szeredi }
810e9be9d5eSMiklos Szeredi 
811370e55acSMiklos Szeredi static bool ovl_type_merge_or_lower(struct dentry *dentry)
812370e55acSMiklos Szeredi {
813370e55acSMiklos Szeredi 	enum ovl_path_type type = ovl_path_type(dentry);
814370e55acSMiklos Szeredi 
815370e55acSMiklos Szeredi 	return OVL_TYPE_MERGE(type) || !OVL_TYPE_UPPER(type);
816370e55acSMiklos Szeredi }
817370e55acSMiklos Szeredi 
818a6c60655SMiklos Szeredi static bool ovl_can_move(struct dentry *dentry)
819a6c60655SMiklos Szeredi {
820a6c60655SMiklos Szeredi 	return ovl_redirect_dir(dentry->d_sb) ||
821a6c60655SMiklos Szeredi 		!d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry);
822a6c60655SMiklos Szeredi }
823a6c60655SMiklos Szeredi 
824a6c60655SMiklos Szeredi static char *ovl_get_redirect(struct dentry *dentry, bool samedir)
825a6c60655SMiklos Szeredi {
826a6c60655SMiklos Szeredi 	char *buf, *ret;
827a6c60655SMiklos Szeredi 	struct dentry *d, *tmp;
8283ea22a71SMiklos Szeredi 	int buflen = ovl_redirect_max + 1;
829a6c60655SMiklos Szeredi 
830a6c60655SMiklos Szeredi 	if (samedir) {
831a6c60655SMiklos Szeredi 		ret = kstrndup(dentry->d_name.name, dentry->d_name.len,
832a6c60655SMiklos Szeredi 			       GFP_KERNEL);
833a6c60655SMiklos Szeredi 		goto out;
834a6c60655SMiklos Szeredi 	}
835a6c60655SMiklos Szeredi 
8360ee931c4SMichal Hocko 	buf = ret = kmalloc(buflen, GFP_KERNEL);
837a6c60655SMiklos Szeredi 	if (!buf)
838a6c60655SMiklos Szeredi 		goto out;
839a6c60655SMiklos Szeredi 
840a6c60655SMiklos Szeredi 	buflen--;
841a6c60655SMiklos Szeredi 	buf[buflen] = '\0';
842a6c60655SMiklos Szeredi 	for (d = dget(dentry); !IS_ROOT(d);) {
843a6c60655SMiklos Szeredi 		const char *name;
844a6c60655SMiklos Szeredi 		int thislen;
845a6c60655SMiklos Szeredi 
846a6c60655SMiklos Szeredi 		spin_lock(&d->d_lock);
847a6c60655SMiklos Szeredi 		name = ovl_dentry_get_redirect(d);
848a6c60655SMiklos Szeredi 		if (name) {
849a6c60655SMiklos Szeredi 			thislen = strlen(name);
850a6c60655SMiklos Szeredi 		} else {
851a6c60655SMiklos Szeredi 			name = d->d_name.name;
852a6c60655SMiklos Szeredi 			thislen = d->d_name.len;
853a6c60655SMiklos Szeredi 		}
854a6c60655SMiklos Szeredi 
855a6c60655SMiklos Szeredi 		/* If path is too long, fall back to userspace move */
856a6c60655SMiklos Szeredi 		if (thislen + (name[0] != '/') > buflen) {
857a6c60655SMiklos Szeredi 			ret = ERR_PTR(-EXDEV);
858a6c60655SMiklos Szeredi 			spin_unlock(&d->d_lock);
859a6c60655SMiklos Szeredi 			goto out_put;
860a6c60655SMiklos Szeredi 		}
861a6c60655SMiklos Szeredi 
862a6c60655SMiklos Szeredi 		buflen -= thislen;
863a6c60655SMiklos Szeredi 		memcpy(&buf[buflen], name, thislen);
864a6c60655SMiklos Szeredi 		tmp = dget_dlock(d->d_parent);
865a6c60655SMiklos Szeredi 		spin_unlock(&d->d_lock);
866a6c60655SMiklos Szeredi 
867a6c60655SMiklos Szeredi 		dput(d);
868a6c60655SMiklos Szeredi 		d = tmp;
869a6c60655SMiklos Szeredi 
870a6c60655SMiklos Szeredi 		/* Absolute redirect: finished */
871a6c60655SMiklos Szeredi 		if (buf[buflen] == '/')
872a6c60655SMiklos Szeredi 			break;
873a6c60655SMiklos Szeredi 		buflen--;
874a6c60655SMiklos Szeredi 		buf[buflen] = '/';
875a6c60655SMiklos Szeredi 	}
876a6c60655SMiklos Szeredi 	ret = kstrdup(&buf[buflen], GFP_KERNEL);
877a6c60655SMiklos Szeredi out_put:
878a6c60655SMiklos Szeredi 	dput(d);
879a6c60655SMiklos Szeredi 	kfree(buf);
880a6c60655SMiklos Szeredi out:
881a6c60655SMiklos Szeredi 	return ret ? ret : ERR_PTR(-ENOMEM);
882a6c60655SMiklos Szeredi }
883a6c60655SMiklos Szeredi 
884a6c60655SMiklos Szeredi static int ovl_set_redirect(struct dentry *dentry, bool samedir)
885a6c60655SMiklos Szeredi {
886a6c60655SMiklos Szeredi 	int err;
887a6c60655SMiklos Szeredi 	const char *redirect = ovl_dentry_get_redirect(dentry);
888a6c60655SMiklos Szeredi 
889a6c60655SMiklos Szeredi 	if (redirect && (samedir || redirect[0] == '/'))
890a6c60655SMiklos Szeredi 		return 0;
891a6c60655SMiklos Szeredi 
892a6c60655SMiklos Szeredi 	redirect = ovl_get_redirect(dentry, samedir);
893a6c60655SMiklos Szeredi 	if (IS_ERR(redirect))
894a6c60655SMiklos Szeredi 		return PTR_ERR(redirect);
895a6c60655SMiklos Szeredi 
89621a22878SAmir Goldstein 	err = ovl_check_setxattr(dentry, ovl_dentry_upper(dentry),
89721a22878SAmir Goldstein 				 OVL_XATTR_REDIRECT,
89821a22878SAmir Goldstein 				 redirect, strlen(redirect), -EXDEV);
899a6c60655SMiklos Szeredi 	if (!err) {
900a6c60655SMiklos Szeredi 		spin_lock(&dentry->d_lock);
901a6c60655SMiklos Szeredi 		ovl_dentry_set_redirect(dentry, redirect);
902a6c60655SMiklos Szeredi 		spin_unlock(&dentry->d_lock);
903a6c60655SMiklos Szeredi 	} else {
904a6c60655SMiklos Szeredi 		kfree(redirect);
905a6c60655SMiklos Szeredi 		pr_warn_ratelimited("overlay: failed to set redirect (%i)\n", err);
906a6c60655SMiklos Szeredi 		/* Fall back to userspace copy-up */
907a6c60655SMiklos Szeredi 		err = -EXDEV;
908a6c60655SMiklos Szeredi 	}
909a6c60655SMiklos Szeredi 	return err;
910a6c60655SMiklos Szeredi }
911a6c60655SMiklos Szeredi 
9126c02cb59SMiklos Szeredi static int ovl_rename(struct inode *olddir, struct dentry *old,
913e9be9d5eSMiklos Szeredi 		      struct inode *newdir, struct dentry *new,
914e9be9d5eSMiklos Szeredi 		      unsigned int flags)
915e9be9d5eSMiklos Szeredi {
916e9be9d5eSMiklos Szeredi 	int err;
9175f8415d6SAmir Goldstein 	bool locked = false;
918e9be9d5eSMiklos Szeredi 	struct dentry *old_upperdir;
919e9be9d5eSMiklos Szeredi 	struct dentry *new_upperdir;
920e9be9d5eSMiklos Szeredi 	struct dentry *olddentry;
921e9be9d5eSMiklos Szeredi 	struct dentry *newdentry;
922e9be9d5eSMiklos Szeredi 	struct dentry *trap;
923e9be9d5eSMiklos Szeredi 	bool old_opaque;
924e9be9d5eSMiklos Szeredi 	bool new_opaque;
925e9be9d5eSMiklos Szeredi 	bool cleanup_whiteout = false;
926e9be9d5eSMiklos Szeredi 	bool overwrite = !(flags & RENAME_EXCHANGE);
927e36cb0b8SDavid Howells 	bool is_dir = d_is_dir(old);
928370e55acSMiklos Szeredi 	bool new_is_dir = d_is_dir(new);
929a6c60655SMiklos Szeredi 	bool samedir = olddir == newdir;
930e9be9d5eSMiklos Szeredi 	struct dentry *opaquedir = NULL;
931e9be9d5eSMiklos Szeredi 	const struct cred *old_cred = NULL;
932e9be9d5eSMiklos Szeredi 
933e9be9d5eSMiklos Szeredi 	err = -EINVAL;
934e9be9d5eSMiklos Szeredi 	if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE))
935e9be9d5eSMiklos Szeredi 		goto out;
936e9be9d5eSMiklos Szeredi 
937e9be9d5eSMiklos Szeredi 	flags &= ~RENAME_NOREPLACE;
938e9be9d5eSMiklos Szeredi 
939e9be9d5eSMiklos Szeredi 	/* Don't copy up directory trees */
940e9be9d5eSMiklos Szeredi 	err = -EXDEV;
941a6c60655SMiklos Szeredi 	if (!ovl_can_move(old))
942e9be9d5eSMiklos Szeredi 		goto out;
943a6c60655SMiklos Szeredi 	if (!overwrite && !ovl_can_move(new))
944e9be9d5eSMiklos Szeredi 		goto out;
945e9be9d5eSMiklos Szeredi 
946e9be9d5eSMiklos Szeredi 	err = ovl_want_write(old);
947e9be9d5eSMiklos Szeredi 	if (err)
948e9be9d5eSMiklos Szeredi 		goto out;
949e9be9d5eSMiklos Szeredi 
950e9be9d5eSMiklos Szeredi 	err = ovl_copy_up(old);
951e9be9d5eSMiklos Szeredi 	if (err)
952e9be9d5eSMiklos Szeredi 		goto out_drop_write;
953e9be9d5eSMiklos Szeredi 
954e9be9d5eSMiklos Szeredi 	err = ovl_copy_up(new->d_parent);
955e9be9d5eSMiklos Szeredi 	if (err)
956e9be9d5eSMiklos Szeredi 		goto out_drop_write;
957e9be9d5eSMiklos Szeredi 	if (!overwrite) {
958e9be9d5eSMiklos Szeredi 		err = ovl_copy_up(new);
959e9be9d5eSMiklos Szeredi 		if (err)
960e9be9d5eSMiklos Szeredi 			goto out_drop_write;
9615f8415d6SAmir Goldstein 	} else {
9625f8415d6SAmir Goldstein 		err = ovl_nlink_start(new, &locked);
9635f8415d6SAmir Goldstein 		if (err)
9645f8415d6SAmir Goldstein 			goto out_drop_write;
965e9be9d5eSMiklos Szeredi 	}
966e9be9d5eSMiklos Szeredi 
9673fe6e52fSAntonio Murdaca 	old_cred = ovl_override_creds(old->d_sb);
968e9be9d5eSMiklos Szeredi 
969370e55acSMiklos Szeredi 	if (overwrite && new_is_dir && ovl_type_merge_or_lower(new)) {
970a105d685SMiklos Szeredi 		opaquedir = ovl_check_empty_and_clear(new);
971e9be9d5eSMiklos Szeredi 		err = PTR_ERR(opaquedir);
972e9be9d5eSMiklos Szeredi 		if (IS_ERR(opaquedir)) {
973e9be9d5eSMiklos Szeredi 			opaquedir = NULL;
974e9be9d5eSMiklos Szeredi 			goto out_revert_creds;
975e9be9d5eSMiklos Szeredi 		}
976e9be9d5eSMiklos Szeredi 	}
977e9be9d5eSMiklos Szeredi 
978e9be9d5eSMiklos Szeredi 	if (overwrite) {
9792aff4534SMiklos Szeredi 		if (ovl_lower_positive(old)) {
980c412ce49SMiklos Szeredi 			if (!ovl_dentry_is_whiteout(new)) {
981e9be9d5eSMiklos Szeredi 				/* Whiteout source */
982e9be9d5eSMiklos Szeredi 				flags |= RENAME_WHITEOUT;
983e9be9d5eSMiklos Szeredi 			} else {
984e9be9d5eSMiklos Szeredi 				/* Switch whiteouts */
985e9be9d5eSMiklos Szeredi 				flags |= RENAME_EXCHANGE;
986e9be9d5eSMiklos Szeredi 			}
987c412ce49SMiklos Szeredi 		} else if (is_dir && ovl_dentry_is_whiteout(new)) {
988e9be9d5eSMiklos Szeredi 			flags |= RENAME_EXCHANGE;
989e9be9d5eSMiklos Szeredi 			cleanup_whiteout = true;
990e9be9d5eSMiklos Szeredi 		}
991e9be9d5eSMiklos Szeredi 	}
992e9be9d5eSMiklos Szeredi 
993e9be9d5eSMiklos Szeredi 	old_upperdir = ovl_dentry_upper(old->d_parent);
994e9be9d5eSMiklos Szeredi 	new_upperdir = ovl_dentry_upper(new->d_parent);
995e9be9d5eSMiklos Szeredi 
996ee1d6d37SAmir Goldstein 	if (!samedir) {
997ee1d6d37SAmir Goldstein 		/*
998ee1d6d37SAmir Goldstein 		 * When moving a merge dir or non-dir with copy up origin into
999f3a15685SAmir Goldstein 		 * a new parent, we are marking the new parent dir "impure".
1000f3a15685SAmir Goldstein 		 * When ovl_iterate() iterates an "impure" upper dir, it will
1001f3a15685SAmir Goldstein 		 * lookup the origin inodes of the entries to fill d_ino.
1002ee1d6d37SAmir Goldstein 		 */
1003f3a15685SAmir Goldstein 		if (ovl_type_origin(old)) {
1004ee1d6d37SAmir Goldstein 			err = ovl_set_impure(new->d_parent, new_upperdir);
1005ee1d6d37SAmir Goldstein 			if (err)
1006ee1d6d37SAmir Goldstein 				goto out_revert_creds;
1007ee1d6d37SAmir Goldstein 		}
1008f3a15685SAmir Goldstein 		if (!overwrite && ovl_type_origin(new)) {
1009ee1d6d37SAmir Goldstein 			err = ovl_set_impure(old->d_parent, old_upperdir);
1010ee1d6d37SAmir Goldstein 			if (err)
1011ee1d6d37SAmir Goldstein 				goto out_revert_creds;
1012ee1d6d37SAmir Goldstein 		}
1013ee1d6d37SAmir Goldstein 	}
1014ee1d6d37SAmir Goldstein 
1015e9be9d5eSMiklos Szeredi 	trap = lock_rename(new_upperdir, old_upperdir);
1016e9be9d5eSMiklos Szeredi 
101711f37104SMiklos Szeredi 	olddentry = lookup_one_len(old->d_name.name, old_upperdir,
101811f37104SMiklos Szeredi 				   old->d_name.len);
101911f37104SMiklos Szeredi 	err = PTR_ERR(olddentry);
102011f37104SMiklos Szeredi 	if (IS_ERR(olddentry))
102111f37104SMiklos Szeredi 		goto out_unlock;
102211f37104SMiklos Szeredi 
102311f37104SMiklos Szeredi 	err = -ESTALE;
10249020df37SMiklos Szeredi 	if (!ovl_matches_upper(old, olddentry))
102511f37104SMiklos Szeredi 		goto out_dput_old;
102611f37104SMiklos Szeredi 
1027e9be9d5eSMiklos Szeredi 	newdentry = lookup_one_len(new->d_name.name, new_upperdir,
1028e9be9d5eSMiklos Szeredi 				   new->d_name.len);
1029e9be9d5eSMiklos Szeredi 	err = PTR_ERR(newdentry);
1030e9be9d5eSMiklos Szeredi 	if (IS_ERR(newdentry))
103111f37104SMiklos Szeredi 		goto out_dput_old;
1032e9be9d5eSMiklos Szeredi 
10333ee23ff1SMiklos Szeredi 	old_opaque = ovl_dentry_is_opaque(old);
10343ee23ff1SMiklos Szeredi 	new_opaque = ovl_dentry_is_opaque(new);
10353ee23ff1SMiklos Szeredi 
1036e9be9d5eSMiklos Szeredi 	err = -ESTALE;
103709d8b586SMiklos Szeredi 	if (d_inode(new) && ovl_dentry_upper(new)) {
103811f37104SMiklos Szeredi 		if (opaquedir) {
103911f37104SMiklos Szeredi 			if (newdentry != opaquedir)
1040e9be9d5eSMiklos Szeredi 				goto out_dput;
104111f37104SMiklos Szeredi 		} else {
10429020df37SMiklos Szeredi 			if (!ovl_matches_upper(new, newdentry))
1043e9be9d5eSMiklos Szeredi 				goto out_dput;
104411f37104SMiklos Szeredi 		}
104511f37104SMiklos Szeredi 	} else {
104611f37104SMiklos Szeredi 		if (!d_is_negative(newdentry) &&
104711f37104SMiklos Szeredi 		    (!new_opaque || !ovl_is_whiteout(newdentry)))
104811f37104SMiklos Szeredi 			goto out_dput;
104911f37104SMiklos Szeredi 	}
105011f37104SMiklos Szeredi 
1051e9be9d5eSMiklos Szeredi 	if (olddentry == trap)
1052e9be9d5eSMiklos Szeredi 		goto out_dput;
1053e9be9d5eSMiklos Szeredi 	if (newdentry == trap)
1054e9be9d5eSMiklos Szeredi 		goto out_dput;
1055e9be9d5eSMiklos Szeredi 
1056804032faSMiklos Szeredi 	if (WARN_ON(olddentry->d_inode == newdentry->d_inode))
1057804032faSMiklos Szeredi 		goto out_dput;
1058804032faSMiklos Szeredi 
10595cf5b477SMiklos Szeredi 	err = 0;
1060a6c60655SMiklos Szeredi 	if (is_dir) {
10615cf5b477SMiklos Szeredi 		if (ovl_type_merge_or_lower(old))
1062a6c60655SMiklos Szeredi 			err = ovl_set_redirect(old, samedir);
106397c684ccSAmir Goldstein 		else if (!old_opaque && ovl_type_merge(new->d_parent))
106421a22878SAmir Goldstein 			err = ovl_set_opaque_xerr(old, olddentry, -EXDEV);
1065a6c60655SMiklos Szeredi 		if (err)
1066a6c60655SMiklos Szeredi 			goto out_dput;
1067a6c60655SMiklos Szeredi 	}
1068a6c60655SMiklos Szeredi 	if (!overwrite && new_is_dir) {
10695cf5b477SMiklos Szeredi 		if (ovl_type_merge_or_lower(new))
1070a6c60655SMiklos Szeredi 			err = ovl_set_redirect(new, samedir);
107197c684ccSAmir Goldstein 		else if (!new_opaque && ovl_type_merge(old->d_parent))
107221a22878SAmir Goldstein 			err = ovl_set_opaque_xerr(new, newdentry, -EXDEV);
1073a6c60655SMiklos Szeredi 		if (err)
1074a6c60655SMiklos Szeredi 			goto out_dput;
1075a6c60655SMiklos Szeredi 	}
1076e9be9d5eSMiklos Szeredi 
1077e9be9d5eSMiklos Szeredi 	err = ovl_do_rename(old_upperdir->d_inode, olddentry,
10783ee23ff1SMiklos Szeredi 			    new_upperdir->d_inode, newdentry, flags);
10793ee23ff1SMiklos Szeredi 	if (err)
1080e9be9d5eSMiklos Szeredi 		goto out_dput;
1081e9be9d5eSMiklos Szeredi 
1082e9be9d5eSMiklos Szeredi 	if (cleanup_whiteout)
1083e9be9d5eSMiklos Szeredi 		ovl_cleanup(old_upperdir->d_inode, newdentry);
1084e9be9d5eSMiklos Szeredi 
1085f681eb1dSAmir Goldstein 	if (overwrite && d_inode(new)) {
1086f681eb1dSAmir Goldstein 		if (new_is_dir)
1087f681eb1dSAmir Goldstein 			clear_nlink(d_inode(new));
1088f681eb1dSAmir Goldstein 		else
1089f681eb1dSAmir Goldstein 			drop_nlink(d_inode(new));
1090f681eb1dSAmir Goldstein 	}
1091f681eb1dSAmir Goldstein 
10924edb83bbSMiklos Szeredi 	ovl_dentry_version_inc(old->d_parent,
10934edb83bbSMiklos Szeredi 			       !overwrite && ovl_type_origin(new));
10944edb83bbSMiklos Szeredi 	ovl_dentry_version_inc(new->d_parent, ovl_type_origin(old));
1095e9be9d5eSMiklos Szeredi 
1096e9be9d5eSMiklos Szeredi out_dput:
1097e9be9d5eSMiklos Szeredi 	dput(newdentry);
109811f37104SMiklos Szeredi out_dput_old:
109911f37104SMiklos Szeredi 	dput(olddentry);
1100e9be9d5eSMiklos Szeredi out_unlock:
1101e9be9d5eSMiklos Szeredi 	unlock_rename(new_upperdir, old_upperdir);
1102e9be9d5eSMiklos Szeredi out_revert_creds:
1103e9be9d5eSMiklos Szeredi 	revert_creds(old_cred);
11045f8415d6SAmir Goldstein 	ovl_nlink_end(new, locked);
1105e9be9d5eSMiklos Szeredi out_drop_write:
1106e9be9d5eSMiklos Szeredi 	ovl_drop_write(old);
1107e9be9d5eSMiklos Szeredi out:
1108e9be9d5eSMiklos Szeredi 	dput(opaquedir);
1109e9be9d5eSMiklos Szeredi 	return err;
1110e9be9d5eSMiklos Szeredi }
1111e9be9d5eSMiklos Szeredi 
1112e9be9d5eSMiklos Szeredi const struct inode_operations ovl_dir_inode_operations = {
1113e9be9d5eSMiklos Szeredi 	.lookup		= ovl_lookup,
1114e9be9d5eSMiklos Szeredi 	.mkdir		= ovl_mkdir,
1115e9be9d5eSMiklos Szeredi 	.symlink	= ovl_symlink,
1116e9be9d5eSMiklos Szeredi 	.unlink		= ovl_unlink,
1117e9be9d5eSMiklos Szeredi 	.rmdir		= ovl_rmdir,
11186c02cb59SMiklos Szeredi 	.rename		= ovl_rename,
1119e9be9d5eSMiklos Szeredi 	.link		= ovl_link,
1120e9be9d5eSMiklos Szeredi 	.setattr	= ovl_setattr,
1121e9be9d5eSMiklos Szeredi 	.create		= ovl_create,
1122e9be9d5eSMiklos Szeredi 	.mknod		= ovl_mknod,
1123e9be9d5eSMiklos Szeredi 	.permission	= ovl_permission,
11245b712091SMiklos Szeredi 	.getattr	= ovl_getattr,
1125e9be9d5eSMiklos Szeredi 	.listxattr	= ovl_listxattr,
112639a25b2bSVivek Goyal 	.get_acl	= ovl_get_acl,
1127d719e8f2SMiklos Szeredi 	.update_time	= ovl_update_time,
1128e9be9d5eSMiklos Szeredi };
1129