From b2dd0bb1d0b71f4d2907d5191ec31aaa625e07bb Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Thu, 18 Nov 2004 20:02:21 +0000 Subject: [PATCH] Separate out md superblock detection code. --- WHATS_NEW | 1 + lib/Makefile.in | 1 + lib/device/dev-md.c | 68 +++++++++++++++++++++++++++++++++++++++++ lib/device/device.h | 3 ++ lib/filters/filter-md.c | 34 +++------------------ 5 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 lib/device/dev-md.c diff --git a/WHATS_NEW b/WHATS_NEW index 8e536238a..3b25a56fe 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.00.26 - ===================================== + Separate out md superblock detection code. Prevent snapshot origin resizing. Improve a vgremove error message. Update some man pages. diff --git a/lib/Makefile.in b/lib/Makefile.in index 026b7b1bc..58041322d 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -43,6 +43,7 @@ SOURCES =\ datastruct/str_list.c \ device/dev-cache.c \ device/dev-io.c \ + device/dev-md.c \ device/device.c \ display/display.c \ error/errseg.c \ diff --git a/lib/device/dev-md.c b/lib/device/dev-md.c new file mode 100644 index 000000000..b10949904 --- /dev/null +++ b/lib/device/dev-md.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2004 Luca Berra + * Copyright (C) 2004 Red Hat, Inc. All rights reserved. + * + * This file is part of LVM2. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License v.2.1. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "lib.h" +#include "metadata.h" + +/* Lifted from because of difficulty including it */ + +#define MD_SB_MAGIC 0xa92b4efc +#define MD_RESERVED_BYTES (64 * 1024) +#define MD_RESERVED_SECTORS (MD_RESERVED_BYTES / 512) +#define MD_NEW_SIZE_SECTORS(x) ((x & ~(MD_RESERVED_SECTORS - 1)) \ + - MD_RESERVED_SECTORS) + +/* + * Returns -1 on error + */ +int dev_is_md(struct device *dev, uint64_t *sb) +{ + int ret = 0; + +#ifdef linux + + uint64_t size, sb_offset; + uint32_t md_magic; + + if (!dev_get_size(dev, &size)) { + stack; + return -1; + } + + if (size < MD_RESERVED_SECTORS * 2) + return 0; + + if (!dev_open(dev)) { + stack; + return -1; + } + + sb_offset = MD_NEW_SIZE_SECTORS(size) << SECTOR_SHIFT; + + /* Check if it is an md component device. */ + if (dev_read(dev, sb_offset, sizeof(uint32_t), &md_magic) && + (md_magic == MD_SB_MAGIC)) { + if (sb) + *sb = sb_offset; + ret = 1; + } + + if (!dev_close(dev)) + stack; + +#endif + return ret; +} + diff --git a/lib/device/device.h b/lib/device/device.h index 2c93ca507..18bdd6803 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -89,6 +89,9 @@ static inline const char *dev_name(const struct device *dev) /* Return a valid device name from the alias list; NULL otherwise */ const char *dev_name_confirmed(struct device *dev, int quiet); +/* Does device contain md superblock? If so, where? */ +int dev_is_md(struct device *dev, uint64_t *sb); + /* FIXME Check partition type if appropriate */ #define is_lvm_partition(a) 1 diff --git a/lib/filters/filter-md.c b/lib/filters/filter-md.c index ea99abeb2..37bbeee09 100644 --- a/lib/filters/filter-md.c +++ b/lib/filters/filter-md.c @@ -28,42 +28,18 @@ static int _ignore_md(struct dev_filter *f, struct device *dev) { - uint64_t size, sector; - uint32_t md_magic; + int ret = dev_is_md(dev, NULL); - if (!dev_get_size(dev, &size)) { - stack; + if (ret == 1) { + log_debug("%s: Skipping md component device", dev_name(dev)); return 0; } - if (size < MD_RESERVED_SECTORS * 2) - /* - * We could ignore it since it is obviously too - * small, but that's not our job. - */ - return 1; - - if (!dev_open(dev)) { - stack; + if (ret < 0) { + log_debug("%s: Skipping: error in md component detection"); return 0; } - sector = MD_NEW_SIZE_SECTORS(size); - - /* Check if it is an md component device. */ - if (dev_read(dev, sector << SECTOR_SHIFT, sizeof(uint32_t), &md_magic)) { - if (md_magic == MD_SB_MAGIC) { - log_debug("%s: Skipping md component device", - dev_name(dev)); - if (!dev_close(dev)) - stack; - return 0; - } - } - - if (!dev_close(dev)) - stack; - return 1; }