1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Separate out md superblock detection code.

This commit is contained in:
Alasdair Kergon 2004-11-18 20:02:21 +00:00
parent 0ec78e9862
commit b2dd0bb1d0
5 changed files with 78 additions and 29 deletions

View File

@ -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.

View File

@ -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 \

68
lib/device/dev-md.c Normal file
View File

@ -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 <linux/raid/md_p.h> 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;
}

View File

@ -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

View File

@ -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;
}