From: Lukasz Majewski <l.majewski@samsung.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/2] fs:ext4:write:fix: Reinitialize global variables after updating a file
Date: Mon, 05 May 2014 07:52:45 +0200 [thread overview]
Message-ID: <20140505075245.1be49bdc@amdc2363> (raw)
In-Reply-To: <CAPnjgZ0UmG9X4U6H8SgtL-+OLoh6XohZZy+ujvoT6VfA=FDSTw@mail.gmail.com>
Hi Simon,
> Hi Lukasz,
>
> On 30 April 2014 03:39, Lukasz Majewski <l.majewski@samsung.com>
> wrote:
> > 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 THOR/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.
>
> I wonder if a sandbox test would be a good idea? You could fairly easy
> mkfs in a loopback file and write a U-Boot script to operate on it.
> See test/ for some examples.
If my time budget allows, I will try to add test to sandbox.
>
> > This patch sets default values for all ext4fs_indir*
> > pointers/variables.
> >
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > ---
> > fs/ext4/ext4_common.c | 23 ++++++++++++++---------
> > fs/ext4/ext4_write.c | 1 +
> > include/ext4fs.h | 1 +
> > 3 files changed, 16 insertions(+), 9 deletions(-)
> >
> > diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
> > index 62e2e80..d0de285 100644
> > --- a/fs/ext4/ext4_common.c
> > +++ b/fs/ext4/ext4_common.c
> > @@ -1841,16 +1841,8 @@ long int read_allocated_block(struct
> > ext2_inode *inode, int fileblock) return blknr;
> > }
> >
> > -void ext4fs_close(void)
> > +void ext4fs_reinit_global(void)
> > {
> > - if ((ext4fs_file != NULL) && (ext4fs_root != NULL)) {
> > - ext4fs_free_node(ext4fs_file,
> > &ext4fs_root->diropen);
> > - ext4fs_file = NULL;
> > - }
> > - if (ext4fs_root != NULL) {
> > - free(ext4fs_root);
> > - ext4fs_root = NULL;
> > - }
> > if (ext4fs_indir1_block != NULL) {
> > free(ext4fs_indir1_block);
> > ext4fs_indir1_block = NULL;
> > @@ -1870,6 +1862,19 @@ void ext4fs_close(void)
> > ext4fs_indir3_blkno = -1;
> > }
> > }
> > +void ext4fs_close(void)
> > +{
> > + if ((ext4fs_file != NULL) && (ext4fs_root != NULL)) {
> > + ext4fs_free_node(ext4fs_file,
> > &ext4fs_root->diropen);
> > + ext4fs_file = NULL;
> > + }
> > + if (ext4fs_root != NULL) {
> > + free(ext4fs_root);
> > + ext4fs_root = NULL;
> > + }
> > +
> > + ext4fs_reinit_global();
> > +}
> >
> > int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
> > struct ext2fs_node **fnode, int
> > *ftype) diff --git a/fs/ext4/ext4_write.c b/fs/ext4/ext4_write.c
> > index 46c573b..4a5f652 100644
> > --- a/fs/ext4/ext4_write.c
> > +++ b/fs/ext4/ext4_write.c
> > @@ -562,6 +562,7 @@ static int ext4fs_delete_file(int inodeno)
> >
> > ext4fs_update();
> > ext4fs_deinit();
> > + ext4fs_reinit_global();
> >
> > if (ext4fs_init() != 0) {
> > printf("error in File System init\n");
> > diff --git a/include/ext4fs.h b/include/ext4fs.h
> > index aacb147..fbbb002 100644
> > --- a/include/ext4fs.h
> > +++ b/include/ext4fs.h
> > @@ -133,6 +133,7 @@ int ext4fs_open(const char *filename);
> > int ext4fs_read(char *buf, unsigned len);
> > int ext4fs_mount(unsigned part_length);
> > void ext4fs_close(void);
> > +void ext4fs_reinit_global(void);
>
> Can we have a comment as to what this function does?
I can add comment to the source code. No problem.
>
> > int ext4fs_ls(const char *dirname);
> > int ext4fs_exists(const char *filename);
> > void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node
> > *currroot); --
> > 1.7.10.4
> >
>
> Regards,
> Simon
--
Best regards,
Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
next prev parent reply other threads:[~2014-05-05 5:52 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-30 10:39 [U-Boot] [PATCH 0/2] fs:ext4: Fixes and code cleanup Lukasz Majewski
2014-04-30 10:39 ` [U-Boot] [PATCH 1/2] fs:ext4:cleanup: Remove superfluous code Lukasz Majewski
2014-04-30 19:15 ` Simon Glass
2014-05-05 5:20 ` Lukasz Majewski
2014-05-05 14:24 ` Simon Glass
2014-05-05 21:10 ` Lukasz Majewski
2014-05-05 21:12 ` Simon Glass
2014-04-30 10:39 ` [U-Boot] [PATCH 2/2] fs:ext4:write:fix: Reinitialize global variables after updating a file Lukasz Majewski
2014-04-30 19:21 ` Simon Glass
2014-05-05 5:52 ` Lukasz Majewski [this message]
2014-05-06 7:36 ` [U-Boot] [PATCH v2 0/2] fs:ext4: Fixes and code cleanup Lukasz Majewski
2014-05-06 7:36 ` [U-Boot] [PATCH v2 1/2] fs:ext4:cleanup: Remove superfluous code Lukasz Majewski
2014-05-13 1:54 ` [U-Boot] [U-Boot, v2, " Tom Rini
2014-05-06 7:36 ` [U-Boot] [PATCH v2 2/2] fs:ext4:write:fix: Reinitialize global variables after updating a file Lukasz Majewski
2014-05-13 1:54 ` [U-Boot] [U-Boot, v2, " Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140505075245.1be49bdc@amdc2363 \
--to=l.majewski@samsung.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.