From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1fJ1TZ-0000BO-0F for mharc-grub-devel@gnu.org; Wed, 16 May 2018 14:48:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52514) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fJ1TW-00008c-NM for grub-devel@gnu.org; Wed, 16 May 2018 14:48:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fJ1TV-0006vy-MJ for grub-devel@gnu.org; Wed, 16 May 2018 14:48:34 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:35360) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fJ1TV-0006vj-FP for grub-devel@gnu.org; Wed, 16 May 2018 14:48:33 -0400 Received: by mail-wm0-x241.google.com with SMTP id o78-v6so4277870wmg.0 for ; Wed, 16 May 2018 11:48:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bpiC29jXHgnSzlKUq3GSlFGSEWoPskw0/rL9U9EmWNs=; b=dFkoFHy2c+5rdu8dawxT4La6sqpG4ZySj2LQDp5aIlw/bG/5j0tWzXSFYMuD2cn7Xa Mqok0DSqpeby6zf2Aw8nSFGRZgY5MxOb8FzTPFWS6KM6orzCrBMQU474k/9OkMv3/+sr iK3mYeBM/q8LjPnjUJVwLgdb540dOc+PPGsWGDVE6Ezvuxali0h0ZrFEvhydfJzSTI7U aXMzb/EKOUx2+IP9PKqJmD89I5F611wcOWGjzA1sYrukpW1TxJgo69A8xPKNcVTOhR50 3bZ7FBDRhId2CzwltkuSjrwov4vRXClKt3dUR3V3HzbFzmvSMBbq++lZ8myOW8IJ6QBv 7gZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bpiC29jXHgnSzlKUq3GSlFGSEWoPskw0/rL9U9EmWNs=; b=pgXIRTzmFESc8NvA1ZxEj5VhLnWD9gS+kIuni6ofud/AxplSFQJvr4gYCdMs39PcoI 7S1XxhzJFWW2t/cIuwbvGZ5+bAGu50XdB7ZoYAQldBy38eF1bVy7R37N6n01TfxI+WTG Q+dgmYYjXyVkc/WyLcipXooNqrai3VGpfKOJkyxckpcDSr1Tf/B3O3AWm8efqo5ZtFbK 1c+p3vsPkeSpZmkUkaqysQk88sxZ6+YhBIPZ3/6NFkcF8LJZyxmrW1s7ti7f98JVWB/f /FesN/or7aTpN7jqrwYBRLwkCisFzz3lApyw4K+d+zmyL6r0tvSH75gKZhmRFdhs2+G4 GcBA== X-Gm-Message-State: ALKqPweu+/r3VhV2/11IljvReuV6/xruC5s+A5/5DJ7Ic6SmAx+zkgQV NTy9WkJolORqAjQlDb9QetMdDg== X-Google-Smtp-Source: AB8JxZqjpUtx9qNeqBhJ55kKUQ/IiR/r0tdcha+shNuZAgVdW4SPhOLUUb9tKVsjHkEKFNCBoO1Cwg== X-Received: by 2002:a1c:f714:: with SMTP id v20-v6mr1562427wmh.73.1526496512110; Wed, 16 May 2018 11:48:32 -0700 (PDT) Received: from venice.bhome (94-38-2-55.adsl-ull.clienti.tiscali.it. [94.38.2.55]) by smtp.gmail.com with ESMTPSA id d17-v6sm3797129wrc.0.2018.05.16.11.48.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 May 2018 11:48:31 -0700 (PDT) From: Goffredo Baroncelli X-Google-Original-From: Goffredo Baroncelli To: grub-devel@gnu.org Cc: Goffredo Baroncelli Subject: [PATCH 6/9] btrfs: refactor the code that read from disk Date: Wed, 16 May 2018 20:48:16 +0200 Message-Id: <20180516184819.23736-7-kreijack@inwind.it> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180516184819.23736-1-kreijack@inwind.it> References: <20180516184819.23736-1-kreijack@inwind.it> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 May 2018 18:48:35 -0000 This is a preparatory patch, to help the adding of the RAID 5/6 recovery code. In case of availability of all disks, this code is good for all the RAID profiles. However in case of failure, the error handling is quite different. Refactoring this code increases the general readability. Signed-off-by: Goffredo Baroncelli --- grub-core/fs/btrfs.c | 85 +++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c index 51f300829..63651928b 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c @@ -625,6 +625,47 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t id) return ctx.dev_found; } +static grub_err_t +btrfs_read_from_chunk (struct grub_btrfs_data *data, + struct grub_btrfs_chunk_item *chunk, + grub_uint64_t stripen, grub_uint64_t stripe_offset, + int redundancy, grub_uint64_t csize, + void *buf) +{ + + struct grub_btrfs_chunk_stripe *stripe; + grub_disk_addr_t paddr; + grub_device_t dev; + grub_err_t err; + + stripe = (struct grub_btrfs_chunk_stripe *) (chunk + 1); + /* Right now the redundancy handling is easy. + With RAID5-like it will be more difficult. */ + stripe += stripen + redundancy; + + paddr = grub_le_to_cpu64 (stripe->offset) + stripe_offset; + + grub_dprintf ("btrfs", "stripe %" PRIxGRUB_UINT64_T + " maps to 0x%" PRIxGRUB_UINT64_T "\n", + stripen, stripe->offset); + grub_dprintf ("btrfs", "reading paddr 0x%" PRIxGRUB_UINT64_T "\n", paddr); + + dev = find_device (data, stripe->device_id); + if (!dev) + { + grub_dprintf ("btrfs", + "couldn't find a necessary member device " + "of multi-device filesystem\n"); + grub_errno = GRUB_ERR_NONE; + return GRUB_ERR_READ_ERROR; + } + + err = grub_disk_read (dev->disk, paddr >> GRUB_DISK_SECTOR_BITS, + paddr & (GRUB_DISK_SECTOR_SIZE - 1), + csize, buf); + return err; +} + static grub_err_t grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr, void *buf, grub_size_t size, int recursion_depth) @@ -638,7 +679,6 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr, grub_err_t err = 0; struct grub_btrfs_key key_out; int challoc = 0; - grub_device_t dev; struct grub_btrfs_key key_in; grub_size_t chsize; grub_disk_addr_t chaddr; @@ -879,42 +919,15 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr, for (i = 0; i < redundancy; i++) { - struct grub_btrfs_chunk_stripe *stripe; - grub_disk_addr_t paddr; - - stripe = (struct grub_btrfs_chunk_stripe *) (chunk + 1); - /* Right now the redundancy handling is easy. - With RAID5-like it will be more difficult. */ - stripe += stripen + i; - - paddr = grub_le_to_cpu64 (stripe->offset) + stripe_offset; - - grub_dprintf ("btrfs", "stripe %" PRIxGRUB_UINT64_T - " maps to 0x%" PRIxGRUB_UINT64_T "\n", - stripen, stripe->offset); - grub_dprintf ("btrfs", "reading paddr 0x%" PRIxGRUB_UINT64_T - "\n", paddr); - - dev = find_device (data, stripe->device_id); - if (!dev) - { - grub_dprintf ("btrfs", - "couldn't find a necessary member device " - "of multi-device filesystem\n"); - err = grub_errno; - grub_errno = GRUB_ERR_NONE; - continue; - } - - err = grub_disk_read (dev->disk, paddr >> GRUB_DISK_SECTOR_BITS, - paddr & (GRUB_DISK_SECTOR_SIZE - 1), - csize, buf); - if (!err) - break; - grub_errno = GRUB_ERR_NONE; + err = btrfs_read_from_chunk (data, chunk, stripen, + stripe_offset, + i, /* redundancy */ + csize, buf); + if (err == GRUB_ERR_NONE) + break; } - if (i != redundancy) - break; + if (err == GRUB_ERR_NONE) + break; } if (err) return grub_errno = err; -- 2.17.0