1ccd979bdSMark Fasheh /* -*- mode: c; c-basic-offset: 8; -*- 2ccd979bdSMark Fasheh * vim: noexpandtab sw=8 ts=8 sts=0: 3ccd979bdSMark Fasheh * 4ccd979bdSMark Fasheh * ocfs2.h 5ccd979bdSMark Fasheh * 6ccd979bdSMark Fasheh * Defines macros and structures used in OCFS2 7ccd979bdSMark Fasheh * 8ccd979bdSMark Fasheh * Copyright (C) 2002, 2004 Oracle. All rights reserved. 9ccd979bdSMark Fasheh * 10ccd979bdSMark Fasheh * This program is free software; you can redistribute it and/or 11ccd979bdSMark Fasheh * modify it under the terms of the GNU General Public 12ccd979bdSMark Fasheh * License as published by the Free Software Foundation; either 13ccd979bdSMark Fasheh * version 2 of the License, or (at your option) any later version. 14ccd979bdSMark Fasheh * 15ccd979bdSMark Fasheh * This program is distributed in the hope that it will be useful, 16ccd979bdSMark Fasheh * but WITHOUT ANY WARRANTY; without even the implied warranty of 17ccd979bdSMark Fasheh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18ccd979bdSMark Fasheh * General Public License for more details. 19ccd979bdSMark Fasheh * 20ccd979bdSMark Fasheh * You should have received a copy of the GNU General Public 21ccd979bdSMark Fasheh * License along with this program; if not, write to the 22ccd979bdSMark Fasheh * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 23ccd979bdSMark Fasheh * Boston, MA 021110-1307, USA. 24ccd979bdSMark Fasheh */ 25ccd979bdSMark Fasheh 26ccd979bdSMark Fasheh #ifndef OCFS2_H 27ccd979bdSMark Fasheh #define OCFS2_H 28ccd979bdSMark Fasheh 29ccd979bdSMark Fasheh #include <linux/spinlock.h> 30ccd979bdSMark Fasheh #include <linux/sched.h> 31ccd979bdSMark Fasheh #include <linux/wait.h> 32ccd979bdSMark Fasheh #include <linux/list.h> 33ccd979bdSMark Fasheh #include <linux/rbtree.h> 34ccd979bdSMark Fasheh #include <linux/workqueue.h> 35ccd979bdSMark Fasheh #include <linux/kref.h> 36c74ec2f7SArjan van de Ven #include <linux/mutex.h> 37ccd979bdSMark Fasheh 38ccd979bdSMark Fasheh #include "cluster/nodemanager.h" 39ccd979bdSMark Fasheh #include "cluster/heartbeat.h" 40ccd979bdSMark Fasheh #include "cluster/tcp.h" 41ccd979bdSMark Fasheh 42ccd979bdSMark Fasheh #include "dlm/dlmapi.h" 43ccd979bdSMark Fasheh 44ccd979bdSMark Fasheh #include "ocfs2_fs.h" 45ccd979bdSMark Fasheh #include "endian.h" 46ccd979bdSMark Fasheh #include "ocfs2_lockid.h" 47ccd979bdSMark Fasheh 48ccd979bdSMark Fasheh struct ocfs2_extent_map { 49ccd979bdSMark Fasheh u32 em_clusters; 50ccd979bdSMark Fasheh struct rb_root em_extents; 51ccd979bdSMark Fasheh }; 52ccd979bdSMark Fasheh 53ccd979bdSMark Fasheh /* Most user visible OCFS2 inodes will have very few pieces of 54ccd979bdSMark Fasheh * metadata, but larger files (including bitmaps, etc) must be taken 55ccd979bdSMark Fasheh * into account when designing an access scheme. We allow a small 56ccd979bdSMark Fasheh * amount of inlined blocks to be stored on an array and grow the 57ccd979bdSMark Fasheh * structure into a rb tree when necessary. */ 58ccd979bdSMark Fasheh #define OCFS2_INODE_MAX_CACHE_ARRAY 2 59ccd979bdSMark Fasheh 60ccd979bdSMark Fasheh struct ocfs2_caching_info { 61ccd979bdSMark Fasheh unsigned int ci_num_cached; 62ccd979bdSMark Fasheh union { 63ccd979bdSMark Fasheh sector_t ci_array[OCFS2_INODE_MAX_CACHE_ARRAY]; 64ccd979bdSMark Fasheh struct rb_root ci_tree; 65ccd979bdSMark Fasheh } ci_cache; 66ccd979bdSMark Fasheh }; 67ccd979bdSMark Fasheh 68ccd979bdSMark Fasheh /* this limits us to 256 nodes 69ccd979bdSMark Fasheh * if we need more, we can do a kmalloc for the map */ 70ccd979bdSMark Fasheh #define OCFS2_NODE_MAP_MAX_NODES 256 71ccd979bdSMark Fasheh struct ocfs2_node_map { 72ccd979bdSMark Fasheh u16 num_nodes; 73ccd979bdSMark Fasheh unsigned long map[BITS_TO_LONGS(OCFS2_NODE_MAP_MAX_NODES)]; 74ccd979bdSMark Fasheh }; 75ccd979bdSMark Fasheh 76ccd979bdSMark Fasheh enum ocfs2_ast_action { 77ccd979bdSMark Fasheh OCFS2_AST_INVALID = 0, 78ccd979bdSMark Fasheh OCFS2_AST_ATTACH, 79ccd979bdSMark Fasheh OCFS2_AST_CONVERT, 80ccd979bdSMark Fasheh OCFS2_AST_DOWNCONVERT, 81ccd979bdSMark Fasheh }; 82ccd979bdSMark Fasheh 83ccd979bdSMark Fasheh /* actions for an unlockast function to take. */ 84ccd979bdSMark Fasheh enum ocfs2_unlock_action { 85ccd979bdSMark Fasheh OCFS2_UNLOCK_INVALID = 0, 86ccd979bdSMark Fasheh OCFS2_UNLOCK_CANCEL_CONVERT, 87ccd979bdSMark Fasheh OCFS2_UNLOCK_DROP_LOCK, 88ccd979bdSMark Fasheh }; 89ccd979bdSMark Fasheh 90ccd979bdSMark Fasheh /* ocfs2_lock_res->l_flags flags. */ 91ccd979bdSMark Fasheh #define OCFS2_LOCK_ATTACHED (0x00000001) /* have we initialized 92ccd979bdSMark Fasheh * the lvb */ 93ccd979bdSMark Fasheh #define OCFS2_LOCK_BUSY (0x00000002) /* we are currently in 94ccd979bdSMark Fasheh * dlm_lock */ 95ccd979bdSMark Fasheh #define OCFS2_LOCK_BLOCKED (0x00000004) /* blocked waiting to 96ccd979bdSMark Fasheh * downconvert*/ 97ccd979bdSMark Fasheh #define OCFS2_LOCK_LOCAL (0x00000008) /* newly created inode */ 98ccd979bdSMark Fasheh #define OCFS2_LOCK_NEEDS_REFRESH (0x00000010) 99ccd979bdSMark Fasheh #define OCFS2_LOCK_REFRESHING (0x00000020) 100ccd979bdSMark Fasheh #define OCFS2_LOCK_INITIALIZED (0x00000040) /* track initialization 101ccd979bdSMark Fasheh * for shutdown paths */ 102ccd979bdSMark Fasheh #define OCFS2_LOCK_FREEING (0x00000080) /* help dlmglue track 103ccd979bdSMark Fasheh * when to skip queueing 104ccd979bdSMark Fasheh * a lock because it's 105ccd979bdSMark Fasheh * about to be 106ccd979bdSMark Fasheh * dropped. */ 107ccd979bdSMark Fasheh #define OCFS2_LOCK_QUEUED (0x00000100) /* queued for downconvert */ 108ccd979bdSMark Fasheh 109ccd979bdSMark Fasheh struct ocfs2_lock_res_ops; 110ccd979bdSMark Fasheh 111ccd979bdSMark Fasheh typedef void (*ocfs2_lock_callback)(int status, unsigned long data); 112ccd979bdSMark Fasheh 113ccd979bdSMark Fasheh struct ocfs2_lock_res { 114ccd979bdSMark Fasheh void *l_priv; 115ccd979bdSMark Fasheh struct ocfs2_lock_res_ops *l_ops; 116ccd979bdSMark Fasheh spinlock_t l_lock; 117ccd979bdSMark Fasheh 118ccd979bdSMark Fasheh struct list_head l_blocked_list; 119ccd979bdSMark Fasheh struct list_head l_mask_waiters; 120ccd979bdSMark Fasheh 121ccd979bdSMark Fasheh enum ocfs2_lock_type l_type; 122ccd979bdSMark Fasheh unsigned long l_flags; 123ccd979bdSMark Fasheh char l_name[OCFS2_LOCK_ID_MAX_LEN]; 124ccd979bdSMark Fasheh int l_level; 125ccd979bdSMark Fasheh unsigned int l_ro_holders; 126ccd979bdSMark Fasheh unsigned int l_ex_holders; 127ccd979bdSMark Fasheh struct dlm_lockstatus l_lksb; 128ccd979bdSMark Fasheh 129ccd979bdSMark Fasheh /* used from AST/BAST funcs. */ 130ccd979bdSMark Fasheh enum ocfs2_ast_action l_action; 131ccd979bdSMark Fasheh enum ocfs2_unlock_action l_unlock_action; 132ccd979bdSMark Fasheh int l_requested; 133ccd979bdSMark Fasheh int l_blocking; 134ccd979bdSMark Fasheh 135ccd979bdSMark Fasheh wait_queue_head_t l_event; 136ccd979bdSMark Fasheh 137ccd979bdSMark Fasheh struct list_head l_debug_list; 138ccd979bdSMark Fasheh }; 139ccd979bdSMark Fasheh 140ccd979bdSMark Fasheh struct ocfs2_dlm_debug { 141ccd979bdSMark Fasheh struct kref d_refcnt; 142ccd979bdSMark Fasheh struct dentry *d_locking_state; 143ccd979bdSMark Fasheh struct list_head d_lockres_tracking; 144ccd979bdSMark Fasheh }; 145ccd979bdSMark Fasheh 146ccd979bdSMark Fasheh enum ocfs2_vol_state 147ccd979bdSMark Fasheh { 148ccd979bdSMark Fasheh VOLUME_INIT = 0, 149ccd979bdSMark Fasheh VOLUME_MOUNTED, 150ccd979bdSMark Fasheh VOLUME_DISMOUNTED, 151ccd979bdSMark Fasheh VOLUME_DISABLED 152ccd979bdSMark Fasheh }; 153ccd979bdSMark Fasheh 154ccd979bdSMark Fasheh struct ocfs2_alloc_stats 155ccd979bdSMark Fasheh { 156ccd979bdSMark Fasheh atomic_t moves; 157ccd979bdSMark Fasheh atomic_t local_data; 158ccd979bdSMark Fasheh atomic_t bitmap_data; 159ccd979bdSMark Fasheh atomic_t bg_allocs; 160ccd979bdSMark Fasheh atomic_t bg_extends; 161ccd979bdSMark Fasheh }; 162ccd979bdSMark Fasheh 163ccd979bdSMark Fasheh enum ocfs2_local_alloc_state 164ccd979bdSMark Fasheh { 165ccd979bdSMark Fasheh OCFS2_LA_UNUSED = 0, 166ccd979bdSMark Fasheh OCFS2_LA_ENABLED, 167ccd979bdSMark Fasheh OCFS2_LA_DISABLED 168ccd979bdSMark Fasheh }; 169ccd979bdSMark Fasheh 170ccd979bdSMark Fasheh enum ocfs2_mount_options 171ccd979bdSMark Fasheh { 172ccd979bdSMark Fasheh OCFS2_MOUNT_HB_LOCAL = 1 << 0, /* Heartbeat started in local mode */ 173ccd979bdSMark Fasheh OCFS2_MOUNT_BARRIER = 1 << 1, /* Use block barriers */ 174ccd979bdSMark Fasheh OCFS2_MOUNT_NOINTR = 1 << 2, /* Don't catch signals */ 175ccd979bdSMark Fasheh OCFS2_MOUNT_ERRORS_PANIC = 1 << 3, /* Panic on errors */ 176ccd979bdSMark Fasheh OCFS2_MOUNT_DATA_WRITEBACK = 1 << 4, /* No data ordering */ 177ccd979bdSMark Fasheh }; 178ccd979bdSMark Fasheh 179ccd979bdSMark Fasheh #define OCFS2_OSB_SOFT_RO 0x0001 180ccd979bdSMark Fasheh #define OCFS2_OSB_HARD_RO 0x0002 181ccd979bdSMark Fasheh #define OCFS2_OSB_ERROR_FS 0x0004 182ccd979bdSMark Fasheh 183ccd979bdSMark Fasheh struct ocfs2_journal; 184ccd979bdSMark Fasheh struct ocfs2_journal_handle; 185ccd979bdSMark Fasheh struct ocfs2_super 186ccd979bdSMark Fasheh { 187ccd979bdSMark Fasheh u32 osb_id; /* id used by the proc interface */ 188ccd979bdSMark Fasheh struct task_struct *commit_task; 189ccd979bdSMark Fasheh struct super_block *sb; 190ccd979bdSMark Fasheh struct inode *root_inode; 191ccd979bdSMark Fasheh struct inode *sys_root_inode; 192ccd979bdSMark Fasheh struct inode *system_inodes[NUM_SYSTEM_INODES]; 193ccd979bdSMark Fasheh 194ccd979bdSMark Fasheh struct ocfs2_slot_info *slot_info; 195ccd979bdSMark Fasheh 196ccd979bdSMark Fasheh spinlock_t node_map_lock; 197ccd979bdSMark Fasheh struct ocfs2_node_map mounted_map; 198ccd979bdSMark Fasheh struct ocfs2_node_map recovery_map; 199ccd979bdSMark Fasheh struct ocfs2_node_map umount_map; 200ccd979bdSMark Fasheh 201ccd979bdSMark Fasheh u32 num_clusters; 202ccd979bdSMark Fasheh u64 root_blkno; 203ccd979bdSMark Fasheh u64 system_dir_blkno; 204ccd979bdSMark Fasheh u64 bitmap_blkno; 205ccd979bdSMark Fasheh u32 bitmap_cpg; 206ccd979bdSMark Fasheh u8 *uuid; 207ccd979bdSMark Fasheh char *uuid_str; 208ccd979bdSMark Fasheh u8 *vol_label; 209ccd979bdSMark Fasheh u64 first_cluster_group_blkno; 210ccd979bdSMark Fasheh u32 fs_generation; 211ccd979bdSMark Fasheh 212ccd979bdSMark Fasheh u32 s_feature_compat; 213ccd979bdSMark Fasheh u32 s_feature_incompat; 214ccd979bdSMark Fasheh u32 s_feature_ro_compat; 215ccd979bdSMark Fasheh 216ccd979bdSMark Fasheh /* Protects s_next_generaion, osb_flags. Could protect more on 217ccd979bdSMark Fasheh * osb as it's very short lived. */ 218ccd979bdSMark Fasheh spinlock_t osb_lock; 219ccd979bdSMark Fasheh u32 s_next_generation; 220ccd979bdSMark Fasheh unsigned long osb_flags; 221ccd979bdSMark Fasheh 222ccd979bdSMark Fasheh unsigned long s_mount_opt; 223ccd979bdSMark Fasheh 224ccd979bdSMark Fasheh u16 max_slots; 225ccd979bdSMark Fasheh u16 num_nodes; 226ccd979bdSMark Fasheh s16 node_num; 227ccd979bdSMark Fasheh s16 slot_num; 228ccd979bdSMark Fasheh int s_sectsize_bits; 229ccd979bdSMark Fasheh int s_clustersize; 230ccd979bdSMark Fasheh int s_clustersize_bits; 231ccd979bdSMark Fasheh struct proc_dir_entry *proc_sub_dir; /* points to /proc/fs/ocfs2/<maj_min> */ 232ccd979bdSMark Fasheh 233ccd979bdSMark Fasheh atomic_t vol_state; 234c74ec2f7SArjan van de Ven struct mutex recovery_lock; 235ccd979bdSMark Fasheh struct task_struct *recovery_thread_task; 236ccd979bdSMark Fasheh int disable_recovery; 237ccd979bdSMark Fasheh wait_queue_head_t checkpoint_event; 238ccd979bdSMark Fasheh atomic_t needs_checkpoint; 239ccd979bdSMark Fasheh struct ocfs2_journal *journal; 240ccd979bdSMark Fasheh 241ccd979bdSMark Fasheh enum ocfs2_local_alloc_state local_alloc_state; 242ccd979bdSMark Fasheh struct buffer_head *local_alloc_bh; 243ccd979bdSMark Fasheh 244ccd979bdSMark Fasheh /* Next two fields are for local node slot recovery during 245ccd979bdSMark Fasheh * mount. */ 246ccd979bdSMark Fasheh int dirty; 247ccd979bdSMark Fasheh struct ocfs2_dinode *local_alloc_copy; 248ccd979bdSMark Fasheh 249ccd979bdSMark Fasheh struct ocfs2_alloc_stats alloc_stats; 250ccd979bdSMark Fasheh char dev_str[20]; /* "major,minor" of the device */ 251ccd979bdSMark Fasheh 252ccd979bdSMark Fasheh struct dlm_ctxt *dlm; 253ccd979bdSMark Fasheh struct ocfs2_lock_res osb_super_lockres; 254ccd979bdSMark Fasheh struct ocfs2_lock_res osb_rename_lockres; 255ccd979bdSMark Fasheh struct dlm_eviction_cb osb_eviction_cb; 256ccd979bdSMark Fasheh struct ocfs2_dlm_debug *osb_dlm_debug; 257ccd979bdSMark Fasheh 258ccd979bdSMark Fasheh struct dentry *osb_debug_root; 259ccd979bdSMark Fasheh 260ccd979bdSMark Fasheh wait_queue_head_t recovery_event; 261ccd979bdSMark Fasheh 262ccd979bdSMark Fasheh spinlock_t vote_task_lock; 263ccd979bdSMark Fasheh struct task_struct *vote_task; 264ccd979bdSMark Fasheh wait_queue_head_t vote_event; 265ccd979bdSMark Fasheh unsigned long vote_wake_sequence; 266ccd979bdSMark Fasheh unsigned long vote_work_sequence; 267ccd979bdSMark Fasheh 268ccd979bdSMark Fasheh struct list_head blocked_lock_list; 269ccd979bdSMark Fasheh unsigned long blocked_lock_count; 270ccd979bdSMark Fasheh 271ccd979bdSMark Fasheh struct list_head vote_list; 272ccd979bdSMark Fasheh int vote_count; 273ccd979bdSMark Fasheh 274ccd979bdSMark Fasheh u32 net_key; 275ccd979bdSMark Fasheh spinlock_t net_response_lock; 276ccd979bdSMark Fasheh unsigned int net_response_ids; 277ccd979bdSMark Fasheh struct list_head net_response_list; 278ccd979bdSMark Fasheh 279ccd979bdSMark Fasheh struct o2hb_callback_func osb_hb_up; 280ccd979bdSMark Fasheh struct o2hb_callback_func osb_hb_down; 281ccd979bdSMark Fasheh 282ccd979bdSMark Fasheh struct list_head osb_net_handlers; 283ccd979bdSMark Fasheh 284ccd979bdSMark Fasheh wait_queue_head_t osb_mount_event; 285ccd979bdSMark Fasheh 286ccd979bdSMark Fasheh /* Truncate log info */ 287ccd979bdSMark Fasheh struct inode *osb_tl_inode; 288ccd979bdSMark Fasheh struct buffer_head *osb_tl_bh; 289ccd979bdSMark Fasheh struct work_struct osb_truncate_log_wq; 290b4df6ed8SMark Fasheh 291b4df6ed8SMark Fasheh struct ocfs2_node_map osb_recovering_orphan_dirs; 292b4df6ed8SMark Fasheh unsigned int *osb_orphan_wipes; 293b4df6ed8SMark Fasheh wait_queue_head_t osb_wipe_event; 294ccd979bdSMark Fasheh }; 295ccd979bdSMark Fasheh 296ccd979bdSMark Fasheh #define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info) 297ccd979bdSMark Fasheh #define OCFS2_MAX_OSB_ID 65536 298ccd979bdSMark Fasheh 299ccd979bdSMark Fasheh static inline int ocfs2_should_order_data(struct inode *inode) 300ccd979bdSMark Fasheh { 301ccd979bdSMark Fasheh if (!S_ISREG(inode->i_mode)) 302ccd979bdSMark Fasheh return 0; 303ccd979bdSMark Fasheh if (OCFS2_SB(inode->i_sb)->s_mount_opt & OCFS2_MOUNT_DATA_WRITEBACK) 304ccd979bdSMark Fasheh return 0; 305ccd979bdSMark Fasheh return 1; 306ccd979bdSMark Fasheh } 307ccd979bdSMark Fasheh 308ccd979bdSMark Fasheh /* set / clear functions because cluster events can make these happen 309ccd979bdSMark Fasheh * in parallel so we want the transitions to be atomic. this also 310ccd979bdSMark Fasheh * means that any future flags osb_flags must be protected by spinlock 311ccd979bdSMark Fasheh * too! */ 312ccd979bdSMark Fasheh static inline void ocfs2_set_osb_flag(struct ocfs2_super *osb, 313ccd979bdSMark Fasheh unsigned long flag) 314ccd979bdSMark Fasheh { 315ccd979bdSMark Fasheh spin_lock(&osb->osb_lock); 316ccd979bdSMark Fasheh osb->osb_flags |= flag; 317ccd979bdSMark Fasheh spin_unlock(&osb->osb_lock); 318ccd979bdSMark Fasheh } 319ccd979bdSMark Fasheh 320ccd979bdSMark Fasheh static inline void ocfs2_set_ro_flag(struct ocfs2_super *osb, 321ccd979bdSMark Fasheh int hard) 322ccd979bdSMark Fasheh { 323ccd979bdSMark Fasheh spin_lock(&osb->osb_lock); 324ccd979bdSMark Fasheh osb->osb_flags &= ~(OCFS2_OSB_SOFT_RO|OCFS2_OSB_HARD_RO); 325ccd979bdSMark Fasheh if (hard) 326ccd979bdSMark Fasheh osb->osb_flags |= OCFS2_OSB_HARD_RO; 327ccd979bdSMark Fasheh else 328ccd979bdSMark Fasheh osb->osb_flags |= OCFS2_OSB_SOFT_RO; 329ccd979bdSMark Fasheh spin_unlock(&osb->osb_lock); 330ccd979bdSMark Fasheh } 331ccd979bdSMark Fasheh 332ccd979bdSMark Fasheh static inline int ocfs2_is_hard_readonly(struct ocfs2_super *osb) 333ccd979bdSMark Fasheh { 334ccd979bdSMark Fasheh int ret; 335ccd979bdSMark Fasheh 336ccd979bdSMark Fasheh spin_lock(&osb->osb_lock); 337ccd979bdSMark Fasheh ret = osb->osb_flags & OCFS2_OSB_HARD_RO; 338ccd979bdSMark Fasheh spin_unlock(&osb->osb_lock); 339ccd979bdSMark Fasheh 340ccd979bdSMark Fasheh return ret; 341ccd979bdSMark Fasheh } 342ccd979bdSMark Fasheh 343ccd979bdSMark Fasheh static inline int ocfs2_is_soft_readonly(struct ocfs2_super *osb) 344ccd979bdSMark Fasheh { 345ccd979bdSMark Fasheh int ret; 346ccd979bdSMark Fasheh 347ccd979bdSMark Fasheh spin_lock(&osb->osb_lock); 348ccd979bdSMark Fasheh ret = osb->osb_flags & OCFS2_OSB_SOFT_RO; 349ccd979bdSMark Fasheh spin_unlock(&osb->osb_lock); 350ccd979bdSMark Fasheh 351ccd979bdSMark Fasheh return ret; 352ccd979bdSMark Fasheh } 353ccd979bdSMark Fasheh 354ccd979bdSMark Fasheh #define OCFS2_IS_VALID_DINODE(ptr) \ 355ccd979bdSMark Fasheh (!strcmp((ptr)->i_signature, OCFS2_INODE_SIGNATURE)) 356ccd979bdSMark Fasheh 357ccd979bdSMark Fasheh #define OCFS2_RO_ON_INVALID_DINODE(__sb, __di) do { \ 358ccd979bdSMark Fasheh typeof(__di) ____di = (__di); \ 359ccd979bdSMark Fasheh ocfs2_error((__sb), \ 360b0697053SMark Fasheh "Dinode # %llu has bad signature %.*s", \ 361b0697053SMark Fasheh (unsigned long long)(____di)->i_blkno, 7, \ 362ccd979bdSMark Fasheh (____di)->i_signature); \ 363ccd979bdSMark Fasheh } while (0); 364ccd979bdSMark Fasheh 365ccd979bdSMark Fasheh #define OCFS2_IS_VALID_EXTENT_BLOCK(ptr) \ 366ccd979bdSMark Fasheh (!strcmp((ptr)->h_signature, OCFS2_EXTENT_BLOCK_SIGNATURE)) 367ccd979bdSMark Fasheh 368ccd979bdSMark Fasheh #define OCFS2_RO_ON_INVALID_EXTENT_BLOCK(__sb, __eb) do { \ 369ccd979bdSMark Fasheh typeof(__eb) ____eb = (__eb); \ 370ccd979bdSMark Fasheh ocfs2_error((__sb), \ 371b0697053SMark Fasheh "Extent Block # %llu has bad signature %.*s", \ 372b0697053SMark Fasheh (unsigned long long)(____eb)->h_blkno, 7, \ 373ccd979bdSMark Fasheh (____eb)->h_signature); \ 374ccd979bdSMark Fasheh } while (0); 375ccd979bdSMark Fasheh 376ccd979bdSMark Fasheh #define OCFS2_IS_VALID_GROUP_DESC(ptr) \ 377ccd979bdSMark Fasheh (!strcmp((ptr)->bg_signature, OCFS2_GROUP_DESC_SIGNATURE)) 378ccd979bdSMark Fasheh 379ccd979bdSMark Fasheh #define OCFS2_RO_ON_INVALID_GROUP_DESC(__sb, __gd) do { \ 380ccd979bdSMark Fasheh typeof(__gd) ____gd = (__gd); \ 381ccd979bdSMark Fasheh ocfs2_error((__sb), \ 382b0697053SMark Fasheh "Group Descriptor # %llu has bad signature %.*s", \ 383b0697053SMark Fasheh (unsigned long long)(____gd)->bg_blkno, 7, \ 384ccd979bdSMark Fasheh (____gd)->bg_signature); \ 385ccd979bdSMark Fasheh } while (0); 386ccd979bdSMark Fasheh 387ccd979bdSMark Fasheh static inline unsigned long ino_from_blkno(struct super_block *sb, 388ccd979bdSMark Fasheh u64 blkno) 389ccd979bdSMark Fasheh { 390ccd979bdSMark Fasheh return (unsigned long)(blkno & (u64)ULONG_MAX); 391ccd979bdSMark Fasheh } 392ccd979bdSMark Fasheh 393ccd979bdSMark Fasheh static inline u64 ocfs2_clusters_to_blocks(struct super_block *sb, 394ccd979bdSMark Fasheh u32 clusters) 395ccd979bdSMark Fasheh { 396ccd979bdSMark Fasheh int c_to_b_bits = OCFS2_SB(sb)->s_clustersize_bits - 397ccd979bdSMark Fasheh sb->s_blocksize_bits; 398ccd979bdSMark Fasheh 399ccd979bdSMark Fasheh return (u64)clusters << c_to_b_bits; 400ccd979bdSMark Fasheh } 401ccd979bdSMark Fasheh 402ccd979bdSMark Fasheh static inline u32 ocfs2_blocks_to_clusters(struct super_block *sb, 403ccd979bdSMark Fasheh u64 blocks) 404ccd979bdSMark Fasheh { 405ccd979bdSMark Fasheh int b_to_c_bits = OCFS2_SB(sb)->s_clustersize_bits - 406ccd979bdSMark Fasheh sb->s_blocksize_bits; 407ccd979bdSMark Fasheh 408ccd979bdSMark Fasheh return (u32)(blocks >> b_to_c_bits); 409ccd979bdSMark Fasheh } 410ccd979bdSMark Fasheh 411ccd979bdSMark Fasheh static inline unsigned int ocfs2_clusters_for_bytes(struct super_block *sb, 412ccd979bdSMark Fasheh u64 bytes) 413ccd979bdSMark Fasheh { 414ccd979bdSMark Fasheh int cl_bits = OCFS2_SB(sb)->s_clustersize_bits; 415ccd979bdSMark Fasheh unsigned int clusters; 416ccd979bdSMark Fasheh 417ccd979bdSMark Fasheh bytes += OCFS2_SB(sb)->s_clustersize - 1; 418ccd979bdSMark Fasheh /* OCFS2 just cannot have enough clusters to overflow this */ 419ccd979bdSMark Fasheh clusters = (unsigned int)(bytes >> cl_bits); 420ccd979bdSMark Fasheh 421ccd979bdSMark Fasheh return clusters; 422ccd979bdSMark Fasheh } 423ccd979bdSMark Fasheh 424ccd979bdSMark Fasheh static inline u64 ocfs2_blocks_for_bytes(struct super_block *sb, 425ccd979bdSMark Fasheh u64 bytes) 426ccd979bdSMark Fasheh { 427ccd979bdSMark Fasheh bytes += sb->s_blocksize - 1; 428ccd979bdSMark Fasheh return bytes >> sb->s_blocksize_bits; 429ccd979bdSMark Fasheh } 430ccd979bdSMark Fasheh 431ccd979bdSMark Fasheh static inline u64 ocfs2_clusters_to_bytes(struct super_block *sb, 432ccd979bdSMark Fasheh u32 clusters) 433ccd979bdSMark Fasheh { 434ccd979bdSMark Fasheh return (u64)clusters << OCFS2_SB(sb)->s_clustersize_bits; 435ccd979bdSMark Fasheh } 436ccd979bdSMark Fasheh 437ccd979bdSMark Fasheh static inline u64 ocfs2_align_bytes_to_clusters(struct super_block *sb, 438ccd979bdSMark Fasheh u64 bytes) 439ccd979bdSMark Fasheh { 440ccd979bdSMark Fasheh int cl_bits = OCFS2_SB(sb)->s_clustersize_bits; 441ccd979bdSMark Fasheh unsigned int clusters; 442ccd979bdSMark Fasheh 443ccd979bdSMark Fasheh clusters = ocfs2_clusters_for_bytes(sb, bytes); 444ccd979bdSMark Fasheh return (u64)clusters << cl_bits; 445ccd979bdSMark Fasheh } 446ccd979bdSMark Fasheh 447ccd979bdSMark Fasheh static inline u64 ocfs2_align_bytes_to_blocks(struct super_block *sb, 448ccd979bdSMark Fasheh u64 bytes) 449ccd979bdSMark Fasheh { 450ccd979bdSMark Fasheh u64 blocks; 451ccd979bdSMark Fasheh 452ccd979bdSMark Fasheh blocks = ocfs2_blocks_for_bytes(sb, bytes); 453ccd979bdSMark Fasheh return blocks << sb->s_blocksize_bits; 454ccd979bdSMark Fasheh } 455ccd979bdSMark Fasheh 456ccd979bdSMark Fasheh static inline unsigned long ocfs2_align_bytes_to_sectors(u64 bytes) 457ccd979bdSMark Fasheh { 458ccd979bdSMark Fasheh return (unsigned long)((bytes + 511) >> 9); 459ccd979bdSMark Fasheh } 460ccd979bdSMark Fasheh 461ccd979bdSMark Fasheh #define ocfs2_set_bit ext2_set_bit 462ccd979bdSMark Fasheh #define ocfs2_clear_bit ext2_clear_bit 463ccd979bdSMark Fasheh #define ocfs2_test_bit ext2_test_bit 464ccd979bdSMark Fasheh #define ocfs2_find_next_zero_bit ext2_find_next_zero_bit 465ccd979bdSMark Fasheh #endif /* OCFS2_H */ 466ccd979bdSMark Fasheh 467