public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Przemyslaw Marczak <p.marczak@samsung.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] fs: fat: read: fix fat16 ls/read issue
Date: Thu, 18 Dec 2014 15:06:42 +0100	[thread overview]
Message-ID: <5492DF72.5080203@samsung.com> (raw)
In-Reply-To: <CAPnjgZ3QgxmkF7wYxX_A8ONfo9z-xQ42anhad0g9YBf-17QfVA@mail.gmail.com>

Hello,

On 12/18/2014 02:47 PM, Simon Glass wrote:
> Hi,
>
> On 11 December 2014 at 05:01, Przemyslaw Marczak <p.marczak@samsung.com> wrote:
>> The present fat implementation ignores FAT16 long name
>> directory entries which aren't placed in a single sector.
>>
>> This was becouse of the buffer was always filled by the
>> two sectors, and the loop was made also for two sectors.
>>
>> If some file long name entries are stored in two sectors,
>> the we have two cases:
>>
>> Case 1:
>> Both of sectors are in the buffer - all required data
>> for long file name is in the buffer.
>> - Read OK!
>>
>> Case 2:
>> The current directory entry is placed at the end of the
>> second buffered sector. And the next entries are placed
>> in a sector which is not buffered yet. Then two next
>> sectors are buffered and the mentioned entry is ignored.
>> - Read fail!
>>
>> This commit fixes this issue by:
>> - read two sectors after loop on each single is done
>> - keep the last used sector as a first in the buffer
>>    before the read of two next
>>
>> The commit doesn't affects the fat32 imlementation,
>> which works good as previous.
>>
>> Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
>> Cc: Mikhail Zolotaryov <lebon@lebon.org.ua>
>> Cc: Tom Rini <trini@ti.com>
>> Cc: Stephen Warren <swarren@nvidia.com>
>> Cc: Simon Glass <sjg@chromium.org>
>> Cc: Suriyan Ramasami <suriyan.r@gmail.com>
>> Cc: Lukasz Majewski <l.majewski@samsung.com>
>> Cc: Wolfgang Denk <wd@denx.de>
>> ---
>>   fs/fat/fat.c | 33 ++++++++++++++++++++++++---------
>>   1 file changed, 24 insertions(+), 9 deletions(-)
>
> Tested-by: Simon Glass <sjg@chomium.org>
>

Thank you.

>>
>> diff --git a/fs/fat/fat.c b/fs/fat/fat.c
>> index 04a51db..afbf12d 100644
>> --- a/fs/fat/fat.c
>> +++ b/fs/fat/fat.c
>> @@ -823,8 +823,11 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
>>          int ret = -1;
>>          int firsttime;
>>          __u32 root_cluster = 0;
>> +       __u32 read_blk;
>>          int rootdir_size = 0;
>> -       int j;
>> +       int j, k;
>
> What is k? Can we use a proper variable name? Also for j. That might
> save needing a comment for them.
>

k is a counter for a first time read. I will change this code and add 
some comment.

>> +       int do_read;
>> +       __u8 *dir_ptr;
>
> Why does it use __u8 instead of u8 or uint8_t for example?
>>
>>          if (read_bootsectandvi(&bs, &volinfo, &mydata->fatsize)) {
>>                  debug("Error: reading boot sector\n");
>> @@ -910,23 +913,35 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
>>          }
>>
>>          j = 0;
>> +       k = 0;
>>          while (1) {
>>                  int i;
>>
>> -               if (j == 0) {
>> +               if (mydata->fatsize == 32 || !k) {
>> +                       dir_ptr = do_fat_read_at_block;
>> +                       k = 1;
>> +               } else {
>> +                       dir_ptr = (do_fat_read_at_block + mydata->sect_size);
>> +                       memcpy(do_fat_read_at_block, dir_ptr, mydata->sect_size);
>> +               }
>> +
>> +               do_read = 1;
>> +
>> +               if (mydata->fatsize == 32 && j)
>> +                       do_read = 0;
>> +
>> +               if (do_read) {
>>                          debug("FAT read sect=%d, clust_size=%d, DIRENTSPERBLOCK=%zd\n",
>>                                  cursect, mydata->clust_size, DIRENTSPERBLOCK);
>>
>> -                       if (disk_read(cursect,
>> -                                       (mydata->fatsize == 32) ?
>> -                                       (mydata->clust_size) :
>> -                                       PREFETCH_BLOCKS,
>> -                                       do_fat_read_at_block) < 0) {
>> +                       read_blk = (mydata->fatsize == 32) ?
>> +                                   mydata->clust_size : PREFETCH_BLOCKS;
>> +                       if (disk_read(cursect, read_blk, dir_ptr) < 0) {
>>                                  debug("Error: reading rootdir block\n");
>>                                  goto exit;
>>                          }
>>
>> -                       dentptr = (dir_entry *) do_fat_read_at_block;
>> +                       dentptr = (dir_entry *)dir_ptr;
>>                  }
>>
>>                  for (i = 0; i < DIRENTSPERBLOCK; i++) {
>> @@ -951,7 +966,7 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
>>
>>                                          get_vfatname(mydata,
>>                                                       root_cluster,
>> -                                                    do_fat_read_at_block,
>> +                                                    dir_ptr,
>>                                                       dentptr, l_name);
>>
>>                                          if (dols == LS_ROOT) {
>> --
>> 1.9.1
>>
>
> Regards,
> Simon
>

Thank you and best regards,
-- 
Przemyslaw Marczak
Samsung R&D Institute Poland
Samsung Electronics
p.marczak at samsung.com

  reply	other threads:[~2014-12-18 14:06 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-11 12:01 [U-Boot] [PATCH] fs: fat: read: fix fat16 ls/read issue Przemyslaw Marczak
2014-12-12  0:32 ` Simon Glass
2014-12-12 15:30   ` Przemyslaw Marczak
2014-12-12 15:52     ` [U-Boot] [PATCH] fat: scripts for prepare and test read fat files Przemyslaw Marczak
2014-12-12 15:54       ` Przemyslaw Marczak
2014-12-16 20:41         ` Simon Glass
2014-12-17  8:53           ` Przemyslaw Marczak
2014-12-16 22:26     ` [U-Boot] [PATCH] fs: fat: read: fix fat16 ls/read issue Simon Glass
2014-12-17  8:53       ` Przemyslaw Marczak
2014-12-17  9:03       ` Przemyslaw Marczak
2014-12-18  3:39         ` Simon Glass
2014-12-18 10:26           ` Przemyslaw Marczak
2014-12-18 13:14             ` Simon Glass
2014-12-18 13:31               ` Przemyslaw Marczak
2014-12-18 13:36                 ` Simon Glass
2014-12-18 13:41                   ` Przemyslaw Marczak
2014-12-18 13:47 ` Simon Glass
2014-12-18 14:06   ` Przemyslaw Marczak [this message]
2014-12-18 14:32   ` Przemyslaw Marczak
2014-12-18 14:34     ` Simon Glass
2014-12-18 14:40       ` Przemyslaw Marczak
2014-12-18 14:56         ` Simon Glass
2014-12-18 15:12           ` Przemyslaw Marczak
2014-12-18 15:21 ` [U-Boot] [PATCH v2] " Przemyslaw Marczak
2014-12-18 16:14   ` [U-Boot] [PATCH v3] " Przemyslaw Marczak
2015-01-07 15:12     ` [U-Boot] [U-Boot,v3] " 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=5492DF72.5080203@samsung.com \
    --to=p.marczak@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox