]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
Merge remote-tracking branch 'ovl/rename2' into for-linus
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 11 Oct 2016 03:02:51 +0000 (23:02 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 11 Oct 2016 03:02:51 +0000 (23:02 -0400)
33 files changed:
1  2 
fs/9p/vfs_inode.c
fs/bad_inode.c
fs/bfs/dir.c
fs/btrfs/inode.c
fs/btrfs/ioctl.c
fs/coda/dir.c
fs/debugfs/inode.c
fs/exofs/namei.c
fs/ext2/namei.c
fs/f2fs/namei.c
fs/fat/namei_msdos.c
fs/fat/namei_vfat.c
fs/fuse/dir.c
fs/gfs2/inode.c
fs/hfs/dir.c
fs/hfsplus/dir.c
fs/jfs/namei.c
fs/libfs.c
fs/logfs/dir.c
fs/minix/namei.c
fs/nilfs2/namei.c
fs/ocfs2/alloc.c
fs/ocfs2/file.c
fs/ocfs2/namei.c
fs/omfs/dir.c
fs/orangefs/namei.c
fs/reiserfs/namei.c
fs/sysv/namei.c
fs/udf/namei.c
fs/ufs/namei.c
fs/xfs/xfs_iops.c
include/linux/fs.h
mm/shmem.c

diff --combined fs/9p/vfs_inode.c
index 44fa598e63498f704eb91afa68e7ad7cb702830c,0ad3c6c712b80f562541f6769f1ed6a47592c9a7..8bea369a29367f02ef654710d258e0c3fb6eee89
@@@ -276,7 -276,7 +276,7 @@@ int v9fs_init_inode(struct v9fs_session
        inode_init_owner(inode, NULL, mode);
        inode->i_blocks = 0;
        inode->i_rdev = rdev;
 -      inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 +      inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
        inode->i_mapping->a_ops = &v9fs_addr_operations;
  
        switch (mode & S_IFMT) {
@@@ -955,7 -955,8 +955,8 @@@ int v9fs_vfs_rmdir(struct inode *i, str
  
  int
  v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-               struct inode *new_dir, struct dentry *new_dentry)
+               struct inode *new_dir, struct dentry *new_dentry,
+               unsigned int flags)
  {
        int retval;
        struct inode *old_inode;
        struct p9_fid *newdirfid;
        struct p9_wstat wstat;
  
+       if (flags)
+               return -EINVAL;
        p9_debug(P9_DEBUG_VFS, "\n");
        retval = 0;
        old_inode = d_inode(old_dentry);
diff --combined fs/bad_inode.c
index 3c8ec390b4465c7a7b3fdb80f143e73d2782bea3,536d2a3872671c007932e05d76feb0dab43c4686..9fc451e9f9879404d0506bc564b855cecf9be458
@@@ -133,7 -133,7 +133,7 @@@ static const struct inode_operations ba
        .mkdir          = bad_inode_mkdir,
        .rmdir          = bad_inode_rmdir,
        .mknod          = bad_inode_mknod,
-       .rename2        = bad_inode_rename2,
+       .rename         = bad_inode_rename2,
        .readlink       = bad_inode_readlink,
        /* follow_link must be no-op, otherwise unmounting this inode
           won't work */
@@@ -173,7 -173,7 +173,7 @@@ void make_bad_inode(struct inode *inode
  
        inode->i_mode = S_IFREG;
        inode->i_atime = inode->i_mtime = inode->i_ctime =
 -              current_fs_time(inode->i_sb);
 +              current_time(inode);
        inode->i_op = &bad_inode_ops;   
        inode->i_fop = &bad_file_ops;   
  }
diff --combined fs/bfs/dir.c
index 4206419a4bdfc119f5daea32afcd62653be730cf,5e3369f7cd9d67438a4e1ea19e6e6acbf9512412..3e5ac30e8b6fa705ccbb09eaf980626217e1c7cb
@@@ -97,7 -97,7 +97,7 @@@ static int bfs_create(struct inode *dir
        set_bit(ino, info->si_imap);
        info->si_freei--;
        inode_init_owner(inode, dir, mode);
 -      inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
        inode->i_blocks = 0;
        inode->i_op = &bfs_file_inops;
        inode->i_fop = &bfs_file_operations;
@@@ -165,7 -165,7 +165,7 @@@ static int bfs_link(struct dentry *old
                return err;
        }
        inc_nlink(inode);
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        mark_inode_dirty(inode);
        ihold(inode);
        d_instantiate(new, inode);
@@@ -194,7 -194,7 +194,7 @@@ static int bfs_unlink(struct inode *dir
        }
        de->ino = 0;
        mark_buffer_dirty_inode(bh, dir);
 -      dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        mark_inode_dirty(dir);
        inode->i_ctime = dir->i_ctime;
        inode_dec_link_count(inode);
@@@ -207,7 -207,8 +207,8 @@@ out_brelse
  }
  
  static int bfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                       struct inode *new_dir, struct dentry *new_dentry)
+                     struct inode *new_dir, struct dentry *new_dentry,
+                     unsigned int flags)
  {
        struct inode *old_inode, *new_inode;
        struct buffer_head *old_bh, *new_bh;
        struct bfs_sb_info *info;
        int error = -ENOENT;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        old_bh = new_bh = NULL;
        old_inode = d_inode(old_dentry);
        if (S_ISDIR(old_inode->i_mode))
                        goto end_rename;
        }
        old_de->ino = 0;
 -      old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME_SEC;
 +      old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
        mark_inode_dirty(old_dir);
        if (new_inode) {
 -              new_inode->i_ctime = CURRENT_TIME_SEC;
 +              new_inode->i_ctime = current_time(new_inode);
                inode_dec_link_count(new_inode);
        }
        mark_buffer_dirty_inode(old_bh, old_dir);
@@@ -300,9 -304,9 +304,9 @@@ static int bfs_add_entry(struct inode *
                                pos = (block - sblock) * BFS_BSIZE + off;
                                if (pos >= dir->i_size) {
                                        dir->i_size += BFS_DIRENT_SIZE;
 -                                      dir->i_ctime = CURRENT_TIME_SEC;
 +                                      dir->i_ctime = current_time(dir);
                                }
 -                              dir->i_mtime = CURRENT_TIME_SEC;
 +                              dir->i_mtime = current_time(dir);
                                mark_inode_dirty(dir);
                                de->ino = cpu_to_le16((u16)ino);
                                for (i = 0; i < BFS_NAMELEN; i++)
diff --combined fs/btrfs/inode.c
index 2924774343e36f606f068503472e96c38e073ed1,c666020915278bbdaeabe0f09bdf05c2994863b2..a240270dc0452f09fb9e2a90e4684411c408319b
@@@ -4059,7 -4059,7 +4059,7 @@@ err
        inode_inc_iversion(inode);
        inode_inc_iversion(dir);
        inode->i_ctime = dir->i_mtime =
 -              dir->i_ctime = current_fs_time(inode->i_sb);
 +              dir->i_ctime = current_time(inode);
        ret = btrfs_update_inode(trans, root, dir);
  out:
        return ret;
@@@ -4202,7 -4202,7 +4202,7 @@@ int btrfs_unlink_subvol(struct btrfs_tr
  
        btrfs_i_size_write(dir, dir->i_size - name_len * 2);
        inode_inc_iversion(dir);
 -      dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb);
 +      dir->i_mtime = dir->i_ctime = current_time(dir);
        ret = btrfs_update_inode_fallback(trans, root, dir);
        if (ret)
                btrfs_abort_transaction(trans, ret);
@@@ -4965,7 -4965,7 +4965,7 @@@ static int btrfs_setsize(struct inode *
                inode_inc_iversion(inode);
                if (!(mask & (ATTR_CTIME | ATTR_MTIME)))
                        inode->i_ctime = inode->i_mtime =
 -                              current_fs_time(inode->i_sb);
 +                              current_time(inode);
        }
  
        if (newsize > oldsize) {
@@@ -5672,7 -5672,7 +5672,7 @@@ static struct inode *new_simple_dir(str
        inode->i_op = &btrfs_dir_ro_inode_operations;
        inode->i_fop = &simple_dir_operations;
        inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO;
 -      inode->i_mtime = current_fs_time(inode->i_sb);
 +      inode->i_mtime = current_time(inode);
        inode->i_atime = inode->i_mtime;
        inode->i_ctime = inode->i_mtime;
        BTRFS_I(inode)->i_otime = inode->i_mtime;
@@@ -6258,7 -6258,7 +6258,7 @@@ static struct inode *btrfs_new_inode(st
        inode_init_owner(inode, dir, mode);
        inode_set_bytes(inode, 0);
  
 -      inode->i_mtime = current_fs_time(inode->i_sb);
 +      inode->i_mtime = current_time(inode);
        inode->i_atime = inode->i_mtime;
        inode->i_ctime = inode->i_mtime;
        BTRFS_I(inode)->i_otime = inode->i_mtime;
@@@ -6372,7 -6372,7 +6372,7 @@@ int btrfs_add_link(struct btrfs_trans_h
                           name_len * 2);
        inode_inc_iversion(parent_inode);
        parent_inode->i_mtime = parent_inode->i_ctime =
 -              current_fs_time(parent_inode->i_sb);
 +              current_time(parent_inode);
        ret = btrfs_update_inode(trans, root, parent_inode);
        if (ret)
                btrfs_abort_transaction(trans, ret);
@@@ -6590,7 -6590,7 +6590,7 @@@ static int btrfs_link(struct dentry *ol
        BTRFS_I(inode)->dir_index = 0ULL;
        inc_nlink(inode);
        inode_inc_iversion(inode);
 -      inode->i_ctime = current_fs_time(inode->i_sb);
 +      inode->i_ctime = current_time(inode);
        ihold(inode);
        set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
  
@@@ -9492,7 -9492,7 +9492,7 @@@ static int btrfs_rename_exchange(struc
        struct btrfs_root *dest = BTRFS_I(new_dir)->root;
        struct inode *new_inode = new_dentry->d_inode;
        struct inode *old_inode = old_dentry->d_inode;
 -      struct timespec ctime = CURRENT_TIME;
 +      struct timespec ctime = current_time(old_inode);
        struct dentry *parent;
        u64 old_ino = btrfs_ino(old_inode);
        u64 new_ino = btrfs_ino(new_inode);
@@@ -9860,7 -9860,7 +9860,7 @@@ static int btrfs_rename(struct inode *o
        inode_inc_iversion(old_inode);
        old_dir->i_ctime = old_dir->i_mtime =
        new_dir->i_ctime = new_dir->i_mtime =
 -      old_inode->i_ctime = current_fs_time(old_dir->i_sb);
 +      old_inode->i_ctime = current_time(old_dir);
  
        if (old_dentry->d_parent != new_dentry->d_parent)
                btrfs_record_unlink_dir(trans, old_dir, old_inode, 1);
  
        if (new_inode) {
                inode_inc_iversion(new_inode);
 -              new_inode->i_ctime = current_fs_time(new_inode->i_sb);
 +              new_inode->i_ctime = current_time(new_inode);
                if (unlikely(btrfs_ino(new_inode) ==
                             BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
                        root_objectid = BTRFS_I(new_inode)->location.objectid;
@@@ -10403,7 -10403,7 +10403,7 @@@ next
                *alloc_hint = ins.objectid + ins.offset;
  
                inode_inc_iversion(inode);
 -              inode->i_ctime = current_fs_time(inode->i_sb);
 +              inode->i_ctime = current_time(inode);
                BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC;
                if (!(mode & FALLOC_FL_KEEP_SIZE) &&
                    (actual_len > inode->i_size) &&
@@@ -10566,7 -10566,7 +10566,7 @@@ static const struct inode_operations bt
        .link           = btrfs_link,
        .mkdir          = btrfs_mkdir,
        .rmdir          = btrfs_rmdir,
-       .rename2        = btrfs_rename2,
+       .rename         = btrfs_rename2,
        .symlink        = btrfs_symlink,
        .setattr        = btrfs_setattr,
        .mknod          = btrfs_mknod,
diff --combined fs/btrfs/ioctl.c
index c48e3744471720748ffe1bcd260dda9837f9308f,7fd939bfbd99359b3ffab8b9689d8fdd2b313aeb..b182197f70910b4e7c867c2a56f9e232063e88fa
@@@ -349,7 -349,7 +349,7 @@@ static int btrfs_ioctl_setflags(struct 
  
        btrfs_update_iflags(inode);
        inode_inc_iversion(inode);
 -      inode->i_ctime = current_fs_time(inode->i_sb);
 +      inode->i_ctime = current_time(inode);
        ret = btrfs_update_inode(trans, root, inode);
  
        btrfs_end_transaction(trans, root);
@@@ -445,7 -445,7 +445,7 @@@ static noinline int create_subvol(struc
        struct btrfs_root *root = BTRFS_I(dir)->root;
        struct btrfs_root *new_root;
        struct btrfs_block_rsv block_rsv;
 -      struct timespec cur_time = current_fs_time(dir->i_sb);
 +      struct timespec cur_time = current_time(dir);
        struct inode *inode;
        int ret;
        int err;
@@@ -1634,6 -1634,9 +1634,9 @@@ static noinline int btrfs_ioctl_snap_cr
        int namelen;
        int ret = 0;
  
+       if (!S_ISDIR(file_inode(file)->i_mode))
+               return -ENOTDIR;
        ret = mnt_want_write_file(file);
        if (ret)
                goto out;
@@@ -1691,6 -1694,9 +1694,9 @@@ static noinline int btrfs_ioctl_snap_cr
        struct btrfs_ioctl_vol_args *vol_args;
        int ret;
  
+       if (!S_ISDIR(file_inode(file)->i_mode))
+               return -ENOTDIR;
        vol_args = memdup_user(arg, sizeof(*vol_args));
        if (IS_ERR(vol_args))
                return PTR_ERR(vol_args);
@@@ -1714,6 -1720,9 +1720,9 @@@ static noinline int btrfs_ioctl_snap_cr
        bool readonly = false;
        struct btrfs_qgroup_inherit *inherit = NULL;
  
+       if (!S_ISDIR(file_inode(file)->i_mode))
+               return -ENOTDIR;
        vol_args = memdup_user(arg, sizeof(*vol_args));
        if (IS_ERR(vol_args))
                return PTR_ERR(vol_args);
@@@ -2357,6 -2366,9 +2366,9 @@@ static noinline int btrfs_ioctl_snap_de
        int ret;
        int err = 0;
  
+       if (!S_ISDIR(dir->i_mode))
+               return -ENOTDIR;
        vol_args = memdup_user(arg, sizeof(*vol_args));
        if (IS_ERR(vol_args))
                return PTR_ERR(vol_args);
@@@ -3279,7 -3291,7 +3291,7 @@@ static int clone_finish_inode_update(st
  
        inode_inc_iversion(inode);
        if (!no_time_update)
 -              inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
 +              inode->i_mtime = inode->i_ctime = current_time(inode);
        /*
         * We round up to the block size at eof when determining which
         * extents to clone above, but shouldn't round up the file size.
@@@ -5094,7 -5106,7 +5106,7 @@@ static long _btrfs_ioctl_set_received_s
        struct btrfs_root *root = BTRFS_I(inode)->root;
        struct btrfs_root_item *root_item = &root->root_item;
        struct btrfs_trans_handle *trans;
 -      struct timespec ct = current_fs_time(inode->i_sb);
 +      struct timespec ct = current_time(inode);
        int ret = 0;
        int received_uuid_changed;
  
diff --combined fs/coda/dir.c
index b10a74bac58bd5f5dab763f69b2dfbfef82f946e,82aceaef8e4eda2648644a8b784139f0883282b9..c0474ac6cbf200eb458eaf5e3f2359e9b0edfcab
@@@ -109,7 -109,7 +109,7 @@@ static inline void coda_dir_update_mtim
        /* optimistically we can also act as if our nose bleeds. The
         * granularity of the mtime is coarse anyways so we might actually be
         * right most of the time. Note: we only do this for directories. */
 -      dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
 +      dir->i_mtime = dir->i_ctime = current_time(dir);
  #endif
  }
  
@@@ -291,7 -291,8 +291,8 @@@ static int coda_rmdir(struct inode *dir
  
  /* rename */
  static int coda_rename(struct inode *old_dir, struct dentry *old_dentry,
-                      struct inode *new_dir, struct dentry *new_dentry)
+                      struct inode *new_dir, struct dentry *new_dentry,
+                      unsigned int flags)
  {
        const char *old_name = old_dentry->d_name.name;
        const char *new_name = new_dentry->d_name.name;
        int new_length = new_dentry->d_name.len;
        int error;
  
+       if (flags)
+               return -EINVAL;
        error = venus_rename(old_dir->i_sb, coda_i2f(old_dir),
                             coda_i2f(new_dir), old_length, new_length,
                             (const char *) old_name, (const char *)new_name);
diff --combined fs/debugfs/inode.c
index 56a3c82a57858400a749bda4675f751a492bd1df,5ac27c9de66997e0f550f7969c20be2492f01218..f17fcf89e18eb077ca4231c344327852ea3b156f
@@@ -45,7 -45,7 +45,7 @@@ static struct inode *debugfs_get_inode(
        if (inode) {
                inode->i_ino = get_next_ino();
                inode->i_atime = inode->i_mtime =
 -                      inode->i_ctime = current_fs_time(sb);
 +                      inode->i_ctime = current_time(inode);
        }
        return inode;
  }
@@@ -748,7 -748,7 +748,7 @@@ struct dentry *debugfs_rename(struct de
        old_name = fsnotify_oldname_init(old_dentry->d_name.name);
  
        error = simple_rename(d_inode(old_dir), old_dentry, d_inode(new_dir),
-               dentry);
+                             dentry, 0);
        if (error) {
                fsnotify_oldname_free(old_name);
                goto exit;
diff --combined fs/exofs/namei.c
index 80c8114d76a60d937bd58062fabbe2b705d4a229,53d838200cc99e6787b40a55b81ee2619fd91d25..7295cd7227700ee9f4356f03805ba839dab551ce
@@@ -142,7 -142,7 +142,7 @@@ static int exofs_link(struct dentry *ol
  {
        struct inode *inode = d_inode(old_dentry);
  
 -      inode->i_ctime = CURRENT_TIME;
 +      inode->i_ctime = current_time(inode);
        inode_inc_link_count(inode);
        ihold(inode);
  
@@@ -227,7 -227,8 +227,8 @@@ static int exofs_rmdir(struct inode *di
  }
  
  static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,
-               struct inode *new_dir, struct dentry *new_dentry)
+                       struct inode *new_dir, struct dentry *new_dentry,
+                       unsigned int flags)
  {
        struct inode *old_inode = d_inode(old_dentry);
        struct inode *new_inode = d_inode(new_dentry);
        struct exofs_dir_entry *old_de;
        int err = -ENOENT;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        old_de = exofs_find_entry(old_dir, old_dentry, &old_page);
        if (!old_de)
                goto out;
                if (!new_de)
                        goto out_dir;
                err = exofs_set_link(new_dir, new_de, new_page, old_inode);
 -              new_inode->i_ctime = CURRENT_TIME;
 +              new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
                inode_dec_link_count(new_inode);
                        inode_inc_link_count(new_dir);
        }
  
 -      old_inode->i_ctime = CURRENT_TIME;
 +      old_inode->i_ctime = current_time(old_inode);
  
        exofs_delete_entry(old_de, old_page);
        mark_inode_dirty(old_inode);
@@@ -310,7 -314,7 +314,7 @@@ const struct inode_operations exofs_dir
        .mkdir          = exofs_mkdir,
        .rmdir          = exofs_rmdir,
        .mknod          = exofs_mknod,
-       .rename         = exofs_rename,
+       .rename         = exofs_rename,
        .setattr        = exofs_setattr,
  };
  
diff --combined fs/ext2/namei.c
index edb7b8c116ebb75b53d8a9f36c906b03599a9e57,be32e20a2b8863a19e48d9ddac2dd2a14354bb00..7d66b2012e939059577c0351c6325fc1926c8d23
@@@ -221,7 -221,7 +221,7 @@@ static int ext2_link (struct dentry * o
        if (err)
                return err;
  
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        inode_inc_link_count(inode);
        ihold(inode);
  
@@@ -328,7 -328,8 +328,8 @@@ static int ext2_rmdir (struct inode * d
  }
  
  static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
-       struct inode * new_dir, struct dentry * new_dentry )
+                       struct inode * new_dir, struct dentry * new_dentry,
+                       unsigned int flags)
  {
        struct inode * old_inode = d_inode(old_dentry);
        struct inode * new_inode = d_inode(new_dentry);
        struct ext2_dir_entry_2 * old_de;
        int err;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        err = dquot_initialize(old_dir);
        if (err)
                goto out;
                if (!new_de)
                        goto out_dir;
                ext2_set_link(new_dir, new_de, new_page, old_inode, 1);
 -              new_inode->i_ctime = CURRENT_TIME_SEC;
 +              new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
                inode_dec_link_count(new_inode);
         * Like most other Unix systems, set the ctime for inodes on a
         * rename.
         */
 -      old_inode->i_ctime = CURRENT_TIME_SEC;
 +      old_inode->i_ctime = current_time(old_inode);
        mark_inode_dirty(old_inode);
  
        ext2_delete_entry (old_de, old_page);
diff --combined fs/f2fs/namei.c
index dfb622ad86dc706760d4b520f760d52049fb537e,08e3d1d7a5009f3fcc76233f688152a0d2bf501f..71e36a780c901940577809953a82129870806942
@@@ -46,7 -46,7 +46,7 @@@ static struct inode *f2fs_new_inode(str
  
        inode->i_ino = ino;
        inode->i_blocks = 0;
 -      inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
 +      inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
        inode->i_generation = sbi->s_next_generation++;
  
        err = insert_inode_locked(inode);
@@@ -177,7 -177,7 +177,7 @@@ static int f2fs_link(struct dentry *old
  
        f2fs_balance_fs(sbi, true);
  
 -      inode->i_ctime = CURRENT_TIME;
 +      inode->i_ctime = current_time(inode);
        ihold(inode);
  
        set_inode_flag(inode, FI_INC_LINK);
@@@ -718,7 -718,7 +718,7 @@@ static int f2fs_rename(struct inode *ol
  
                f2fs_set_link(new_dir, new_entry, new_page, old_inode);
  
 -              new_inode->i_ctime = CURRENT_TIME;
 +              new_inode->i_ctime = current_time(new_inode);
                down_write(&F2FS_I(new_inode)->i_sem);
                if (old_dir_entry)
                        f2fs_i_links_write(new_inode, false);
                file_set_enc_name(old_inode);
        up_write(&F2FS_I(old_inode)->i_sem);
  
 -      old_inode->i_ctime = CURRENT_TIME;
 +      old_inode->i_ctime = current_time(old_inode);
        f2fs_mark_inode_dirty_sync(old_inode);
  
        f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
@@@ -927,7 -927,7 +927,7 @@@ static int f2fs_cross_rename(struct ino
        file_lost_pino(old_inode);
        up_write(&F2FS_I(old_inode)->i_sem);
  
 -      old_dir->i_ctime = CURRENT_TIME;
 +      old_dir->i_ctime = current_time(old_dir);
        if (old_nlink) {
                down_write(&F2FS_I(old_dir)->i_sem);
                f2fs_i_links_write(old_dir, old_nlink > 0);
        file_lost_pino(new_inode);
        up_write(&F2FS_I(new_inode)->i_sem);
  
 -      new_dir->i_ctime = CURRENT_TIME;
 +      new_dir->i_ctime = current_time(new_dir);
        if (new_nlink) {
                down_write(&F2FS_I(new_dir)->i_sem);
                f2fs_i_links_write(new_dir, new_nlink > 0);
@@@ -1093,7 -1093,7 +1093,7 @@@ const struct inode_operations f2fs_dir_
        .mkdir          = f2fs_mkdir,
        .rmdir          = f2fs_rmdir,
        .mknod          = f2fs_mknod,
-       .rename2        = f2fs_rename2,
+       .rename         = f2fs_rename2,
        .tmpfile        = f2fs_tmpfile,
        .getattr        = f2fs_getattr,
        .setattr        = f2fs_setattr,
diff --combined fs/fat/namei_msdos.c
index ccd9f83f9bb6e26ac808e0e22cdb6dd8f90c7258,a8f6aa9699483123791a83fd72e9e0dbd3fb440b..7d6a105d601b52d3d5b356e94c0c7ab87a818263
@@@ -283,7 -283,7 +283,7 @@@ static int msdos_create(struct inode *d
                goto out;
        }
  
 -      ts = CURRENT_TIME_SEC;
 +      ts = current_time(dir);
        err = msdos_add_entry(dir, msdos_name, 0, is_hid, 0, &ts, &sinfo);
        if (err)
                goto out;
@@@ -330,7 -330,7 +330,7 @@@ static int msdos_rmdir(struct inode *di
        drop_nlink(dir);
  
        clear_nlink(inode);
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        fat_detach(inode);
  out:
        mutex_unlock(&MSDOS_SB(sb)->s_lock);
@@@ -364,7 -364,7 +364,7 @@@ static int msdos_mkdir(struct inode *di
                goto out;
        }
  
 -      ts = CURRENT_TIME_SEC;
 +      ts = current_time(dir);
        cluster = fat_alloc_new_dir(dir, &ts);
        if (cluster < 0) {
                err = cluster;
@@@ -416,7 -416,7 +416,7 @@@ static int msdos_unlink(struct inode *d
        if (err)
                goto out;
        clear_nlink(inode);
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        fat_detach(inode);
  out:
        mutex_unlock(&MSDOS_SB(sb)->s_lock);
@@@ -481,7 -481,7 +481,7 @@@ static int do_msdos_rename(struct inod
                                mark_inode_dirty(old_inode);
  
                        old_dir->i_version++;
 -                      old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME_SEC;
 +                      old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
                        if (IS_DIRSYNC(old_dir))
                                (void)fat_sync_inode(old_dir);
                        else
                }
        }
  
 -      ts = CURRENT_TIME_SEC;
 +      ts = current_time(old_inode);
        if (new_inode) {
                if (err)
                        goto out;
@@@ -596,12 -596,16 +596,16 @@@ error_inode
  
  /***** Rename, a wrapper for rename_same_dir & rename_diff_dir */
  static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry,
-                       struct inode *new_dir, struct dentry *new_dentry)
+                       struct inode *new_dir, struct dentry *new_dentry,
+                       unsigned int flags)
  {
        struct super_block *sb = old_dir->i_sb;
        unsigned char old_msdos_name[MSDOS_NAME], new_msdos_name[MSDOS_NAME];
        int err, is_hid;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        mutex_lock(&MSDOS_SB(sb)->s_lock);
  
        err = msdos_format_name(old_dentry->d_name.name,
diff --combined fs/fat/namei_vfat.c
index d4a1b2bfda64343c3298028dfd40fb17959315a5,c5e48b8631ccb5bbaa2ebe5269b99bc266d4b65a..bf46a2d7dc50d3dba408b49360bc2177e7a829f5
@@@ -777,7 -777,7 +777,7 @@@ static int vfat_create(struct inode *di
  
        mutex_lock(&MSDOS_SB(sb)->s_lock);
  
 -      ts = CURRENT_TIME_SEC;
 +      ts = current_time(dir);
        err = vfat_add_entry(dir, &dentry->d_name, 0, 0, &ts, &sinfo);
        if (err)
                goto out;
@@@ -821,7 -821,7 +821,7 @@@ static int vfat_rmdir(struct inode *dir
        drop_nlink(dir);
  
        clear_nlink(inode);
 -      inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
 +      inode->i_mtime = inode->i_atime = current_time(inode);
        fat_detach(inode);
        dentry->d_time = dir->i_version;
  out:
@@@ -847,7 -847,7 +847,7 @@@ static int vfat_unlink(struct inode *di
        if (err)
                goto out;
        clear_nlink(inode);
 -      inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
 +      inode->i_mtime = inode->i_atime = current_time(inode);
        fat_detach(inode);
        dentry->d_time = dir->i_version;
  out:
@@@ -866,7 -866,7 +866,7 @@@ static int vfat_mkdir(struct inode *dir
  
        mutex_lock(&MSDOS_SB(sb)->s_lock);
  
 -      ts = CURRENT_TIME_SEC;
 +      ts = current_time(dir);
        cluster = fat_alloc_new_dir(dir, &ts);
        if (cluster < 0) {
                err = cluster;
@@@ -903,7 -903,8 +903,8 @@@ out
  }
  
  static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry,
-                      struct inode *new_dir, struct dentry *new_dentry)
+                      struct inode *new_dir, struct dentry *new_dentry,
+                      unsigned int flags)
  {
        struct buffer_head *dotdot_bh;
        struct msdos_dir_entry *dotdot_de;
        int err, is_dir, update_dotdot, corrupt = 0;
        struct super_block *sb = old_dir->i_sb;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        old_sinfo.bh = sinfo.bh = dotdot_bh = NULL;
        old_inode = d_inode(old_dentry);
        new_inode = d_inode(new_dentry);
                }
        }
  
 -      ts = CURRENT_TIME_SEC;
 +      ts = current_time(old_dir);
        if (new_inode) {
                if (is_dir) {
                        err = fat_dir_empty(new_inode);
diff --combined fs/fuse/dir.c
index 8de80dc563c5c3e0dd385d18e717aab9c85f35f2,4bfeaa70815f6c76cfa8ea06eadbe856d4c91d43..215b4beea2ef463e641a092d7c26a618e7745f34
@@@ -637,7 -637,7 +637,7 @@@ static int fuse_symlink(struct inode *d
  static inline void fuse_update_ctime(struct inode *inode)
  {
        if (!IS_NOCMTIME(inode)) {
 -              inode->i_ctime = current_fs_time(inode->i_sb);
 +              inode->i_ctime = current_time(inode);
                mark_inode_dirty_sync(inode);
        }
  }
@@@ -1876,7 -1876,7 +1876,7 @@@ static const struct inode_operations fu
        .symlink        = fuse_symlink,
        .unlink         = fuse_unlink,
        .rmdir          = fuse_rmdir,
-       .rename2        = fuse_rename2,
+       .rename         = fuse_rename2,
        .link           = fuse_link,
        .setattr        = fuse_setattr,
        .create         = fuse_create,
diff --combined fs/gfs2/inode.c
index a197a219eed99c655d55e0e94590e187cb23d288,56825cc8ab87e159dd8c54947264224071188966..abc74e13502dd4a8d8a2d0e03669af846128a1a6
@@@ -652,7 -652,7 +652,7 @@@ static int gfs2_create_inode(struct ino
        set_nlink(inode, S_ISDIR(mode) ? 2 : 1);
        inode->i_rdev = dev;
        inode->i_size = size;
 -      inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 +      inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
        gfs2_set_inode_blocks(inode, 1);
        munge_mode_uid_gid(dip, inode);
        check_and_update_goal(dip);
@@@ -979,7 -979,7 +979,7 @@@ static int gfs2_link(struct dentry *old
  
        gfs2_trans_add_meta(ip->i_gl, dibh);
        inc_nlink(&ip->i_inode);
 -      ip->i_inode.i_ctime = CURRENT_TIME;
 +      ip->i_inode.i_ctime = current_time(&ip->i_inode);
        ihold(inode);
        d_instantiate(dentry, inode);
        mark_inode_dirty(inode);
@@@ -1063,7 -1063,7 +1063,7 @@@ static int gfs2_unlink_inode(struct gfs
                return error;
  
        ip->i_entries = 0;
 -      inode->i_ctime = CURRENT_TIME;
 +      inode->i_ctime = current_time(inode);
        if (S_ISDIR(inode->i_mode))
                clear_nlink(inode);
        else
@@@ -1326,7 -1326,7 +1326,7 @@@ static int update_moved_ino(struct gfs2
        error = gfs2_meta_inode_buffer(ip, &dibh);
        if (error)
                return error;
 -      ip->i_inode.i_ctime = CURRENT_TIME;
 +      ip->i_inode.i_ctime = current_time(&ip->i_inode);
        gfs2_trans_add_meta(ip->i_gl, dibh);
        gfs2_dinode_out(ip, dibh->b_data);
        brelse(dibh);
@@@ -2054,7 -2054,7 +2054,7 @@@ const struct inode_operations gfs2_dir_
        .mkdir = gfs2_mkdir,
        .rmdir = gfs2_unlink,
        .mknod = gfs2_mknod,
-       .rename2 = gfs2_rename2,
+       .rename = gfs2_rename2,
        .permission = gfs2_permission,
        .setattr = gfs2_setattr,
        .getattr = gfs2_getattr,
diff --combined fs/hfs/dir.c
index 4f379fb916911a58e8a4cf573ffdbb90783a775b,4f7a1b64e2512a05918dcd63aa6bb710f33eef6e..5de5c48b418da2e62edc00c188bde0546cf97410
@@@ -268,7 -268,7 +268,7 @@@ static int hfs_remove(struct inode *dir
        if (res)
                return res;
        clear_nlink(inode);
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        hfs_delete_inode(inode);
        mark_inode_dirty(inode);
        return 0;
   * XXX: how do you handle must_be dir?
   */
  static int hfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                     struct inode *new_dir, struct dentry *new_dentry)
+                     struct inode *new_dir, struct dentry *new_dentry,
+                     unsigned int flags)
  {
        int res;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        /* Unlink destination if it already exists */
        if (d_really_is_positive(new_dentry)) {
                res = hfs_remove(new_dir, new_dentry);
diff --combined fs/hfsplus/dir.c
index 69c66c21113bee1a4702c3f123cb1beea1e2e45a,063577958126fdeacf4eff86b4a10fea40c55401..3cf088779589b14bb6315905eb7265cfceac50b9
@@@ -347,7 -347,7 +347,7 @@@ static int hfsplus_link(struct dentry *
        inc_nlink(inode);
        hfsplus_instantiate(dst_dentry, inode, cnid);
        ihold(inode);
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        mark_inode_dirty(inode);
        sbi->file_count++;
        hfsplus_mark_mdb_dirty(dst_dir->i_sb);
@@@ -406,7 -406,7 +406,7 @@@ static int hfsplus_unlink(struct inode 
                        hfsplus_delete_inode(inode);
        } else
                sbi->file_count--;
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        mark_inode_dirty(inode);
  out:
        mutex_unlock(&sbi->vh_mutex);
@@@ -427,7 -427,7 +427,7 @@@ static int hfsplus_rmdir(struct inode *
        if (res)
                goto out;
        clear_nlink(inode);
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        hfsplus_delete_inode(inode);
        mark_inode_dirty(inode);
  out:
@@@ -530,10 -530,14 +530,14 @@@ static int hfsplus_mkdir(struct inode *
  }
  
  static int hfsplus_rename(struct inode *old_dir, struct dentry *old_dentry,
-                         struct inode *new_dir, struct dentry *new_dentry)
+                         struct inode *new_dir, struct dentry *new_dentry,
+                         unsigned int flags)
  {
        int res;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        /* Unlink destination if it already exists */
        if (d_really_is_positive(new_dentry)) {
                if (d_is_dir(new_dentry))
diff --combined fs/jfs/namei.c
index 10449c1deac01875605f5e40a3dd0833ee47c5c2,1d88df6ae81bd46328281cb66be05f601142c95d..d1d7c43abb63263cf593c55c4dc7fa24635fd608
@@@ -162,7 -162,7 +162,7 @@@ static int jfs_create(struct inode *dip
  
        mark_inode_dirty(ip);
  
 -      dip->i_ctime = dip->i_mtime = CURRENT_TIME;
 +      dip->i_ctime = dip->i_mtime = current_time(dip);
  
        mark_inode_dirty(dip);
  
@@@ -298,7 -298,7 +298,7 @@@ static int jfs_mkdir(struct inode *dip
  
        /* update parent directory inode */
        inc_nlink(dip);         /* for '..' from child directory */
 -      dip->i_ctime = dip->i_mtime = CURRENT_TIME;
 +      dip->i_ctime = dip->i_mtime = current_time(dip);
        mark_inode_dirty(dip);
  
        rc = txCommit(tid, 2, &iplist[0], 0);
@@@ -406,7 -406,7 +406,7 @@@ static int jfs_rmdir(struct inode *dip
        /* update parent directory's link count corresponding
         * to ".." entry of the target directory deleted
         */
 -      dip->i_ctime = dip->i_mtime = CURRENT_TIME;
 +      dip->i_ctime = dip->i_mtime = current_time(dip);
        inode_dec_link_count(dip);
  
        /*
@@@ -528,7 -528,7 +528,7 @@@ static int jfs_unlink(struct inode *dip
  
        ASSERT(ip->i_nlink);
  
 -      ip->i_ctime = dip->i_ctime = dip->i_mtime = CURRENT_TIME;
 +      ip->i_ctime = dip->i_ctime = dip->i_mtime = current_time(ip);
        mark_inode_dirty(dip);
  
        /* update target's inode */
@@@ -838,8 -838,8 +838,8 @@@ static int jfs_link(struct dentry *old_
  
        /* update object inode */
        inc_nlink(ip);          /* for new link */
 -      ip->i_ctime = CURRENT_TIME;
 -      dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      ip->i_ctime = current_time(ip);
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        mark_inode_dirty(dir);
        ihold(ip);
  
@@@ -1039,7 -1039,7 +1039,7 @@@ static int jfs_symlink(struct inode *di
  
        mark_inode_dirty(ip);
  
 -      dip->i_ctime = dip->i_mtime = CURRENT_TIME;
 +      dip->i_ctime = dip->i_mtime = current_time(dip);
        mark_inode_dirty(dip);
        /*
         * commit update of parent directory and link object
   * FUNCTION:  rename a file or directory
   */
  static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-              struct inode *new_dir, struct dentry *new_dentry)
+                     struct inode *new_dir, struct dentry *new_dentry,
+                     unsigned int flags)
  {
        struct btstack btstack;
        ino_t ino;
        s64 new_size = 0;
        int commit_flag;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
  
        jfs_info("jfs_rename: %pd %pd", old_dentry, new_dentry);
  
                        tblk->xflag |= COMMIT_DELETE;
                        tblk->u.ip = new_ip;
                } else {
 -                      new_ip->i_ctime = CURRENT_TIME;
 +                      new_ip->i_ctime = current_time(new_ip);
                        mark_inode_dirty(new_ip);
                }
        } else {
        /*
         * Update ctime on changed/moved inodes & mark dirty
         */
 -      old_ip->i_ctime = CURRENT_TIME;
 +      old_ip->i_ctime = current_time(old_ip);
        mark_inode_dirty(old_ip);
  
 -      new_dir->i_ctime = new_dir->i_mtime = current_fs_time(new_dir->i_sb);
 +      new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir);
        mark_inode_dirty(new_dir);
  
        /* Build list of inodes modified by this transaction */
  
        if (old_dir != new_dir) {
                iplist[ipcount++] = new_dir;
 -              old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
 +              old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
                mark_inode_dirty(old_dir);
        }
  
@@@ -1426,7 -1429,7 +1429,7 @@@ static int jfs_mknod(struct inode *dir
  
        mark_inode_dirty(ip);
  
 -      dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
  
        mark_inode_dirty(dir);
  
diff --combined fs/libfs.c
index cc9f7ef2a1ceb7770335f7f23d5a9a00c87b3c08,4758353b2d41bb1b252afe6b2026f46bd5d44d5f..d8ee308de3255d1c8753eab6645d0874744548d7
@@@ -265,7 -265,7 +265,7 @@@ struct dentry *mount_pseudo(struct file
         */
        root->i_ino = 1;
        root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR;
 -      root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME;
 +      root->i_atime = root->i_mtime = root->i_ctime = current_time(root);
        dentry = __d_alloc(s, &d_name);
        if (!dentry) {
                iput(root);
@@@ -295,7 -295,7 +295,7 @@@ int simple_link(struct dentry *old_dent
  {
        struct inode *inode = d_inode(old_dentry);
  
 -      inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
        inc_nlink(inode);
        ihold(inode);
        dget(dentry);
@@@ -329,7 -329,7 +329,7 @@@ int simple_unlink(struct inode *dir, st
  {
        struct inode *inode = d_inode(dentry);
  
 -      inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
        drop_nlink(inode);
        dput(dentry);
        return 0;
@@@ -349,11 -349,15 +349,15 @@@ int simple_rmdir(struct inode *dir, str
  EXPORT_SYMBOL(simple_rmdir);
  
  int simple_rename(struct inode *old_dir, struct dentry *old_dentry,
-               struct inode *new_dir, struct dentry *new_dentry)
+                 struct inode *new_dir, struct dentry *new_dentry,
+                 unsigned int flags)
  {
        struct inode *inode = d_inode(old_dentry);
        int they_are_dirs = d_is_dir(old_dentry);
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        if (!simple_empty(new_dentry))
                return -ENOTEMPTY;
  
        }
  
        old_dir->i_ctime = old_dir->i_mtime = new_dir->i_ctime =
 -              new_dir->i_mtime = inode->i_ctime = CURRENT_TIME;
 +              new_dir->i_mtime = inode->i_ctime = current_time(old_dir);
  
        return 0;
  }
@@@ -520,7 -524,7 +524,7 @@@ int simple_fill_super(struct super_bloc
         */
        inode->i_ino = 1;
        inode->i_mode = S_IFDIR | 0755;
 -      inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 +      inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
        inode->i_op = &simple_dir_inode_operations;
        inode->i_fop = &simple_dir_operations;
        set_nlink(inode, 2);
                        goto out;
                }
                inode->i_mode = S_IFREG | files->mode;
 -              inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 +              inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
                inode->i_fop = files->ops;
                inode->i_ino = i;
                d_add(dentry, inode);
@@@ -1092,7 -1096,7 +1096,7 @@@ struct inode *alloc_anon_inode(struct s
        inode->i_uid = current_fsuid();
        inode->i_gid = current_fsgid();
        inode->i_flags |= S_PRIVATE;
 -      inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 +      inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
        return inode;
  }
  EXPORT_SYMBOL(alloc_anon_inode);
diff --combined fs/logfs/dir.c
index a284dd8689a8158ae05a539c8f5a590727c2a78a,be37b907e65a0c1e07343e5e5c7e5e147f1b9a51..c87ea52de3d9d202d02dd6d66735c4d8f89724a8
@@@ -226,7 -226,7 +226,7 @@@ static int logfs_unlink(struct inode *d
        ta->state = UNLINK_1;
        ta->ino = inode->i_ino;
  
 -      inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
  
        page = logfs_get_dd_page(dir, dentry);
        if (!page) {
@@@ -540,7 -540,7 +540,7 @@@ static int logfs_link(struct dentry *ol
  {
        struct inode *inode = d_inode(old_dentry);
  
 -      inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
        ihold(inode);
        inc_nlink(inode);
        mark_inode_dirty_sync(inode);
@@@ -573,7 -573,7 +573,7 @@@ static int logfs_delete_dd(struct inod
         * (crc-protected) journal.
         */
        BUG_ON(beyond_eof(dir, pos));
 -      dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        log_dir(" Delete dentry (%lx, %llx)\n", dir->i_ino, pos);
        return logfs_delete(dir, pos, NULL);
  }
@@@ -718,8 -718,12 +718,12 @@@ out
  }
  
  static int logfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                       struct inode *new_dir, struct dentry *new_dentry)
+                       struct inode *new_dir, struct dentry *new_dentry,
+                       unsigned int flags)
  {
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        if (d_really_is_positive(new_dentry))
                return logfs_rename_target(old_dir, old_dentry,
                                           new_dir, new_dentry);
diff --combined fs/minix/namei.c
index 66ca515302781e51ae3af8f1f6ef1e6639dff1b4,f7811d508104c120c7c85c515e7d757afa6bec46..1e0f11f5dac9c90093dd511f2dc451971c232c6d
@@@ -106,7 -106,7 +106,7 @@@ static int minix_link(struct dentry * o
  {
        struct inode *inode = d_inode(old_dentry);
  
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        inode_inc_link_count(inode);
        ihold(inode);
        return add_nondir(dentry, inode);
@@@ -185,7 -185,8 +185,8 @@@ static int minix_rmdir(struct inode * d
  }
  
  static int minix_rename(struct inode * old_dir, struct dentry *old_dentry,
-                          struct inode * new_dir, struct dentry *new_dentry)
+                       struct inode * new_dir, struct dentry *new_dentry,
+                       unsigned int flags)
  {
        struct inode * old_inode = d_inode(old_dentry);
        struct inode * new_inode = d_inode(new_dentry);
        struct minix_dir_entry * old_de;
        int err = -ENOENT;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        old_de = minix_find_entry(old_dentry, &old_page);
        if (!old_de)
                goto out;
                if (!new_de)
                        goto out_dir;
                minix_set_link(new_de, new_page, old_inode);
 -              new_inode->i_ctime = CURRENT_TIME_SEC;
 +              new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
                inode_dec_link_count(new_inode);
diff --combined fs/nilfs2/namei.c
index ace5ebf3b2a80b5cf2c999eee958e88797cfaf73,ea94049c3e7959685ef05e487ccb6fc12ede1afc..2b71c60fe982a1bafdca0848193acc33287b56c5
@@@ -194,7 -194,7 +194,7 @@@ static int nilfs_link(struct dentry *ol
        if (err)
                return err;
  
 -      inode->i_ctime = CURRENT_TIME;
 +      inode->i_ctime = current_time(inode);
        inode_inc_link_count(inode);
        ihold(inode);
  
@@@ -350,7 -350,8 +350,8 @@@ static int nilfs_rmdir(struct inode *di
  }
  
  static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                       struct inode *new_dir,  struct dentry *new_dentry)
+                       struct inode *new_dir,  struct dentry *new_dentry,
+                       unsigned int flags)
  {
        struct inode *old_inode = d_inode(old_dentry);
        struct inode *new_inode = d_inode(new_dentry);
        struct nilfs_transaction_info ti;
        int err;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        err = nilfs_transaction_begin(old_dir->i_sb, &ti, 1);
        if (unlikely(err))
                return err;
                        goto out_dir;
                nilfs_set_link(new_dir, new_de, new_page, old_inode);
                nilfs_mark_inode_dirty(new_dir);
 -              new_inode->i_ctime = CURRENT_TIME;
 +              new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
                drop_nlink(new_inode);
         * Like most other Unix systems, set the ctime for inodes on a
         * rename.
         */
 -      old_inode->i_ctime = CURRENT_TIME;
 +      old_inode->i_ctime = current_time(old_inode);
  
        nilfs_delete_entry(old_de, old_page);
  
diff --combined fs/ocfs2/alloc.c
index 498e71141b5386558af2fa44e37a8faf06f9bdec,f165f867f3326f1c0dce98c4e1d031308fb65c51..f72712f6c28d587ab6d96c21a48940403a5ccdad
@@@ -5922,7 -5922,6 +5922,6 @@@ bail
  }
  
  static int ocfs2_replay_truncate_records(struct ocfs2_super *osb,
-                                        handle_t *handle,
                                         struct inode *data_alloc_inode,
                                         struct buffer_head *data_alloc_bh)
  {
        struct ocfs2_truncate_log *tl;
        struct inode *tl_inode = osb->osb_tl_inode;
        struct buffer_head *tl_bh = osb->osb_tl_bh;
+       handle_t *handle;
  
        di = (struct ocfs2_dinode *) tl_bh->b_data;
        tl = &di->id2.i_dealloc;
        i = le16_to_cpu(tl->tl_used) - 1;
        while (i >= 0) {
+               handle = ocfs2_start_trans(osb, OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC);
+               if (IS_ERR(handle)) {
+                       status = PTR_ERR(handle);
+                       mlog_errno(status);
+                       goto bail;
+               }
                /* Caller has given us at least enough credits to
                 * update the truncate log dinode */
                status = ocfs2_journal_access_di(handle, INODE_CACHE(tl_inode), tl_bh,
                        }
                }
  
-               status = ocfs2_extend_trans(handle,
-                               OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC);
-               if (status < 0) {
-                       mlog_errno(status);
-                       goto bail;
-               }
+               ocfs2_commit_trans(osb, handle);
                i--;
        }
  
@@@ -5994,7 -5996,6 +5996,6 @@@ int __ocfs2_flush_truncate_log(struct o
  {
        int status;
        unsigned int num_to_flush;
-       handle_t *handle;
        struct inode *tl_inode = osb->osb_tl_inode;
        struct inode *data_alloc_inode = NULL;
        struct buffer_head *tl_bh = osb->osb_tl_bh;
                goto out_mutex;
        }
  
-       handle = ocfs2_start_trans(osb, OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC);
-       if (IS_ERR(handle)) {
-               status = PTR_ERR(handle);
-               mlog_errno(status);
-               goto out_unlock;
-       }
-       status = ocfs2_replay_truncate_records(osb, handle, data_alloc_inode,
+       status = ocfs2_replay_truncate_records(osb, data_alloc_inode,
                                               data_alloc_bh);
        if (status < 0)
                mlog_errno(status);
  
-       ocfs2_commit_trans(osb, handle);
- out_unlock:
        brelse(data_alloc_bh);
        ocfs2_inode_unlock(data_alloc_inode, 1);
  
@@@ -6413,43 -6404,34 +6404,34 @@@ static int ocfs2_free_cached_blocks(str
                goto out_mutex;
        }
  
-       handle = ocfs2_start_trans(osb, OCFS2_SUBALLOC_FREE);
-       if (IS_ERR(handle)) {
-               ret = PTR_ERR(handle);
-               mlog_errno(ret);
-               goto out_unlock;
-       }
        while (head) {
                if (head->free_bg)
                        bg_blkno = head->free_bg;
                else
                        bg_blkno = ocfs2_which_suballoc_group(head->free_blk,
                                                              head->free_bit);
+               handle = ocfs2_start_trans(osb, OCFS2_SUBALLOC_FREE);
+               if (IS_ERR(handle)) {
+                       ret = PTR_ERR(handle);
+                       mlog_errno(ret);
+                       goto out_unlock;
+               }
                trace_ocfs2_free_cached_blocks(
                     (unsigned long long)head->free_blk, head->free_bit);
  
                ret = ocfs2_free_suballoc_bits(handle, inode, di_bh,
                                               head->free_bit, bg_blkno, 1);
-               if (ret) {
+               if (ret)
                        mlog_errno(ret);
-                       goto out_journal;
-               }
  
-               ret = ocfs2_extend_trans(handle, OCFS2_SUBALLOC_FREE);
-               if (ret) {
-                       mlog_errno(ret);
-                       goto out_journal;
-               }
+               ocfs2_commit_trans(osb, handle);
  
                tmp = head;
                head = head->free_next;
                kfree(tmp);
        }
  
- out_journal:
-       ocfs2_commit_trans(osb, handle);
  out_unlock:
        ocfs2_inode_unlock(inode, 1);
        brelse(di_bh);
@@@ -7311,7 -7293,7 +7293,7 @@@ int ocfs2_truncate_inline(struct inode 
        }
  
        inode->i_blocks = ocfs2_inode_sector_count(inode);
 -      inode->i_ctime = inode->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = inode->i_mtime = current_time(inode);
  
        di->i_ctime = di->i_mtime = cpu_to_le64(inode->i_ctime.tv_sec);
        di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
diff --combined fs/ocfs2/file.c
index 9adcac9dfda14086eb6fd1d418fe30f0b8cbf671,0b055bfb8e866ddf2c4bf874ff653694081a5dec..63bfc3b5260dc7b09f486b12936c11d7a885ba8e
@@@ -253,7 -253,7 +253,7 @@@ int ocfs2_should_update_atime(struct in
                return 0;
        }
  
 -      now = CURRENT_TIME;
 +      now = current_time(inode);
        if ((now.tv_sec - inode->i_atime.tv_sec <= osb->s_atime_quantum))
                return 0;
        else
@@@ -287,7 -287,7 +287,7 @@@ int ocfs2_update_inode_atime(struct ino
         * have i_mutex to guard against concurrent changes to other
         * inode fields.
         */
 -      inode->i_atime = CURRENT_TIME;
 +      inode->i_atime = current_time(inode);
        di->i_atime = cpu_to_le64(inode->i_atime.tv_sec);
        di->i_atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec);
        ocfs2_update_inode_fsync_trans(handle, inode, 0);
@@@ -308,7 -308,7 +308,7 @@@ int ocfs2_set_inode_size(handle_t *hand
  
        i_size_write(inode, new_i_size);
        inode->i_blocks = ocfs2_inode_sector_count(inode);
 -      inode->i_ctime = inode->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = inode->i_mtime = current_time(inode);
  
        status = ocfs2_mark_inode_dirty(handle, inode, fe_bh);
        if (status < 0) {
@@@ -429,7 -429,7 +429,7 @@@ static int ocfs2_orphan_for_truncate(st
        }
  
        i_size_write(inode, new_i_size);
 -      inode->i_ctime = inode->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = inode->i_mtime = current_time(inode);
  
        di = (struct ocfs2_dinode *) fe_bh->b_data;
        di->i_size = cpu_to_le64(new_i_size);
@@@ -840,7 -840,7 +840,7 @@@ static int ocfs2_write_zero_page(struc
        i_size_write(inode, abs_to);
        inode->i_blocks = ocfs2_inode_sector_count(inode);
        di->i_size = cpu_to_le64((u64)i_size_read(inode));
 -      inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 +      inode->i_mtime = inode->i_ctime = current_time(inode);
        di->i_mtime = di->i_ctime = cpu_to_le64(inode->i_mtime.tv_sec);
        di->i_ctime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
        di->i_mtime_nsec = di->i_ctime_nsec;
@@@ -1506,7 -1506,8 +1506,8 @@@ static int ocfs2_zero_partial_clusters(
                                       u64 start, u64 len)
  {
        int ret = 0;
-       u64 tmpend, end = start + len;
+       u64 tmpend = 0;
+       u64 end = start + len;
        struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
        unsigned int csize = osb->s_clustersize;
        handle_t *handle;
        }
  
        /*
-        * We want to get the byte offset of the end of the 1st cluster.
+        * If start is on a cluster boundary and end is somewhere in another
+        * cluster, we have not COWed the cluster starting at start, unless
+        * end is also within the same cluster. So, in this case, we skip this
+        * first call to ocfs2_zero_range_for_truncate() truncate and move on
+        * to the next one.
         */
-       tmpend = (u64)osb->s_clustersize + (start & ~(osb->s_clustersize - 1));
-       if (tmpend > end)
-               tmpend = end;
+       if ((start & (csize - 1)) != 0) {
+               /*
+                * We want to get the byte offset of the end of the 1st
+                * cluster.
+                */
+               tmpend = (u64)osb->s_clustersize +
+                       (start & ~(osb->s_clustersize - 1));
+               if (tmpend > end)
+                       tmpend = end;
  
-       trace_ocfs2_zero_partial_clusters_range1((unsigned long long)start,
-                                                (unsigned long long)tmpend);
+               trace_ocfs2_zero_partial_clusters_range1(
+                       (unsigned long long)start,
+                       (unsigned long long)tmpend);
  
-       ret = ocfs2_zero_range_for_truncate(inode, handle, start, tmpend);
-       if (ret)
-               mlog_errno(ret);
+               ret = ocfs2_zero_range_for_truncate(inode, handle, start,
+                                                   tmpend);
+               if (ret)
+                       mlog_errno(ret);
+       }
  
        if (tmpend < end) {
                /*
@@@ -1936,7 -1950,7 +1950,7 @@@ static int __ocfs2_change_file_space(st
        if (change_size && i_size_read(inode) < size)
                i_size_write(inode, size);
  
 -      inode->i_ctime = inode->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = inode->i_mtime = current_time(inode);
        ret = ocfs2_mark_inode_dirty(handle, inode, di_bh);
        if (ret < 0)
                mlog_errno(ret);
diff --combined fs/ocfs2/namei.c
index e2747d8d05521844b24d82bc8272f8eda3878366,7fb6a7f023e7ed724810a10007d13824876d6c9f..0e0e387f2da3df478e720244f34f84ec90d6cfa9
@@@ -798,7 -798,7 +798,7 @@@ static int ocfs2_link(struct dentry *ol
        }
  
        inc_nlink(inode);
 -      inode->i_ctime = CURRENT_TIME;
 +      inode->i_ctime = current_time(inode);
        ocfs2_set_links_count(fe, inode->i_nlink);
        fe->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
        fe->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
@@@ -1000,7 -1000,7 +1000,7 @@@ static int ocfs2_unlink(struct inode *d
        ocfs2_set_links_count(fe, inode->i_nlink);
        ocfs2_journal_dirty(handle, fe_bh);
  
 -      dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        if (S_ISDIR(inode->i_mode))
                drop_nlink(dir);
  
@@@ -1203,7 -1203,8 +1203,8 @@@ static void ocfs2_double_unlock(struct 
  static int ocfs2_rename(struct inode *old_dir,
                        struct dentry *old_dentry,
                        struct inode *new_dir,
-                       struct dentry *new_dentry)
+                       struct dentry *new_dentry,
+                       unsigned int flags)
  {
        int status = 0, rename_lock = 0, parents_locked = 0, target_exists = 0;
        int old_child_locked = 0, new_child_locked = 0, update_dot_dot = 0;
        struct ocfs2_dir_lookup_result target_insert = { NULL, };
        bool should_add_orphan = false;
  
+       if (flags)
+               return -EINVAL;
        /* At some point it might be nice to break this function up a
         * bit. */
  
                                         new_dir_bh, &target_insert);
        }
  
 -      old_inode->i_ctime = CURRENT_TIME;
 +      old_inode->i_ctime = current_time(old_inode);
        mark_inode_dirty(old_inode);
  
        status = ocfs2_journal_access_di(handle, INODE_CACHE(old_inode),
  
        if (new_inode) {
                drop_nlink(new_inode);
 -              new_inode->i_ctime = CURRENT_TIME;
 +              new_inode->i_ctime = current_time(new_inode);
        }
 -      old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
 +      old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
  
        if (update_dot_dot) {
                status = ocfs2_update_entry(old_inode, handle,
diff --combined fs/omfs/dir.c
index 9a89164de1cc262e11fab488498573b2df791c55,e81f06be5e7bd2262f767e6c22ab0e70e62bb4d2..b7146526afff303543a2ab11ecd78ab2949f770d
@@@ -143,7 -143,7 +143,7 @@@ static int omfs_add_link(struct dentry 
        mark_buffer_dirty(bh);
        brelse(bh);
  
 -      dir->i_ctime = CURRENT_TIME_SEC;
 +      dir->i_ctime = current_time(dir);
  
        /* mark affected inodes dirty to rebuild checksums */
        mark_inode_dirty(dir);
@@@ -371,12 -371,16 +371,16 @@@ static bool omfs_fill_chain(struct inod
  }
  
  static int omfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-               struct inode *new_dir, struct dentry *new_dentry)
+                      struct inode *new_dir, struct dentry *new_dentry,
+                      unsigned int flags)
  {
        struct inode *new_inode = d_inode(new_dentry);
        struct inode *old_inode = d_inode(old_dentry);
        int err;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        if (new_inode) {
                /* overwriting existing file/dir */
                err = omfs_remove(new_dir, new_dentry);
        if (err)
                goto out;
  
 -      old_inode->i_ctime = CURRENT_TIME_SEC;
 +      old_inode->i_ctime = current_time(old_inode);
        mark_inode_dirty(old_inode);
  out:
        return err;
diff --combined fs/orangefs/namei.c
index e1ab955292311d544dfe649a52e6cd44a310371b,5f015c58bfa29efbe74f0c704c08d886b1d86096..0dfa868a6d037a286f8b68d97b0c5883bb2526a4
@@@ -81,7 -81,7 +81,7 @@@ static int orangefs_create(struct inod
                     dentry->d_name.name);
  
        SetMtimeFlag(parent);
 -      dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb);
 +      dir->i_mtime = dir->i_ctime = current_time(dir);
        mark_inode_dirty_sync(dir);
        ret = 0;
  out:
@@@ -254,7 -254,7 +254,7 @@@ static int orangefs_unlink(struct inod
                drop_nlink(inode);
  
                SetMtimeFlag(parent);
 -              dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb);
 +              dir->i_mtime = dir->i_ctime = current_time(dir);
                mark_inode_dirty_sync(dir);
        }
        return ret;
@@@ -331,7 -331,7 +331,7 @@@ static int orangefs_symlink(struct inod
                     dentry->d_name.name);
  
        SetMtimeFlag(parent);
 -      dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb);
 +      dir->i_mtime = dir->i_ctime = current_time(dir);
        mark_inode_dirty_sync(dir);
        ret = 0;
  out:
@@@ -399,7 -399,7 +399,7 @@@ static int orangefs_mkdir(struct inode 
         * across clients; keep constant at 1.
         */
        SetMtimeFlag(parent);
 -      dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb);
 +      dir->i_mtime = dir->i_ctime = current_time(dir);
        mark_inode_dirty_sync(dir);
  out:
        op_release(new_op);
  static int orangefs_rename(struct inode *old_dir,
                        struct dentry *old_dentry,
                        struct inode *new_dir,
-                       struct dentry *new_dentry)
+                       struct dentry *new_dentry,
+                       unsigned int flags)
  {
        struct orangefs_kernel_op_s *new_op;
        int ret;
  
+       if (flags)
+               return -EINVAL;
        gossip_debug(GOSSIP_NAME_DEBUG,
                     "orangefs_rename: called (%pd2 => %pd2) ct=%d\n",
                     old_dentry, new_dentry, d_count(new_dentry));
                     ret);
  
        if (new_dentry->d_inode)
 -              new_dentry->d_inode->i_ctime = CURRENT_TIME;
 +              new_dentry->d_inode->i_ctime = current_time(new_dentry->d_inode);
  
        op_release(new_op);
        return ret;
diff --combined fs/reiserfs/namei.c
index 968411930bd516467055ba6641f2c6d54db599f3,586260ed81c9e163b585e3a2f513f524c434be75..f9a0a2ba37830b9a34bf21a0e42ada262aad2804
@@@ -570,7 -570,7 +570,7 @@@ static int reiserfs_add_entry(struct re
        }
  
        dir->i_size += paste_size;
 -      dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
 +      dir->i_mtime = dir->i_ctime = current_time(dir);
        if (!S_ISDIR(inode->i_mode) && visible)
                /* reiserfs_mkdir or reiserfs_rename will do that by itself */
                reiserfs_update_sd(th, dir);
@@@ -963,7 -963,7 +963,7 @@@ static int reiserfs_rmdir(struct inode 
                               inode->i_nlink);
  
        clear_nlink(inode);
 -      inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
 +      inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(dir);
        reiserfs_update_sd(&th, inode);
  
        DEC_DIR_INODE_NLINK(dir)
@@@ -1067,11 -1067,11 +1067,11 @@@ static int reiserfs_unlink(struct inod
                inc_nlink(inode);
                goto end_unlink;
        }
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        reiserfs_update_sd(&th, inode);
  
        dir->i_size -= (de.de_entrylen + DEH_SIZE);
 -      dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        reiserfs_update_sd(&th, dir);
  
        if (!savelink)
@@@ -1246,7 -1246,7 +1246,7 @@@ static int reiserfs_link(struct dentry 
                return err ? err : retval;
        }
  
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        reiserfs_update_sd(&th, inode);
  
        ihold(inode);
@@@ -1306,7 -1306,8 +1306,8 @@@ static void set_ino_in_dir_entry(struc
   * get_empty_nodes or its clones
   */
  static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                          struct inode *new_dir, struct dentry *new_dentry)
+                          struct inode *new_dir, struct dentry *new_dentry,
+                          unsigned int flags)
  {
        int retval;
        INITIALIZE_PATH(old_entry_path);
        unsigned long savelink = 1;
        struct timespec ctime;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        /*
         * three balancings: (1) old name removal, (2) new name insertion
         * and (3) maybe "save" link insertion
  
        mark_de_hidden(old_de.de_deh + old_de.de_entry_num);
        journal_mark_dirty(&th, old_de.de_bh);
 -      ctime = CURRENT_TIME_SEC;
 +      ctime = current_time(old_dir);
        old_dir->i_ctime = old_dir->i_mtime = ctime;
        new_dir->i_ctime = new_dir->i_mtime = ctime;
        /*
diff --combined fs/sysv/namei.c
index ce66618721b2419dc1c8ef7b6811d19c1d3daec7,30bf6780985a06b3ce0ce03675f5502e82a475ec..d8817f13976357232a21a1ead9577c68b8c4b117
@@@ -120,7 -120,7 +120,7 @@@ static int sysv_link(struct dentry * ol
  {
        struct inode *inode = d_inode(old_dentry);
  
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        inode_inc_link_count(inode);
        ihold(inode);
  
@@@ -206,7 -206,8 +206,8 @@@ static int sysv_rmdir(struct inode * di
   * higher-level routines.
   */
  static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry,
-                 struct inode * new_dir, struct dentry * new_dentry)
+                      struct inode * new_dir, struct dentry * new_dentry,
+                      unsigned int flags)
  {
        struct inode * old_inode = d_inode(old_dentry);
        struct inode * new_inode = d_inode(new_dentry);
        struct sysv_dir_entry * old_de;
        int err = -ENOENT;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        old_de = sysv_find_entry(old_dentry, &old_page);
        if (!old_de)
                goto out;
                if (!new_de)
                        goto out_dir;
                sysv_set_link(new_de, new_page, old_inode);
 -              new_inode->i_ctime = CURRENT_TIME_SEC;
 +              new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
                inode_dec_link_count(new_inode);
diff --combined fs/udf/namei.c
index 61af3f1e1973a5c93dcc7bd7c13aaa202262ce76,17e9d4af301097a7a69dabdd1ad0f9249c25c1b2..2d65e280748bb99f2c9e494142c7cf78587148d7
@@@ -616,7 -616,7 +616,7 @@@ static int udf_add_nondir(struct dentr
        *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
                cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
        udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
 -      dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb);
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        mark_inode_dirty(dir);
        if (fibh.sbh != fibh.ebh)
                brelse(fibh.ebh);
@@@ -730,7 -730,7 +730,7 @@@ static int udf_mkdir(struct inode *dir
        cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY;
        udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
        inc_nlink(dir);
 -      dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb);
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        mark_inode_dirty(dir);
        unlock_new_inode(inode);
        d_instantiate(dentry, inode);
@@@ -845,7 -845,7 +845,7 @@@ static int udf_rmdir(struct inode *dir
        inode->i_size = 0;
        inode_dec_link_count(dir);
        inode->i_ctime = dir->i_ctime = dir->i_mtime =
 -                                              current_fs_time(dir->i_sb);
 +                                              current_time(inode);
        mark_inode_dirty(dir);
  
  end_rmdir:
@@@ -888,7 -888,7 +888,7 @@@ static int udf_unlink(struct inode *dir
        retval = udf_delete_entry(dir, fi, &fibh, &cfi);
        if (retval)
                goto end_unlink;
 -      dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb);
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        mark_inode_dirty(dir);
        inode_dec_link_count(inode);
        inode->i_ctime = dir->i_ctime;
@@@ -1079,9 -1079,9 +1079,9 @@@ static int udf_link(struct dentry *old_
                brelse(fibh.ebh);
        brelse(fibh.sbh);
        inc_nlink(inode);
 -      inode->i_ctime = current_fs_time(inode->i_sb);
 +      inode->i_ctime = current_time(inode);
        mark_inode_dirty(inode);
 -      dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb);
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        mark_inode_dirty(dir);
        ihold(inode);
        d_instantiate(dentry, inode);
   * higher-level routines.
   */
  static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
-                     struct inode *new_dir, struct dentry *new_dentry)
+                     struct inode *new_dir, struct dentry *new_dentry,
+                     unsigned int flags)
  {
        struct inode *old_inode = d_inode(old_dentry);
        struct inode *new_inode = d_inode(new_dentry);
        struct kernel_lb_addr tloc;
        struct udf_inode_info *old_iinfo = UDF_I(old_inode);
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
        if (IS_ERR(ofi)) {
                retval = PTR_ERR(ofi);
         * Like most other Unix systems, set the ctime for inodes on a
         * rename.
         */
 -      old_inode->i_ctime = current_fs_time(old_inode->i_sb);
 +      old_inode->i_ctime = current_time(old_inode);
        mark_inode_dirty(old_inode);
  
        /*
        udf_delete_entry(old_dir, ofi, &ofibh, &ocfi);
  
        if (new_inode) {
 -              new_inode->i_ctime = current_fs_time(new_inode->i_sb);
 +              new_inode->i_ctime = current_time(new_inode);
                inode_dec_link_count(new_inode);
        }
 -      old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb);
 -      new_dir->i_ctime = new_dir->i_mtime = current_fs_time(new_dir->i_sb);
 +      old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
 +      new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir);
        mark_inode_dirty(old_dir);
        mark_inode_dirty(new_dir);
  
diff --combined fs/ufs/namei.c
index e3b263998130879fd49a4a81f338be16d44b25ac,f2f11c382b6d40514320edb38e756c47a44c0b63..8eca4eda8450a1bec00f80ea30964ea5c51f8286
@@@ -153,7 -153,7 +153,7 @@@ static int ufs_link (struct dentry * ol
        struct inode *inode = d_inode(old_dentry);
        int error;
  
 -      inode->i_ctime = CURRENT_TIME_SEC;
 +      inode->i_ctime = current_time(inode);
        inode_inc_link_count(inode);
        ihold(inode);
  
@@@ -245,7 -245,8 +245,8 @@@ static int ufs_rmdir (struct inode * di
  }
  
  static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                     struct inode *new_dir, struct dentry *new_dentry)
+                     struct inode *new_dir, struct dentry *new_dentry,
+                     unsigned int flags)
  {
        struct inode *old_inode = d_inode(old_dentry);
        struct inode *new_inode = d_inode(new_dentry);
        struct ufs_dir_entry *old_de;
        int err = -ENOENT;
  
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
        old_de = ufs_find_entry(old_dir, &old_dentry->d_name, &old_page);
        if (!old_de)
                goto out;
                if (!new_de)
                        goto out_dir;
                ufs_set_link(new_dir, new_de, new_page, old_inode, 1);
 -              new_inode->i_ctime = CURRENT_TIME_SEC;
 +              new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
                inode_dec_link_count(new_inode);
         * Like most other Unix systems, set the ctime for inodes on a
         * rename.
         */
 -      old_inode->i_ctime = CURRENT_TIME_SEC;
 +      old_inode->i_ctime = current_time(old_inode);
  
        ufs_delete_entry(old_dir, old_de, old_page);
        mark_inode_dirty(old_inode);
diff --combined fs/xfs/xfs_iops.c
index 08c33f7fbe496895f9aefc420ff6beba3de30f0f,a66c781e5468176ff12808602c9c937b472137a1..d8ac28656ac2c58a6ddf99e564fa23f6fb2786fd
@@@ -882,7 -882,7 +882,7 @@@ xfs_setattr_size
        if (newsize != oldsize &&
            !(iattr->ia_valid & (ATTR_CTIME | ATTR_MTIME))) {
                iattr->ia_ctime = iattr->ia_mtime =
 -                      current_fs_time(inode->i_sb);
 +                      current_time(inode);
                iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME;
        }
  
@@@ -1059,7 -1059,7 +1059,7 @@@ static const struct inode_operations xf
         */
        .rmdir                  = xfs_vn_unlink,
        .mknod                  = xfs_vn_mknod,
-       .rename2                = xfs_vn_rename,
+       .rename                 = xfs_vn_rename,
        .get_acl                = xfs_get_acl,
        .set_acl                = xfs_set_acl,
        .getattr                = xfs_vn_getattr,
@@@ -1087,7 -1087,7 +1087,7 @@@ static const struct inode_operations xf
         */
        .rmdir                  = xfs_vn_unlink,
        .mknod                  = xfs_vn_mknod,
-       .rename2                = xfs_vn_rename,
+       .rename                 = xfs_vn_rename,
        .get_acl                = xfs_get_acl,
        .set_acl                = xfs_set_acl,
        .getattr                = xfs_vn_getattr,
diff --combined include/linux/fs.h
index 32ce6b31a61bbff35af71be6233c425f812e4be8,cf7e621f7413aa4a38bcbed8f57b6d7a24a97cf0..17d5a3507d0e131743e8125601167da6d71ea823
@@@ -1459,7 -1459,6 +1459,7 @@@ static inline void i_gid_write(struct i
  }
  
  extern struct timespec current_fs_time(struct super_block *sb);
 +extern struct timespec current_time(struct inode *inode);
  
  /*
   * Snapshotting support.
@@@ -1734,8 -1733,6 +1734,6 @@@ struct inode_operations 
        int (*rmdir) (struct inode *,struct dentry *);
        int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
        int (*rename) (struct inode *, struct dentry *,
-                       struct inode *, struct dentry *);
-       int (*rename2) (struct inode *, struct dentry *,
                        struct inode *, struct dentry *, unsigned int);
        int (*setattr) (struct dentry *, struct iattr *);
        int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
@@@ -2951,7 -2948,8 +2949,8 @@@ extern int simple_open(struct inode *in
  extern int simple_link(struct dentry *, struct inode *, struct dentry *);
  extern int simple_unlink(struct inode *, struct dentry *);
  extern int simple_rmdir(struct inode *, struct dentry *);
- extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
+ extern int simple_rename(struct inode *, struct dentry *,
+                        struct inode *, struct dentry *, unsigned int);
  extern int noop_fsync(struct file *, loff_t, loff_t, int);
  extern int simple_empty(struct dentry *);
  extern int simple_readpage(struct file *file, struct page *page);
diff --combined mm/shmem.c
index 28ae88bbeffaa66f2ca597bb5aa70ea124e88008,efbef23366051ae90f9a056871b08f24a2cfa020..e7e8f8c210c101e04cb00976f1db3a110cf87eaf
@@@ -270,7 -270,7 +270,7 @@@ bool shmem_charge(struct inode *inode, 
                info->alloced -= pages;
                shmem_recalc_inode(inode);
                spin_unlock_irqrestore(&info->lock, flags);
+               shmem_unacct_blocks(info->flags, pages);
                return false;
        }
        percpu_counter_add(&sbinfo->used_blocks, pages);
@@@ -291,6 -291,7 +291,7 @@@ void shmem_uncharge(struct inode *inode
  
        if (sbinfo->max_blocks)
                percpu_counter_sub(&sbinfo->used_blocks, pages);
+       shmem_unacct_blocks(info->flags, pages);
  }
  
  /*
@@@ -933,7 -934,7 +934,7 @@@ static void shmem_undo_range(struct ino
  void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend)
  {
        shmem_undo_range(inode, lstart, lend, false);
 -      inode->i_ctime = inode->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = inode->i_mtime = current_time(inode);
  }
  EXPORT_SYMBOL_GPL(shmem_truncate_range);
  
@@@ -978,7 -979,7 +979,7 @@@ static int shmem_setattr(struct dentry 
                        if (error)
                                return error;
                        i_size_write(inode, newsize);
 -                      inode->i_ctime = inode->i_mtime = CURRENT_TIME;
 +                      inode->i_ctime = inode->i_mtime = current_time(inode);
                }
                if (newsize <= oldsize) {
                        loff_t holebegin = round_up(newsize, PAGE_SIZE);
@@@ -1980,7 -1981,7 +1981,7 @@@ unsigned long shmem_get_unmapped_area(s
                                return addr;
                        sb = shm_mnt->mnt_sb;
                }
-               if (SHMEM_SB(sb)->huge != SHMEM_HUGE_NEVER)
+               if (SHMEM_SB(sb)->huge == SHMEM_HUGE_NEVER)
                        return addr;
        }
  
@@@ -2082,7 -2083,7 +2083,7 @@@ static struct inode *shmem_get_inode(st
                inode->i_ino = get_next_ino();
                inode_init_owner(inode, dir, mode);
                inode->i_blocks = 0;
 -              inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 +              inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
                inode->i_generation = get_seconds();
                info = SHMEM_I(inode);
                memset(info, 0, (char *)inode - (char *)info);
@@@ -2853,7 -2854,7 +2854,7 @@@ static long shmem_fallocate(struct fil
  
        if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > inode->i_size)
                i_size_write(inode, offset + len);
 -      inode->i_ctime = CURRENT_TIME;
 +      inode->i_ctime = current_time(inode);
  undone:
        spin_lock(&inode->i_lock);
        inode->i_private = NULL;
@@@ -2906,7 -2907,7 +2907,7 @@@ shmem_mknod(struct inode *dir, struct d
  
                error = 0;
                dir->i_size += BOGO_DIRENT_SIZE;
 -              dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +              dir->i_ctime = dir->i_mtime = current_time(dir);
                d_instantiate(dentry, inode);
                dget(dentry); /* Extra count - pin the dentry in core */
        }
@@@ -2974,7 -2975,7 +2975,7 @@@ static int shmem_link(struct dentry *ol
                goto out;
  
        dir->i_size += BOGO_DIRENT_SIZE;
 -      inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
        inc_nlink(inode);
        ihold(inode);   /* New dentry reference */
        dget(dentry);           /* Extra pinning count for the created dentry */
@@@ -2991,7 -2992,7 +2992,7 @@@ static int shmem_unlink(struct inode *d
                shmem_free_inode(inode->i_sb);
  
        dir->i_size -= BOGO_DIRENT_SIZE;
 -      inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
        drop_nlink(inode);
        dput(dentry);   /* Undo the count from "create" - this does all the work */
        return 0;
@@@ -3024,7 -3025,7 +3025,7 @@@ static int shmem_exchange(struct inode 
        old_dir->i_ctime = old_dir->i_mtime =
        new_dir->i_ctime = new_dir->i_mtime =
        d_inode(old_dentry)->i_ctime =
 -      d_inode(new_dentry)->i_ctime = CURRENT_TIME;
 +      d_inode(new_dentry)->i_ctime = current_time(old_dir);
  
        return 0;
  }
@@@ -3098,7 -3099,7 +3099,7 @@@ static int shmem_rename2(struct inode *
        new_dir->i_size += BOGO_DIRENT_SIZE;
        old_dir->i_ctime = old_dir->i_mtime =
        new_dir->i_ctime = new_dir->i_mtime =
 -      inode->i_ctime = CURRENT_TIME;
 +      inode->i_ctime = current_time(old_dir);
        return 0;
  }
  
@@@ -3153,7 -3154,7 +3154,7 @@@ static int shmem_symlink(struct inode *
                put_page(page);
        }
        dir->i_size += BOGO_DIRENT_SIZE;
 -      dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 +      dir->i_ctime = dir->i_mtime = current_time(dir);
        d_instantiate(dentry, inode);
        dget(dentry);
        return 0;
@@@ -3813,7 -3814,7 +3814,7 @@@ static const struct inode_operations sh
        .mkdir          = shmem_mkdir,
        .rmdir          = shmem_rmdir,
        .mknod          = shmem_mknod,
-       .rename2        = shmem_rename2,
+       .rename         = shmem_rename2,
        .tmpfile        = shmem_tmpfile,
  #endif
  #ifdef CONFIG_TMPFS_XATTR