namei.c (549c7297717c32ee53f156cd949e055e601f67bb) | namei.c (14f3db5542e62bcf6fe088a09760ac52d55306c5) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/fs/ext4/namei.c 4 * 5 * Copyright (C) 1992, 1993, 1994, 1995 6 * Remy Card (card@masi.ibp.fr) 7 * Laboratoire MASI - Institut Blaise Pascal 8 * Universite Pierre et Marie Curie (Paris VI) --- 2596 unchanged lines hidden (view full) --- 2605 2606 err = dquot_initialize(dir); 2607 if (err) 2608 return err; 2609 2610 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 2611 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3); 2612retry: | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/fs/ext4/namei.c 4 * 5 * Copyright (C) 1992, 1993, 1994, 1995 6 * Remy Card (card@masi.ibp.fr) 7 * Laboratoire MASI - Institut Blaise Pascal 8 * Universite Pierre et Marie Curie (Paris VI) --- 2596 unchanged lines hidden (view full) --- 2605 2606 err = dquot_initialize(dir); 2607 if (err) 2608 return err; 2609 2610 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 2611 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3); 2612retry: |
2613 inode = ext4_new_inode_start_handle(dir, mode, &dentry->d_name, 0, 2614 NULL, EXT4_HT_DIR, credits); | 2613 inode = ext4_new_inode_start_handle(mnt_userns, dir, mode, &dentry->d_name, 2614 0, NULL, EXT4_HT_DIR, credits); |
2615 handle = ext4_journal_current_handle(); 2616 err = PTR_ERR(inode); 2617 if (!IS_ERR(inode)) { 2618 inode->i_op = &ext4_file_inode_operations; 2619 inode->i_fop = &ext4_file_operations; 2620 ext4_set_aops(inode); 2621 err = ext4_add_nondir(handle, dentry, &inode); 2622 if (!err) --- 17 unchanged lines hidden (view full) --- 2640 2641 err = dquot_initialize(dir); 2642 if (err) 2643 return err; 2644 2645 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 2646 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3); 2647retry: | 2615 handle = ext4_journal_current_handle(); 2616 err = PTR_ERR(inode); 2617 if (!IS_ERR(inode)) { 2618 inode->i_op = &ext4_file_inode_operations; 2619 inode->i_fop = &ext4_file_operations; 2620 ext4_set_aops(inode); 2621 err = ext4_add_nondir(handle, dentry, &inode); 2622 if (!err) --- 17 unchanged lines hidden (view full) --- 2640 2641 err = dquot_initialize(dir); 2642 if (err) 2643 return err; 2644 2645 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 2646 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3); 2647retry: |
2648 inode = ext4_new_inode_start_handle(dir, mode, &dentry->d_name, 0, 2649 NULL, EXT4_HT_DIR, credits); | 2648 inode = ext4_new_inode_start_handle(mnt_userns, dir, mode, &dentry->d_name, 2649 0, NULL, EXT4_HT_DIR, credits); |
2650 handle = ext4_journal_current_handle(); 2651 err = PTR_ERR(inode); 2652 if (!IS_ERR(inode)) { 2653 init_special_inode(inode, inode->i_mode, rdev); 2654 inode->i_op = &ext4_special_inode_operations; 2655 err = ext4_add_nondir(handle, dentry, &inode); 2656 if (!err) 2657 ext4_fc_track_create(handle, dentry); --- 14 unchanged lines hidden (view full) --- 2672 struct inode *inode; 2673 int err, retries = 0; 2674 2675 err = dquot_initialize(dir); 2676 if (err) 2677 return err; 2678 2679retry: | 2650 handle = ext4_journal_current_handle(); 2651 err = PTR_ERR(inode); 2652 if (!IS_ERR(inode)) { 2653 init_special_inode(inode, inode->i_mode, rdev); 2654 inode->i_op = &ext4_special_inode_operations; 2655 err = ext4_add_nondir(handle, dentry, &inode); 2656 if (!err) 2657 ext4_fc_track_create(handle, dentry); --- 14 unchanged lines hidden (view full) --- 2672 struct inode *inode; 2673 int err, retries = 0; 2674 2675 err = dquot_initialize(dir); 2676 if (err) 2677 return err; 2678 2679retry: |
2680 inode = ext4_new_inode_start_handle(dir, mode, | 2680 inode = ext4_new_inode_start_handle(mnt_userns, dir, mode, |
2681 NULL, 0, NULL, 2682 EXT4_HT_DIR, 2683 EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) + 2684 4 + EXT4_XATTR_TRANS_BLOCKS); 2685 handle = ext4_journal_current_handle(); 2686 err = PTR_ERR(inode); 2687 if (!IS_ERR(inode)) { 2688 inode->i_op = &ext4_file_inode_operations; --- 98 unchanged lines hidden (view full) --- 2787 2788 err = dquot_initialize(dir); 2789 if (err) 2790 return err; 2791 2792 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 2793 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3); 2794retry: | 2681 NULL, 0, NULL, 2682 EXT4_HT_DIR, 2683 EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) + 2684 4 + EXT4_XATTR_TRANS_BLOCKS); 2685 handle = ext4_journal_current_handle(); 2686 err = PTR_ERR(inode); 2687 if (!IS_ERR(inode)) { 2688 inode->i_op = &ext4_file_inode_operations; --- 98 unchanged lines hidden (view full) --- 2787 2788 err = dquot_initialize(dir); 2789 if (err) 2790 return err; 2791 2792 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 2793 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3); 2794retry: |
2795 inode = ext4_new_inode_start_handle(dir, S_IFDIR | mode, | 2795 inode = ext4_new_inode_start_handle(mnt_userns, dir, S_IFDIR | mode, |
2796 &dentry->d_name, 2797 0, NULL, EXT4_HT_DIR, credits); 2798 handle = ext4_journal_current_handle(); 2799 err = PTR_ERR(inode); 2800 if (IS_ERR(inode)) 2801 goto out_stop; 2802 2803 inode->i_op = &ext4_dir_inode_operations; --- 526 unchanged lines hidden (view full) --- 3330 * (EXT4_DATA_TRANS_BLOCKS + EXT4_INDEX_EXTRA_TRANS_BLOCKS), 3331 * allocate new inode (bitmap, group descriptor, inode block, 3332 * quota blocks, sb is already counted in previous macros). 3333 */ 3334 credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 3335 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3; 3336 } 3337 | 2796 &dentry->d_name, 2797 0, NULL, EXT4_HT_DIR, credits); 2798 handle = ext4_journal_current_handle(); 2799 err = PTR_ERR(inode); 2800 if (IS_ERR(inode)) 2801 goto out_stop; 2802 2803 inode->i_op = &ext4_dir_inode_operations; --- 526 unchanged lines hidden (view full) --- 3330 * (EXT4_DATA_TRANS_BLOCKS + EXT4_INDEX_EXTRA_TRANS_BLOCKS), 3331 * allocate new inode (bitmap, group descriptor, inode block, 3332 * quota blocks, sb is already counted in previous macros). 3333 */ 3334 credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + 3335 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3; 3336 } 3337 |
3338 inode = ext4_new_inode_start_handle(dir, S_IFLNK|S_IRWXUGO, | 3338 inode = ext4_new_inode_start_handle(mnt_userns, dir, S_IFLNK|S_IRWXUGO, |
3339 &dentry->d_name, 0, NULL, 3340 EXT4_HT_DIR, credits); 3341 handle = ext4_journal_current_handle(); 3342 if (IS_ERR(inode)) { 3343 if (handle) 3344 ext4_journal_stop(handle); 3345 return PTR_ERR(inode); 3346 } --- 312 unchanged lines hidden (view full) --- 3659 if (ent->dir_nlink_delta == -1) 3660 ext4_dec_count(ent->dir); 3661 else 3662 ext4_inc_count(ent->dir); 3663 ext4_mark_inode_dirty(handle, ent->dir); 3664 } 3665} 3666 | 3339 &dentry->d_name, 0, NULL, 3340 EXT4_HT_DIR, credits); 3341 handle = ext4_journal_current_handle(); 3342 if (IS_ERR(inode)) { 3343 if (handle) 3344 ext4_journal_stop(handle); 3345 return PTR_ERR(inode); 3346 } --- 312 unchanged lines hidden (view full) --- 3659 if (ent->dir_nlink_delta == -1) 3660 ext4_dec_count(ent->dir); 3661 else 3662 ext4_inc_count(ent->dir); 3663 ext4_mark_inode_dirty(handle, ent->dir); 3664 } 3665} 3666 |
3667static struct inode *ext4_whiteout_for_rename(struct ext4_renament *ent, | 3667static struct inode *ext4_whiteout_for_rename(struct user_namespace *mnt_userns, 3668 struct ext4_renament *ent, |
3668 int credits, handle_t **h) 3669{ 3670 struct inode *wh; 3671 handle_t *handle; 3672 int retries = 0; 3673 3674 /* 3675 * for inode block, sb block, group summaries, 3676 * and inode bitmap 3677 */ 3678 credits += (EXT4_MAXQUOTAS_TRANS_BLOCKS(ent->dir->i_sb) + 3679 EXT4_XATTR_TRANS_BLOCKS + 4); 3680retry: | 3669 int credits, handle_t **h) 3670{ 3671 struct inode *wh; 3672 handle_t *handle; 3673 int retries = 0; 3674 3675 /* 3676 * for inode block, sb block, group summaries, 3677 * and inode bitmap 3678 */ 3679 credits += (EXT4_MAXQUOTAS_TRANS_BLOCKS(ent->dir->i_sb) + 3680 EXT4_XATTR_TRANS_BLOCKS + 4); 3681retry: |
3681 wh = ext4_new_inode_start_handle(ent->dir, S_IFCHR | WHITEOUT_MODE, | 3682 wh = ext4_new_inode_start_handle(mnt_userns, ent->dir, 3683 S_IFCHR | WHITEOUT_MODE, |
3682 &ent->dentry->d_name, 0, NULL, 3683 EXT4_HT_DIR, credits); 3684 3685 handle = ext4_journal_current_handle(); 3686 if (IS_ERR(wh)) { 3687 if (handle) 3688 ext4_journal_stop(handle); 3689 if (PTR_ERR(wh) == -ENOSPC && --- 10 unchanged lines hidden (view full) --- 3700/* 3701 * Anybody can rename anything with this: the permission checks are left to the 3702 * higher-level routines. 3703 * 3704 * n.b. old_{dentry,inode) refers to the source dentry/inode 3705 * while new_{dentry,inode) refers to the destination dentry/inode 3706 * This comes from rename(const char *oldpath, const char *newpath) 3707 */ | 3684 &ent->dentry->d_name, 0, NULL, 3685 EXT4_HT_DIR, credits); 3686 3687 handle = ext4_journal_current_handle(); 3688 if (IS_ERR(wh)) { 3689 if (handle) 3690 ext4_journal_stop(handle); 3691 if (PTR_ERR(wh) == -ENOSPC && --- 10 unchanged lines hidden (view full) --- 3702/* 3703 * Anybody can rename anything with this: the permission checks are left to the 3704 * higher-level routines. 3705 * 3706 * n.b. old_{dentry,inode) refers to the source dentry/inode 3707 * while new_{dentry,inode) refers to the destination dentry/inode 3708 * This comes from rename(const char *oldpath, const char *newpath) 3709 */ |
3708static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, 3709 struct inode *new_dir, struct dentry *new_dentry, 3710 unsigned int flags) | 3710static int ext4_rename(struct user_namespace *mnt_userns, struct inode *old_dir, 3711 struct dentry *old_dentry, struct inode *new_dir, 3712 struct dentry *new_dentry, unsigned int flags) |
3711{ 3712 handle_t *handle = NULL; 3713 struct ext4_renament old = { 3714 .dir = old_dir, 3715 .dentry = old_dentry, 3716 .inode = d_inode(old_dentry), 3717 }; 3718 struct ext4_renament new = { --- 67 unchanged lines hidden (view full) --- 3786 if (!(flags & RENAME_WHITEOUT)) { 3787 handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits); 3788 if (IS_ERR(handle)) { 3789 retval = PTR_ERR(handle); 3790 handle = NULL; 3791 goto end_rename; 3792 } 3793 } else { | 3713{ 3714 handle_t *handle = NULL; 3715 struct ext4_renament old = { 3716 .dir = old_dir, 3717 .dentry = old_dentry, 3718 .inode = d_inode(old_dentry), 3719 }; 3720 struct ext4_renament new = { --- 67 unchanged lines hidden (view full) --- 3788 if (!(flags & RENAME_WHITEOUT)) { 3789 handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits); 3790 if (IS_ERR(handle)) { 3791 retval = PTR_ERR(handle); 3792 handle = NULL; 3793 goto end_rename; 3794 } 3795 } else { |
3794 whiteout = ext4_whiteout_for_rename(&old, credits, &handle); | 3796 whiteout = ext4_whiteout_for_rename(mnt_userns, &old, credits, &handle); |
3795 if (IS_ERR(whiteout)) { 3796 retval = PTR_ERR(whiteout); 3797 whiteout = NULL; 3798 goto end_rename; 3799 } 3800 } 3801 3802 old_file_type = old.de->file_type; --- 302 unchanged lines hidden (view full) --- 4105 if (err) 4106 return err; 4107 4108 if (flags & RENAME_EXCHANGE) { 4109 return ext4_cross_rename(old_dir, old_dentry, 4110 new_dir, new_dentry); 4111 } 4112 | 3797 if (IS_ERR(whiteout)) { 3798 retval = PTR_ERR(whiteout); 3799 whiteout = NULL; 3800 goto end_rename; 3801 } 3802 } 3803 3804 old_file_type = old.de->file_type; --- 302 unchanged lines hidden (view full) --- 4107 if (err) 4108 return err; 4109 4110 if (flags & RENAME_EXCHANGE) { 4111 return ext4_cross_rename(old_dir, old_dentry, 4112 new_dir, new_dentry); 4113 } 4114 |
4113 return ext4_rename(old_dir, old_dentry, new_dir, new_dentry, flags); | 4115 return ext4_rename(mnt_userns, old_dir, old_dentry, new_dir, new_dentry, flags); |
4114} 4115 4116/* 4117 * directories can handle most operations... 4118 */ 4119const struct inode_operations ext4_dir_inode_operations = { 4120 .create = ext4_create, 4121 .lookup = ext4_lookup, --- 23 unchanged lines hidden --- | 4116} 4117 4118/* 4119 * directories can handle most operations... 4120 */ 4121const struct inode_operations ext4_dir_inode_operations = { 4122 .create = ext4_create, 4123 .lookup = ext4_lookup, --- 23 unchanged lines hidden --- |