ext4: factor out ext4_fill_raw_inode()
Factor out ext4_fill_raw_inode() from ext4_do_update_inode(), which is use to fill the in-mem inode contents into the inode table buffer, in preparation for initializing the exclusive inode buffer without reading the block in __ext4_get_inode_loc(). Signed-off-by: Zhang Yi <yi.zhang@huawei.com> Reviewed-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20210901020955.1657340-2-yi.zhang@huawei.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
Родитель
0f2f87d51a
Коммит
664bd38b9c
|
@ -4852,9 +4852,8 @@ bad_inode:
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ext4_inode_blocks_set(handle_t *handle,
|
static int ext4_inode_blocks_set(struct ext4_inode *raw_inode,
|
||||||
struct ext4_inode *raw_inode,
|
struct ext4_inode_info *ei)
|
||||||
struct ext4_inode_info *ei)
|
|
||||||
{
|
{
|
||||||
struct inode *inode = &(ei->vfs_inode);
|
struct inode *inode = &(ei->vfs_inode);
|
||||||
u64 i_blocks = READ_ONCE(inode->i_blocks);
|
u64 i_blocks = READ_ONCE(inode->i_blocks);
|
||||||
|
@ -4957,37 +4956,16 @@ static void ext4_update_other_inodes_time(struct super_block *sb,
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static int ext4_fill_raw_inode(struct inode *inode, struct ext4_inode *raw_inode)
|
||||||
* Post the struct inode info into an on-disk inode location in the
|
|
||||||
* buffer-cache. This gobbles the caller's reference to the
|
|
||||||
* buffer_head in the inode location struct.
|
|
||||||
*
|
|
||||||
* The caller must have write access to iloc->bh.
|
|
||||||
*/
|
|
||||||
static int ext4_do_update_inode(handle_t *handle,
|
|
||||||
struct inode *inode,
|
|
||||||
struct ext4_iloc *iloc)
|
|
||||||
{
|
{
|
||||||
struct ext4_inode *raw_inode = ext4_raw_inode(iloc);
|
|
||||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||||
struct buffer_head *bh = iloc->bh;
|
|
||||||
struct super_block *sb = inode->i_sb;
|
|
||||||
int err = 0, block;
|
|
||||||
int need_datasync = 0, set_large_file = 0;
|
|
||||||
uid_t i_uid;
|
uid_t i_uid;
|
||||||
gid_t i_gid;
|
gid_t i_gid;
|
||||||
projid_t i_projid;
|
projid_t i_projid;
|
||||||
|
int block;
|
||||||
|
int err;
|
||||||
|
|
||||||
spin_lock(&ei->i_raw_lock);
|
err = ext4_inode_blocks_set(raw_inode, ei);
|
||||||
|
|
||||||
/*
|
|
||||||
* For fields not tracked in the in-memory inode, initialise them
|
|
||||||
* to zero for new inodes.
|
|
||||||
*/
|
|
||||||
if (ext4_test_inode_state(inode, EXT4_STATE_NEW))
|
|
||||||
memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
|
|
||||||
|
|
||||||
err = ext4_inode_blocks_set(handle, raw_inode, ei);
|
|
||||||
|
|
||||||
raw_inode->i_mode = cpu_to_le16(inode->i_mode);
|
raw_inode->i_mode = cpu_to_le16(inode->i_mode);
|
||||||
i_uid = i_uid_read(inode);
|
i_uid = i_uid_read(inode);
|
||||||
|
@ -5029,16 +5007,8 @@ static int ext4_do_update_inode(handle_t *handle,
|
||||||
raw_inode->i_file_acl_high =
|
raw_inode->i_file_acl_high =
|
||||||
cpu_to_le16(ei->i_file_acl >> 32);
|
cpu_to_le16(ei->i_file_acl >> 32);
|
||||||
raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl);
|
raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl);
|
||||||
if (READ_ONCE(ei->i_disksize) != ext4_isize(inode->i_sb, raw_inode)) {
|
ext4_isize_set(raw_inode, ei->i_disksize);
|
||||||
ext4_isize_set(raw_inode, ei->i_disksize);
|
|
||||||
need_datasync = 1;
|
|
||||||
}
|
|
||||||
if (ei->i_disksize > 0x7fffffffULL) {
|
|
||||||
if (!ext4_has_feature_large_file(sb) ||
|
|
||||||
EXT4_SB(sb)->s_es->s_rev_level ==
|
|
||||||
cpu_to_le32(EXT4_GOOD_OLD_REV))
|
|
||||||
set_large_file = 1;
|
|
||||||
}
|
|
||||||
raw_inode->i_generation = cpu_to_le32(inode->i_generation);
|
raw_inode->i_generation = cpu_to_le32(inode->i_generation);
|
||||||
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
|
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
|
||||||
if (old_valid_dev(inode->i_rdev)) {
|
if (old_valid_dev(inode->i_rdev)) {
|
||||||
|
@ -5078,6 +5048,45 @@ static int ext4_do_update_inode(handle_t *handle,
|
||||||
raw_inode->i_projid = cpu_to_le32(i_projid);
|
raw_inode->i_projid = cpu_to_le32(i_projid);
|
||||||
|
|
||||||
ext4_inode_csum_set(inode, raw_inode, ei);
|
ext4_inode_csum_set(inode, raw_inode, ei);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Post the struct inode info into an on-disk inode location in the
|
||||||
|
* buffer-cache. This gobbles the caller's reference to the
|
||||||
|
* buffer_head in the inode location struct.
|
||||||
|
*
|
||||||
|
* The caller must have write access to iloc->bh.
|
||||||
|
*/
|
||||||
|
static int ext4_do_update_inode(handle_t *handle,
|
||||||
|
struct inode *inode,
|
||||||
|
struct ext4_iloc *iloc)
|
||||||
|
{
|
||||||
|
struct ext4_inode *raw_inode = ext4_raw_inode(iloc);
|
||||||
|
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||||
|
struct buffer_head *bh = iloc->bh;
|
||||||
|
struct super_block *sb = inode->i_sb;
|
||||||
|
int err;
|
||||||
|
int need_datasync = 0, set_large_file = 0;
|
||||||
|
|
||||||
|
spin_lock(&ei->i_raw_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For fields not tracked in the in-memory inode, initialise them
|
||||||
|
* to zero for new inodes.
|
||||||
|
*/
|
||||||
|
if (ext4_test_inode_state(inode, EXT4_STATE_NEW))
|
||||||
|
memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
|
||||||
|
|
||||||
|
if (READ_ONCE(ei->i_disksize) != ext4_isize(inode->i_sb, raw_inode))
|
||||||
|
need_datasync = 1;
|
||||||
|
if (ei->i_disksize > 0x7fffffffULL) {
|
||||||
|
if (!ext4_has_feature_large_file(sb) ||
|
||||||
|
EXT4_SB(sb)->s_es->s_rev_level == cpu_to_le32(EXT4_GOOD_OLD_REV))
|
||||||
|
set_large_file = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ext4_fill_raw_inode(inode, raw_inode);
|
||||||
spin_unlock(&ei->i_raw_lock);
|
spin_unlock(&ei->i_raw_lock);
|
||||||
if (err) {
|
if (err) {
|
||||||
EXT4_ERROR_INODE(inode, "corrupted inode contents");
|
EXT4_ERROR_INODE(inode, "corrupted inode contents");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче