All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 4/8] qcow2-refcount: Move OFLAG_COPIED checks
Date: Fri, 30 Aug 2013 11:39:10 +0200	[thread overview]
Message-ID: <5220683E.8020808@redhat.com> (raw)
In-Reply-To: <20130830084842.GA2840@dhcp-200-207.str.redhat.com>

Am 30.08.2013 10:48, schrieb Kevin Wolf:
> Am 30.08.2013 um 09:46 hat Max Reitz geschrieben:
>> Move the OFLAG_COPIED checks out of check_refcounts_l1 and
>> check_refcounts_l2 and after the actual refcount checks/fixes (since the
>> refcounts might actually change there).
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>>   block/qcow2-refcount.c | 99 +++++++++++++++++++++++++++++++++-----------------
>>   1 file changed, 65 insertions(+), 34 deletions(-)
>>
>> diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
>> index 310efcc..fdc0f86 100644
>> --- a/block/qcow2-refcount.c
>> +++ b/block/qcow2-refcount.c
>> @@ -1035,7 +1035,7 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
>>       BDRVQcowState *s = bs->opaque;
>>       uint64_t *l2_table, l2_entry;
>>       uint64_t next_contiguous_offset = 0;
>> -    int i, l2_size, nb_csectors, refcount;
>> +    int i, l2_size, nb_csectors;
>>   
>>       /* Read L2 table from disk */
>>       l2_size = s->l2_size * sizeof(uint64_t);
>> @@ -1087,23 +1087,8 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
>>   
>>           case QCOW2_CLUSTER_NORMAL:
>>           {
>> -            /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
>>               uint64_t offset = l2_entry & L2E_OFFSET_MASK;
>>   
>> -            if (flags & CHECK_OFLAG_COPIED) {
>> -                refcount = get_refcount(bs, offset >> s->cluster_bits);
>> -                if (refcount < 0) {
>> -                    fprintf(stderr, "Can't get refcount for offset %"
>> -                        PRIx64 ": %s\n", l2_entry, strerror(-refcount));
>> -                    goto fail;
>> -                }
>> -                if ((refcount == 1) != ((l2_entry & QCOW_OFLAG_COPIED) != 0)) {
>> -                    fprintf(stderr, "ERROR OFLAG_COPIED: offset=%"
>> -                        PRIx64 " refcount=%d\n", l2_entry, refcount);
>> -                    res->corruptions++;
>> -                }
>> -            }
>> -
>>               if (flags & CHECK_FRAG_INFO) {
>>                   res->bfi.allocated_clusters++;
>>                   if (next_contiguous_offset &&
>> @@ -1160,7 +1145,7 @@ static int check_refcounts_l1(BlockDriverState *bs,
>>   {
>>       BDRVQcowState *s = bs->opaque;
>>       uint64_t *l1_table, l2_offset, l1_size2;
>> -    int i, refcount, ret;
>> +    int i, ret;
>>   
>>       l1_size2 = l1_size * sizeof(uint64_t);
>>   
>> @@ -1184,22 +1169,6 @@ static int check_refcounts_l1(BlockDriverState *bs,
>>       for(i = 0; i < l1_size; i++) {
>>           l2_offset = l1_table[i];
>>           if (l2_offset) {
>> -            /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
>> -            if (flags & CHECK_OFLAG_COPIED) {
>> -                refcount = get_refcount(bs, (l2_offset & ~QCOW_OFLAG_COPIED)
>> -                    >> s->cluster_bits);
>> -                if (refcount < 0) {
>> -                    fprintf(stderr, "Can't get refcount for l2_offset %"
>> -                        PRIx64 ": %s\n", l2_offset, strerror(-refcount));
>> -                    goto fail;
>> -                }
>> -                if ((refcount == 1) != ((l2_offset & QCOW_OFLAG_COPIED) != 0)) {
>> -                    fprintf(stderr, "ERROR OFLAG_COPIED: l2_offset=%" PRIx64
>> -                        " refcount=%d\n", l2_offset, refcount);
>> -                    res->corruptions++;
>> -                }
>> -            }
>> -
>>               /* Mark L2 table as used */
>>               l2_offset &= L1E_OFFSET_MASK;
>>               inc_refcounts(bs, res, refcount_table, refcount_table_size,
>> @@ -1241,7 +1210,8 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
>>   {
>>       BDRVQcowState *s = bs->opaque;
>>       int64_t size, i, highest_cluster;
>> -    int nb_clusters, refcount1, refcount2;
>> +    uint64_t *l2_table = NULL;
>> +    int nb_clusters, refcount1, refcount2, j;
>>       QCowSnapshot *sn;
>>       uint16_t *refcount_table;
>>       int ret;
>> @@ -1365,10 +1335,71 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
>>           }
>>       }
>>   
>> +    l2_table = qemu_blockalign(bs, s->cluster_size);
>> +
>> +    /* check OFLAG_COPIED */
>> +    for (i = 0; i < s->l1_size; i++) {
>> +        uint64_t l1_entry = s->l1_table[i];
>> +        uint64_t l2_offset = l1_entry & L1E_OFFSET_MASK;
>> +        int refcount;
>> +
>> +        if (!l2_offset) {
>> +            continue;
>> +        }
>> +
>> +        refcount = get_refcount(bs, l2_offset >> s->cluster_bits);
>> +        if (refcount < 0) {
>> +            /* don't print message nor increment check_errors, since the above
>> +             * loop will have done this already */
>> +            continue;
>> +        }
>> +        if ((refcount == 1) != ((l1_entry & QCOW_OFLAG_COPIED) != 0)) {
>> +            fprintf(stderr, "ERROR OFLAG_COPIED L2 cluster: l1_entry=%" PRIx64
>> +                    " refcount=%d\n",
>> +                    l1_entry, refcount);
> In theory, code motion patches shouldn't change much else, but as you're
> already changing the message here, I wouldn't mind if you also sneaked
> in the L1 index. ;-)
Okay, I'll do that.

>> +            res->corruptions++;
>> +        }
>> +
>> +        ret = bdrv_pread(bs->file, l2_offset, l2_table,
>> +                s->l2_size * sizeof(uint64_t));
> Indentation: s would usually be aligned to the same column as bs.
>
>> +        if (ret < 0) {
>> +            fprintf(stderr, "ERROR: Could not read L2 table: %s\n",
>> +                    strerror(-ret));
>> +            res->check_errors++;
>> +            goto fail;
>> +        }
>> +
>> +        for (j = 0; j < s->l2_size; j++) {
>> +            uint64_t l2_entry = be64_to_cpu(l2_table[j]);
>> +            uint64_t data_offset;
>> +
>> +            if (qcow2_get_cluster_type(l2_entry) != QCOW2_CLUSTER_NORMAL) {
>> +                continue;
>> +            }
> You're removing the check for QCOW2_CLUSTER_ZERO, which was a
> fall-through case in the original code.
Oh, right. I keep forgetting preallocations… :-/

>> +
>> +            data_offset = l2_entry & L2E_OFFSET_MASK;
>> +
>> +            refcount = get_refcount(bs, data_offset >> s->cluster_bits);
>> +            if (refcount < 0) {
>> +                /* don't print message nor increment check_errors, since the
>> +                 * above loop will have done this already */
>> +                continue;
>> +            }
>> +            if ((refcount == 1) != ((l2_entry & QCOW_OFLAG_COPIED) != 0)) {
>> +                fprintf(stderr, "ERROR OFLAG_COPIED data cluster: l2_entry=%"
>> +                        PRIx64 " refcount=%d\n",
>> +                        l2_entry, refcount);
>> +                res->corruptions++;
>> +            }
>> +        }
>> +    }
> I think it's long enough that it deserves a separate function.
Okay.

>> +
>>       res->image_end_offset = (highest_cluster + 1) * s->cluster_size;
>>       ret = 0;
>>   
>>   fail:
>> +    qemu_vfree(l2_table);
>>       g_free(refcount_table);
>>   
>>       return ret;
> Kevin

Max

  reply	other threads:[~2013-08-30  9:39 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-30  7:46 [Qemu-devel] [PATCH v3 0/8] Add metadata overlap checks Max Reitz
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 1/8] qcow2: Add corrupt bit Max Reitz
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 2/8] qcow2: Metadata overlap checks Max Reitz
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 3/8] qcow2: Employ metadata " Max Reitz
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 4/8] qcow2-refcount: Move OFLAG_COPIED checks Max Reitz
2013-08-30  8:48   ` Kevin Wolf
2013-08-30  9:39     ` Max Reitz [this message]
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 5/8] qcow2-refcount: Repair OFLAG_COPIED errors Max Reitz
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 6/8] qcow2-refcount: Repair shared refcount blocks Max Reitz
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 7/8] qcow2_check: Mark image consistent Max Reitz
2013-08-30  7:46 ` [Qemu-devel] [PATCH v3 8/8] qemu-iotests: Overlapping cluster allocations Max Reitz
2013-08-30  9:02 ` [Qemu-devel] [PATCH v3 0/8] Add metadata overlap checks 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=5220683E.8020808@redhat.com \
    --to=mreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /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.