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