]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/blkmapd/device-discovery.h
blkmapd: Add complex block layout discovery and mapping daemon
[nfs-utils.git] / utils / blkmapd / device-discovery.h
diff --git a/utils/blkmapd/device-discovery.h b/utils/blkmapd/device-discovery.h
new file mode 100644 (file)
index 0000000..a86eed9
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * bl-device-discovery.h
+ *
+ * Copyright (c) 2010 EMC Corporation, Haiying Tang <Tang_Haiying@emc.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef BL_DEVICE_DISCOVERY_H
+#define BL_DEVICE_DISCOVERY_H
+
+#include <stdint.h>
+
+enum blk_vol_type {
+       BLOCK_VOLUME_SIMPLE = 0,        /* maps to a single LU */
+       BLOCK_VOLUME_SLICE = 1,         /* slice of another volume */
+       BLOCK_VOLUME_CONCAT = 2,        /* concatenation of multiple volumes */
+       BLOCK_VOLUME_STRIPE = 3,        /* striped across multiple volumes */
+       BLOCK_VOLUME_PSEUDO = 4,
+};
+
+/* All disk offset/lengths are stored in 512-byte sectors */
+struct bl_volume {
+       uint32_t bv_type;
+       off_t bv_size;
+       struct bl_volume **bv_vols;
+       int bv_vol_n;
+       union {
+               dev_t bv_dev;           /* for BLOCK_VOLUME_SIMPLE(PSEUDO) */
+               off_t bv_stripe_unit;   /* for BLOCK_VOLUME_STRIPE(CONCAT) */
+               off_t bv_offset;        /* for BLOCK_VOLUME_SLICE */
+       } param;
+};
+
+struct bl_sig_comp {
+       int64_t bs_offset;              /* In bytes */
+       uint32_t bs_length;             /* In bytes */
+       char *bs_string;
+};
+
+/* Maximum number of signatures components in a simple volume */
+# define BLOCK_MAX_SIG_COMP 16
+
+struct bl_sig {
+       int si_num_comps;
+       struct bl_sig_comp si_comps[BLOCK_MAX_SIG_COMP];
+};
+
+/*
+ * Multipath support: ACTIVE or PSEUDO device is valid,
+ *                   PASSIVE is a standby for ACTIVE.
+ */
+enum bl_path_state_e {
+       BL_PATH_STATE_PASSIVE = 1,
+       BL_PATH_STATE_ACTIVE = 2,
+       BL_PATH_STATE_PSEUDO = 3,
+};
+
+struct bl_serial {
+       int len;
+       char *data;
+};
+
+struct bl_disk_path {
+       struct bl_disk_path *next;
+       char *full_path;
+       enum bl_path_state_e state;
+};
+
+struct bl_disk {
+       struct bl_disk *next;
+       struct bl_serial *serial;
+       dev_t dev;
+       off_t size;                     /* in 512-byte sectors */
+       struct bl_disk_path *valid_path;
+       struct bl_disk_path *paths;
+};
+
+struct bl_dev_id {
+       unsigned char type;
+       unsigned char ids;
+       unsigned char reserve;
+       unsigned char len;
+       char data[0];
+};
+
+struct bl_dev_msg {
+       int status;
+       uint32_t major, minor;
+};
+
+struct bl_pipemsg_hdr {
+       uint8_t type;
+       uint16_t totallen;              /* length of message excluding hdr */
+};
+
+#define BL_DEVICE_UMOUNT                0x0    /* Umount--delete devices */
+#define BL_DEVICE_MOUNT                 0x1    /* Mount--create devices */
+#define BL_DEVICE_REQUEST_INIT          0x0    /* Start request */
+#define BL_DEVICE_REQUEST_PROC          0x1    /* User process succeeds */
+#define BL_DEVICE_REQUEST_ERR           0x2    /* User process fails */
+
+uint32_t *blk_overflow(uint32_t * p, uint32_t * end, size_t nbytes);
+
+#define BLK_READBUF(p, e, nbytes)  do { \
+       p = blk_overflow(p, e, nbytes); \
+       if (!p) {\
+               goto out_err;\
+       } \
+} while (0)
+
+#define READ32(x)         (x) = ntohl(*p++)
+
+#define READ64(x)         do {                  \
+       (x) = (uint64_t)ntohl(*p++) << 32;           \
+       (x) |= ntohl(*p++);                     \
+} while (0)
+
+#define READ_SECTOR(x)     do { \
+       READ64(tmp); \
+       if (tmp & 0x1ff) { \
+               goto out_err; \
+       } \
+       (x) = tmp >> 9; \
+} while (0)
+
+extern struct bl_disk *visible_disk_list;
+uint64_t dm_device_create(struct bl_volume *vols, int num_vols);
+int dm_device_remove_all(uint64_t *dev);
+uint64_t process_deviceinfo(const char *dev_addr_buf,
+                           unsigned int dev_addr_len,
+                           uint32_t *major, uint32_t *minor);
+
+extern ssize_t atomicio(ssize_t(*f) (int, void *, size_t),
+                       int fd, void *_s, size_t n);
+extern struct bl_serial *bldev_read_serial(int fd, const char *filename);
+extern enum bl_path_state_e bldev_read_ap_state(int fd);
+extern int bl_discover_devices(void);
+
+#define BL_LOG_INFO(fmt...)            syslog(LOG_INFO, fmt)
+#define BL_LOG_WARNING(fmt...)         syslog(LOG_WARNING, fmt)
+#define BL_LOG_ERR(fmt...)             syslog(LOG_ERR, fmt)
+#define BL_LOG_DEBUG(fmt...)           syslog(LOG_DEBUG, fmt)
+#endif