Fix a regression which caused us to fail to interpret symlinks in very
ancient ext3 file system images. Also fix two xfstests failures, one of which could cause a OOPS, plus an additional bug fix caught by fuzz testing. -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEK2m5VNv+CHkogTfJ8vlZVpUNgaMFAlo1y3EACgkQ8vlZVpUN gaNFOQf/bMf6ynai1dGGRwef+UcT874NZ2Hqm+UqI6pxusz0ZeKWm8HWfPfg31Fa o+OnUsZ7NXFBIHyfXKFJzdOgutjZ5eY0vMu+NrlyBdd6W+ZcHwn1PvQsLapFYvqK Rt+8nWTKqtnksSfh0vyODmUYgItOULOPPepjnIPm/Pd0DinJwo0GY/8MzLkz4SpX g6R60ou0ToEYNqBXAKIBnZ4aq8KWMtCMGcD270U5eAm/63Pt4riRwJbjITxZPAH1 wKzivP4Ce5ce8W2g2/6mFFlBFWvtlB491T+BsgHUEv3OLze+kYS2PcxQthhEmBR8 zeZ2o2/0tTxejE//cyJ4gCe3fYGRDg== =xqLC -----END PGP SIGNATURE----- Merge tag 'ext4_for_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Pull ext4 fixes from Ted Ts'o: "Fix a regression which caused us to fail to interpret symlinks in very ancient ext3 file system images. Also fix two xfstests failures, one of which could cause an OOPS, plus an additional bug fix caught by fuzz testing" * tag 'ext4_for_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: fix crash when a directory's i_size is too small ext4: add missing error check in __ext4_new_inode() ext4: fix fdatasync(2) after fallocate(2) operation ext4: support fast symlinks from ext3 file systems
This commit is contained in:
commit
1c6b942d7d
|
@ -4722,6 +4722,7 @@ retry:
|
|||
EXT4_INODE_EOFBLOCKS);
|
||||
}
|
||||
ext4_mark_inode_dirty(handle, inode);
|
||||
ext4_update_inode_fsync_trans(handle, inode, 1);
|
||||
ret2 = ext4_journal_stop(handle);
|
||||
if (ret2)
|
||||
break;
|
||||
|
|
|
@ -816,6 +816,8 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,
|
|||
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
||||
struct posix_acl *p = get_acl(dir, ACL_TYPE_DEFAULT);
|
||||
|
||||
if (IS_ERR(p))
|
||||
return ERR_CAST(p);
|
||||
if (p) {
|
||||
int acl_size = p->a_count * sizeof(ext4_acl_entry);
|
||||
|
||||
|
|
|
@ -149,6 +149,15 @@ static int ext4_meta_trans_blocks(struct inode *inode, int lblocks,
|
|||
*/
|
||||
int ext4_inode_is_fast_symlink(struct inode *inode)
|
||||
{
|
||||
if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) {
|
||||
int ea_blocks = EXT4_I(inode)->i_file_acl ?
|
||||
EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0;
|
||||
|
||||
if (ext4_has_inline_data(inode))
|
||||
return 0;
|
||||
|
||||
return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);
|
||||
}
|
||||
return S_ISLNK(inode->i_mode) && inode->i_size &&
|
||||
(inode->i_size < EXT4_N_BLOCKS * 4);
|
||||
}
|
||||
|
|
|
@ -1399,6 +1399,10 @@ static struct buffer_head * ext4_find_entry (struct inode *dir,
|
|||
"falling back\n"));
|
||||
}
|
||||
nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);
|
||||
if (!nblocks) {
|
||||
ret = NULL;
|
||||
goto cleanup_and_exit;
|
||||
}
|
||||
start = EXT4_I(dir)->i_dir_start_lookup;
|
||||
if (start >= nblocks)
|
||||
start = 0;
|
||||
|
|
Loading…
Reference in New Issue