10 Mar, 2018
1 commit
-
Other filesystem drivers don't do this.
Signed-off-by: Marek Behun
23 Jan, 2018
1 commit
-
Migrate the following symbols to Kconfig:
CONFIG_FS_EXT4
CONFIG_EXT4_WRITEThe definitions in config_fallbacks.h can now be expressed in Kconfig.
Signed-off-by: Tuomas Tynkkynen
20 Nov, 2017
1 commit
-
Some fixes when reading EXT files and directory entries were identified
after using e2fuzz to corrupt an EXT3 filesystem:- Stop reading directory entries if the offset becomes badly aligned.
- Avoid overwriting memory by clamping the length used to zero the buffer
in ext4fs_read_file. Also sanity check blocksize.Signed-off-by: Ian Ray
Signed-off-by: Martyn Welch
Reviewed-by: Stefano Babic
06 Oct, 2017
2 commits
-
As reported by Coverity, we did not free dirnode in the case of failure.
Do so now.Reported-by: Coverity (CID: 131221)
Cc: Stefan Brüns
Signed-off-by: Tom Rini -
The current code doesn't compute the group descriptor checksum correctly
for the filesystems that e2fsprogs 1.43.4 creates (they have
'Group descriptor size: 64' as reported by tune2fs). Extend the checksum
calculation to be done as ext4_group_desc_csum() does in Linux.This fixes these errors in dmesg from running fs-test.sh and makes it
succeed again:[1671902.620699] EXT4-fs (loop1): ext4_check_descriptors: Checksum for group 0 failed (35782!=10965)
[1671902.620706] EXT4-fs (loop1): group descriptors corrupted!Signed-off-by: Tuomas Tynkkynen
03 Oct, 2017
1 commit
-
The ext4, reiserfs and zfs filesystems all have their own implementation
of the same function, *_devread. Generalize this function into fs_devread
and put the code into fs/fs_internal.c.Signed-off-by: Marek Behun
[trini: Move fs/fs_internal.o hunk to the end of fs/Makefile as all
cases need it]
Signed-off-by: Tom Rini
27 Aug, 2017
1 commit
-
While &p_jdb[fs->blksz] is a valid expression (it points *one* char
sized element past the end of the array, e.g. &p_jdb[fs->blksz + 1] is
invalid (according to the C standard (C99/C11)).Changing this to tag = (struct ext3_journal_block_tag *)(p_jdb + ofs);
Cc: Stefan Brüns
Suggested-by: Stefan Brüns
Reported-by: Coverity (CID: 165117, 165110)
Signed-off-by: Tom Rini
Reviewed-by: Stefan Brüns
28 Apr, 2017
1 commit
-
In file ext4fs.c funtion ext4fs_read_file() compares an
unsigned expression with < 0 like belowlbaint_t blknr;
blknr = read_allocated_block(&(node->inode), i);
if (blknr < 0)
return -1;blknr is of type ulong/uint64_t. read_allocated_block() returns
long int. So comparing blknr with < 0 will always be false. Instead
declare blknr as long int.Similarly ext4/dev.c does a similar comparison. Drop the redundant
comparison.Signed-off-by: Lokesh Vutla
Reviewed-by: Tom Rini
28 Dec, 2016
1 commit
-
genext2fs creates revision level 0 filesystems, which are not readable
by u-boot due to the initialized group descriptor size field.
f798b1dda1c5de818b806189e523d1b75db7e72dReported-by: Kever Yang
Reported-by: FrostyBytes@protonmail.com
Signed-off-by: Stefan Brüns
Tested-by: Kever Yang
22 Nov, 2016
2 commits
-
Support was already implemented, but not hooked up. This fixes several
fails in the test cases.Signed-off-by: Stefan Brüns
Acked-by: Stephen Warren -
A sparse file may have regions not mapped by any extents, at the start
or at the end of the file, or anywhere between, thus not finding a
matching extent region is never an error.Found by python filesystem tests.
Signed-off-by: Stefan Brüns
24 Oct, 2016
3 commits
-
Instead of creating a journal entry for each directory block, even
if the block is unmodified, only log the modified block.Signed-off-by: Stefan Brüns
Reviewed-by: Tom Rini
Reviewed-by: Lukasz Majewski -
The direntlen checks were quite bogus, i.e. the loop termination used
"len + offset == blocksize" (exact match only), and checked for a
direntlen less than 0. The latter can never happen as the len is
unsigned, this has been reported by Coverity, CID 153384.Use the same code as in search_dir for directory traversal. This code
has the correct checks for direntlen >= sizeof(struct dirent), and
offset < blocksize.Signed-off-by: Stefan Brüns
Reported-by: Coverity (CID: 153383, 153384)
Reviewed-by: Tom Rini
Reviewed-by: Lukasz Majewski -
Use the same variable names as in search_dir, to make purpose of variables
more obvious.Signed-off-by: Stefan Brüns
Reviewed-by: Tom Rini
24 Sep, 2016
1 commit
-
Now, arch/${ARCH}/include/asm/errno.h and include/linux/errno.h have
the same content. (both just wrap )Replace all include directives for with .
Signed-off-by: Masahiro Yamada
[trini: Fixup include/clk.]
Signed-off-by: Tom Rini
23 Sep, 2016
25 commits
-
Enable mounting of ext4 fs with 64bit feature, as it is supported now.
These had been disabled in 6f94ab6656ceffb3f2a972c8de4c554502b6f2b7.Signed-off-by: Stefan Brüns
-
Also adjust high 16/32 bits when free inode/block counts are modified.
Signed-off-by: Stefan Brüns
-
The descriptor size is variable, thus array indices are not generically
applicable. The larger group descriptors also contain e.g. high parts
of block numbers, which have to be read and written.Signed-off-by: Stefan Brüns
-
The correct descriptor size must be used when calculating offsets, and
also to read the correct amount of data.Signed-off-by: Stefan Brüns
-
The helper functions encapsulate access of the block group descriptors,
independent of group descriptor size. The helpers also deal with the
endianess of the fields, and with split fields like free_blocks/
free_blocks_high.Signed-off-by: Stefan Brüns
-
If EXT4_FEATURE_INCOMPAT_64BIT is set, the descriptor can be read from
the superblocks, otherwise it defaults to 32.Signed-off-by: Stefan Brüns
-
If the same block is updated multiple times in a row during a single
file system operation, gd_index is decremented to use the same journal
entry again. Avoid loosing the already allocated buffer.Signed-off-by: Stefan Brüns
-
read_allocated block may return block number 0, which is just an indicator
a chunk of the file is not backed by a block, i.e. it is sparse.During file deletions, just continue with the next logical block, for other
operations treat blocknumber -
The data blocks are identical for files using traditional direct/indirect
block allocation scheme and extent trees, thus this code part can be
common. Only the code to deallocate the indirect blocks to record the
used blocks has to be seperate, respectively the code to release extent
tree index blocks.Actually the code to release the extent tree index blocks is still missing,
but at least add a FIXME at the appropriate place.Signed-off-by: Stefan Brüns
-
Make sure the the extra_isize field (offset 128) is initialized to 0, to
mark any extra data as invalid.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
fs->inodesz is already correctly (i.e. dependent on fs revision)
initialized in ext4fs_mount.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
temp_ptr should always be freed, even if the function is left via
goto fail.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
If the blocksize is 1024, count is initialized with 1. Incrementing count
by 8 will never match (count == fs->blksz * 8), and ptr may be
incremented beyond the buffer end if the bitmap is filled. Add the
startblock offset after the loop.Remove the second loop, as only the first iteration will be done.
Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
The last free block of a block group may be in its middle. After it has
been allocated, the next block group should be scanned from its beginning.The following command triggers the bad behaviour (on a blocksize 1024 fs):
./sandbox/u-boot -c 'i=0; host bind 0 ./disk.raw ;
while test $i -lt 260 ; do echo $i; setexpr i $i + 1;
ext4write host 0:2 0 /X${i} 0x1450; done ;
ext4write host 0:2 0 /X240 0x2000 ; 'When 'X240' is extended from 5200 byte to 8192 byte, the new blocks should
start from the first free block (8811), but it uses the blocks 8098-8103
and 16296-16297 -- 8103 + 1 + 8192 = 16296. This can be shown with
debugfs, commands 'ffb' and 'stat X240'.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
zero_buffer is never written, thus clearing it is pointless.
journal_buffer is completely initialized by ext4fs_devread (or in case
of failure, not used).Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
e2fsck warns about "Group descriptor 0 marked uninitialized without
feature set."
The bg_itable_unused field is only defined if FEATURE_RO_COMPAT_GDT_CSUM
is set, and should be set (kept) zero otherwise.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
Scanning only the direct blocks of the directory file may falsely report
an existing file as nonexisting, and worse can also lead to creation
of a duplicate entry on file creation.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
While directories can be read using the old linear scan method, adding a
new file would require updating the index tree (alternatively, the whole
tree could be removed).Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
Previously, only the last directory block was scanned for available space.
Instead, scan all blocks back to front, and if no sufficient space is
found, eventually append a new block.
Blocks are only appended if the directory does not use extents or the new
block would require insertion of indirect blocks, as the old code does.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
The following command crashes u-boot:
./sandbox/u-boot -c 'i=0; host bind 0 ./sandbox/test/fs/3GB.ext4.img ;
while test $i -lt 200 ; do echo $i; setexpr i $i + 1;
ext4write host 0 0 /foobar${i} 0; done'Previously, the code updated the direct_block even for extents, and
fortunately crashed before pushing garbage to the disk.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
In case the dir entry creation failed, ext4fs_write would later overwrite
a random inode, as inodeno was never initialized.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
The following command triggers a segfault in search_dir:
./sandbox/u-boot -c 'host bind 0 ./sandbox/test/fs/3GB.ext4.img ;
ext4write host 0 0 /./foo 0x10'The following command triggers a segfault in check_filename:
./sandbox/u-boot -c 'host bind 0 ./sandbox/test/fs/3GB.ext4.img ;
ext4write host 0 0 /. 0x10'"." is the first entry in the directory, thus previous_dir is NULL. The
whole previous_dir block in search_dir seems to be a bad copy from
check_filename(...). As the changed data is not written to disk, the
statement is mostly harmless, save the possible NULL-ptr reference.Typically a file is unlinked by extending the direntlen of the previous
entry. If the entry is the first entry in the directory block, it is
invalidated by setting inode=0.The inode==0 case is hard to trigger without crafted filesystems. It only
hits if the first entry in a directory block is deleted and later a lookup
for the entry (by name) is done.Signed-off-by: Stefan Brüns
Reviewed-by: Lukasz Majewski -
le32_to_cpu() must only convert the revision_level and not the boolean
result.Signed-off-by: Michael Walle
-
All fields were accessed directly instead of using the proper byte swap
functions. Thus, ext4 write support was only usable on little-endian
architectures. Fix this.Signed-off-by: Michael Walle
-
Instead of __{be,le}{16,32}_to_cpu use {be,le}{16,32}_to_cpu.
Signed-off-by: Michael Walle