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 ---