13 May, 2014

6 commits

  • When write a file into FAT file system, it will search a match file in
    root dir. So the find_directory_entry() will get the first cluster of
    root dir content and search the directory item one by one. If the file
    is not found, we will call get_fatent_value() to get next cluster of root
    dir via lookup the FAT table and continue the search.

    The issue is in FAT16/12 system, we cannot get root dir's next clust
    from FAT table. The FAT table only be use to find the clust of data
    aera in FAT16/12.

    In FAT16/12 if the clust is in root dir, the clust number is a negative
    number or 0, 1. Since root dir is located in front of the data area.
    Data area start clust #2. So the root dir clust number should < 2.

    This patch will check above situation before call get_fatenv_value().
    If curclust is < 2, include minus number, we just increase one on the
    curclust since root dir is in continous cluster.

    The patch also add a sanity check for entry in get_fatenv_value().

    Signed-off-by: Josh Wu

    Wu, Josh
     
  • In fat_write.c, the last clust condition check is incorrect:

    if ((curclust >= 0xffffff8) || (curclust >= 0xfff8)) {
    ... ...
    }

    For example, in FAT32 if curclust is 0x11000. It is a valid clust.
    But on above condition check, it will be think as a last clust.

    So the correct last clust check should be:
    in fat32, curclust >= 0xffffff8
    in fat16, curclust >= 0xfff8
    in fat12, curclust >= 0xff8

    This patch correct the last clust check.

    Signed-off-by: Josh Wu

    Wu, Josh
     
  • This bug shows up when file stored on the ext4 file system is updated.

    The ext4fs_delete_file() is responsible for deleting file's (e.g. uImage)
    data.
    However some global data (especially ext4fs_indir2_block), which is used
    during file deletion are left unchanged.

    The ext4fs_indir2_block pointer stores reference to old ext4 double
    indirect allocated blocks. When it is unchanged, after file deletion,
    ext4fs_write_file() uses the same pointer (since it is already initialized
    - i.e. not NULL) to return number of blocks to write. This trunks larger
    file when previous one was smaller.

    Lets consider following scenario:

    1. Flash target with ext4 formatted boot.img (which has uImage [*] on itself)
    2. Developer wants to upload their custom uImage [**]
    - When new uImage [**] is smaller than the [*] - everything works
    correctly - we are able to store the whole smaller file with corrupted
    ext4fs_indir2_block pointer
    - When new uImage [**] is larger than the [*] - theCRC is corrupted,
    since truncation on data stored at eMMC was done.
    3. When uImage CRC error appears, then reboot and LTHOR/DFU reflashing causes
    proper setting of ext4fs_indir2_block() and after that uImage[**]
    is successfully stored (correct uImage [*] metadata is stored at an
    eMMC on the first flashing).

    Due to above the bug was very difficult to reproduce.
    This patch sets default values for all ext4fs_indir* pointers/variables.

    Signed-off-by: Lukasz Majewski

    Łukasz Majewski
     
  • Code responsible for handling situation when ext4 has block size of 1024B
    can be ordered to take less space.

    This patch does that for ext4 common and write files.

    Signed-off-by: Lukasz Majewski

    Łukasz Majewski
     
  • __DATE__ and __TIME__ makes the build non-deterministic.
    Drop the debug message using them.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • Use of malloc of do_fat_write() causes cache error on ARM v7 platforms.
    Perhaps, the same problem will occur at any other CPUs.
    This replaces malloc with memalign to fix cache buffer alignment.

    Signed-off-by: Nobuhiro Iwamatsu
    Signed-off-by: Yoshiyuki Ito
    Tested-by: Hector Palacios

    Nobuhiro Iwamatsu
     

05 Mar, 2014

1 commit

  • U-Boot already has a list implementation, and files which include both
    that and the yaffs implementation will get errors:

    In file included from ydirectenv.h:80:0,
    from yportenv.h:81,
    from yaffs_guts.h:19,
    from yaffs_allocator.h:19,
    from yaffs_allocator.c:14:
    yaffs_list.h:32:8: error: redefinition of ‘struct list_head’
    struct list_head {
    ^

    Remove the yaffs implementation.

    Signed-off-by: Simon Glass

    Simon Glass
     

27 Feb, 2014

2 commits

  • Conflicts:
    arch/arm/cpu/armv7/config.mk
    board/ti/am43xx/mux.c
    include/configs/am43xx_evm.h

    Signed-off-by: Tom Rini

    Tom Rini
     
  • When we tell the compiler to optimize for ARMv7 (and ARMv6 for that
    matter) it assumes a default of SCTRL.A being cleared and unaligned
    accesses being allowed and fast at the hardware level. We set this bit
    and must pass along -mno-unaligned-access so that the compiler will
    still breakdown accesses and not trigger a data abort.

    To better help understand the requirements of the project with respect
    to unaligned memory access, the
    Documentation/unaligned-memory-access.txt file has been added as
    doc/README.unaligned-memory-access.txt and is taken from the v3.14-rc1
    tag of the kernel.

    Cc: Albert ARIBAUD
    Cc: Mans Rullgard
    Signed-off-by: Tom Rini

    Tom Rini
     

26 Feb, 2014

1 commit


22 Feb, 2014

2 commits

  • Fix the following checkpatch warning:-

    WARNING: externs should be avoided in .c files

    Signed-off-by: Murali Karicheri

    Karicheri, Muralidharan
     
  • In an ext4 filesystem, the inode corresponding to a file has a 60-byte
    area which contains an extent header structure and up to 4 extent
    structures (5 x 12 bytes).

    For files that need more than 4 extents to be represented (either files
    larger than 4 x 128MB = 512MB or smaller files but very fragmented),
    ext4 creates extent index structures. Each extent index points to a 4KB
    physical block where one extent header and additional 340 extents could
    be stored.

    The current u-boot ext4 code is very inefficient when it tries to load a
    file which has extent indexes. For each logical file block the code will
    read over and over again the same blocks of 4096 bytes from the disk.

    Since the extent tree in a file is always the same, we can cache the
    extent structures in memory before actually starting to read the file.

    This patch creates a simple linked list of structures holding information
    about all the extents used to represent a file. The list is sorted by
    the logical block number (ee_block) so that we can easily find the
    proper extent information for any file block.

    Without this patch, a 69MB file which had just one extent index pointing
    to a block with another 6 extents was read in approximately 3 minutes.
    With this patch applied the same file can be read in almost 20 seconds.

    Signed-off-by: Ionut Nicu

    Ionut Nicu
     

21 Feb, 2014

1 commit


20 Feb, 2014

2 commits

  • Now we are ready to switch over to real Kbuild.

    This commit disables temporary scripts:
    scripts/{Makefile.build.tmp, Makefile.host.tmp}
    and enables real Kbuild scripts:
    scripts/{Makefile.build,Makefile.host,Makefile.lib}.

    This switch is triggered by the line in scripts/Kbuild.include
    -build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build.tmp obj
    +build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

    We need to adjust some build scripts for U-Boot.
    But smaller amount of modification is preferable.

    Additionally, we need to fix compiler flags which are
    locally added or removed.

    In Kbuild, it is not allowed to change CFLAGS locally.
    Instead, ccflags-y, asflags-y, cppflags-y,
    CFLAGS_$(basetarget).o, CFLAGS_REMOVE_$(basetarget).o
    are prepared for that purpose.

    Signed-off-by: Masahiro Yamada
    Tested-by: Gerhard Sittig

    Masahiro Yamada
     
  • This commit changes the working directory
    where the build process occurs.

    Before this commit, build process occurred under the source
    tree for both in-tree and out-of-tree build.

    That's why we needed to add $(obj) prefix to all generated
    files in makefiles like follows:
    $(obj)u-boot.bin: $(obj)u-boot

    Here, $(obj) is empty for in-tree build, whereas it points
    to the output directory for out-of-tree build.

    And our old build system changes the current working directory
    with "make -C " syntax when descending into the
    sub-directories.

    On the other hand, Kbuild uses a different idea
    to handle out-of-tree build and directory descending.

    The build process of Kbuild always occurs under the output tree.
    When "O=dir/to/store/output/files" is given, the build system
    changes the current working directory to that directory and
    restarts the make.

    Kbuild uses "make -f $(srctree)/scripts/Makefile.build obj="
    syntax for descending into sub-directories.
    (We can write it like "make $(obj)=" with a shorthand.)
    This means the current working directory is always the top
    of the output directory.

    Signed-off-by: Masahiro Yamada
    Tested-by: Gerhard Sittig

    Masahiro Yamada
     

19 Feb, 2014

6 commits

  • This hooks into the generic "file exists" support added in an earlier
    patch, and provides an implementation for the FAT filesystem.

    Signed-off-by: Stephen Warren
    Acked-by: Simon Glass

    Stephen Warren
     
  • This hooks into the generic "file exists" support added in an earlier
    patch, and provides an implementation for the ext4 filesystem.

    Signed-off-by: Stephen Warren
    Acked-by: Simon Glass

    Stephen Warren
     
  • This hooks into the generic "file exists" support added in an earlier
    patch, and provides an implementation for the sandbox test environment.

    Signed-off-by: Stephen Warren
    Acked-by: Simon Glass

    Stephen Warren
     
  • FAT and ext4 expect that the passed in block device descriptor not be
    NULL. This causes problems on sandbox, where get_device_and_partition()
    succeeds for the "host" device, yet passes back a NULL device descriptor.
    Add special handling for this situation, so that the generic filesystem
    commands operate as expected on sandbox.

    Signed-off-by: Stephen Warren

    Stephen Warren
     
  • This could be used in scripts such as:

    if test -e mmc 0:1 /boot/boot.scr; then
    load mmc 0:1 ${scriptaddr} /boot/boot.scr
    source ${scriptaddr}
    fi

    rather than:

    if load mmc 0:1 ${scriptaddr} /boot/boot.scr; then
    source ${scriptaddr}
    fi

    This prevents errors being printed by attempts to load non-existent
    files, which can be important when checking for a large set of files,
    such as /boot/boot.scr.uimg, /boot/boot.scr, /boot/extlinux.conf,
    /boot.scr.uimg, /boot.scr, /extlinux.conf.

    Signed-off-by: Stephen Warren
    Acked-by: Simon Glass

    Stephen Warren
     
  • Fix a few issues with the generic "save" shell command, and fs_write()
    function.

    1) fstypes[].write wasn't filled in for some file-systems, and isn't
    checked when used, which could cause crashes/... if executing save
    on e.g. fat/ext filesystems.

    2) fs_write() requires the length argument to be non-zero, since it needs
    to know exactly how many bytes to write. Adjust the comments and code
    according to this.

    3) fs_write() wasn't prototyped in like other generic functions;
    other code should be able to call this directly rather than invoking
    the "save" shell command.

    Signed-off-by: Stephen Warren
    Acked-by: Simon Glass

    Stephen Warren
     

20 Jan, 2014

5 commits

  • The summary already has other verification. This one is not needed.

    The check caused summaries to be ignored if they were not on the
    numbered block. This caused problems when a summary was embedded in an
    image and the image is written to a flash with bad blocks.

    Signed-off-by: Charles Manning

    Charles Manning
     
  • For files where we actually have extent indexes following
    an extent header (ext_block->eh_depth != 0), the do/while
    loop from ext4fs_get_extent_block() does not select the
    proper extent index structure.

    For example, if we have:

    ext_block->eh_depth = 1
    ext_block->eh_entries = 1
    fileblock = 0
    index[0].ei_block = 0

    the do/while loop will exit with i set to 0 and the
    ext4fs_get_extent_block() function will return 0, even if
    there was a valid extent index structure following the
    header.

    Signed-off-by: Ionut Nicu
    Signed-off-by: Mathias Rulf

    Ionut Nicu
     
  • Using fs->blksz in ext4fs_get_extent_block() is not
    correct since fs->blksz is not initialized on the
    read path. Use EXT2_BLOCK_SIZE() instead which will
    produce the desired output.

    Signed-off-by: Ionut Nicu
    Signed-off-by: Mathias Rulf

    Ionut Nicu
     
  • Curently, we are using 32 bit multiplication to calculate the offset,
    so the result will always be 32 bit.
    This can silently cause file system corruption when performing a write
    operation on partition larger than 4 GiB.

    This patch address the issue by simply promoting the terms to 64 bit,
    and let compilers decide how to do the multiplication efficiently.

    Signed-off-by: Ma Haijun

    Ma Haijun
     
  • It may cause file system corruption when do a write operation.
    This issue only affects boards that use 32 bit lbaint_t.

    Signed-off-by: Ma Haijun

    Ma Haijun
     

13 Dec, 2013

2 commits


18 Nov, 2013

2 commits


09 Nov, 2013

1 commit

  • Curently memcpy copies string without null terminating char because
    function strlen returns only number of characters excluding
    null terminating character. Replace memcpy with strcpy.

    Signed-off-by: Piotr Wilczek
    Signed-off-by: Kyungmin Park
    CC: Tom Rini

    Piotr Wilczek
     

01 Nov, 2013

2 commits


16 Oct, 2013

1 commit

  • commit 39ac34473f3c96e77cbe03a49141771ed1639486 ("cmd_mtdparts: use 64
    bits for flash size, partition size & offset") introduced warnings
    in a couple places due to printf formats or pointer casting.

    This patch fixes the warnings pointed out here:
    http://lists.denx.de/pipermail/u-boot/2013-October/164981.html

    Signed-off-by: Scott Wood
    Cc: York Sun
    Cc: Stefan Roese
    Cc: Paul Burton
    Cc: Tom Rini

    Scott Wood
     

15 Oct, 2013

1 commit


08 Oct, 2013

1 commit

  • As documented, almost all U-Boot commands expect numbers to be entered
    in hexadecimal input format. (Exception: for historical reasons, the
    "sleep" command takes its argument in decimal input format.)

    This rule was broken for the "load" command; for details please see
    especially commits 045fa1e "fs: add filesystem switch libary,
    implement ls and fsload commands" and 3f83c87 "fs: fix number base
    behaviour change in fatload/ext*load". In the result, the load
    command would always require an explicit "0x" prefix for regular
    (i. e. base 16 formatted) input.

    Change this to use the standard notation of base 16 input format.
    While strictly speaking this is a change of the user interface, we
    hope that it will not cause trouble. Stephen Warren comments (see
    [1]):

    I suppose you can change the behaviour if you want; anyone
    writing "0x..." for their values presumably won't be
    affected, and if people really do assume all values in U-Boot
    are in hex, presumably nobody currently relies upon using
    non-prefixed values with the generic load command, since it
    doesn't work like that right now.

    [1] http://article.gmane.org/gmane.comp.boot-loaders.u-boot/171172

    Acked-by: Tom Rini
    Acked-by: Stephen Warren
    Signed-off-by: Wolfgang Denk

    Wolfgang Denk
     

07 Sep, 2013

1 commit

  • In the set_cluster() function, it will convert the buffer size to sector
    numbers. Then call disk_write() to write by sector.
    For remaining buffer, the size is less than a sector, call disk_write()
    again to write them in one sector.

    But if the total buffer size is less then one sector, the original code
    will call disk_write() with zero sector number. It is unnecessary.
    So this patch fix this. Now it will not call disk_write() if total buffer size
    is less than one sector.

    Signed-off-by: Josh Wu

    Wu, Josh
     

20 Aug, 2013

1 commit


24 Jul, 2013

1 commit


22 Jul, 2013

1 commit

  • Fix reading ext4_extent_header struture on BE machines. Some 16 bit
    fields where converted to 32 bit fields, due to the byte swap on BE
    machines the containing value was corrupted. Therefore reading ext4
    filesystems on BE machines where broken before.

    Signed-off-by: Rommel Custodio
    [sent via git-send-email; rework commit message]
    Signed-off-by: Andreas Bießmann
    Reviewed-by: Simon Glass
    Tested-by: Simon Glass
    Tested-by: Lukasz Majewski

    Rommel Custodio