/* * Ceph - scalable distributed file system * * Copyright (C) 2004-2010 Sage Weil * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software * Foundation. See file COPYING. * */ #ifndef CEPH_RBD_TYPES_H #define CEPH_RBD_TYPES_H #include "include/types.h" #include "rbd/features.h" /* New-style rbd image 'foo' consists of objects * rbd_id.foo - id of image * rbd_header. - image metadata * rbd_object_map. - optional image object map * rbd_data..00000000 * rbd_data..00000001 * ... - data */ #define RBD_HEADER_PREFIX "rbd_header." #define RBD_OBJECT_MAP_PREFIX "rbd_object_map." #define RBD_DATA_PREFIX "rbd_data." #define RBD_ID_PREFIX "rbd_id." /* * old-style rbd image 'foo' consists of objects * foo.rbd - image metadata * rb...00000000 * rb...00000001 * ... - data */ #define RBD_SUFFIX ".rbd" #define RBD_DIRECTORY "rbd_directory" #define RBD_INFO "rbd_info" /* * rbd_children object in each pool contains omap entries * that map parent (poolid, imageid, snapid) to a list of children * (imageids; snapids aren't required because we get all the snapshot * info from a read of the child's header object anyway). * * The clone operation writes a new item to this child list, and rm or * flatten removes an item, and may remove the whole entry if no children * exist after the rm/flatten. * * When attempting to remove a parent, all pools are searched for * rbd_children objects with entries referring to that parent; if any * exist (and those children exist), the parent removal is prevented. */ #define RBD_CHILDREN "rbd_children" #define RBD_LOCK_NAME "rbd_lock" /** * rbd_mirroring object in each pool contains pool-specific settings * for configuring mirroring. */ #define RBD_MIRRORING "rbd_mirroring" /** * rbd_mirror_leader and rbd_mirror_instance. objects are used * for pool-level coordination between rbd-mirror daemons. */ #define RBD_MIRROR_LEADER "rbd_mirror_leader" #define RBD_MIRROR_INSTANCE_PREFIX "rbd_mirror_instance." #define RBD_MAX_OBJ_NAME_SIZE 96 #define RBD_MAX_BLOCK_NAME_SIZE 24 /** * Maximum string length of the RBD v2 image id (not including * null termination). This limit was derived from the existing * RBD_MAX_BLOCK_NAME_SIZE limit which needs to hold the "rbd_data." * prefix and null termination. */ #define RBD_MAX_IMAGE_ID_LENGTH 14 /** * Maximum string length of the RBD block object name prefix (not including * null termination). * * v1 format: rb... * v2 format: rbd_data.[.] * * Note: new features might require increasing this maximum prefix length. */ #define RBD_MAX_BLOCK_NAME_PREFIX_LENGTH 43 #define RBD_COMP_NONE 0 #define RBD_CRYPT_NONE 0 #define RBD_HEADER_TEXT "<<< Rados Block Device Image >>>\n" #define RBD_HEADER_SIGNATURE "RBD" #define RBD_HEADER_VERSION "001.005" #define RBD_GROUP_HEADER_PREFIX "rbd_group_header." #define RBD_GROUP_DIRECTORY "rbd_group_directory" #define RBD_TRASH "rbd_trash" struct rbd_info { __le64 max_id; } __attribute__ ((packed)); struct rbd_obj_snap_ondisk { __le64 id; __le64 image_size; } __attribute__((packed)); struct rbd_obj_header_ondisk { char text[40]; char block_name[RBD_MAX_BLOCK_NAME_SIZE]; char signature[4]; char version[8]; struct { __u8 order; __u8 crypt_type; __u8 comp_type; __u8 unused; } __attribute__((packed)) options; __le64 image_size; __le64 snap_seq; __le32 snap_count; __le32 reserved; __le64 snap_names_len; struct rbd_obj_snap_ondisk snaps[0]; } __attribute__((packed)); enum { RBD_PROTECTION_STATUS_UNPROTECTED = 0, RBD_PROTECTION_STATUS_UNPROTECTING = 1, RBD_PROTECTION_STATUS_PROTECTED = 2, RBD_PROTECTION_STATUS_LAST = 3 }; #endif