All of lore.kernel.org
 help / color / mirror / Atom feed
From: Karel Zak <kzak@redhat.com>
To: Naohiro Aota <naohiro.aota@wdc.com>
Cc: util-linux@vger.kernel.org, linux-btrfs@vger.kernel.org,
	linux-fsdevel@vger.kernel.org,
	Damien Le Moal <damien.lemoal@wdc.com>,
	Johannes Thumshirn <johannes.thumshirn@wdc.com>
Subject: Re: [PATCH v2 2/3] blkid: add magic and probing for zoned btrfs
Date: Wed, 14 Apr 2021 15:47:08 +0200	[thread overview]
Message-ID: <20210414134708.t475gnqa7bor7bc6@ws.net.home> (raw)
In-Reply-To: <20210414013339.2936229-3-naohiro.aota@wdc.com>

On Wed, Apr 14, 2021 at 10:33:38AM +0900, Naohiro Aota wrote:
> +#define ASSERT(x) assert(x)

Really? ;-)

> +typedef uint64_t u64;
> +typedef uint64_t sector_t;
> +typedef uint8_t u8;

I do not see a reason for u64 and u8 here.

> +
> +#ifdef HAVE_LINUX_BLKZONED_H
> +static int sb_write_pointer(int fd, struct blk_zone *zones, u64 *wp_ret)
> +{
> +	bool empty[BTRFS_NR_SB_LOG_ZONES];
> +	bool full[BTRFS_NR_SB_LOG_ZONES];
> +	sector_t sector;
> +
> +	ASSERT(zones[0].type != BLK_ZONE_TYPE_CONVENTIONAL &&
> +	       zones[1].type != BLK_ZONE_TYPE_CONVENTIONAL);

assert()

 ...
> +		for (i = 0; i < BTRFS_NR_SB_LOG_ZONES; i++) {
> +			u64 bytenr;
> +
> +			bytenr = ((zones[i].start + zones[i].len)
> +				   << SECTOR_SHIFT) - BTRFS_SUPER_INFO_SIZE;
> +
> +			ret = pread64(fd, buf[i], BTRFS_SUPER_INFO_SIZE,
> +				      bytenr);

 please, use  

     ptr = blkid_probe_get_buffer(pr, BTRFS_SUPER_INFO_SIZE, bytenr);

 the library will care about the buffer and reuse it. It's also
 important to keep blkid_do_wipe() usable.

> +			if (ret != BTRFS_SUPER_INFO_SIZE)
> +				return -EIO;
> +			super[i] = (struct btrfs_super_block *)&buf[i];

  super[i] = (struct btrfs_super_block *) ptr;

> +		}
> +
> +		if (super[0]->generation > super[1]->generation)
> +			sector = zones[1].start;
> +		else
> +			sector = zones[0].start;
> +	} else if (!full[0] && (empty[1] || full[1])) {
> +		sector = zones[0].wp;
> +	} else if (full[0]) {
> +		sector = zones[1].wp;
> +	} else {
> +		return -EUCLEAN;
> +	}
> +	*wp_ret = sector << SECTOR_SHIFT;
> +	return 0;
> +}
> +
> +static int sb_log_offset(blkid_probe pr, uint64_t *bytenr_ret)
> +{
> +	uint32_t zone_num = 0;
> +	uint32_t zone_size_sector;
> +	struct blk_zone_report *rep;
> +	struct blk_zone *zones;
> +	size_t rep_size;
> +	int ret;
> +	uint64_t wp;
> +
> +	zone_size_sector = pr->zone_size >> SECTOR_SHIFT;
> +
> +	rep_size = sizeof(struct blk_zone_report) + sizeof(struct blk_zone) * 2;
> +	rep = malloc(rep_size);
> +	if (!rep)
> +		return -errno;
> +
> +	memset(rep, 0, rep_size);
> +	rep->sector = zone_num * zone_size_sector;
> +	rep->nr_zones = 2;

what about to add to lib/blkdev.c a new function:

   struct blk_zone_report *blkdev_get_zonereport(int fd, uint64 sector, int nzones);

and call this function from your sb_log_offset() as well as from blkid_do_wipe()?

Anyway, calloc() is better than malloc()+memset().

> +	if (zones[0].type == BLK_ZONE_TYPE_CONVENTIONAL) {
> +		*bytenr_ret = zones[0].start << SECTOR_SHIFT;
> +		ret = 0;
> +		goto out;
> +	} else if (zones[1].type == BLK_ZONE_TYPE_CONVENTIONAL) {
> +		*bytenr_ret = zones[1].start << SECTOR_SHIFT;
> +		ret = 0;
> +		goto out;
> +	}

what about:

 for (i = 0; i < BTRFS_NR_SB_LOG_ZONES; i++) {
   if (zones[i].type == BLK_ZONE_TYPE_CONVENTIONAL) {
      *bytenr_ret = zones[i].start << SECTOR_SHIFT;
      ret = 0;
      goto out;
   }
 }




 Karel

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


  parent reply	other threads:[~2021-04-14 13:47 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-14  1:33 [PATCH v2 0/3] implement zone-aware probing/wiping for zoned btrfs Naohiro Aota
2021-04-14  1:33 ` [PATCH v2 1/3] blkid: implement zone-aware probing Naohiro Aota
2021-04-14  9:14   ` Damien Le Moal
2021-04-14  9:17   ` Johannes Thumshirn
2021-04-14 13:31   ` Karel Zak
2021-04-14 15:03     ` Naohiro Aota
2021-04-14  1:33 ` [PATCH v2 2/3] blkid: add magic and probing for zoned btrfs Naohiro Aota
2021-04-14  9:49   ` Johannes Thumshirn
2021-04-14 13:47   ` Karel Zak [this message]
2021-04-14 15:08     ` Naohiro Aota
2021-04-16 15:52   ` David Sterba
2021-04-26  1:38     ` Naohiro Aota
2021-04-14  1:33 ` [PATCH v2 3/3] blkid: support zone reset for wipefs Naohiro Aota
2021-04-14  9:13   ` Damien Le Moal
2021-04-14  9:50   ` Johannes Thumshirn
2021-04-14 13:57   ` Karel Zak
2021-04-16 16:04     ` David Sterba
2021-04-14 14:09 ` [PATCH v2 0/3] implement zone-aware probing/wiping for zoned btrfs Karel Zak
2021-04-14 22:04   ` Damien Le Moal
2021-04-22 14:41 ` Karel Zak

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=20210414134708.t475gnqa7bor7bc6@ws.net.home \
    --to=kzak@redhat.com \
    --cc=damien.lemoal@wdc.com \
    --cc=johannes.thumshirn@wdc.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=naohiro.aota@wdc.com \
    --cc=util-linux@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 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.