1/* 2 * common.h - Common definitions for both Kernel and user-mode utilities 3 * 4 * Copyright (C) 2005, 2006 5 * Avishay Traeger (avishay@gmail.com) 6 * Copyright (C) 2008, 2009 7 * Boaz Harrosh <bharrosh@panasas.com> 8 * 9 * Copyrights for code taken from ext2: 10 * Copyright (C) 1992, 1993, 1994, 1995 11 * Remy Card (card@masi.ibp.fr) 12 * Laboratoire MASI - Institut Blaise Pascal 13 * Universite Pierre et Marie Curie (Paris VI) 14 * from 15 * linux/fs/minix/inode.c 16 * Copyright (C) 1991, 1992 Linus Torvalds 17 * 18 * This file is part of exofs. 19 * 20 * exofs is free software; you can redistribute it and/or modify 21 * it under the terms of the GNU General Public License as published by 22 * the Free Software Foundation. Since it is based on ext2, and the only 23 * valid version of GPL for the Linux kernel is version 2, the only valid 24 * version of GPL for exofs is version 2. 25 * 26 * exofs is distributed in the hope that it will be useful, 27 * but WITHOUT ANY WARRANTY; without even the implied warranty of 28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 29 * GNU General Public License for more details. 30 * 31 * You should have received a copy of the GNU General Public License 32 * along with exofs; if not, write to the Free Software 33 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 34 */ 35 36#ifndef __EXOFS_COM_H__ 37#define __EXOFS_COM_H__ 38 39#include <linux/types.h> 40 41#include <scsi/osd_attributes.h> 42#include <scsi/osd_initiator.h> 43#include <scsi/osd_sec.h> 44 45/**************************************************************************** 46 * Object ID related defines 47 * NOTE: inode# = object ID - EXOFS_OBJ_OFF 48 ****************************************************************************/ 49#define EXOFS_MIN_PID 0x10000 /* Smallest partition ID */ 50#define EXOFS_OBJ_OFF 0x10000 /* offset for objects */ 51#define EXOFS_SUPER_ID 0x10000 /* object ID for on-disk superblock */ 52#define EXOFS_DEVTABLE_ID 0x10001 /* object ID for on-disk device table */ 53#define EXOFS_ROOT_ID 0x10002 /* object ID for root directory */ 54 55/* exofs Application specific page/attribute */ 56# define EXOFS_APAGE_FS_DATA (OSD_APAGE_APP_DEFINED_FIRST + 3) 57# define EXOFS_ATTR_INODE_DATA 1 58# define EXOFS_ATTR_INODE_FILE_LAYOUT 2 59# define EXOFS_ATTR_INODE_DIR_LAYOUT 3 60 61/* 62 * The maximum number of files we can have is limited by the size of the 63 * inode number. This is the largest object ID that the file system supports. 64 * Object IDs 0, 1, and 2 are always in use (see above defines). 65 */ 66enum { 67 EXOFS_MAX_INO_ID = (sizeof(ino_t) * 8 == 64) ? ULLONG_MAX : 68 (1ULL << (sizeof(ino_t) * 8ULL - 1ULL)), 69 EXOFS_MAX_ID = (EXOFS_MAX_INO_ID - 1 - EXOFS_OBJ_OFF), 70}; 71 72/**************************************************************************** 73 * Misc. 74 ****************************************************************************/ 75#define EXOFS_BLKSHIFT 12 76#define EXOFS_BLKSIZE (1UL << EXOFS_BLKSHIFT) 77 78/**************************************************************************** 79 * superblock-related things 80 ****************************************************************************/ 81#define EXOFS_SUPER_MAGIC 0x5DF5 82 83/* 84 * The file system control block - stored in object EXOFS_SUPER_ID's data. 85 * This is where the in-memory superblock is stored on disk. 86 */ 87enum {EXOFS_FSCB_VER = 1, EXOFS_DT_VER = 1}; 88struct exofs_fscb { 89 __le64 s_nextid; /* Highest object ID used */ 90 __le64 s_numfiles; /* Number of files on fs */ 91 __le32 s_version; /* == EXOFS_FSCB_VER */ 92 __le16 s_magic; /* Magic signature */ 93 __le16 s_newfs; /* Non-zero if this is a new fs */ 94 95 /* From here on it's a static part, only written by mkexofs */ 96 __le64 s_dev_table_oid; /* Resurved, not used */ 97 __le64 s_dev_table_count; /* == 0 means no dev_table */ 98} __packed; 99 100/* 101 * Describes the raid used in the FS. It is part of the device table. 102 * This here is taken from the pNFS-objects definition. In exofs we 103 * use one raid policy through-out the filesystem. (NOTE: the funny 104 * alignment at begining. We take care of it at exofs_device_table. 105 */ 106struct exofs_dt_data_map { 107 __le32 cb_num_comps; 108 __le64 cb_stripe_unit; 109 __le32 cb_group_width; 110 __le32 cb_group_depth; 111 __le32 cb_mirror_cnt; 112 __le32 cb_raid_algorithm; 113} __packed; 114 115/* 116 * This is an osd device information descriptor. It is a single entry in 117 * the exofs device table. It describes an osd target lun which 118 * contains data belonging to this FS. (Same partition_id on all devices) 119 */ 120struct exofs_dt_device_info { 121 __le32 systemid_len; 122 u8 systemid[OSD_SYSTEMID_LEN]; 123 __le64 long_name_offset; /* If !0 then offset-in-file */ 124 __le32 osdname_len; /* */ 125 u8 osdname[44]; /* Embbeded, Ususally an asci uuid */ 126} __packed; 127 128/* 129 * The EXOFS device table - stored in object EXOFS_DEVTABLE_ID's data. 130 * It contains the raid used for this multy-device FS and an array of 131 * participating devices. 132 */ 133struct exofs_device_table { 134 __le32 dt_version; /* == EXOFS_DT_VER */ 135 struct exofs_dt_data_map dt_data_map; /* Raid policy to use */ 136 137 /* Resurved space For future use. Total includeing this: 138 * (8 * sizeof(le64)) 139 */ 140 __le64 __Resurved[4]; 141 142 __le64 dt_num_devices; /* Array size */ 143 struct exofs_dt_device_info dt_dev_table[]; /* Array of devices */ 144} __packed; 145 146/**************************************************************************** 147 * inode-related things 148 ****************************************************************************/ 149#define EXOFS_IDATA 5 150 151/* 152 * The file control block - stored in an object's attributes. This is where 153 * the in-memory inode is stored on disk. 154 */ 155struct exofs_fcb { 156 __le64 i_size; /* Size of the file */ 157 __le16 i_mode; /* File mode */ 158 __le16 i_links_count; /* Links count */ 159 __le32 i_uid; /* Owner Uid */ 160 __le32 i_gid; /* Group Id */ 161 __le32 i_atime; /* Access time */ 162 __le32 i_ctime; /* Creation time */ 163 __le32 i_mtime; /* Modification time */ 164 __le32 i_flags; /* File flags (unused for now)*/ 165 __le32 i_generation; /* File version (for NFS) */ 166 __le32 i_data[EXOFS_IDATA]; /* Short symlink names and device #s */ 167}; 168 169#define EXOFS_INO_ATTR_SIZE sizeof(struct exofs_fcb) 170 171/* This is the Attribute the fcb is stored in */ 172static const struct __weak osd_attr g_attr_inode_data = ATTR_DEF( 173 EXOFS_APAGE_FS_DATA, 174 EXOFS_ATTR_INODE_DATA, 175 EXOFS_INO_ATTR_SIZE); 176 177/**************************************************************************** 178 * dentry-related things 179 ****************************************************************************/ 180#define EXOFS_NAME_LEN 255 181 182/* 183 * The on-disk directory entry 184 */ 185struct exofs_dir_entry { 186 __le64 inode_no; /* inode number */ 187 __le16 rec_len; /* directory entry length */ 188 u8 name_len; /* name length */ 189 u8 file_type; /* umm...file type */ 190 char name[EXOFS_NAME_LEN]; /* file name */ 191}; 192 193enum { 194 EXOFS_FT_UNKNOWN, 195 EXOFS_FT_REG_FILE, 196 EXOFS_FT_DIR, 197 EXOFS_FT_CHRDEV, 198 EXOFS_FT_BLKDEV, 199 EXOFS_FT_FIFO, 200 EXOFS_FT_SOCK, 201 EXOFS_FT_SYMLINK, 202 EXOFS_FT_MAX 203}; 204 205#define EXOFS_DIR_PAD 4 206#define EXOFS_DIR_ROUND (EXOFS_DIR_PAD - 1) 207#define EXOFS_DIR_REC_LEN(name_len) \ 208 (((name_len) + offsetof(struct exofs_dir_entry, name) + \ 209 EXOFS_DIR_ROUND) & ~EXOFS_DIR_ROUND) 210 211/* 212 * The on-disk (optional) layout structure. 213 * sits in an EXOFS_ATTR_INODE_FILE_LAYOUT or EXOFS_ATTR_INODE_DIR_LAYOUT 214 * attribute, attached to any inode, usually to a directory. 215 */ 216 217enum exofs_inode_layout_gen_functions { 218 LAYOUT_MOVING_WINDOW = 0, 219 LAYOUT_IMPLICT = 1, 220}; 221 222struct exofs_on_disk_inode_layout { 223 __le16 gen_func; /* One of enum exofs_inode_layout_gen_functions */ 224 __le16 pad; 225 union { 226 /* gen_func == LAYOUT_MOVING_WINDOW (default) */ 227 struct exofs_layout_sliding_window { 228 __le32 num_devices; /* first n devices in global-table*/ 229 } sliding_window __packed; 230 231 /* gen_func == LAYOUT_IMPLICT */ 232 struct exofs_layout_implict_list { 233 struct exofs_dt_data_map data_map; 234 /* Variable array of size data_map.cb_num_comps. These 235 * are device indexes of the devices in the global table 236 */ 237 __le32 dev_indexes[]; 238 } implict __packed; 239 }; 240} __packed; 241 242static inline size_t exofs_on_disk_inode_layout_size(unsigned max_devs) 243{ 244 return sizeof(struct exofs_on_disk_inode_layout) + 245 max_devs * sizeof(__le32); 246} 247 248#endif /*ifndef __EXOFS_COM_H__*/ 249