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