]> sourceware.org Git - lvm2.git/commitdiff
Separate out md superblock detection code.
authorAlasdair Kergon <agk@redhat.com>
Thu, 18 Nov 2004 20:02:21 +0000 (20:02 +0000)
committerAlasdair Kergon <agk@redhat.com>
Thu, 18 Nov 2004 20:02:21 +0000 (20:02 +0000)
WHATS_NEW
lib/Makefile.in
lib/device/dev-md.c [new file with mode: 0644]
lib/device/device.h
lib/filters/filter-md.c

index 8e536238a6a193b297b4ce2ee31991c55cd9fa95..3b25a56fe3ca9ac26f3a034a3a9f346b1a794086 100644 (file)
--- 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.
index 026b7b1bc76d5f31b5fc5a17b72860c90636c7a4..58041322d94f19510c20a604bd9ddc739c4ade71 100644 (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 \
diff --git a/lib/device/dev-md.c b/lib/device/dev-md.c
new file mode 100644 (file)
index 0000000..b109499
--- /dev/null
@@ -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;
+}
+
index 2c93ca50737511f6dd5089f5f91852fd237ba3bc..18bdd6803aa99b01618781bd388cd17631dd3d0b 100644 (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
index ea99abeb27968f630e9b621c23e2f5cb6bb36816..37bbeee0998575b69278a9c2bab6a8ab2cea40a8 100644 (file)
 
 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;
 }
 
This page took 0.043376 seconds and 5 git commands to generate.