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:
parent
0ec78e9862
commit
b2dd0bb1d0
@ -1,5 +1,6 @@
|
|||||||
Version 2.00.26 -
|
Version 2.00.26 -
|
||||||
=====================================
|
=====================================
|
||||||
|
Separate out md superblock detection code.
|
||||||
Prevent snapshot origin resizing.
|
Prevent snapshot origin resizing.
|
||||||
Improve a vgremove error message.
|
Improve a vgremove error message.
|
||||||
Update some man pages.
|
Update some man pages.
|
||||||
|
@ -43,6 +43,7 @@ SOURCES =\
|
|||||||
datastruct/str_list.c \
|
datastruct/str_list.c \
|
||||||
device/dev-cache.c \
|
device/dev-cache.c \
|
||||||
device/dev-io.c \
|
device/dev-io.c \
|
||||||
|
device/dev-md.c \
|
||||||
device/device.c \
|
device/device.c \
|
||||||
display/display.c \
|
display/display.c \
|
||||||
error/errseg.c \
|
error/errseg.c \
|
||||||
|
68
lib/device/dev-md.c
Normal file
68
lib/device/dev-md.c
Normal 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;
|
||||||
|
}
|
||||||
|
|
@ -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 */
|
/* Return a valid device name from the alias list; NULL otherwise */
|
||||||
const char *dev_name_confirmed(struct device *dev, int quiet);
|
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 */
|
/* FIXME Check partition type if appropriate */
|
||||||
|
|
||||||
#define is_lvm_partition(a) 1
|
#define is_lvm_partition(a) 1
|
||||||
|
@ -28,42 +28,18 @@
|
|||||||
|
|
||||||
static int _ignore_md(struct dev_filter *f, struct device *dev)
|
static int _ignore_md(struct dev_filter *f, struct device *dev)
|
||||||
{
|
{
|
||||||
uint64_t size, sector;
|
int ret = dev_is_md(dev, NULL);
|
||||||
uint32_t md_magic;
|
|
||||||
|
|
||||||
if (!dev_get_size(dev, &size)) {
|
if (ret == 1) {
|
||||||
stack;
|
log_debug("%s: Skipping md component device", dev_name(dev));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size < MD_RESERVED_SECTORS * 2)
|
if (ret < 0) {
|
||||||
/*
|
log_debug("%s: Skipping: error in md component detection");
|
||||||
* We could ignore it since it is obviously too
|
|
||||||
* small, but that's not our job.
|
|
||||||
*/
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (!dev_open(dev)) {
|
|
||||||
stack;
|
|
||||||
return 0;
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user