Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'cross-rename' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs

Pull renameat2 system call from Miklos Szeredi:
"This adds a new syscall, renameat2(), which is the same as renameat()
but with a flags argument.

The purpose of extending rename is to add cross-rename, a symmetric
variant of rename, which exchanges the two files. This allows
interesting things, which were not possible before, for example
atomically replacing a directory tree with a symlink, etc... This
also allows overlayfs and friends to operate on whiteouts atomically.

Andy Lutomirski also suggested a "noreplace" flag, which disables the
overwriting behavior of rename.

These two flags, RENAME_EXCHANGE and RENAME_NOREPLACE are only
implemented for ext4 as an example and for testing"

* 'cross-rename' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs:
ext4: add cross rename support
ext4: rename: split out helper functions
ext4: rename: move EMLINK check up
ext4: rename: create ext4_renament structure for local vars
vfs: add cross-rename
vfs: lock_two_nondirectories: allow directory args
security: add flags to rename hooks
vfs: add RENAME_NOREPLACE flag
vfs: add renameat2 syscall
vfs: rename: use common code for dir and non-dir
vfs: rename: move d_move() up
vfs: add d_is_dir()

+660 -330
+5 -1
Documentation/filesystems/Locking
··· 47 47 int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t); 48 48 int (*rename) (struct inode *, struct dentry *, 49 49 struct inode *, struct dentry *); 50 + int (*rename2) (struct inode *, struct dentry *, 51 + struct inode *, struct dentry *, unsigned int); 50 52 int (*readlink) (struct dentry *, char __user *,int); 51 53 void * (*follow_link) (struct dentry *, struct nameidata *); 52 54 void (*put_link) (struct dentry *, struct nameidata *, void *); ··· 80 78 unlink: yes (both) 81 79 rmdir: yes (both) (see below) 82 80 rename: yes (all) (see below) 81 + rename2: yes (all) (see below) 83 82 readlink: no 84 83 follow_link: no 85 84 put_link: no ··· 99 96 100 97 Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on 101 98 victim. 102 - cross-directory ->rename() has (per-superblock) ->s_vfs_rename_sem. 99 + cross-directory ->rename() and rename2() has (per-superblock) 100 + ->s_vfs_rename_sem. 103 101 104 102 See Documentation/filesystems/directory-locking for more detailed discussion 105 103 of the locking scheme for directory operations.
+16
Documentation/filesystems/vfs.txt
··· 347 347 int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t); 348 348 int (*rename) (struct inode *, struct dentry *, 349 349 struct inode *, struct dentry *); 350 + int (*rename2) (struct inode *, struct dentry *, 351 + struct inode *, struct dentry *, unsigned int); 350 352 int (*readlink) (struct dentry *, char __user *,int); 351 353 void * (*follow_link) (struct dentry *, struct nameidata *); 352 354 void (*put_link) (struct dentry *, struct nameidata *, void *); ··· 415 413 416 414 rename: called by the rename(2) system call to rename the object to 417 415 have the parent and name given by the second inode and dentry. 416 + 417 + rename2: this has an additional flags argument compared to rename. 418 + If no flags are supported by the filesystem then this method 419 + need not be implemented. If some flags are supported then the 420 + filesystem must return -EINVAL for any unsupported or unknown 421 + flags. Currently the following flags are implemented: 422 + (1) RENAME_NOREPLACE: this flag indicates that if the target 423 + of the rename exists the rename should fail with -EEXIST 424 + instead of replacing the target. The VFS already checks for 425 + existence, so for local filesystems the RENAME_NOREPLACE 426 + implementation is equivalent to plain rename. 427 + (2) RENAME_EXCHANGE: exchange source and target. Both must 428 + exist; this is checked by the VFS. Unlike plain rename, 429 + source and target may be of different type. 418 430 419 431 readlink: called by the readlink(2) system call. Only required if 420 432 you want to support reading symbolic links
+1
arch/x86/syscalls/syscall_64.tbl
··· 322 322 313 common finit_module sys_finit_module 323 323 314 common sched_setattr sys_sched_setattr 324 324 315 common sched_getattr sys_sched_getattr 325 + 316 common renameat2 sys_renameat2 325 326 326 327 # 327 328 # x32-specific system call numbers start at 512 to avoid cache impact
+2 -2
drivers/staging/lustre/lustre/include/linux/lustre_compat25.h
··· 105 105 #define ll_vfs_unlink(inode,entry,mnt) vfs_unlink(inode,entry) 106 106 #define ll_vfs_mknod(dir,entry,mnt,mode,dev) vfs_mknod(dir,entry,mode,dev) 107 107 #define ll_security_inode_unlink(dir,entry,mnt) security_inode_unlink(dir,entry) 108 - #define ll_vfs_rename(old,old_dir,mnt,new,new_dir,mnt1,delegated_inode) \ 109 - vfs_rename(old,old_dir,new,new_dir,delegated_inode) 108 + #define ll_vfs_rename(old, old_dir, mnt, new, new_dir, mnt1) \ 109 + vfs_rename(old, old_dir, new, new_dir, NULL, 0) 110 110 111 111 #define cfs_bio_io_error(a,b) bio_io_error((a)) 112 112 #define cfs_bio_endio(a,b,c) bio_endio((a),(c))
+1 -1
drivers/staging/lustre/lustre/lvfs/lvfs_linux.c
··· 223 223 GOTO(put_old, err = PTR_ERR(dchild_new)); 224 224 225 225 err = ll_vfs_rename(dir->d_inode, dchild_old, mnt, 226 - dir->d_inode, dchild_new, mnt, NULL); 226 + dir->d_inode, dchild_new, mnt); 227 227 228 228 dput(dchild_new); 229 229 put_old:
+2 -2
fs/cachefiles/namei.c
··· 391 391 path.dentry = dir; 392 392 path_to_graveyard.mnt = cache->mnt; 393 393 path_to_graveyard.dentry = cache->graveyard; 394 - ret = security_path_rename(&path, rep, &path_to_graveyard, grave); 394 + ret = security_path_rename(&path, rep, &path_to_graveyard, grave, 0); 395 395 if (ret < 0) { 396 396 cachefiles_io_error(cache, "Rename security error %d", ret); 397 397 } else { 398 398 ret = vfs_rename(dir->d_inode, rep, 399 - cache->graveyard->d_inode, grave, NULL); 399 + cache->graveyard->d_inode, grave, NULL, 0); 400 400 if (ret != 0 && ret != -ENOMEM) 401 401 cachefiles_io_error(cache, 402 402 "Rename failed with error %d", ret);
+41 -9
fs/dcache.c
··· 2483 2483 dentry->d_name.name = dentry->d_iname; 2484 2484 } else { 2485 2485 /* 2486 - * Both are internal. Just copy target to dentry 2486 + * Both are internal. 2487 2487 */ 2488 - memcpy(dentry->d_iname, target->d_name.name, 2489 - target->d_name.len + 1); 2490 - dentry->d_name.len = target->d_name.len; 2491 - return; 2488 + unsigned int i; 2489 + BUILD_BUG_ON(!IS_ALIGNED(DNAME_INLINE_LEN, sizeof(long))); 2490 + for (i = 0; i < DNAME_INLINE_LEN / sizeof(long); i++) { 2491 + swap(((long *) &dentry->d_iname)[i], 2492 + ((long *) &target->d_iname)[i]); 2493 + } 2492 2494 } 2493 2495 } 2494 2496 swap(dentry->d_name.len, target->d_name.len); ··· 2547 2545 * __d_move - move a dentry 2548 2546 * @dentry: entry to move 2549 2547 * @target: new dentry 2548 + * @exchange: exchange the two dentries 2550 2549 * 2551 2550 * Update the dcache to reflect the move of a file name. Negative 2552 2551 * dcache entries should not be moved in this way. Caller must hold 2553 2552 * rename_lock, the i_mutex of the source and target directories, 2554 2553 * and the sb->s_vfs_rename_mutex if they differ. See lock_rename(). 2555 2554 */ 2556 - static void __d_move(struct dentry * dentry, struct dentry * target) 2555 + static void __d_move(struct dentry *dentry, struct dentry *target, 2556 + bool exchange) 2557 2557 { 2558 2558 if (!dentry->d_inode) 2559 2559 printk(KERN_WARNING "VFS: moving negative dcache entry\n"); ··· 2577 2573 __d_drop(dentry); 2578 2574 __d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash)); 2579 2575 2580 - /* Unhash the target: dput() will then get rid of it */ 2576 + /* 2577 + * Unhash the target (d_delete() is not usable here). If exchanging 2578 + * the two dentries, then rehash onto the other's hash queue. 2579 + */ 2581 2580 __d_drop(target); 2581 + if (exchange) { 2582 + __d_rehash(target, 2583 + d_hash(dentry->d_parent, dentry->d_name.hash)); 2584 + } 2582 2585 2583 2586 list_del(&dentry->d_u.d_child); 2584 2587 list_del(&target->d_u.d_child); ··· 2612 2601 write_seqcount_end(&dentry->d_seq); 2613 2602 2614 2603 dentry_unlock_parents_for_move(dentry, target); 2604 + if (exchange) 2605 + fsnotify_d_move(target); 2615 2606 spin_unlock(&target->d_lock); 2616 2607 fsnotify_d_move(dentry); 2617 2608 spin_unlock(&dentry->d_lock); ··· 2631 2618 void d_move(struct dentry *dentry, struct dentry *target) 2632 2619 { 2633 2620 write_seqlock(&rename_lock); 2634 - __d_move(dentry, target); 2621 + __d_move(dentry, target, false); 2635 2622 write_sequnlock(&rename_lock); 2636 2623 } 2637 2624 EXPORT_SYMBOL(d_move); 2625 + 2626 + /* 2627 + * d_exchange - exchange two dentries 2628 + * @dentry1: first dentry 2629 + * @dentry2: second dentry 2630 + */ 2631 + void d_exchange(struct dentry *dentry1, struct dentry *dentry2) 2632 + { 2633 + write_seqlock(&rename_lock); 2634 + 2635 + WARN_ON(!dentry1->d_inode); 2636 + WARN_ON(!dentry2->d_inode); 2637 + WARN_ON(IS_ROOT(dentry1)); 2638 + WARN_ON(IS_ROOT(dentry2)); 2639 + 2640 + __d_move(dentry1, dentry2, true); 2641 + 2642 + write_sequnlock(&rename_lock); 2643 + } 2638 2644 2639 2645 /** 2640 2646 * d_ancestor - search for an ancestor ··· 2702 2670 m2 = &alias->d_parent->d_inode->i_mutex; 2703 2671 out_unalias: 2704 2672 if (likely(!d_mountpoint(alias))) { 2705 - __d_move(alias, dentry); 2673 + __d_move(alias, dentry, false); 2706 2674 ret = alias; 2707 2675 } 2708 2676 out_err:
+1 -1
fs/ecryptfs/inode.c
··· 641 641 } 642 642 rc = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry, 643 643 lower_new_dir_dentry->d_inode, lower_new_dentry, 644 - NULL); 644 + NULL, 0); 645 645 if (rc) 646 646 goto out_lock; 647 647 if (target_inode)
+348 -130
fs/ext4/namei.c
··· 3000 3000 return ext4_get_first_inline_block(inode, parent_de, retval); 3001 3001 } 3002 3002 3003 + struct ext4_renament { 3004 + struct inode *dir; 3005 + struct dentry *dentry; 3006 + struct inode *inode; 3007 + bool is_dir; 3008 + int dir_nlink_delta; 3009 + 3010 + /* entry for "dentry" */ 3011 + struct buffer_head *bh; 3012 + struct ext4_dir_entry_2 *de; 3013 + int inlined; 3014 + 3015 + /* entry for ".." in inode if it's a directory */ 3016 + struct buffer_head *dir_bh; 3017 + struct ext4_dir_entry_2 *parent_de; 3018 + int dir_inlined; 3019 + }; 3020 + 3021 + static int ext4_rename_dir_prepare(handle_t *handle, struct ext4_renament *ent) 3022 + { 3023 + int retval; 3024 + 3025 + ent->dir_bh = ext4_get_first_dir_block(handle, ent->inode, 3026 + &retval, &ent->parent_de, 3027 + &ent->dir_inlined); 3028 + if (!ent->dir_bh) 3029 + return retval; 3030 + if (le32_to_cpu(ent->parent_de->inode) != ent->dir->i_ino) 3031 + return -EIO; 3032 + BUFFER_TRACE(ent->dir_bh, "get_write_access"); 3033 + return ext4_journal_get_write_access(handle, ent->dir_bh); 3034 + } 3035 + 3036 + static int ext4_rename_dir_finish(handle_t *handle, struct ext4_renament *ent, 3037 + unsigned dir_ino) 3038 + { 3039 + int retval; 3040 + 3041 + ent->parent_de->inode = cpu_to_le32(dir_ino); 3042 + BUFFER_TRACE(ent->dir_bh, "call ext4_handle_dirty_metadata"); 3043 + if (!ent->dir_inlined) { 3044 + if (is_dx(ent->inode)) { 3045 + retval = ext4_handle_dirty_dx_node(handle, 3046 + ent->inode, 3047 + ent->dir_bh); 3048 + } else { 3049 + retval = ext4_handle_dirty_dirent_node(handle, 3050 + ent->inode, 3051 + ent->dir_bh); 3052 + } 3053 + } else { 3054 + retval = ext4_mark_inode_dirty(handle, ent->inode); 3055 + } 3056 + if (retval) { 3057 + ext4_std_error(ent->dir->i_sb, retval); 3058 + return retval; 3059 + } 3060 + return 0; 3061 + } 3062 + 3063 + static int ext4_setent(handle_t *handle, struct ext4_renament *ent, 3064 + unsigned ino, unsigned file_type) 3065 + { 3066 + int retval; 3067 + 3068 + BUFFER_TRACE(ent->bh, "get write access"); 3069 + retval = ext4_journal_get_write_access(handle, ent->bh); 3070 + if (retval) 3071 + return retval; 3072 + ent->de->inode = cpu_to_le32(ino); 3073 + if (EXT4_HAS_INCOMPAT_FEATURE(ent->dir->i_sb, 3074 + EXT4_FEATURE_INCOMPAT_FILETYPE)) 3075 + ent->de->file_type = file_type; 3076 + ent->dir->i_version++; 3077 + ent->dir->i_ctime = ent->dir->i_mtime = 3078 + ext4_current_time(ent->dir); 3079 + ext4_mark_inode_dirty(handle, ent->dir); 3080 + BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata"); 3081 + if (!ent->inlined) { 3082 + retval = ext4_handle_dirty_dirent_node(handle, 3083 + ent->dir, ent->bh); 3084 + if (unlikely(retval)) { 3085 + ext4_std_error(ent->dir->i_sb, retval); 3086 + return retval; 3087 + } 3088 + } 3089 + brelse(ent->bh); 3090 + ent->bh = NULL; 3091 + 3092 + return 0; 3093 + } 3094 + 3095 + static int ext4_find_delete_entry(handle_t *handle, struct inode *dir, 3096 + const struct qstr *d_name) 3097 + { 3098 + int retval = -ENOENT; 3099 + struct buffer_head *bh; 3100 + struct ext4_dir_entry_2 *de; 3101 + 3102 + bh = ext4_find_entry(dir, d_name, &de, NULL); 3103 + if (bh) { 3104 + retval = ext4_delete_entry(handle, dir, de, bh); 3105 + brelse(bh); 3106 + } 3107 + return retval; 3108 + } 3109 + 3110 + static void ext4_rename_delete(handle_t *handle, struct ext4_renament *ent) 3111 + { 3112 + int retval; 3113 + /* 3114 + * ent->de could have moved from under us during htree split, so make 3115 + * sure that we are deleting the right entry. We might also be pointing 3116 + * to a stale entry in the unused part of ent->bh so just checking inum 3117 + * and the name isn't enough. 3118 + */ 3119 + if (le32_to_cpu(ent->de->inode) != ent->inode->i_ino || 3120 + ent->de->name_len != ent->dentry->d_name.len || 3121 + strncmp(ent->de->name, ent->dentry->d_name.name, 3122 + ent->de->name_len)) { 3123 + retval = ext4_find_delete_entry(handle, ent->dir, 3124 + &ent->dentry->d_name); 3125 + } else { 3126 + retval = ext4_delete_entry(handle, ent->dir, ent->de, ent->bh); 3127 + if (retval == -ENOENT) { 3128 + retval = ext4_find_delete_entry(handle, ent->dir, 3129 + &ent->dentry->d_name); 3130 + } 3131 + } 3132 + 3133 + if (retval) { 3134 + ext4_warning(ent->dir->i_sb, 3135 + "Deleting old file (%lu), %d, error=%d", 3136 + ent->dir->i_ino, ent->dir->i_nlink, retval); 3137 + } 3138 + } 3139 + 3140 + static void ext4_update_dir_count(handle_t *handle, struct ext4_renament *ent) 3141 + { 3142 + if (ent->dir_nlink_delta) { 3143 + if (ent->dir_nlink_delta == -1) 3144 + ext4_dec_count(handle, ent->dir); 3145 + else 3146 + ext4_inc_count(handle, ent->dir); 3147 + ext4_mark_inode_dirty(handle, ent->dir); 3148 + } 3149 + } 3150 + 3003 3151 /* 3004 3152 * Anybody can rename anything with this: the permission checks are left to the 3005 3153 * higher-level routines. ··· 3160 3012 struct inode *new_dir, struct dentry *new_dentry) 3161 3013 { 3162 3014 handle_t *handle = NULL; 3163 - struct inode *old_inode, *new_inode; 3164 - struct buffer_head *old_bh, *new_bh, *dir_bh; 3165 - struct ext4_dir_entry_2 *old_de, *new_de; 3015 + struct ext4_renament old = { 3016 + .dir = old_dir, 3017 + .dentry = old_dentry, 3018 + .inode = old_dentry->d_inode, 3019 + }; 3020 + struct ext4_renament new = { 3021 + .dir = new_dir, 3022 + .dentry = new_dentry, 3023 + .inode = new_dentry->d_inode, 3024 + }; 3166 3025 int retval; 3167 - int inlined = 0, new_inlined = 0; 3168 - struct ext4_dir_entry_2 *parent_de; 3169 3026 3170 - dquot_initialize(old_dir); 3171 - dquot_initialize(new_dir); 3172 - 3173 - old_bh = new_bh = dir_bh = NULL; 3027 + dquot_initialize(old.dir); 3028 + dquot_initialize(new.dir); 3174 3029 3175 3030 /* Initialize quotas before so that eventual writes go 3176 3031 * in separate transaction */ 3177 - if (new_dentry->d_inode) 3178 - dquot_initialize(new_dentry->d_inode); 3032 + if (new.inode) 3033 + dquot_initialize(new.inode); 3179 3034 3180 - old_bh = ext4_find_entry(old_dir, &old_dentry->d_name, &old_de, NULL); 3035 + old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de, NULL); 3181 3036 /* 3182 3037 * Check for inode number is _not_ due to possible IO errors. 3183 3038 * We might rmdir the source, keep it as pwd of some process 3184 3039 * and merrily kill the link to whatever was created under the 3185 3040 * same name. Goodbye sticky bit ;-< 3186 3041 */ 3187 - old_inode = old_dentry->d_inode; 3188 3042 retval = -ENOENT; 3189 - if (!old_bh || le32_to_cpu(old_de->inode) != old_inode->i_ino) 3043 + if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) 3190 3044 goto end_rename; 3191 3045 3192 - new_inode = new_dentry->d_inode; 3193 - new_bh = ext4_find_entry(new_dir, &new_dentry->d_name, 3194 - &new_de, &new_inlined); 3195 - if (new_bh) { 3196 - if (!new_inode) { 3197 - brelse(new_bh); 3198 - new_bh = NULL; 3046 + new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, 3047 + &new.de, &new.inlined); 3048 + if (new.bh) { 3049 + if (!new.inode) { 3050 + brelse(new.bh); 3051 + new.bh = NULL; 3199 3052 } 3200 3053 } 3201 - if (new_inode && !test_opt(new_dir->i_sb, NO_AUTO_DA_ALLOC)) 3202 - ext4_alloc_da_blocks(old_inode); 3054 + if (new.inode && !test_opt(new.dir->i_sb, NO_AUTO_DA_ALLOC)) 3055 + ext4_alloc_da_blocks(old.inode); 3203 3056 3204 - handle = ext4_journal_start(old_dir, EXT4_HT_DIR, 3205 - (2 * EXT4_DATA_TRANS_BLOCKS(old_dir->i_sb) + 3057 + handle = ext4_journal_start(old.dir, EXT4_HT_DIR, 3058 + (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) + 3206 3059 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2)); 3207 3060 if (IS_ERR(handle)) 3208 3061 return PTR_ERR(handle); 3209 3062 3210 - if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir)) 3063 + if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir)) 3211 3064 ext4_handle_sync(handle); 3212 3065 3213 - if (S_ISDIR(old_inode->i_mode)) { 3214 - if (new_inode) { 3066 + if (S_ISDIR(old.inode->i_mode)) { 3067 + if (new.inode) { 3215 3068 retval = -ENOTEMPTY; 3216 - if (!empty_dir(new_inode)) 3069 + if (!empty_dir(new.inode)) 3070 + goto end_rename; 3071 + } else { 3072 + retval = -EMLINK; 3073 + if (new.dir != old.dir && EXT4_DIR_LINK_MAX(new.dir)) 3217 3074 goto end_rename; 3218 3075 } 3219 - retval = -EIO; 3220 - dir_bh = ext4_get_first_dir_block(handle, old_inode, 3221 - &retval, &parent_de, 3222 - &inlined); 3223 - if (!dir_bh) 3224 - goto end_rename; 3225 - if (le32_to_cpu(parent_de->inode) != old_dir->i_ino) 3226 - goto end_rename; 3227 - retval = -EMLINK; 3228 - if (!new_inode && new_dir != old_dir && 3229 - EXT4_DIR_LINK_MAX(new_dir)) 3230 - goto end_rename; 3231 - BUFFER_TRACE(dir_bh, "get_write_access"); 3232 - retval = ext4_journal_get_write_access(handle, dir_bh); 3076 + retval = ext4_rename_dir_prepare(handle, &old); 3233 3077 if (retval) 3234 3078 goto end_rename; 3235 3079 } 3236 - if (!new_bh) { 3237 - retval = ext4_add_entry(handle, new_dentry, old_inode); 3080 + if (!new.bh) { 3081 + retval = ext4_add_entry(handle, new.dentry, old.inode); 3238 3082 if (retval) 3239 3083 goto end_rename; 3240 3084 } else { 3241 - BUFFER_TRACE(new_bh, "get write access"); 3242 - retval = ext4_journal_get_write_access(handle, new_bh); 3085 + retval = ext4_setent(handle, &new, 3086 + old.inode->i_ino, old.de->file_type); 3243 3087 if (retval) 3244 3088 goto end_rename; 3245 - new_de->inode = cpu_to_le32(old_inode->i_ino); 3246 - if (EXT4_HAS_INCOMPAT_FEATURE(new_dir->i_sb, 3247 - EXT4_FEATURE_INCOMPAT_FILETYPE)) 3248 - new_de->file_type = old_de->file_type; 3249 - new_dir->i_version++; 3250 - new_dir->i_ctime = new_dir->i_mtime = 3251 - ext4_current_time(new_dir); 3252 - ext4_mark_inode_dirty(handle, new_dir); 3253 - BUFFER_TRACE(new_bh, "call ext4_handle_dirty_metadata"); 3254 - if (!new_inlined) { 3255 - retval = ext4_handle_dirty_dirent_node(handle, 3256 - new_dir, new_bh); 3257 - if (unlikely(retval)) { 3258 - ext4_std_error(new_dir->i_sb, retval); 3259 - goto end_rename; 3260 - } 3261 - } 3262 - brelse(new_bh); 3263 - new_bh = NULL; 3264 3089 } 3265 3090 3266 3091 /* 3267 3092 * Like most other Unix systems, set the ctime for inodes on a 3268 3093 * rename. 3269 3094 */ 3270 - old_inode->i_ctime = ext4_current_time(old_inode); 3271 - ext4_mark_inode_dirty(handle, old_inode); 3095 + old.inode->i_ctime = ext4_current_time(old.inode); 3096 + ext4_mark_inode_dirty(handle, old.inode); 3272 3097 3273 3098 /* 3274 3099 * ok, that's it 3275 3100 */ 3276 - if (le32_to_cpu(old_de->inode) != old_inode->i_ino || 3277 - old_de->name_len != old_dentry->d_name.len || 3278 - strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || 3279 - (retval = ext4_delete_entry(handle, old_dir, 3280 - old_de, old_bh)) == -ENOENT) { 3281 - /* old_de could have moved from under us during htree split, so 3282 - * make sure that we are deleting the right entry. We might 3283 - * also be pointing to a stale entry in the unused part of 3284 - * old_bh so just checking inum and the name isn't enough. */ 3285 - struct buffer_head *old_bh2; 3286 - struct ext4_dir_entry_2 *old_de2; 3101 + ext4_rename_delete(handle, &old); 3287 3102 3288 - old_bh2 = ext4_find_entry(old_dir, &old_dentry->d_name, 3289 - &old_de2, NULL); 3290 - if (old_bh2) { 3291 - retval = ext4_delete_entry(handle, old_dir, 3292 - old_de2, old_bh2); 3293 - brelse(old_bh2); 3294 - } 3103 + if (new.inode) { 3104 + ext4_dec_count(handle, new.inode); 3105 + new.inode->i_ctime = ext4_current_time(new.inode); 3295 3106 } 3296 - if (retval) { 3297 - ext4_warning(old_dir->i_sb, 3298 - "Deleting old file (%lu), %d, error=%d", 3299 - old_dir->i_ino, old_dir->i_nlink, retval); 3300 - } 3301 - 3302 - if (new_inode) { 3303 - ext4_dec_count(handle, new_inode); 3304 - new_inode->i_ctime = ext4_current_time(new_inode); 3305 - } 3306 - old_dir->i_ctime = old_dir->i_mtime = ext4_current_time(old_dir); 3307 - ext4_update_dx_flag(old_dir); 3308 - if (dir_bh) { 3309 - parent_de->inode = cpu_to_le32(new_dir->i_ino); 3310 - BUFFER_TRACE(dir_bh, "call ext4_handle_dirty_metadata"); 3311 - if (!inlined) { 3312 - if (is_dx(old_inode)) { 3313 - retval = ext4_handle_dirty_dx_node(handle, 3314 - old_inode, 3315 - dir_bh); 3316 - } else { 3317 - retval = ext4_handle_dirty_dirent_node(handle, 3318 - old_inode, dir_bh); 3319 - } 3320 - } else { 3321 - retval = ext4_mark_inode_dirty(handle, old_inode); 3322 - } 3323 - if (retval) { 3324 - ext4_std_error(old_dir->i_sb, retval); 3107 + old.dir->i_ctime = old.dir->i_mtime = ext4_current_time(old.dir); 3108 + ext4_update_dx_flag(old.dir); 3109 + if (old.dir_bh) { 3110 + retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino); 3111 + if (retval) 3325 3112 goto end_rename; 3326 - } 3327 - ext4_dec_count(handle, old_dir); 3328 - if (new_inode) { 3113 + 3114 + ext4_dec_count(handle, old.dir); 3115 + if (new.inode) { 3329 3116 /* checked empty_dir above, can't have another parent, 3330 3117 * ext4_dec_count() won't work for many-linked dirs */ 3331 - clear_nlink(new_inode); 3118 + clear_nlink(new.inode); 3332 3119 } else { 3333 - ext4_inc_count(handle, new_dir); 3334 - ext4_update_dx_flag(new_dir); 3335 - ext4_mark_inode_dirty(handle, new_dir); 3120 + ext4_inc_count(handle, new.dir); 3121 + ext4_update_dx_flag(new.dir); 3122 + ext4_mark_inode_dirty(handle, new.dir); 3336 3123 } 3337 3124 } 3338 - ext4_mark_inode_dirty(handle, old_dir); 3339 - if (new_inode) { 3340 - ext4_mark_inode_dirty(handle, new_inode); 3341 - if (!new_inode->i_nlink) 3342 - ext4_orphan_add(handle, new_inode); 3125 + ext4_mark_inode_dirty(handle, old.dir); 3126 + if (new.inode) { 3127 + ext4_mark_inode_dirty(handle, new.inode); 3128 + if (!new.inode->i_nlink) 3129 + ext4_orphan_add(handle, new.inode); 3343 3130 } 3344 3131 retval = 0; 3345 3132 3346 3133 end_rename: 3347 - brelse(dir_bh); 3348 - brelse(old_bh); 3349 - brelse(new_bh); 3134 + brelse(old.dir_bh); 3135 + brelse(old.bh); 3136 + brelse(new.bh); 3350 3137 if (handle) 3351 3138 ext4_journal_stop(handle); 3352 3139 return retval; 3140 + } 3141 + 3142 + static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry, 3143 + struct inode *new_dir, struct dentry *new_dentry) 3144 + { 3145 + handle_t *handle = NULL; 3146 + struct ext4_renament old = { 3147 + .dir = old_dir, 3148 + .dentry = old_dentry, 3149 + .inode = old_dentry->d_inode, 3150 + }; 3151 + struct ext4_renament new = { 3152 + .dir = new_dir, 3153 + .dentry = new_dentry, 3154 + .inode = new_dentry->d_inode, 3155 + }; 3156 + u8 new_file_type; 3157 + int retval; 3158 + 3159 + dquot_initialize(old.dir); 3160 + dquot_initialize(new.dir); 3161 + 3162 + old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, 3163 + &old.de, &old.inlined); 3164 + /* 3165 + * Check for inode number is _not_ due to possible IO errors. 3166 + * We might rmdir the source, keep it as pwd of some process 3167 + * and merrily kill the link to whatever was created under the 3168 + * same name. Goodbye sticky bit ;-< 3169 + */ 3170 + retval = -ENOENT; 3171 + if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) 3172 + goto end_rename; 3173 + 3174 + new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, 3175 + &new.de, &new.inlined); 3176 + 3177 + /* RENAME_EXCHANGE case: old *and* new must both exist */ 3178 + if (!new.bh || le32_to_cpu(new.de->inode) != new.inode->i_ino) 3179 + goto end_rename; 3180 + 3181 + handle = ext4_journal_start(old.dir, EXT4_HT_DIR, 3182 + (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) + 3183 + 2 * EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2)); 3184 + if (IS_ERR(handle)) 3185 + return PTR_ERR(handle); 3186 + 3187 + if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir)) 3188 + ext4_handle_sync(handle); 3189 + 3190 + if (S_ISDIR(old.inode->i_mode)) { 3191 + old.is_dir = true; 3192 + retval = ext4_rename_dir_prepare(handle, &old); 3193 + if (retval) 3194 + goto end_rename; 3195 + } 3196 + if (S_ISDIR(new.inode->i_mode)) { 3197 + new.is_dir = true; 3198 + retval = ext4_rename_dir_prepare(handle, &new); 3199 + if (retval) 3200 + goto end_rename; 3201 + } 3202 + 3203 + /* 3204 + * Other than the special case of overwriting a directory, parents' 3205 + * nlink only needs to be modified if this is a cross directory rename. 3206 + */ 3207 + if (old.dir != new.dir && old.is_dir != new.is_dir) { 3208 + old.dir_nlink_delta = old.is_dir ? -1 : 1; 3209 + new.dir_nlink_delta = -old.dir_nlink_delta; 3210 + retval = -EMLINK; 3211 + if ((old.dir_nlink_delta > 0 && EXT4_DIR_LINK_MAX(old.dir)) || 3212 + (new.dir_nlink_delta > 0 && EXT4_DIR_LINK_MAX(new.dir))) 3213 + goto end_rename; 3214 + } 3215 + 3216 + new_file_type = new.de->file_type; 3217 + retval = ext4_setent(handle, &new, old.inode->i_ino, old.de->file_type); 3218 + if (retval) 3219 + goto end_rename; 3220 + 3221 + retval = ext4_setent(handle, &old, new.inode->i_ino, new_file_type); 3222 + if (retval) 3223 + goto end_rename; 3224 + 3225 + /* 3226 + * Like most other Unix systems, set the ctime for inodes on a 3227 + * rename. 3228 + */ 3229 + old.inode->i_ctime = ext4_current_time(old.inode); 3230 + new.inode->i_ctime = ext4_current_time(new.inode); 3231 + ext4_mark_inode_dirty(handle, old.inode); 3232 + ext4_mark_inode_dirty(handle, new.inode); 3233 + 3234 + if (old.dir_bh) { 3235 + retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino); 3236 + if (retval) 3237 + goto end_rename; 3238 + } 3239 + if (new.dir_bh) { 3240 + retval = ext4_rename_dir_finish(handle, &new, old.dir->i_ino); 3241 + if (retval) 3242 + goto end_rename; 3243 + } 3244 + ext4_update_dir_count(handle, &old); 3245 + ext4_update_dir_count(handle, &new); 3246 + retval = 0; 3247 + 3248 + end_rename: 3249 + brelse(old.dir_bh); 3250 + brelse(new.dir_bh); 3251 + brelse(old.bh); 3252 + brelse(new.bh); 3253 + if (handle) 3254 + ext4_journal_stop(handle); 3255 + return retval; 3256 + } 3257 + 3258 + static int ext4_rename2(struct inode *old_dir, struct dentry *old_dentry, 3259 + struct inode *new_dir, struct dentry *new_dentry, 3260 + unsigned int flags) 3261 + { 3262 + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) 3263 + return -EINVAL; 3264 + 3265 + if (flags & RENAME_EXCHANGE) { 3266 + return ext4_cross_rename(old_dir, old_dentry, 3267 + new_dir, new_dentry); 3268 + } 3269 + /* 3270 + * Existence checking was done by the VFS, otherwise "RENAME_NOREPLACE" 3271 + * is equivalent to regular rename. 3272 + */ 3273 + return ext4_rename(old_dir, old_dentry, new_dir, new_dentry); 3353 3274 } 3354 3275 3355 3276 /* ··· 3435 3218 .mknod = ext4_mknod, 3436 3219 .tmpfile = ext4_tmpfile, 3437 3220 .rename = ext4_rename, 3221 + .rename2 = ext4_rename2, 3438 3222 .setattr = ext4_setattr, 3439 3223 .setxattr = generic_setxattr, 3440 3224 .getxattr = generic_getxattr,
+12 -13
fs/inode.c
··· 944 944 945 945 /** 946 946 * lock_two_nondirectories - take two i_mutexes on non-directory objects 947 + * 948 + * Lock any non-NULL argument that is not a directory. 949 + * Zero, one or two objects may be locked by this function. 950 + * 947 951 * @inode1: first inode to lock 948 952 * @inode2: second inode to lock 949 953 */ 950 954 void lock_two_nondirectories(struct inode *inode1, struct inode *inode2) 951 955 { 952 - WARN_ON_ONCE(S_ISDIR(inode1->i_mode)); 953 - if (inode1 == inode2 || !inode2) { 956 + if (inode1 > inode2) 957 + swap(inode1, inode2); 958 + 959 + if (inode1 && !S_ISDIR(inode1->i_mode)) 954 960 mutex_lock(&inode1->i_mutex); 955 - return; 956 - } 957 - WARN_ON_ONCE(S_ISDIR(inode2->i_mode)); 958 - if (inode1 < inode2) { 959 - mutex_lock(&inode1->i_mutex); 961 + if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1) 960 962 mutex_lock_nested(&inode2->i_mutex, I_MUTEX_NONDIR2); 961 - } else { 962 - mutex_lock(&inode2->i_mutex); 963 - mutex_lock_nested(&inode1->i_mutex, I_MUTEX_NONDIR2); 964 - } 965 963 } 966 964 EXPORT_SYMBOL(lock_two_nondirectories); 967 965 ··· 970 972 */ 971 973 void unlock_two_nondirectories(struct inode *inode1, struct inode *inode2) 972 974 { 973 - mutex_unlock(&inode1->i_mutex); 974 - if (inode2 && inode2 != inode1) 975 + if (inode1 && !S_ISDIR(inode1->i_mode)) 976 + mutex_unlock(&inode1->i_mutex); 977 + if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1) 975 978 mutex_unlock(&inode2->i_mutex); 976 979 } 977 980 EXPORT_SYMBOL(unlock_two_nondirectories);
+189 -162
fs/namei.c
··· 1796 1796 if (err) 1797 1797 return err; 1798 1798 } 1799 - if (!d_is_directory(nd->path.dentry)) { 1799 + if (!d_can_lookup(nd->path.dentry)) { 1800 1800 err = -ENOTDIR; 1801 1801 break; 1802 1802 } ··· 1817 1817 struct dentry *root = nd->root.dentry; 1818 1818 struct inode *inode = root->d_inode; 1819 1819 if (*name) { 1820 - if (!d_is_directory(root)) 1820 + if (!d_can_lookup(root)) 1821 1821 return -ENOTDIR; 1822 1822 retval = inode_permission(inode, MAY_EXEC); 1823 1823 if (retval) ··· 1873 1873 dentry = f.file->f_path.dentry; 1874 1874 1875 1875 if (*name) { 1876 - if (!d_is_directory(dentry)) { 1876 + if (!d_can_lookup(dentry)) { 1877 1877 fdput(f); 1878 1878 return -ENOTDIR; 1879 1879 } ··· 1955 1955 err = complete_walk(nd); 1956 1956 1957 1957 if (!err && nd->flags & LOOKUP_DIRECTORY) { 1958 - if (!d_is_directory(nd->path.dentry)) { 1958 + if (!d_can_lookup(nd->path.dentry)) { 1959 1959 path_put(&nd->path); 1960 1960 err = -ENOTDIR; 1961 1961 } ··· 2414 2414 IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) 2415 2415 return -EPERM; 2416 2416 if (isdir) { 2417 - if (!d_is_directory(victim) && !d_is_autodir(victim)) 2417 + if (!d_is_dir(victim)) 2418 2418 return -ENOTDIR; 2419 2419 if (IS_ROOT(victim)) 2420 2420 return -EBUSY; 2421 - } else if (d_is_directory(victim) || d_is_autodir(victim)) 2421 + } else if (d_is_dir(victim)) 2422 2422 return -EISDIR; 2423 2423 if (IS_DEADDIR(dir)) 2424 2424 return -ENOENT; ··· 3016 3016 } 3017 3017 audit_inode(name, nd->path.dentry, 0); 3018 3018 error = -EISDIR; 3019 - if ((open_flag & O_CREAT) && 3020 - (d_is_directory(nd->path.dentry) || d_is_autodir(nd->path.dentry))) 3019 + if ((open_flag & O_CREAT) && d_is_dir(nd->path.dentry)) 3021 3020 goto out; 3022 3021 error = -ENOTDIR; 3023 - if ((nd->flags & LOOKUP_DIRECTORY) && !d_is_directory(nd->path.dentry)) 3022 + if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) 3024 3023 goto out; 3025 3024 if (!S_ISREG(nd->inode->i_mode)) 3026 3025 will_truncate = false; ··· 3743 3744 slashes: 3744 3745 if (d_is_negative(dentry)) 3745 3746 error = -ENOENT; 3746 - else if (d_is_directory(dentry) || d_is_autodir(dentry)) 3747 + else if (d_is_dir(dentry)) 3747 3748 error = -EISDIR; 3748 3749 else 3749 3750 error = -ENOTDIR; ··· 3973 3974 return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0); 3974 3975 } 3975 3976 3976 - /* 3977 + /** 3978 + * vfs_rename - rename a filesystem object 3979 + * @old_dir: parent of source 3980 + * @old_dentry: source 3981 + * @new_dir: parent of destination 3982 + * @new_dentry: destination 3983 + * @delegated_inode: returns an inode needing a delegation break 3984 + * @flags: rename flags 3985 + * 3986 + * The caller must hold multiple mutexes--see lock_rename()). 3987 + * 3988 + * If vfs_rename discovers a delegation in need of breaking at either 3989 + * the source or destination, it will return -EWOULDBLOCK and return a 3990 + * reference to the inode in delegated_inode. The caller should then 3991 + * break the delegation and retry. Because breaking a delegation may 3992 + * take a long time, the caller should drop all locks before doing 3993 + * so. 3994 + * 3995 + * Alternatively, a caller may pass NULL for delegated_inode. This may 3996 + * be appropriate for callers that expect the underlying filesystem not 3997 + * to be NFS exported. 3998 + * 3977 3999 * The worst of all namespace operations - renaming directory. "Perverted" 3978 4000 * doesn't even start to describe it. Somebody in UCB had a heck of a trip... 3979 4001 * Problems: ··· 4022 4002 * ->i_mutex on parents, which works but leads to some truly excessive 4023 4003 * locking]. 4024 4004 */ 4025 - static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry, 4026 - struct inode *new_dir, struct dentry *new_dentry) 4027 - { 4028 - int error = 0; 4029 - struct inode *target = new_dentry->d_inode; 4030 - unsigned max_links = new_dir->i_sb->s_max_links; 4031 - 4032 - /* 4033 - * If we are going to change the parent - check write permissions, 4034 - * we'll need to flip '..'. 4035 - */ 4036 - if (new_dir != old_dir) { 4037 - error = inode_permission(old_dentry->d_inode, MAY_WRITE); 4038 - if (error) 4039 - return error; 4040 - } 4041 - 4042 - error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry); 4043 - if (error) 4044 - return error; 4045 - 4046 - dget(new_dentry); 4047 - if (target) 4048 - mutex_lock(&target->i_mutex); 4049 - 4050 - error = -EBUSY; 4051 - if (d_mountpoint(old_dentry) || d_mountpoint(new_dentry)) 4052 - goto out; 4053 - 4054 - error = -EMLINK; 4055 - if (max_links && !target && new_dir != old_dir && 4056 - new_dir->i_nlink >= max_links) 4057 - goto out; 4058 - 4059 - if (target) 4060 - shrink_dcache_parent(new_dentry); 4061 - error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); 4062 - if (error) 4063 - goto out; 4064 - 4065 - if (target) { 4066 - target->i_flags |= S_DEAD; 4067 - dont_mount(new_dentry); 4068 - } 4069 - out: 4070 - if (target) 4071 - mutex_unlock(&target->i_mutex); 4072 - dput(new_dentry); 4073 - if (!error) 4074 - if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) 4075 - d_move(old_dentry,new_dentry); 4076 - return error; 4077 - } 4078 - 4079 - static int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry, 4080 - struct inode *new_dir, struct dentry *new_dentry, 4081 - struct inode **delegated_inode) 4082 - { 4083 - struct inode *target = new_dentry->d_inode; 4084 - struct inode *source = old_dentry->d_inode; 4085 - int error; 4086 - 4087 - error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry); 4088 - if (error) 4089 - return error; 4090 - 4091 - dget(new_dentry); 4092 - lock_two_nondirectories(source, target); 4093 - 4094 - error = -EBUSY; 4095 - if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry)) 4096 - goto out; 4097 - 4098 - error = try_break_deleg(source, delegated_inode); 4099 - if (error) 4100 - goto out; 4101 - if (target) { 4102 - error = try_break_deleg(target, delegated_inode); 4103 - if (error) 4104 - goto out; 4105 - } 4106 - error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); 4107 - if (error) 4108 - goto out; 4109 - 4110 - if (target) 4111 - dont_mount(new_dentry); 4112 - if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) 4113 - d_move(old_dentry, new_dentry); 4114 - out: 4115 - unlock_two_nondirectories(source, target); 4116 - dput(new_dentry); 4117 - return error; 4118 - } 4119 - 4120 - /** 4121 - * vfs_rename - rename a filesystem object 4122 - * @old_dir: parent of source 4123 - * @old_dentry: source 4124 - * @new_dir: parent of destination 4125 - * @new_dentry: destination 4126 - * @delegated_inode: returns an inode needing a delegation break 4127 - * 4128 - * The caller must hold multiple mutexes--see lock_rename()). 4129 - * 4130 - * If vfs_rename discovers a delegation in need of breaking at either 4131 - * the source or destination, it will return -EWOULDBLOCK and return a 4132 - * reference to the inode in delegated_inode. The caller should then 4133 - * break the delegation and retry. Because breaking a delegation may 4134 - * take a long time, the caller should drop all locks before doing 4135 - * so. 4136 - * 4137 - * Alternatively, a caller may pass NULL for delegated_inode. This may 4138 - * be appropriate for callers that expect the underlying filesystem not 4139 - * to be NFS exported. 4140 - */ 4141 4005 int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, 4142 4006 struct inode *new_dir, struct dentry *new_dentry, 4143 - struct inode **delegated_inode) 4007 + struct inode **delegated_inode, unsigned int flags) 4144 4008 { 4145 4009 int error; 4146 - int is_dir = d_is_directory(old_dentry) || d_is_autodir(old_dentry); 4010 + bool is_dir = d_is_dir(old_dentry); 4147 4011 const unsigned char *old_name; 4012 + struct inode *source = old_dentry->d_inode; 4013 + struct inode *target = new_dentry->d_inode; 4014 + bool new_is_dir = false; 4015 + unsigned max_links = new_dir->i_sb->s_max_links; 4148 4016 4149 - if (old_dentry->d_inode == new_dentry->d_inode) 4150 - return 0; 4151 - 4017 + if (source == target) 4018 + return 0; 4019 + 4152 4020 error = may_delete(old_dir, old_dentry, is_dir); 4153 4021 if (error) 4154 4022 return error; 4155 4023 4156 - if (!new_dentry->d_inode) 4024 + if (!target) { 4157 4025 error = may_create(new_dir, new_dentry); 4158 - else 4159 - error = may_delete(new_dir, new_dentry, is_dir); 4026 + } else { 4027 + new_is_dir = d_is_dir(new_dentry); 4028 + 4029 + if (!(flags & RENAME_EXCHANGE)) 4030 + error = may_delete(new_dir, new_dentry, is_dir); 4031 + else 4032 + error = may_delete(new_dir, new_dentry, new_is_dir); 4033 + } 4160 4034 if (error) 4161 4035 return error; 4162 4036 4163 4037 if (!old_dir->i_op->rename) 4164 4038 return -EPERM; 4165 4039 4166 - old_name = fsnotify_oldname_init(old_dentry->d_name.name); 4040 + if (flags && !old_dir->i_op->rename2) 4041 + return -EINVAL; 4167 4042 4168 - if (is_dir) 4169 - error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry); 4170 - else 4171 - error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry,delegated_inode); 4172 - if (!error) 4043 + /* 4044 + * If we are going to change the parent - check write permissions, 4045 + * we'll need to flip '..'. 4046 + */ 4047 + if (new_dir != old_dir) { 4048 + if (is_dir) { 4049 + error = inode_permission(source, MAY_WRITE); 4050 + if (error) 4051 + return error; 4052 + } 4053 + if ((flags & RENAME_EXCHANGE) && new_is_dir) { 4054 + error = inode_permission(target, MAY_WRITE); 4055 + if (error) 4056 + return error; 4057 + } 4058 + } 4059 + 4060 + error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry, 4061 + flags); 4062 + if (error) 4063 + return error; 4064 + 4065 + old_name = fsnotify_oldname_init(old_dentry->d_name.name); 4066 + dget(new_dentry); 4067 + if (!is_dir || (flags & RENAME_EXCHANGE)) 4068 + lock_two_nondirectories(source, target); 4069 + else if (target) 4070 + mutex_lock(&target->i_mutex); 4071 + 4072 + error = -EBUSY; 4073 + if (d_mountpoint(old_dentry) || d_mountpoint(new_dentry)) 4074 + goto out; 4075 + 4076 + if (max_links && new_dir != old_dir) { 4077 + error = -EMLINK; 4078 + if (is_dir && !new_is_dir && new_dir->i_nlink >= max_links) 4079 + goto out; 4080 + if ((flags & RENAME_EXCHANGE) && !is_dir && new_is_dir && 4081 + old_dir->i_nlink >= max_links) 4082 + goto out; 4083 + } 4084 + if (is_dir && !(flags & RENAME_EXCHANGE) && target) 4085 + shrink_dcache_parent(new_dentry); 4086 + if (!is_dir) { 4087 + error = try_break_deleg(source, delegated_inode); 4088 + if (error) 4089 + goto out; 4090 + } 4091 + if (target && !new_is_dir) { 4092 + error = try_break_deleg(target, delegated_inode); 4093 + if (error) 4094 + goto out; 4095 + } 4096 + if (!flags) { 4097 + error = old_dir->i_op->rename(old_dir, old_dentry, 4098 + new_dir, new_dentry); 4099 + } else { 4100 + error = old_dir->i_op->rename2(old_dir, old_dentry, 4101 + new_dir, new_dentry, flags); 4102 + } 4103 + if (error) 4104 + goto out; 4105 + 4106 + if (!(flags & RENAME_EXCHANGE) && target) { 4107 + if (is_dir) 4108 + target->i_flags |= S_DEAD; 4109 + dont_mount(new_dentry); 4110 + } 4111 + if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) { 4112 + if (!(flags & RENAME_EXCHANGE)) 4113 + d_move(old_dentry, new_dentry); 4114 + else 4115 + d_exchange(old_dentry, new_dentry); 4116 + } 4117 + out: 4118 + if (!is_dir || (flags & RENAME_EXCHANGE)) 4119 + unlock_two_nondirectories(source, target); 4120 + else if (target) 4121 + mutex_unlock(&target->i_mutex); 4122 + dput(new_dentry); 4123 + if (!error) { 4173 4124 fsnotify_move(old_dir, new_dir, old_name, is_dir, 4174 - new_dentry->d_inode, old_dentry); 4125 + !(flags & RENAME_EXCHANGE) ? target : NULL, old_dentry); 4126 + if (flags & RENAME_EXCHANGE) { 4127 + fsnotify_move(new_dir, old_dir, old_dentry->d_name.name, 4128 + new_is_dir, NULL, new_dentry); 4129 + } 4130 + } 4175 4131 fsnotify_oldname_free(old_name); 4176 4132 4177 4133 return error; 4178 4134 } 4179 4135 4180 - SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname, 4181 - int, newdfd, const char __user *, newname) 4136 + SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname, 4137 + int, newdfd, const char __user *, newname, unsigned int, flags) 4182 4138 { 4183 4139 struct dentry *old_dir, *new_dir; 4184 4140 struct dentry *old_dentry, *new_dentry; ··· 4166 4170 unsigned int lookup_flags = 0; 4167 4171 bool should_retry = false; 4168 4172 int error; 4173 + 4174 + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) 4175 + return -EINVAL; 4176 + 4177 + if ((flags & RENAME_NOREPLACE) && (flags & RENAME_EXCHANGE)) 4178 + return -EINVAL; 4179 + 4169 4180 retry: 4170 4181 from = user_path_parent(olddfd, oldname, &oldnd, lookup_flags); 4171 4182 if (IS_ERR(from)) { ··· 4196 4193 goto exit2; 4197 4194 4198 4195 new_dir = newnd.path.dentry; 4196 + if (flags & RENAME_NOREPLACE) 4197 + error = -EEXIST; 4199 4198 if (newnd.last_type != LAST_NORM) 4200 4199 goto exit2; 4201 4200 ··· 4207 4202 4208 4203 oldnd.flags &= ~LOOKUP_PARENT; 4209 4204 newnd.flags &= ~LOOKUP_PARENT; 4210 - newnd.flags |= LOOKUP_RENAME_TARGET; 4205 + if (!(flags & RENAME_EXCHANGE)) 4206 + newnd.flags |= LOOKUP_RENAME_TARGET; 4211 4207 4212 4208 retry_deleg: 4213 4209 trap = lock_rename(new_dir, old_dir); ··· 4221 4215 error = -ENOENT; 4222 4216 if (d_is_negative(old_dentry)) 4223 4217 goto exit4; 4224 - /* unless the source is a directory trailing slashes give -ENOTDIR */ 4225 - if (!d_is_directory(old_dentry) && !d_is_autodir(old_dentry)) { 4226 - error = -ENOTDIR; 4227 - if (oldnd.last.name[oldnd.last.len]) 4228 - goto exit4; 4229 - if (newnd.last.name[newnd.last.len]) 4230 - goto exit4; 4231 - } 4232 - /* source should not be ancestor of target */ 4233 - error = -EINVAL; 4234 - if (old_dentry == trap) 4235 - goto exit4; 4236 4218 new_dentry = lookup_hash(&newnd); 4237 4219 error = PTR_ERR(new_dentry); 4238 4220 if (IS_ERR(new_dentry)) 4239 4221 goto exit4; 4222 + error = -EEXIST; 4223 + if ((flags & RENAME_NOREPLACE) && d_is_positive(new_dentry)) 4224 + goto exit5; 4225 + if (flags & RENAME_EXCHANGE) { 4226 + error = -ENOENT; 4227 + if (d_is_negative(new_dentry)) 4228 + goto exit5; 4229 + 4230 + if (!d_is_dir(new_dentry)) { 4231 + error = -ENOTDIR; 4232 + if (newnd.last.name[newnd.last.len]) 4233 + goto exit5; 4234 + } 4235 + } 4236 + /* unless the source is a directory trailing slashes give -ENOTDIR */ 4237 + if (!d_is_dir(old_dentry)) { 4238 + error = -ENOTDIR; 4239 + if (oldnd.last.name[oldnd.last.len]) 4240 + goto exit5; 4241 + if (!(flags & RENAME_EXCHANGE) && newnd.last.name[newnd.last.len]) 4242 + goto exit5; 4243 + } 4244 + /* source should not be ancestor of target */ 4245 + error = -EINVAL; 4246 + if (old_dentry == trap) 4247 + goto exit5; 4240 4248 /* target should not be an ancestor of source */ 4241 - error = -ENOTEMPTY; 4249 + if (!(flags & RENAME_EXCHANGE)) 4250 + error = -ENOTEMPTY; 4242 4251 if (new_dentry == trap) 4243 4252 goto exit5; 4244 4253 4245 4254 error = security_path_rename(&oldnd.path, old_dentry, 4246 - &newnd.path, new_dentry); 4255 + &newnd.path, new_dentry, flags); 4247 4256 if (error) 4248 4257 goto exit5; 4249 4258 error = vfs_rename(old_dir->d_inode, old_dentry, 4250 - new_dir->d_inode, new_dentry, 4251 - &delegated_inode); 4259 + new_dir->d_inode, new_dentry, 4260 + &delegated_inode, flags); 4252 4261 exit5: 4253 4262 dput(new_dentry); 4254 4263 exit4: ··· 4293 4272 return error; 4294 4273 } 4295 4274 4275 + SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname, 4276 + int, newdfd, const char __user *, newname) 4277 + { 4278 + return sys_renameat2(olddfd, oldname, newdfd, newname, 0); 4279 + } 4280 + 4296 4281 SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname) 4297 4282 { 4298 - return sys_renameat(AT_FDCWD, oldname, AT_FDCWD, newname); 4283 + return sys_renameat2(AT_FDCWD, oldname, AT_FDCWD, newname, 0); 4299 4284 } 4300 4285 4301 4286 int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen, const char *link)
+1 -1
fs/nfsd/vfs.c
··· 1694 1694 if (ffhp->fh_export->ex_path.dentry != tfhp->fh_export->ex_path.dentry) 1695 1695 goto out_dput_new; 1696 1696 1697 - host_err = vfs_rename(fdir, odentry, tdir, ndentry, NULL); 1697 + host_err = vfs_rename(fdir, odentry, tdir, ndentry, NULL, 0); 1698 1698 if (!host_err) { 1699 1699 host_err = commit_metadata(tfhp); 1700 1700 if (!host_err)
+7 -1
include/linux/dcache.h
··· 308 308 309 309 /* used for rename() and baskets */ 310 310 extern void d_move(struct dentry *, struct dentry *); 311 + extern void d_exchange(struct dentry *, struct dentry *); 311 312 extern struct dentry *d_ancestor(struct dentry *, struct dentry *); 312 313 313 314 /* appendix may either be NULL or be used for transname suffixes */ ··· 430 429 return dentry->d_flags & DCACHE_ENTRY_TYPE; 431 430 } 432 431 433 - static inline bool d_is_directory(const struct dentry *dentry) 432 + static inline bool d_can_lookup(const struct dentry *dentry) 434 433 { 435 434 return __d_entry_type(dentry) == DCACHE_DIRECTORY_TYPE; 436 435 } ··· 438 437 static inline bool d_is_autodir(const struct dentry *dentry) 439 438 { 440 439 return __d_entry_type(dentry) == DCACHE_AUTODIR_TYPE; 440 + } 441 + 442 + static inline bool d_is_dir(const struct dentry *dentry) 443 + { 444 + return d_can_lookup(dentry) || d_is_autodir(dentry); 441 445 } 442 446 443 447 static inline bool d_is_symlink(const struct dentry *dentry)
+3 -1
include/linux/fs.h
··· 1461 1461 extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct inode **); 1462 1462 extern int vfs_rmdir(struct inode *, struct dentry *); 1463 1463 extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); 1464 - extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **); 1464 + extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); 1465 1465 1466 1466 /* 1467 1467 * VFS dentry helper functions. ··· 1572 1572 int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t); 1573 1573 int (*rename) (struct inode *, struct dentry *, 1574 1574 struct inode *, struct dentry *); 1575 + int (*rename2) (struct inode *, struct dentry *, 1576 + struct inode *, struct dentry *, unsigned int); 1575 1577 int (*setattr) (struct dentry *, struct iattr *); 1576 1578 int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); 1577 1579 int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
+8 -4
include/linux/security.h
··· 1793 1793 int security_inode_rmdir(struct inode *dir, struct dentry *dentry); 1794 1794 int security_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev); 1795 1795 int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry, 1796 - struct inode *new_dir, struct dentry *new_dentry); 1796 + struct inode *new_dir, struct dentry *new_dentry, 1797 + unsigned int flags); 1797 1798 int security_inode_readlink(struct dentry *dentry); 1798 1799 int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd); 1799 1800 int security_inode_permission(struct inode *inode, int mask); ··· 2162 2161 static inline int security_inode_rename(struct inode *old_dir, 2163 2162 struct dentry *old_dentry, 2164 2163 struct inode *new_dir, 2165 - struct dentry *new_dentry) 2164 + struct dentry *new_dentry, 2165 + unsigned int flags) 2166 2166 { 2167 2167 return 0; 2168 2168 } ··· 2957 2955 int security_path_link(struct dentry *old_dentry, struct path *new_dir, 2958 2956 struct dentry *new_dentry); 2959 2957 int security_path_rename(struct path *old_dir, struct dentry *old_dentry, 2960 - struct path *new_dir, struct dentry *new_dentry); 2958 + struct path *new_dir, struct dentry *new_dentry, 2959 + unsigned int flags); 2961 2960 int security_path_chmod(struct path *path, umode_t mode); 2962 2961 int security_path_chown(struct path *path, kuid_t uid, kgid_t gid); 2963 2962 int security_path_chroot(struct path *path); ··· 3006 3003 static inline int security_path_rename(struct path *old_dir, 3007 3004 struct dentry *old_dentry, 3008 3005 struct path *new_dir, 3009 - struct dentry *new_dentry) 3006 + struct dentry *new_dentry, 3007 + unsigned int flags) 3010 3008 { 3011 3009 return 0; 3012 3010 }
+3
include/uapi/linux/fs.h
··· 35 35 #define SEEK_HOLE 4 /* seek to the next hole */ 36 36 #define SEEK_MAX SEEK_HOLE 37 37 38 + #define RENAME_NOREPLACE (1 << 0) /* Don't overwrite target */ 39 + #define RENAME_EXCHANGE (1 << 1) /* Exchange source and dest */ 40 + 38 41 struct fstrim_range { 39 42 __u64 start; 40 43 __u64 len;
+20 -2
security/security.c
··· 433 433 } 434 434 435 435 int security_path_rename(struct path *old_dir, struct dentry *old_dentry, 436 - struct path *new_dir, struct dentry *new_dentry) 436 + struct path *new_dir, struct dentry *new_dentry, 437 + unsigned int flags) 437 438 { 438 439 if (unlikely(IS_PRIVATE(old_dentry->d_inode) || 439 440 (new_dentry->d_inode && IS_PRIVATE(new_dentry->d_inode)))) 440 441 return 0; 442 + 443 + if (flags & RENAME_EXCHANGE) { 444 + int err = security_ops->path_rename(new_dir, new_dentry, 445 + old_dir, old_dentry); 446 + if (err) 447 + return err; 448 + } 449 + 441 450 return security_ops->path_rename(old_dir, old_dentry, new_dir, 442 451 new_dentry); 443 452 } ··· 533 524 } 534 525 535 526 int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry, 536 - struct inode *new_dir, struct dentry *new_dentry) 527 + struct inode *new_dir, struct dentry *new_dentry, 528 + unsigned int flags) 537 529 { 538 530 if (unlikely(IS_PRIVATE(old_dentry->d_inode) || 539 531 (new_dentry->d_inode && IS_PRIVATE(new_dentry->d_inode)))) 540 532 return 0; 533 + 534 + if (flags & RENAME_EXCHANGE) { 535 + int err = security_ops->inode_rename(new_dir, new_dentry, 536 + old_dir, old_dentry); 537 + if (err) 538 + return err; 539 + } 540 + 541 541 return security_ops->inode_rename(old_dir, old_dentry, 542 542 new_dir, new_dentry); 543 543 }