From: Kevin Wolf <kwolf@redhat.com>
To: Amjad Alsharafi <amjadsharafi10@gmail.com>
Cc: qemu-devel@nongnu.org, Hanna Reitz <hreitz@redhat.com>,
"open list:vvfat" <qemu-block@nongnu.org>
Subject: Re: [PATCH v4 2/4] vvfat: Fix usage of `info.file.offset`
Date: Mon, 10 Jun 2024 18:49:43 +0200 [thread overview]
Message-ID: <Zmcup6IVpHW3sRP5@redhat.com> (raw)
In-Reply-To: <a4ae80b8307284a8b30f0267171cca850f12dc42.1717549035.git.amjadsharafi10@gmail.com>
Am 05.06.2024 um 02:58 hat Amjad Alsharafi geschrieben:
> The field is marked as "the offset in the file (in clusters)", but it
> was being used like this
> `cluster_size*(nums)+mapping->info.file.offset`, which is incorrect.
>
> Additionally, removed the `abort` when `first_mapping_index` does not
> match, as this matches the case when adding new clusters for files, and
> its inevitable that we reach this condition when doing that if the
> clusters are not after one another, so there is no reason to `abort`
> here, execution continues and the new clusters are written to disk
> correctly.
>
> Signed-off-by: Amjad Alsharafi <amjadsharafi10@gmail.com>
Can you help me understand how first_mapping_index really works?
It seems to me that you get a chain of mappings for each file on the FAT
filesystem, which are just the contiguous areas in it, and
first_mapping_index refers to the mapping at the start of the file. But
for much of the time, it actually doesn't seem to be set at all, so you
have mapping->first_mapping_index == -1. Do you understand the rules
around when it's set and when it isn't?
> block/vvfat.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/block/vvfat.c b/block/vvfat.c
> index 19da009a5b..f0642ac3e4 100644
> --- a/block/vvfat.c
> +++ b/block/vvfat.c
> @@ -1408,7 +1408,9 @@ read_cluster_directory:
>
> assert(s->current_fd);
>
> - offset=s->cluster_size*(cluster_num-s->current_mapping->begin)+s->current_mapping->info.file.offset;
> + offset = s->cluster_size *
> + ((cluster_num - s->current_mapping->begin)
> + + s->current_mapping->info.file.offset);
> if(lseek(s->current_fd, offset, SEEK_SET)!=offset)
> return -3;
> s->cluster=s->cluster_buffer;
> @@ -1929,8 +1931,9 @@ get_cluster_count_for_direntry(BDRVVVFATState* s, direntry_t* direntry, const ch
> (mapping->mode & MODE_DIRECTORY) == 0) {
>
> /* was modified in qcow */
> - if (offset != mapping->info.file.offset + s->cluster_size
> - * (cluster_num - mapping->begin)) {
> + if (offset != s->cluster_size
> + * ((cluster_num - mapping->begin)
> + + mapping->info.file.offset)) {
> /* offset of this cluster in file chain has changed */
> abort();
> copy_it = 1;
> @@ -1944,7 +1947,6 @@ get_cluster_count_for_direntry(BDRVVVFATState* s, direntry_t* direntry, const ch
>
> if (mapping->first_mapping_index != first_mapping_index
> && mapping->info.file.offset > 0) {
> - abort();
> copy_it = 1;
> }
I'm unsure which case this represents. If first_mapping_index refers to
the mapping of the first cluster in the file, does this mean we got a
mapping for a different file here? Or is the comparison between -1 and a
real value?
In any case it doesn't seem to be the case that the comment at the
declaration of copy_it describes.
>
> @@ -2404,7 +2406,7 @@ static int commit_mappings(BDRVVVFATState* s,
> (mapping->end - mapping->begin);
> } else
> next_mapping->info.file.offset = mapping->info.file.offset +
> - mapping->end - mapping->begin;
> + (mapping->end - mapping->begin);
>
> mapping = next_mapping;
> }
Kevin
next prev parent reply other threads:[~2024-06-10 16:51 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-05 0:58 [PATCH v4 0/4] vvfat: Fix write bugs for large files and add iotests Amjad Alsharafi
2024-06-05 0:58 ` [PATCH v4 1/4] vvfat: Fix bug in writing to middle of file Amjad Alsharafi
2024-06-05 0:58 ` [PATCH v4 2/4] vvfat: Fix usage of `info.file.offset` Amjad Alsharafi
2024-06-10 16:49 ` Kevin Wolf [this message]
2024-06-11 12:31 ` Amjad Alsharafi
2024-06-11 14:30 ` Kevin Wolf
2024-06-11 16:22 ` Amjad Alsharafi
2024-06-11 18:11 ` Kevin Wolf
2024-06-05 0:58 ` [PATCH v4 3/4] vvfat: Fix reading files with non-continuous clusters Amjad Alsharafi
2024-06-05 0:58 ` [PATCH v4 4/4] iotests: Add `vvfat` tests Amjad Alsharafi
2024-06-10 12:01 ` Kevin Wolf
2024-06-10 14:11 ` Amjad Alsharafi
2024-06-10 16:50 ` Kevin Wolf
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=Zmcup6IVpHW3sRP5@redhat.com \
--to=kwolf@redhat.com \
--cc=amjadsharafi10@gmail.com \
--cc=hreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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.