From: Jes Sorensen <Jes.Sorensen@redhat.com>
To: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Cc: linux-raid@vger.kernel.org
Subject: Re: [PATCH 2/2] super1: fix setting bad block log offset in write_init_super1()
Date: Wed, 16 Nov 2016 09:58:36 -0500 [thread overview]
Message-ID: <wrfj4m37mpyb.fsf@redhat.com> (raw)
In-Reply-To: <20161110105054.29869-2-artur.paszkiewicz@intel.com> (Artur Paszkiewicz's message of "Thu, 10 Nov 2016 11:50:54 +0100")
Artur Paszkiewicz <artur.paszkiewicz@intel.com> writes:
> Commit f79bbf4f6904 ("super1: don't put the bblog at the end of the free
> space.") changed the location of the bad block log to be after the
> write-intent bitmap, but a fixed offset was used and it can make bbl
> overlap with the bitmap, especially when using a small bitmap chunk.
> This patch changes it to use the actual offset and size of the bitmap.
> It also joins the cases for v1.1 and v1.2 superblock because the code
> was very similar.
>
> Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
> ---
> super1.c | 47 +++++++++++++++++++++++------------------------
> 1 file changed, 23 insertions(+), 24 deletions(-)
Applied!
Thanks,
Jes
>
> diff --git a/super1.c b/super1.c
> index 982d88c..1d03a0a 100644
> --- a/super1.c
> +++ b/super1.c
> @@ -1693,6 +1693,7 @@ static int write_init_super1(struct supertype *st)
> unsigned long long dsize, array_size;
> unsigned long long sb_offset;
> unsigned long long data_offset;
> + long bm_offset;
>
> for (di = st->info; di; di = di->next) {
> if (di->disk.state & (1 << MD_DISK_JOURNAL))
> @@ -1760,15 +1761,25 @@ static int write_init_super1(struct supertype *st)
> * data_offset has already been set.
> */
> array_size = __le64_to_cpu(sb->size);
> - /* work out how much space we left for a bitmap,
> - * Add 8 sectors for bad block log */
> - bm_space = choose_bm_space(array_size) + 8;
> +
> + /* work out how much space we left for a bitmap */
> + if (sb->feature_map & __cpu_to_le32(MD_FEATURE_BITMAP_OFFSET)) {
> + bitmap_super_t *bms = (bitmap_super_t *)
> + (((char *)sb) + MAX_SB_SIZE);
> + bm_space = calc_bitmap_size(bms, 4096) >> 9;
> + bm_offset = (long)__le32_to_cpu(sb->bitmap_offset);
> + } else {
> + bm_space = choose_bm_space(array_size);
> + bm_offset = 8;
> + }
>
> data_offset = di->data_offset;
> if (data_offset == INVALID_SECTORS)
> data_offset = st->data_offset;
> switch(st->minor_version) {
> case 0:
> + /* Add 8 sectors for bad block log */
> + bm_space += 8;
> if (data_offset == INVALID_SECTORS)
> data_offset = 0;
> sb_offset = dsize;
> @@ -1785,38 +1796,26 @@ static int write_init_super1(struct supertype *st)
> }
> break;
> case 1:
> - sb->super_offset = __cpu_to_le64(0);
> - if (data_offset == INVALID_SECTORS)
> - data_offset = 16;
> -
> - sb->data_offset = __cpu_to_le64(data_offset);
> - sb->data_size = __cpu_to_le64(dsize - data_offset);
> - if (data_offset >= 8 + 32*2 + 8) {
> - sb->bblog_size = __cpu_to_le16(8);
> - sb->bblog_offset = __cpu_to_le32(8 + 32*2);
> - } else if (data_offset >= 16) {
> - sb->bblog_size = __cpu_to_le16(8);
> - sb->bblog_offset = __cpu_to_le32(data_offset-8);
> - }
> - break;
> case 2:
> - sb_offset = 4*2;
> + sb_offset = st->minor_version == 2 ? 8 : 0;
> sb->super_offset = __cpu_to_le64(sb_offset);
> if (data_offset == INVALID_SECTORS)
> - data_offset = 24;
> + data_offset = sb_offset + 16;
>
> sb->data_offset = __cpu_to_le64(data_offset);
> sb->data_size = __cpu_to_le64(dsize - data_offset);
> - if (data_offset >= 16 + 32*2 + 8) {
> + if (data_offset >= sb_offset+bm_offset+bm_space+8) {
> sb->bblog_size = __cpu_to_le16(8);
> - sb->bblog_offset = __cpu_to_le32(8 + 32*2);
> - } else if (data_offset >= 16+16) {
> + sb->bblog_offset = __cpu_to_le32(bm_offset +
> + bm_space);
> + } else if (data_offset >= sb_offset + 16) {
> sb->bblog_size = __cpu_to_le16(8);
> - /* '8' sectors for the bblog, and another '8'
> + /* '8' sectors for the bblog, and 'sb_offset'
> * because we want offset from superblock, not
> * start of device.
> */
> - sb->bblog_offset = __cpu_to_le32(data_offset-8-8);
> + sb->bblog_offset = __cpu_to_le32(data_offset -
> + 8 - sb_offset);
> }
> break;
> default:
next prev parent reply other threads:[~2016-11-16 14:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-10 10:50 [PATCH 1/2] super1: make internal bitmap size calculations more consistent Artur Paszkiewicz
2016-11-10 10:50 ` [PATCH 2/2] super1: fix setting bad block log offset in write_init_super1() Artur Paszkiewicz
2016-11-16 14:58 ` Jes Sorensen [this message]
2016-11-16 14:57 ` [PATCH 1/2] super1: make internal bitmap size calculations more consistent Jes Sorensen
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=wrfj4m37mpyb.fsf@redhat.com \
--to=jes.sorensen@redhat.com \
--cc=artur.paszkiewicz@intel.com \
--cc=linux-raid@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).