74e696426aaef38ec4bca9175b9aac9181feefcc
[cascardo/linux.git] / fs / overlayfs / dir.c
1 /*
2  *
3  * Copyright (C) 2011 Novell Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published by
7  * the Free Software Foundation.
8  */
9
10 #include <linux/fs.h>
11 #include <linux/namei.h>
12 #include <linux/xattr.h>
13 #include <linux/security.h>
14 #include <linux/cred.h>
15 #include <linux/posix_acl.h>
16 #include <linux/posix_acl_xattr.h>
17 #include <linux/atomic.h>
18 #include "overlayfs.h"
19
20 void ovl_cleanup(struct inode *wdir, struct dentry *wdentry)
21 {
22         int err;
23
24         dget(wdentry);
25         if (d_is_dir(wdentry))
26                 err = ovl_do_rmdir(wdir, wdentry);
27         else
28                 err = ovl_do_unlink(wdir, wdentry);
29         dput(wdentry);
30
31         if (err) {
32                 pr_err("overlayfs: cleanup of '%pd2' failed (%i)\n",
33                        wdentry, err);
34         }
35 }
36
37 struct dentry *ovl_lookup_temp(struct dentry *workdir, struct dentry *dentry)
38 {
39         struct dentry *temp;
40         char name[20];
41         static atomic_t temp_id = ATOMIC_INIT(0);
42
43         /* counter is allowed to wrap, since temp dentries are ephemeral */
44         snprintf(name, sizeof(name), "#%x", atomic_inc_return(&temp_id));
45
46         temp = lookup_one_len(name, workdir, strlen(name));
47         if (!IS_ERR(temp) && temp->d_inode) {
48                 pr_err("overlayfs: workdir/%s already exists\n", name);
49                 dput(temp);
50                 temp = ERR_PTR(-EIO);
51         }
52
53         return temp;
54 }
55
56 /* caller holds i_mutex on workdir */
57 static struct dentry *ovl_whiteout(struct dentry *workdir,
58                                    struct dentry *dentry)
59 {
60         int err;
61         struct dentry *whiteout;
62         struct inode *wdir = workdir->d_inode;
63
64         whiteout = ovl_lookup_temp(workdir, dentry);
65         if (IS_ERR(whiteout))
66                 return whiteout;
67
68         err = ovl_do_whiteout(wdir, whiteout);
69         if (err) {
70                 dput(whiteout);
71                 whiteout = ERR_PTR(err);
72         }
73
74         return whiteout;
75 }
76
77 int ovl_create_real(struct inode *dir, struct dentry *newdentry,
78                     struct kstat *stat, const char *link,
79                     struct dentry *hardlink, bool debug)
80 {
81         int err;
82
83         if (newdentry->d_inode)
84                 return -ESTALE;
85
86         if (hardlink) {
87                 err = ovl_do_link(hardlink, dir, newdentry, debug);
88         } else {
89                 switch (stat->mode & S_IFMT) {
90                 case S_IFREG:
91                         err = ovl_do_create(dir, newdentry, stat->mode, debug);
92                         break;
93
94                 case S_IFDIR:
95                         err = ovl_do_mkdir(dir, newdentry, stat->mode, debug);
96                         break;
97
98                 case S_IFCHR:
99                 case S_IFBLK:
100                 case S_IFIFO:
101                 case S_IFSOCK:
102                         err = ovl_do_mknod(dir, newdentry,
103                                            stat->mode, stat->rdev, debug);
104                         break;
105
106                 case S_IFLNK:
107                         err = ovl_do_symlink(dir, newdentry, link, debug);
108                         break;
109
110                 default:
111                         err = -EPERM;
112                 }
113         }
114         if (!err && WARN_ON(!newdentry->d_inode)) {
115                 /*
116                  * Not quite sure if non-instantiated dentry is legal or not.
117                  * VFS doesn't seem to care so check and warn here.
118                  */
119                 err = -ENOENT;
120         }
121         return err;
122 }
123
124 static int ovl_set_opaque(struct dentry *upperdentry)
125 {
126         return ovl_do_setxattr(upperdentry, OVL_XATTR_OPAQUE, "y", 1, 0);
127 }
128
129 static void ovl_remove_opaque(struct dentry *upperdentry)
130 {
131         int err;
132
133         err = ovl_do_removexattr(upperdentry, OVL_XATTR_OPAQUE);
134         if (err) {
135                 pr_warn("overlayfs: failed to remove opaque from '%s' (%i)\n",
136                         upperdentry->d_name.name, err);
137         }
138 }
139
140 static int ovl_dir_getattr(struct vfsmount *mnt, struct dentry *dentry,
141                          struct kstat *stat)
142 {
143         int err;
144         enum ovl_path_type type;
145         struct path realpath;
146         const struct cred *old_cred;
147
148         type = ovl_path_real(dentry, &realpath);
149         old_cred = ovl_override_creds(dentry->d_sb);
150         err = vfs_getattr(&realpath, stat);
151         revert_creds(old_cred);
152         if (err)
153                 return err;
154
155         stat->dev = dentry->d_sb->s_dev;
156         stat->ino = dentry->d_inode->i_ino;
157
158         /*
159          * It's probably not worth it to count subdirs to get the
160          * correct link count.  nlink=1 seems to pacify 'find' and
161          * other utilities.
162          */
163         if (OVL_TYPE_MERGE(type))
164                 stat->nlink = 1;
165
166         return 0;
167 }
168
169 /* Common operations required to be done after creation of file on upper */
170 static void ovl_instantiate(struct dentry *dentry, struct inode *inode,
171                             struct dentry *newdentry, bool hardlink)
172 {
173         ovl_dentry_version_inc(dentry->d_parent);
174         ovl_dentry_update(dentry, newdentry);
175         if (!hardlink) {
176                 ovl_inode_update(inode, d_inode(newdentry));
177                 ovl_copyattr(newdentry->d_inode, inode);
178         } else {
179                 WARN_ON(ovl_inode_real(inode, NULL) != d_inode(newdentry));
180                 inc_nlink(inode);
181         }
182         d_instantiate(dentry, inode);
183 }
184
185 static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
186                             struct kstat *stat, const char *link,
187                             struct dentry *hardlink)
188 {
189         struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
190         struct inode *udir = upperdir->d_inode;
191         struct dentry *newdentry;
192         int err;
193
194         if (!hardlink && !IS_POSIXACL(udir))
195                 stat->mode &= ~current_umask();
196
197         inode_lock_nested(udir, I_MUTEX_PARENT);
198         newdentry = lookup_one_len(dentry->d_name.name, upperdir,
199                                    dentry->d_name.len);
200         err = PTR_ERR(newdentry);
201         if (IS_ERR(newdentry))
202                 goto out_unlock;
203         err = ovl_create_real(udir, newdentry, stat, link, hardlink, false);
204         if (err)
205                 goto out_dput;
206
207         ovl_instantiate(dentry, inode, newdentry, !!hardlink);
208         newdentry = NULL;
209 out_dput:
210         dput(newdentry);
211 out_unlock:
212         inode_unlock(udir);
213         return err;
214 }
215
216 static int ovl_lock_rename_workdir(struct dentry *workdir,
217                                    struct dentry *upperdir)
218 {
219         /* Workdir should not be the same as upperdir */
220         if (workdir == upperdir)
221                 goto err;
222
223         /* Workdir should not be subdir of upperdir and vice versa */
224         if (lock_rename(workdir, upperdir) != NULL)
225                 goto err_unlock;
226
227         return 0;
228
229 err_unlock:
230         unlock_rename(workdir, upperdir);
231 err:
232         pr_err("overlayfs: failed to lock workdir+upperdir\n");
233         return -EIO;
234 }
235
236 static struct dentry *ovl_clear_empty(struct dentry *dentry,
237                                       struct list_head *list)
238 {
239         struct dentry *workdir = ovl_workdir(dentry);
240         struct inode *wdir = workdir->d_inode;
241         struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
242         struct inode *udir = upperdir->d_inode;
243         struct path upperpath;
244         struct dentry *upper;
245         struct dentry *opaquedir;
246         struct kstat stat;
247         int err;
248
249         if (WARN_ON(!workdir))
250                 return ERR_PTR(-EROFS);
251
252         err = ovl_lock_rename_workdir(workdir, upperdir);
253         if (err)
254                 goto out;
255
256         ovl_path_upper(dentry, &upperpath);
257         err = vfs_getattr(&upperpath, &stat);
258         if (err)
259                 goto out_unlock;
260
261         err = -ESTALE;
262         if (!S_ISDIR(stat.mode))
263                 goto out_unlock;
264         upper = upperpath.dentry;
265         if (upper->d_parent->d_inode != udir)
266                 goto out_unlock;
267
268         opaquedir = ovl_lookup_temp(workdir, dentry);
269         err = PTR_ERR(opaquedir);
270         if (IS_ERR(opaquedir))
271                 goto out_unlock;
272
273         err = ovl_create_real(wdir, opaquedir, &stat, NULL, NULL, true);
274         if (err)
275                 goto out_dput;
276
277         err = ovl_copy_xattr(upper, opaquedir);
278         if (err)
279                 goto out_cleanup;
280
281         err = ovl_set_opaque(opaquedir);
282         if (err)
283                 goto out_cleanup;
284
285         inode_lock(opaquedir->d_inode);
286         err = ovl_set_attr(opaquedir, &stat);
287         inode_unlock(opaquedir->d_inode);
288         if (err)
289                 goto out_cleanup;
290
291         err = ovl_do_rename(wdir, opaquedir, udir, upper, RENAME_EXCHANGE);
292         if (err)
293                 goto out_cleanup;
294
295         ovl_cleanup_whiteouts(upper, list);
296         ovl_cleanup(wdir, upper);
297         unlock_rename(workdir, upperdir);
298
299         /* dentry's upper doesn't match now, get rid of it */
300         d_drop(dentry);
301
302         return opaquedir;
303
304 out_cleanup:
305         ovl_cleanup(wdir, opaquedir);
306 out_dput:
307         dput(opaquedir);
308 out_unlock:
309         unlock_rename(workdir, upperdir);
310 out:
311         return ERR_PTR(err);
312 }
313
314 static struct dentry *ovl_check_empty_and_clear(struct dentry *dentry)
315 {
316         int err;
317         struct dentry *ret = NULL;
318         enum ovl_path_type type = ovl_path_type(dentry);
319         LIST_HEAD(list);
320
321         err = ovl_check_empty_dir(dentry, &list);
322         if (err) {
323                 ret = ERR_PTR(err);
324                 goto out_free;
325         }
326
327         /*
328          * When removing an empty opaque directory, then it makes no sense to
329          * replace it with an exact replica of itself.
330          *
331          * If no upperdentry then skip clearing whiteouts.
332          *
333          * Can race with copy-up, since we don't hold the upperdir mutex.
334          * Doesn't matter, since copy-up can't create a non-empty directory
335          * from an empty one.
336          */
337         if (OVL_TYPE_UPPER(type) && OVL_TYPE_MERGE(type))
338                 ret = ovl_clear_empty(dentry, &list);
339
340 out_free:
341         ovl_cache_free(&list);
342
343         return ret;
344 }
345
346 static int ovl_set_upper_acl(struct dentry *upperdentry, const char *name,
347                              const struct posix_acl *acl)
348 {
349         void *buffer;
350         size_t size;
351         int err;
352
353         if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !acl)
354                 return 0;
355
356         size = posix_acl_to_xattr(NULL, acl, NULL, 0);
357         buffer = kmalloc(size, GFP_KERNEL);
358         if (!buffer)
359                 return -ENOMEM;
360
361         size = posix_acl_to_xattr(&init_user_ns, acl, buffer, size);
362         err = size;
363         if (err < 0)
364                 goto out_free;
365
366         err = vfs_setxattr(upperdentry, name, buffer, size, XATTR_CREATE);
367 out_free:
368         kfree(buffer);
369         return err;
370 }
371
372 static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
373                                     struct kstat *stat, const char *link,
374                                     struct dentry *hardlink)
375 {
376         struct dentry *workdir = ovl_workdir(dentry);
377         struct inode *wdir = workdir->d_inode;
378         struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
379         struct inode *udir = upperdir->d_inode;
380         struct dentry *upper;
381         struct dentry *newdentry;
382         int err;
383         struct posix_acl *acl, *default_acl;
384
385         if (WARN_ON(!workdir))
386                 return -EROFS;
387
388         if (!hardlink) {
389                 err = posix_acl_create(dentry->d_parent->d_inode,
390                                        &stat->mode, &default_acl, &acl);
391                 if (err)
392                         return err;
393         }
394
395         err = ovl_lock_rename_workdir(workdir, upperdir);
396         if (err)
397                 goto out;
398
399         newdentry = ovl_lookup_temp(workdir, dentry);
400         err = PTR_ERR(newdentry);
401         if (IS_ERR(newdentry))
402                 goto out_unlock;
403
404         upper = lookup_one_len(dentry->d_name.name, upperdir,
405                                dentry->d_name.len);
406         err = PTR_ERR(upper);
407         if (IS_ERR(upper))
408                 goto out_dput;
409
410         err = ovl_create_real(wdir, newdentry, stat, link, hardlink, true);
411         if (err)
412                 goto out_dput2;
413
414         /*
415          * mode could have been mutilated due to umask (e.g. sgid directory)
416          */
417         if (!hardlink &&
418             !S_ISLNK(stat->mode) && newdentry->d_inode->i_mode != stat->mode) {
419                 struct iattr attr = {
420                         .ia_valid = ATTR_MODE,
421                         .ia_mode = stat->mode,
422                 };
423                 inode_lock(newdentry->d_inode);
424                 err = notify_change(newdentry, &attr, NULL);
425                 inode_unlock(newdentry->d_inode);
426                 if (err)
427                         goto out_cleanup;
428         }
429         if (!hardlink) {
430                 err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_ACCESS,
431                                         acl);
432                 if (err)
433                         goto out_cleanup;
434
435                 err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_DEFAULT,
436                                         default_acl);
437                 if (err)
438                         goto out_cleanup;
439         }
440
441         if (!hardlink && S_ISDIR(stat->mode)) {
442                 err = ovl_set_opaque(newdentry);
443                 if (err)
444                         goto out_cleanup;
445
446                 err = ovl_do_rename(wdir, newdentry, udir, upper,
447                                     RENAME_EXCHANGE);
448                 if (err)
449                         goto out_cleanup;
450
451                 ovl_cleanup(wdir, upper);
452         } else {
453                 err = ovl_do_rename(wdir, newdentry, udir, upper, 0);
454                 if (err)
455                         goto out_cleanup;
456         }
457         ovl_instantiate(dentry, inode, newdentry, !!hardlink);
458         newdentry = NULL;
459 out_dput2:
460         dput(upper);
461 out_dput:
462         dput(newdentry);
463 out_unlock:
464         unlock_rename(workdir, upperdir);
465 out:
466         if (!hardlink) {
467                 posix_acl_release(acl);
468                 posix_acl_release(default_acl);
469         }
470         return err;
471
472 out_cleanup:
473         ovl_cleanup(wdir, newdentry);
474         goto out_dput2;
475 }
476
477 static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
478                               struct kstat *stat, const char *link,
479                               struct dentry *hardlink)
480 {
481         int err;
482         const struct cred *old_cred;
483         struct cred *override_cred;
484
485         err = ovl_copy_up(dentry->d_parent);
486         if (err)
487                 return err;
488
489         old_cred = ovl_override_creds(dentry->d_sb);
490         err = -ENOMEM;
491         override_cred = prepare_creds();
492         if (override_cred) {
493                 override_cred->fsuid = inode->i_uid;
494                 override_cred->fsgid = inode->i_gid;
495                 put_cred(override_creds(override_cred));
496                 put_cred(override_cred);
497
498                 if (!ovl_dentry_is_opaque(dentry))
499                         err = ovl_create_upper(dentry, inode, stat, link,
500                                                 hardlink);
501                 else
502                         err = ovl_create_over_whiteout(dentry, inode, stat,
503                                                         link, hardlink);
504         }
505         revert_creds(old_cred);
506         if (!err) {
507                 struct inode *realinode = d_inode(ovl_dentry_upper(dentry));
508
509                 WARN_ON(inode->i_mode != realinode->i_mode);
510                 WARN_ON(!uid_eq(inode->i_uid, realinode->i_uid));
511                 WARN_ON(!gid_eq(inode->i_gid, realinode->i_gid));
512         }
513         return err;
514 }
515
516 static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
517                              const char *link)
518 {
519         int err;
520         struct inode *inode;
521         struct kstat stat = {
522                 .rdev = rdev,
523         };
524
525         err = ovl_want_write(dentry);
526         if (err)
527                 goto out;
528
529         err = -ENOMEM;
530         inode = ovl_new_inode(dentry->d_sb, mode);
531         if (!inode)
532                 goto out_drop_write;
533
534         inode_init_owner(inode, dentry->d_parent->d_inode, mode);
535         stat.mode = inode->i_mode;
536
537         err = ovl_create_or_link(dentry, inode, &stat, link, NULL);
538         if (err)
539                 iput(inode);
540
541 out_drop_write:
542         ovl_drop_write(dentry);
543 out:
544         return err;
545 }
546
547 static int ovl_create(struct inode *dir, struct dentry *dentry, umode_t mode,
548                       bool excl)
549 {
550         return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL);
551 }
552
553 static int ovl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
554 {
555         return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
556 }
557
558 static int ovl_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
559                      dev_t rdev)
560 {
561         /* Don't allow creation of "whiteout" on overlay */
562         if (S_ISCHR(mode) && rdev == WHITEOUT_DEV)
563                 return -EPERM;
564
565         return ovl_create_object(dentry, mode, rdev, NULL);
566 }
567
568 static int ovl_symlink(struct inode *dir, struct dentry *dentry,
569                        const char *link)
570 {
571         return ovl_create_object(dentry, S_IFLNK, 0, link);
572 }
573
574 static int ovl_link(struct dentry *old, struct inode *newdir,
575                     struct dentry *new)
576 {
577         int err;
578         struct inode *inode;
579
580         err = ovl_want_write(old);
581         if (err)
582                 goto out;
583
584         err = ovl_copy_up(old);
585         if (err)
586                 goto out_drop_write;
587
588         inode = d_inode(old);
589         ihold(inode);
590
591         err = ovl_create_or_link(new, inode, NULL, NULL, ovl_dentry_upper(old));
592         if (err)
593                 iput(inode);
594
595 out_drop_write:
596         ovl_drop_write(old);
597 out:
598         return err;
599 }
600
601 static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
602 {
603         struct dentry *workdir = ovl_workdir(dentry);
604         struct inode *wdir = workdir->d_inode;
605         struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
606         struct inode *udir = upperdir->d_inode;
607         struct dentry *whiteout;
608         struct dentry *upper;
609         struct dentry *opaquedir = NULL;
610         int err;
611         int flags = 0;
612
613         if (WARN_ON(!workdir))
614                 return -EROFS;
615
616         if (is_dir) {
617                 opaquedir = ovl_check_empty_and_clear(dentry);
618                 err = PTR_ERR(opaquedir);
619                 if (IS_ERR(opaquedir))
620                         goto out;
621         }
622
623         err = ovl_lock_rename_workdir(workdir, upperdir);
624         if (err)
625                 goto out_dput;
626
627         upper = lookup_one_len(dentry->d_name.name, upperdir,
628                                dentry->d_name.len);
629         err = PTR_ERR(upper);
630         if (IS_ERR(upper))
631                 goto out_unlock;
632
633         err = -ESTALE;
634         if ((opaquedir && upper != opaquedir) ||
635             (!opaquedir && ovl_dentry_upper(dentry) &&
636              upper != ovl_dentry_upper(dentry))) {
637                 goto out_dput_upper;
638         }
639
640         whiteout = ovl_whiteout(workdir, dentry);
641         err = PTR_ERR(whiteout);
642         if (IS_ERR(whiteout))
643                 goto out_dput_upper;
644
645         if (d_is_dir(upper))
646                 flags = RENAME_EXCHANGE;
647
648         err = ovl_do_rename(wdir, whiteout, udir, upper, flags);
649         if (err)
650                 goto kill_whiteout;
651         if (flags)
652                 ovl_cleanup(wdir, upper);
653
654         ovl_dentry_version_inc(dentry->d_parent);
655 out_d_drop:
656         d_drop(dentry);
657         dput(whiteout);
658 out_dput_upper:
659         dput(upper);
660 out_unlock:
661         unlock_rename(workdir, upperdir);
662 out_dput:
663         dput(opaquedir);
664 out:
665         return err;
666
667 kill_whiteout:
668         ovl_cleanup(wdir, whiteout);
669         goto out_d_drop;
670 }
671
672 static int ovl_remove_upper(struct dentry *dentry, bool is_dir)
673 {
674         struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
675         struct inode *dir = upperdir->d_inode;
676         struct dentry *upper;
677         int err;
678
679         inode_lock_nested(dir, I_MUTEX_PARENT);
680         upper = lookup_one_len(dentry->d_name.name, upperdir,
681                                dentry->d_name.len);
682         err = PTR_ERR(upper);
683         if (IS_ERR(upper))
684                 goto out_unlock;
685
686         err = -ESTALE;
687         if (upper == ovl_dentry_upper(dentry)) {
688                 if (is_dir)
689                         err = vfs_rmdir(dir, upper);
690                 else
691                         err = vfs_unlink(dir, upper, NULL);
692                 ovl_dentry_version_inc(dentry->d_parent);
693         }
694         dput(upper);
695
696         /*
697          * Keeping this dentry hashed would mean having to release
698          * upperpath/lowerpath, which could only be done if we are the
699          * sole user of this dentry.  Too tricky...  Just unhash for
700          * now.
701          */
702         if (!err)
703                 d_drop(dentry);
704 out_unlock:
705         inode_unlock(dir);
706
707         return err;
708 }
709
710 static inline int ovl_check_sticky(struct dentry *dentry)
711 {
712         struct inode *dir = ovl_dentry_real(dentry->d_parent)->d_inode;
713         struct inode *inode = ovl_dentry_real(dentry)->d_inode;
714
715         if (check_sticky(dir, inode))
716                 return -EPERM;
717
718         return 0;
719 }
720
721 static int ovl_do_remove(struct dentry *dentry, bool is_dir)
722 {
723         enum ovl_path_type type;
724         int err;
725         const struct cred *old_cred;
726
727
728         err = ovl_check_sticky(dentry);
729         if (err)
730                 goto out;
731
732         err = ovl_want_write(dentry);
733         if (err)
734                 goto out;
735
736         err = ovl_copy_up(dentry->d_parent);
737         if (err)
738                 goto out_drop_write;
739
740         type = ovl_path_type(dentry);
741
742         old_cred = ovl_override_creds(dentry->d_sb);
743         if (OVL_TYPE_PURE_UPPER(type))
744                 err = ovl_remove_upper(dentry, is_dir);
745         else
746                 err = ovl_remove_and_whiteout(dentry, is_dir);
747         revert_creds(old_cred);
748         if (!err) {
749                 if (is_dir)
750                         clear_nlink(dentry->d_inode);
751                 else
752                         drop_nlink(dentry->d_inode);
753         }
754 out_drop_write:
755         ovl_drop_write(dentry);
756 out:
757         return err;
758 }
759
760 static int ovl_unlink(struct inode *dir, struct dentry *dentry)
761 {
762         return ovl_do_remove(dentry, false);
763 }
764
765 static int ovl_rmdir(struct inode *dir, struct dentry *dentry)
766 {
767         return ovl_do_remove(dentry, true);
768 }
769
770 static int ovl_rename2(struct inode *olddir, struct dentry *old,
771                        struct inode *newdir, struct dentry *new,
772                        unsigned int flags)
773 {
774         int err;
775         enum ovl_path_type old_type;
776         enum ovl_path_type new_type;
777         struct dentry *old_upperdir;
778         struct dentry *new_upperdir;
779         struct dentry *olddentry;
780         struct dentry *newdentry;
781         struct dentry *trap;
782         bool old_opaque;
783         bool new_opaque;
784         bool cleanup_whiteout = false;
785         bool overwrite = !(flags & RENAME_EXCHANGE);
786         bool is_dir = d_is_dir(old);
787         bool new_is_dir = false;
788         struct dentry *opaquedir = NULL;
789         const struct cred *old_cred = NULL;
790
791         err = -EINVAL;
792         if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE))
793                 goto out;
794
795         flags &= ~RENAME_NOREPLACE;
796
797         err = ovl_check_sticky(old);
798         if (err)
799                 goto out;
800
801         /* Don't copy up directory trees */
802         old_type = ovl_path_type(old);
803         err = -EXDEV;
804         if (OVL_TYPE_MERGE_OR_LOWER(old_type) && is_dir)
805                 goto out;
806
807         if (new->d_inode) {
808                 err = ovl_check_sticky(new);
809                 if (err)
810                         goto out;
811
812                 if (d_is_dir(new))
813                         new_is_dir = true;
814
815                 new_type = ovl_path_type(new);
816                 err = -EXDEV;
817                 if (!overwrite && OVL_TYPE_MERGE_OR_LOWER(new_type) && new_is_dir)
818                         goto out;
819
820                 err = 0;
821                 if (!OVL_TYPE_UPPER(new_type) && !OVL_TYPE_UPPER(old_type)) {
822                         if (ovl_dentry_lower(old)->d_inode ==
823                             ovl_dentry_lower(new)->d_inode)
824                                 goto out;
825                 }
826                 if (OVL_TYPE_UPPER(new_type) && OVL_TYPE_UPPER(old_type)) {
827                         if (ovl_dentry_upper(old)->d_inode ==
828                             ovl_dentry_upper(new)->d_inode)
829                                 goto out;
830                 }
831         } else {
832                 if (ovl_dentry_is_opaque(new))
833                         new_type = __OVL_PATH_UPPER;
834                 else
835                         new_type = __OVL_PATH_UPPER | __OVL_PATH_PURE;
836         }
837
838         err = ovl_want_write(old);
839         if (err)
840                 goto out;
841
842         err = ovl_copy_up(old);
843         if (err)
844                 goto out_drop_write;
845
846         err = ovl_copy_up(new->d_parent);
847         if (err)
848                 goto out_drop_write;
849         if (!overwrite) {
850                 err = ovl_copy_up(new);
851                 if (err)
852                         goto out_drop_write;
853         }
854
855         old_opaque = !OVL_TYPE_PURE_UPPER(old_type);
856         new_opaque = !OVL_TYPE_PURE_UPPER(new_type);
857
858         old_cred = ovl_override_creds(old->d_sb);
859
860         if (overwrite && OVL_TYPE_MERGE_OR_LOWER(new_type) && new_is_dir) {
861                 opaquedir = ovl_check_empty_and_clear(new);
862                 err = PTR_ERR(opaquedir);
863                 if (IS_ERR(opaquedir)) {
864                         opaquedir = NULL;
865                         goto out_revert_creds;
866                 }
867         }
868
869         if (overwrite) {
870                 if (old_opaque) {
871                         if (new->d_inode || !new_opaque) {
872                                 /* Whiteout source */
873                                 flags |= RENAME_WHITEOUT;
874                         } else {
875                                 /* Switch whiteouts */
876                                 flags |= RENAME_EXCHANGE;
877                         }
878                 } else if (is_dir && !new->d_inode && new_opaque) {
879                         flags |= RENAME_EXCHANGE;
880                         cleanup_whiteout = true;
881                 }
882         }
883
884         old_upperdir = ovl_dentry_upper(old->d_parent);
885         new_upperdir = ovl_dentry_upper(new->d_parent);
886
887         trap = lock_rename(new_upperdir, old_upperdir);
888
889
890         olddentry = lookup_one_len(old->d_name.name, old_upperdir,
891                                    old->d_name.len);
892         err = PTR_ERR(olddentry);
893         if (IS_ERR(olddentry))
894                 goto out_unlock;
895
896         err = -ESTALE;
897         if (olddentry != ovl_dentry_upper(old))
898                 goto out_dput_old;
899
900         newdentry = lookup_one_len(new->d_name.name, new_upperdir,
901                                    new->d_name.len);
902         err = PTR_ERR(newdentry);
903         if (IS_ERR(newdentry))
904                 goto out_dput_old;
905
906         err = -ESTALE;
907         if (ovl_dentry_upper(new)) {
908                 if (opaquedir) {
909                         if (newdentry != opaquedir)
910                                 goto out_dput;
911                 } else {
912                         if (newdentry != ovl_dentry_upper(new))
913                                 goto out_dput;
914                 }
915         } else {
916                 if (!d_is_negative(newdentry) &&
917                     (!new_opaque || !ovl_is_whiteout(newdentry)))
918                         goto out_dput;
919         }
920
921         if (olddentry == trap)
922                 goto out_dput;
923         if (newdentry == trap)
924                 goto out_dput;
925
926         if (is_dir && !old_opaque && new_opaque) {
927                 err = ovl_set_opaque(olddentry);
928                 if (err)
929                         goto out_dput;
930         }
931         if (!overwrite && new_is_dir && old_opaque && !new_opaque) {
932                 err = ovl_set_opaque(newdentry);
933                 if (err)
934                         goto out_dput;
935         }
936
937         if (old_opaque || new_opaque) {
938                 err = ovl_do_rename(old_upperdir->d_inode, olddentry,
939                                     new_upperdir->d_inode, newdentry,
940                                     flags);
941         } else {
942                 /* No debug for the plain case */
943                 BUG_ON(flags & ~RENAME_EXCHANGE);
944                 err = vfs_rename(old_upperdir->d_inode, olddentry,
945                                  new_upperdir->d_inode, newdentry,
946                                  NULL, flags);
947         }
948
949         if (err) {
950                 if (is_dir && !old_opaque && new_opaque)
951                         ovl_remove_opaque(olddentry);
952                 if (!overwrite && new_is_dir && old_opaque && !new_opaque)
953                         ovl_remove_opaque(newdentry);
954                 goto out_dput;
955         }
956
957         if (is_dir && old_opaque && !new_opaque)
958                 ovl_remove_opaque(olddentry);
959         if (!overwrite && new_is_dir && !old_opaque && new_opaque)
960                 ovl_remove_opaque(newdentry);
961
962         /*
963          * Old dentry now lives in different location. Dentries in
964          * lowerstack are stale. We cannot drop them here because
965          * access to them is lockless. This could be only pure upper
966          * or opaque directory - numlower is zero. Or upper non-dir
967          * entry - its pureness is tracked by flag opaque.
968          */
969         if (old_opaque != new_opaque) {
970                 ovl_dentry_set_opaque(old, new_opaque);
971                 if (!overwrite)
972                         ovl_dentry_set_opaque(new, old_opaque);
973         }
974
975         if (cleanup_whiteout)
976                 ovl_cleanup(old_upperdir->d_inode, newdentry);
977
978         ovl_dentry_version_inc(old->d_parent);
979         ovl_dentry_version_inc(new->d_parent);
980
981 out_dput:
982         dput(newdentry);
983 out_dput_old:
984         dput(olddentry);
985 out_unlock:
986         unlock_rename(new_upperdir, old_upperdir);
987 out_revert_creds:
988         revert_creds(old_cred);
989 out_drop_write:
990         ovl_drop_write(old);
991 out:
992         dput(opaquedir);
993         return err;
994 }
995
996 const struct inode_operations ovl_dir_inode_operations = {
997         .lookup         = ovl_lookup,
998         .mkdir          = ovl_mkdir,
999         .symlink        = ovl_symlink,
1000         .unlink         = ovl_unlink,
1001         .rmdir          = ovl_rmdir,
1002         .rename2        = ovl_rename2,
1003         .link           = ovl_link,
1004         .setattr        = ovl_setattr,
1005         .create         = ovl_create,
1006         .mknod          = ovl_mknod,
1007         .permission     = ovl_permission,
1008         .getattr        = ovl_dir_getattr,
1009         .setxattr       = generic_setxattr,
1010         .getxattr       = generic_getxattr,
1011         .listxattr      = ovl_listxattr,
1012         .removexattr    = generic_removexattr,
1013         .get_acl        = ovl_get_acl,
1014         .update_time    = ovl_update_time,
1015 };