mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
Merge branch 'tt/misc' into dev
This commit is contained in:
commit
dfdeeb41fb
|
|
@ -5580,8 +5580,23 @@ static int __ext4_expand_extra_isize(struct inode *inode,
|
||||||
{
|
{
|
||||||
struct ext4_inode *raw_inode;
|
struct ext4_inode *raw_inode;
|
||||||
struct ext4_xattr_ibody_header *header;
|
struct ext4_xattr_ibody_header *header;
|
||||||
|
unsigned int inode_size = EXT4_INODE_SIZE(inode->i_sb);
|
||||||
|
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
/* this was checked at iget time, but double check for good measure */
|
||||||
|
if ((EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize > inode_size) ||
|
||||||
|
(ei->i_extra_isize & 3)) {
|
||||||
|
EXT4_ERROR_INODE(inode, "bad extra_isize %u (inode size %u)",
|
||||||
|
ei->i_extra_isize,
|
||||||
|
EXT4_INODE_SIZE(inode->i_sb));
|
||||||
|
return -EFSCORRUPTED;
|
||||||
|
}
|
||||||
|
if ((new_extra_isize < ei->i_extra_isize) ||
|
||||||
|
(new_extra_isize < 4) ||
|
||||||
|
(new_extra_isize > inode_size - EXT4_GOOD_OLD_INODE_SIZE))
|
||||||
|
return -EINVAL; /* Should never happen */
|
||||||
|
|
||||||
raw_inode = ext4_raw_inode(iloc);
|
raw_inode = ext4_raw_inode(iloc);
|
||||||
|
|
||||||
header = IHDR(inode, raw_inode);
|
header = IHDR(inode, raw_inode);
|
||||||
|
|
|
||||||
|
|
@ -3196,18 +3196,17 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
if (IS_DIRSYNC(dir))
|
if (IS_DIRSYNC(dir))
|
||||||
ext4_handle_sync(handle);
|
ext4_handle_sync(handle);
|
||||||
|
|
||||||
if (inode->i_nlink == 0) {
|
|
||||||
ext4_warning_inode(inode, "Deleting file '%.*s' with no links",
|
|
||||||
dentry->d_name.len, dentry->d_name.name);
|
|
||||||
set_nlink(inode, 1);
|
|
||||||
}
|
|
||||||
retval = ext4_delete_entry(handle, dir, de, bh);
|
retval = ext4_delete_entry(handle, dir, de, bh);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto end_unlink;
|
goto end_unlink;
|
||||||
dir->i_ctime = dir->i_mtime = current_time(dir);
|
dir->i_ctime = dir->i_mtime = current_time(dir);
|
||||||
ext4_update_dx_flag(dir);
|
ext4_update_dx_flag(dir);
|
||||||
ext4_mark_inode_dirty(handle, dir);
|
ext4_mark_inode_dirty(handle, dir);
|
||||||
drop_nlink(inode);
|
if (inode->i_nlink == 0)
|
||||||
|
ext4_warning_inode(inode, "Deleting file '%.*s' with no links",
|
||||||
|
dentry->d_name.len, dentry->d_name.name);
|
||||||
|
else
|
||||||
|
drop_nlink(inode);
|
||||||
if (!inode->i_nlink)
|
if (!inode->i_nlink)
|
||||||
ext4_orphan_add(handle, inode);
|
ext4_orphan_add(handle, inode);
|
||||||
inode->i_ctime = current_time(inode);
|
inode->i_ctime = current_time(inode);
|
||||||
|
|
|
||||||
|
|
@ -3544,12 +3544,15 @@ static void ext4_clamp_want_extra_isize(struct super_block *sb)
|
||||||
{
|
{
|
||||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||||
struct ext4_super_block *es = sbi->s_es;
|
struct ext4_super_block *es = sbi->s_es;
|
||||||
|
unsigned def_extra_isize = sizeof(struct ext4_inode) -
|
||||||
|
EXT4_GOOD_OLD_INODE_SIZE;
|
||||||
|
|
||||||
/* determine the minimum size of new large inodes, if present */
|
if (sbi->s_inode_size == EXT4_GOOD_OLD_INODE_SIZE) {
|
||||||
if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE &&
|
sbi->s_want_extra_isize = 0;
|
||||||
sbi->s_want_extra_isize == 0) {
|
return;
|
||||||
sbi->s_want_extra_isize = sizeof(struct ext4_inode) -
|
}
|
||||||
EXT4_GOOD_OLD_INODE_SIZE;
|
if (sbi->s_want_extra_isize < 4) {
|
||||||
|
sbi->s_want_extra_isize = def_extra_isize;
|
||||||
if (ext4_has_feature_extra_isize(sb)) {
|
if (ext4_has_feature_extra_isize(sb)) {
|
||||||
if (sbi->s_want_extra_isize <
|
if (sbi->s_want_extra_isize <
|
||||||
le16_to_cpu(es->s_want_extra_isize))
|
le16_to_cpu(es->s_want_extra_isize))
|
||||||
|
|
@ -3562,10 +3565,10 @@ static void ext4_clamp_want_extra_isize(struct super_block *sb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Check if enough inode space is available */
|
/* Check if enough inode space is available */
|
||||||
if (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize >
|
if ((sbi->s_want_extra_isize > sbi->s_inode_size) ||
|
||||||
sbi->s_inode_size) {
|
(EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize >
|
||||||
sbi->s_want_extra_isize = sizeof(struct ext4_inode) -
|
sbi->s_inode_size)) {
|
||||||
EXT4_GOOD_OLD_INODE_SIZE;
|
sbi->s_want_extra_isize = def_extra_isize;
|
||||||
ext4_msg(sb, KERN_INFO,
|
ext4_msg(sb, KERN_INFO,
|
||||||
"required extra inode space not available");
|
"required extra inode space not available");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user