cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ocfs2.h (25179B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * ocfs2.h
      4 *
      5 * Defines macros and structures used in OCFS2
      6 *
      7 * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
      8 */
      9
     10#ifndef OCFS2_H
     11#define OCFS2_H
     12
     13#include <linux/spinlock.h>
     14#include <linux/sched.h>
     15#include <linux/wait.h>
     16#include <linux/list.h>
     17#include <linux/llist.h>
     18#include <linux/rbtree.h>
     19#include <linux/workqueue.h>
     20#include <linux/kref.h>
     21#include <linux/mutex.h>
     22#include <linux/lockdep.h>
     23#include <linux/jbd2.h>
     24
     25/* For union ocfs2_dlm_lksb */
     26#include "stackglue.h"
     27
     28#include "ocfs2_fs.h"
     29#include "ocfs2_lockid.h"
     30#include "ocfs2_ioctl.h"
     31
     32/* For struct ocfs2_blockcheck_stats */
     33#include "blockcheck.h"
     34
     35#include "reservations.h"
     36
     37#include "filecheck.h"
     38
     39/* Caching of metadata buffers */
     40
     41/* Most user visible OCFS2 inodes will have very few pieces of
     42 * metadata, but larger files (including bitmaps, etc) must be taken
     43 * into account when designing an access scheme. We allow a small
     44 * amount of inlined blocks to be stored on an array and grow the
     45 * structure into a rb tree when necessary. */
     46#define OCFS2_CACHE_INFO_MAX_ARRAY 2
     47
     48/* Flags for ocfs2_caching_info */
     49
     50enum ocfs2_caching_info_flags {
     51	/* Indicates that the metadata cache is using the inline array */
     52	OCFS2_CACHE_FL_INLINE	= 1<<1,
     53};
     54
     55struct ocfs2_caching_operations;
     56struct ocfs2_caching_info {
     57	/*
     58	 * The parent structure provides the locks, but because the
     59	 * parent structure can differ, it provides locking operations
     60	 * to struct ocfs2_caching_info.
     61	 */
     62	const struct ocfs2_caching_operations *ci_ops;
     63
     64	/* next two are protected by trans_inc_lock */
     65	/* which transaction were we created on? Zero if none. */
     66	unsigned long		ci_created_trans;
     67	/* last transaction we were a part of. */
     68	unsigned long		ci_last_trans;
     69
     70	/* Cache structures */
     71	unsigned int		ci_flags;
     72	unsigned int		ci_num_cached;
     73	union {
     74	sector_t	ci_array[OCFS2_CACHE_INFO_MAX_ARRAY];
     75		struct rb_root	ci_tree;
     76	} ci_cache;
     77};
     78/*
     79 * Need this prototype here instead of in uptodate.h because journal.h
     80 * uses it.
     81 */
     82struct super_block *ocfs2_metadata_cache_get_super(struct ocfs2_caching_info *ci);
     83
     84/* this limits us to 256 nodes
     85 * if we need more, we can do a kmalloc for the map */
     86#define OCFS2_NODE_MAP_MAX_NODES    256
     87struct ocfs2_node_map {
     88	u16 num_nodes;
     89	unsigned long map[BITS_TO_LONGS(OCFS2_NODE_MAP_MAX_NODES)];
     90};
     91
     92enum ocfs2_ast_action {
     93	OCFS2_AST_INVALID = 0,
     94	OCFS2_AST_ATTACH,
     95	OCFS2_AST_CONVERT,
     96	OCFS2_AST_DOWNCONVERT,
     97};
     98
     99/* actions for an unlockast function to take. */
    100enum ocfs2_unlock_action {
    101	OCFS2_UNLOCK_INVALID = 0,
    102	OCFS2_UNLOCK_CANCEL_CONVERT,
    103	OCFS2_UNLOCK_DROP_LOCK,
    104};
    105
    106/* ocfs2_lock_res->l_flags flags. */
    107#define OCFS2_LOCK_ATTACHED      (0x00000001) /* we have initialized
    108					       * the lvb */
    109#define OCFS2_LOCK_BUSY          (0x00000002) /* we are currently in
    110					       * dlm_lock */
    111#define OCFS2_LOCK_BLOCKED       (0x00000004) /* blocked waiting to
    112					       * downconvert*/
    113#define OCFS2_LOCK_LOCAL         (0x00000008) /* newly created inode */
    114#define OCFS2_LOCK_NEEDS_REFRESH (0x00000010)
    115#define OCFS2_LOCK_REFRESHING    (0x00000020)
    116#define OCFS2_LOCK_INITIALIZED   (0x00000040) /* track initialization
    117					       * for shutdown paths */
    118#define OCFS2_LOCK_FREEING       (0x00000080) /* help dlmglue track
    119					       * when to skip queueing
    120					       * a lock because it's
    121					       * about to be
    122					       * dropped. */
    123#define OCFS2_LOCK_QUEUED        (0x00000100) /* queued for downconvert */
    124#define OCFS2_LOCK_NOCACHE       (0x00000200) /* don't use a holder count */
    125#define OCFS2_LOCK_PENDING       (0x00000400) /* This lockres is pending a
    126						 call to dlm_lock.  Only
    127						 exists with BUSY set. */
    128#define OCFS2_LOCK_UPCONVERT_FINISHING (0x00000800) /* blocks the dc thread
    129						     * from downconverting
    130						     * before the upconvert
    131						     * has completed */
    132
    133#define OCFS2_LOCK_NONBLOCK_FINISHED (0x00001000) /* NONBLOCK cluster
    134						   * lock has already
    135						   * returned, do not block
    136						   * dc thread from
    137						   * downconverting */
    138
    139struct ocfs2_lock_res_ops;
    140
    141typedef void (*ocfs2_lock_callback)(int status, unsigned long data);
    142
    143#ifdef CONFIG_OCFS2_FS_STATS
    144struct ocfs2_lock_stats {
    145	u64		ls_total;	/* Total wait in NSEC */
    146	u32		ls_gets;	/* Num acquires */
    147	u32		ls_fail;	/* Num failed acquires */
    148
    149	/* Storing max wait in usecs saves 24 bytes per inode */
    150	u32		ls_max;		/* Max wait in USEC */
    151	u64		ls_last;	/* Last unlock time in USEC */
    152};
    153#endif
    154
    155struct ocfs2_lock_res {
    156	void                    *l_priv;
    157	struct ocfs2_lock_res_ops *l_ops;
    158
    159
    160	struct list_head         l_blocked_list;
    161	struct list_head         l_mask_waiters;
    162	struct list_head	 l_holders;
    163
    164	unsigned long		 l_flags;
    165	char                     l_name[OCFS2_LOCK_ID_MAX_LEN];
    166	unsigned int             l_ro_holders;
    167	unsigned int             l_ex_holders;
    168	signed char		 l_level;
    169	signed char		 l_requested;
    170	signed char		 l_blocking;
    171
    172	/* Data packed - type enum ocfs2_lock_type */
    173	unsigned char            l_type;
    174
    175	/* used from AST/BAST funcs. */
    176	/* Data packed - enum type ocfs2_ast_action */
    177	unsigned char            l_action;
    178	/* Data packed - enum type ocfs2_unlock_action */
    179	unsigned char            l_unlock_action;
    180	unsigned int             l_pending_gen;
    181
    182	spinlock_t               l_lock;
    183
    184	struct ocfs2_dlm_lksb    l_lksb;
    185
    186	wait_queue_head_t        l_event;
    187
    188	struct list_head         l_debug_list;
    189
    190#ifdef CONFIG_OCFS2_FS_STATS
    191	struct ocfs2_lock_stats  l_lock_prmode;		/* PR mode stats */
    192	u32                      l_lock_refresh;	/* Disk refreshes */
    193	u64                      l_lock_wait;	/* First lock wait time */
    194	struct ocfs2_lock_stats  l_lock_exmode;		/* EX mode stats */
    195#endif
    196#ifdef CONFIG_DEBUG_LOCK_ALLOC
    197	struct lockdep_map	 l_lockdep_map;
    198#endif
    199};
    200
    201enum ocfs2_orphan_reco_type {
    202	ORPHAN_NO_NEED_TRUNCATE = 0,
    203	ORPHAN_NEED_TRUNCATE,
    204};
    205
    206enum ocfs2_orphan_scan_state {
    207	ORPHAN_SCAN_ACTIVE,
    208	ORPHAN_SCAN_INACTIVE
    209};
    210
    211struct ocfs2_orphan_scan {
    212	struct mutex 		os_lock;
    213	struct ocfs2_super 	*os_osb;
    214	struct ocfs2_lock_res 	os_lockres;     /* lock to synchronize scans */
    215	struct delayed_work 	os_orphan_scan_work;
    216	time64_t		os_scantime;  /* time this node ran the scan */
    217	u32			os_count;      /* tracks node specific scans */
    218	u32  			os_seqno;       /* tracks cluster wide scans */
    219	atomic_t		os_state;              /* ACTIVE or INACTIVE */
    220};
    221
    222struct ocfs2_dlm_debug {
    223	struct kref d_refcnt;
    224	u32 d_filter_secs;
    225	struct list_head d_lockres_tracking;
    226};
    227
    228enum ocfs2_vol_state
    229{
    230	VOLUME_INIT = 0,
    231	VOLUME_MOUNTED,
    232	VOLUME_MOUNTED_QUOTAS,
    233	VOLUME_DISMOUNTED,
    234	VOLUME_DISABLED
    235};
    236
    237struct ocfs2_alloc_stats
    238{
    239	atomic_t moves;
    240	atomic_t local_data;
    241	atomic_t bitmap_data;
    242	atomic_t bg_allocs;
    243	atomic_t bg_extends;
    244};
    245
    246enum ocfs2_local_alloc_state
    247{
    248	OCFS2_LA_UNUSED = 0,	/* Local alloc will never be used for
    249				 * this mountpoint. */
    250	OCFS2_LA_ENABLED,	/* Local alloc is in use. */
    251	OCFS2_LA_THROTTLED,	/* Local alloc is in use, but number
    252				 * of bits has been reduced. */
    253	OCFS2_LA_DISABLED	/* Local alloc has temporarily been
    254				 * disabled. */
    255};
    256
    257enum ocfs2_mount_options
    258{
    259	OCFS2_MOUNT_HB_LOCAL = 1 << 0, /* Local heartbeat */
    260	OCFS2_MOUNT_BARRIER = 1 << 1,	/* Use block barriers */
    261	OCFS2_MOUNT_NOINTR  = 1 << 2,   /* Don't catch signals */
    262	OCFS2_MOUNT_ERRORS_PANIC = 1 << 3, /* Panic on errors */
    263	OCFS2_MOUNT_DATA_WRITEBACK = 1 << 4, /* No data ordering */
    264	OCFS2_MOUNT_LOCALFLOCKS = 1 << 5, /* No cluster aware user file locks */
    265	OCFS2_MOUNT_NOUSERXATTR = 1 << 6, /* No user xattr */
    266	OCFS2_MOUNT_INODE64 = 1 << 7,	/* Allow inode numbers > 2^32 */
    267	OCFS2_MOUNT_POSIX_ACL = 1 << 8,	/* Force POSIX access control lists */
    268	OCFS2_MOUNT_NO_POSIX_ACL = 1 << 9,	/* Disable POSIX access
    269						   control lists */
    270	OCFS2_MOUNT_USRQUOTA = 1 << 10, /* We support user quotas */
    271	OCFS2_MOUNT_GRPQUOTA = 1 << 11, /* We support group quotas */
    272	OCFS2_MOUNT_COHERENCY_BUFFERED = 1 << 12, /* Allow concurrent O_DIRECT
    273						     writes */
    274	OCFS2_MOUNT_HB_NONE = 1 << 13, /* No heartbeat */
    275	OCFS2_MOUNT_HB_GLOBAL = 1 << 14, /* Global heartbeat */
    276
    277	OCFS2_MOUNT_JOURNAL_ASYNC_COMMIT = 1 << 15,  /* Journal Async Commit */
    278	OCFS2_MOUNT_ERRORS_CONT = 1 << 16, /* Return EIO to the calling process on error */
    279	OCFS2_MOUNT_ERRORS_ROFS = 1 << 17, /* Change filesystem to read-only on error */
    280	OCFS2_MOUNT_NOCLUSTER = 1 << 18, /* No cluster aware filesystem mount */
    281};
    282
    283#define OCFS2_OSB_SOFT_RO	0x0001
    284#define OCFS2_OSB_HARD_RO	0x0002
    285#define OCFS2_OSB_ERROR_FS	0x0004
    286#define OCFS2_DEFAULT_ATIME_QUANTUM	60
    287
    288struct ocfs2_journal;
    289struct ocfs2_slot_info;
    290struct ocfs2_recovery_map;
    291struct ocfs2_replay_map;
    292struct ocfs2_quota_recovery;
    293struct ocfs2_super
    294{
    295	struct task_struct *commit_task;
    296	struct super_block *sb;
    297	struct inode *root_inode;
    298	struct inode *sys_root_inode;
    299	struct inode *global_system_inodes[NUM_GLOBAL_SYSTEM_INODES];
    300	struct inode **local_system_inodes;
    301
    302	struct ocfs2_slot_info *slot_info;
    303
    304	u32 *slot_recovery_generations;
    305
    306	spinlock_t node_map_lock;
    307
    308	u64 root_blkno;
    309	u64 system_dir_blkno;
    310	u64 bitmap_blkno;
    311	u32 bitmap_cpg;
    312	char *uuid_str;
    313	u32 uuid_hash;
    314	u8 *vol_label;
    315	u64 first_cluster_group_blkno;
    316	u32 fs_generation;
    317
    318	u32 s_feature_compat;
    319	u32 s_feature_incompat;
    320	u32 s_feature_ro_compat;
    321
    322	/* Protects s_next_generation, osb_flags and s_inode_steal_slot.
    323	 * Could protect more on osb as it's very short lived.
    324	 */
    325	spinlock_t osb_lock;
    326	u32 s_next_generation;
    327	unsigned long osb_flags;
    328	u16 s_inode_steal_slot;
    329	u16 s_meta_steal_slot;
    330	atomic_t s_num_inodes_stolen;
    331	atomic_t s_num_meta_stolen;
    332
    333	unsigned long s_mount_opt;
    334	unsigned int s_atime_quantum;
    335
    336	unsigned int max_slots;
    337	unsigned int node_num;
    338	int slot_num;
    339	int preferred_slot;
    340	int s_sectsize_bits;
    341	int s_clustersize;
    342	int s_clustersize_bits;
    343	unsigned int s_xattr_inline_size;
    344
    345	atomic_t vol_state;
    346	struct mutex recovery_lock;
    347	struct ocfs2_recovery_map *recovery_map;
    348	struct ocfs2_replay_map *replay_map;
    349	struct task_struct *recovery_thread_task;
    350	int disable_recovery;
    351	wait_queue_head_t checkpoint_event;
    352	struct ocfs2_journal *journal;
    353	unsigned long osb_commit_interval;
    354
    355	struct delayed_work		la_enable_wq;
    356
    357	/*
    358	 * Must hold local alloc i_rwsem and osb->osb_lock to change
    359	 * local_alloc_bits. Reads can be done under either lock.
    360	 */
    361	unsigned int local_alloc_bits;
    362	unsigned int local_alloc_default_bits;
    363	/* osb_clusters_at_boot can become stale! Do not trust it to
    364	 * be up to date. */
    365	unsigned int osb_clusters_at_boot;
    366
    367	enum ocfs2_local_alloc_state local_alloc_state; /* protected
    368							 * by osb_lock */
    369
    370	struct buffer_head *local_alloc_bh;
    371
    372	u64 la_last_gd;
    373
    374	struct ocfs2_reservation_map	osb_la_resmap;
    375
    376	unsigned int	osb_resv_level;
    377	unsigned int	osb_dir_resv_level;
    378
    379	/* Next two fields are for local node slot recovery during
    380	 * mount. */
    381	struct ocfs2_dinode *local_alloc_copy;
    382	struct ocfs2_quota_recovery *quota_rec;
    383
    384	struct ocfs2_blockcheck_stats osb_ecc_stats;
    385	struct ocfs2_alloc_stats alloc_stats;
    386	char dev_str[20];		/* "major,minor" of the device */
    387
    388	u8 osb_stackflags;
    389
    390	char osb_cluster_stack[OCFS2_STACK_LABEL_LEN + 1];
    391	char osb_cluster_name[OCFS2_CLUSTER_NAME_LEN + 1];
    392	struct ocfs2_cluster_connection *cconn;
    393	struct ocfs2_lock_res osb_super_lockres;
    394	struct ocfs2_lock_res osb_rename_lockres;
    395	struct ocfs2_lock_res osb_nfs_sync_lockres;
    396	struct rw_semaphore nfs_sync_rwlock;
    397	struct ocfs2_lock_res osb_trim_fs_lockres;
    398	struct mutex obs_trim_fs_mutex;
    399	struct ocfs2_dlm_debug *osb_dlm_debug;
    400
    401	struct dentry *osb_debug_root;
    402
    403	wait_queue_head_t recovery_event;
    404
    405	spinlock_t dc_task_lock;
    406	struct task_struct *dc_task;
    407	wait_queue_head_t dc_event;
    408	unsigned long dc_wake_sequence;
    409	unsigned long dc_work_sequence;
    410
    411	/*
    412	 * Any thread can add locks to the list, but the downconvert
    413	 * thread is the only one allowed to remove locks. Any change
    414	 * to this rule requires updating
    415	 * ocfs2_downconvert_thread_do_work().
    416	 */
    417	struct list_head blocked_lock_list;
    418	unsigned long blocked_lock_count;
    419
    420	/* List of dquot structures to drop last reference to */
    421	struct llist_head dquot_drop_list;
    422	struct work_struct dquot_drop_work;
    423
    424	wait_queue_head_t		osb_mount_event;
    425
    426	/* Truncate log info */
    427	struct inode			*osb_tl_inode;
    428	struct buffer_head		*osb_tl_bh;
    429	struct delayed_work		osb_truncate_log_wq;
    430	atomic_t			osb_tl_disable;
    431	/*
    432	 * How many clusters in our truncate log.
    433	 * It must be protected by osb_tl_inode->i_rwsem.
    434	 */
    435	unsigned int truncated_clusters;
    436
    437	struct ocfs2_node_map		osb_recovering_orphan_dirs;
    438	unsigned int			*osb_orphan_wipes;
    439	wait_queue_head_t		osb_wipe_event;
    440
    441	struct ocfs2_orphan_scan	osb_orphan_scan;
    442
    443	/* used to protect metaecc calculation check of xattr. */
    444	spinlock_t osb_xattr_lock;
    445
    446	unsigned int			osb_dx_mask;
    447	u32				osb_dx_seed[4];
    448
    449	/* the group we used to allocate inodes. */
    450	u64				osb_inode_alloc_group;
    451
    452	/* rb tree root for refcount lock. */
    453	struct rb_root	osb_rf_lock_tree;
    454	struct ocfs2_refcount_tree *osb_ref_tree_lru;
    455
    456	struct mutex system_file_mutex;
    457
    458	/*
    459	 * OCFS2 needs to schedule several different types of work which
    460	 * require cluster locking, disk I/O, recovery waits, etc. Since these
    461	 * types of work tend to be heavy we avoid using the kernel events
    462	 * workqueue and schedule on our own.
    463	 */
    464	struct workqueue_struct *ocfs2_wq;
    465
    466	/* sysfs directory per partition */
    467	struct kset *osb_dev_kset;
    468
    469	/* file check related stuff */
    470	struct ocfs2_filecheck_sysfs_entry osb_fc_ent;
    471};
    472
    473#define OCFS2_SB(sb)	    ((struct ocfs2_super *)(sb)->s_fs_info)
    474
    475/* Useful typedef for passing around journal access functions */
    476typedef int (*ocfs2_journal_access_func)(handle_t *handle,
    477					 struct ocfs2_caching_info *ci,
    478					 struct buffer_head *bh, int type);
    479
    480static inline int ocfs2_should_order_data(struct inode *inode)
    481{
    482	if (!S_ISREG(inode->i_mode))
    483		return 0;
    484	if (OCFS2_SB(inode->i_sb)->s_mount_opt & OCFS2_MOUNT_DATA_WRITEBACK)
    485		return 0;
    486	return 1;
    487}
    488
    489static inline int ocfs2_sparse_alloc(struct ocfs2_super *osb)
    490{
    491	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC)
    492		return 1;
    493	return 0;
    494}
    495
    496static inline int ocfs2_writes_unwritten_extents(struct ocfs2_super *osb)
    497{
    498	/*
    499	 * Support for sparse files is a pre-requisite
    500	 */
    501	if (!ocfs2_sparse_alloc(osb))
    502		return 0;
    503
    504	if (osb->s_feature_ro_compat & OCFS2_FEATURE_RO_COMPAT_UNWRITTEN)
    505		return 1;
    506	return 0;
    507}
    508
    509static inline int ocfs2_supports_append_dio(struct ocfs2_super *osb)
    510{
    511	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_APPEND_DIO)
    512		return 1;
    513	return 0;
    514}
    515
    516
    517static inline int ocfs2_supports_inline_data(struct ocfs2_super *osb)
    518{
    519	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_INLINE_DATA)
    520		return 1;
    521	return 0;
    522}
    523
    524static inline int ocfs2_supports_xattr(struct ocfs2_super *osb)
    525{
    526	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_XATTR)
    527		return 1;
    528	return 0;
    529}
    530
    531static inline int ocfs2_meta_ecc(struct ocfs2_super *osb)
    532{
    533	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_META_ECC)
    534		return 1;
    535	return 0;
    536}
    537
    538static inline int ocfs2_supports_indexed_dirs(struct ocfs2_super *osb)
    539{
    540	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS)
    541		return 1;
    542	return 0;
    543}
    544
    545static inline int ocfs2_supports_discontig_bg(struct ocfs2_super *osb)
    546{
    547	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG)
    548		return 1;
    549	return 0;
    550}
    551
    552static inline unsigned int ocfs2_link_max(struct ocfs2_super *osb)
    553{
    554	if (ocfs2_supports_indexed_dirs(osb))
    555		return OCFS2_DX_LINK_MAX;
    556	return OCFS2_LINK_MAX;
    557}
    558
    559static inline unsigned int ocfs2_read_links_count(struct ocfs2_dinode *di)
    560{
    561	u32 nlink = le16_to_cpu(di->i_links_count);
    562	u32 hi = le16_to_cpu(di->i_links_count_hi);
    563
    564	if (di->i_dyn_features & cpu_to_le16(OCFS2_INDEXED_DIR_FL))
    565		nlink |= (hi << OCFS2_LINKS_HI_SHIFT);
    566
    567	return nlink;
    568}
    569
    570static inline void ocfs2_set_links_count(struct ocfs2_dinode *di, u32 nlink)
    571{
    572	u16 lo, hi;
    573
    574	lo = nlink;
    575	hi = nlink >> OCFS2_LINKS_HI_SHIFT;
    576
    577	di->i_links_count = cpu_to_le16(lo);
    578	di->i_links_count_hi = cpu_to_le16(hi);
    579}
    580
    581static inline void ocfs2_add_links_count(struct ocfs2_dinode *di, int n)
    582{
    583	u32 links = ocfs2_read_links_count(di);
    584
    585	links += n;
    586
    587	ocfs2_set_links_count(di, links);
    588}
    589
    590static inline int ocfs2_refcount_tree(struct ocfs2_super *osb)
    591{
    592	if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE)
    593		return 1;
    594	return 0;
    595}
    596
    597/* set / clear functions because cluster events can make these happen
    598 * in parallel so we want the transitions to be atomic. this also
    599 * means that any future flags osb_flags must be protected by spinlock
    600 * too! */
    601static inline void ocfs2_set_osb_flag(struct ocfs2_super *osb,
    602				      unsigned long flag)
    603{
    604	spin_lock(&osb->osb_lock);
    605	osb->osb_flags |= flag;
    606	spin_unlock(&osb->osb_lock);
    607}
    608
    609static inline void ocfs2_set_ro_flag(struct ocfs2_super *osb,
    610				     int hard)
    611{
    612	spin_lock(&osb->osb_lock);
    613	osb->osb_flags &= ~(OCFS2_OSB_SOFT_RO|OCFS2_OSB_HARD_RO);
    614	if (hard)
    615		osb->osb_flags |= OCFS2_OSB_HARD_RO;
    616	else
    617		osb->osb_flags |= OCFS2_OSB_SOFT_RO;
    618	spin_unlock(&osb->osb_lock);
    619}
    620
    621static inline int ocfs2_is_hard_readonly(struct ocfs2_super *osb)
    622{
    623	int ret;
    624
    625	spin_lock(&osb->osb_lock);
    626	ret = osb->osb_flags & OCFS2_OSB_HARD_RO;
    627	spin_unlock(&osb->osb_lock);
    628
    629	return ret;
    630}
    631
    632static inline int ocfs2_is_soft_readonly(struct ocfs2_super *osb)
    633{
    634	int ret;
    635
    636	spin_lock(&osb->osb_lock);
    637	ret = osb->osb_flags & OCFS2_OSB_SOFT_RO;
    638	spin_unlock(&osb->osb_lock);
    639
    640	return ret;
    641}
    642
    643static inline int ocfs2_clusterinfo_valid(struct ocfs2_super *osb)
    644{
    645	return (osb->s_feature_incompat &
    646		(OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK |
    647		 OCFS2_FEATURE_INCOMPAT_CLUSTERINFO));
    648}
    649
    650static inline int ocfs2_userspace_stack(struct ocfs2_super *osb)
    651{
    652	if (ocfs2_clusterinfo_valid(osb) &&
    653	    memcmp(osb->osb_cluster_stack, OCFS2_CLASSIC_CLUSTER_STACK,
    654		   OCFS2_STACK_LABEL_LEN))
    655		return 1;
    656	return 0;
    657}
    658
    659static inline int ocfs2_o2cb_stack(struct ocfs2_super *osb)
    660{
    661	if (ocfs2_clusterinfo_valid(osb) &&
    662	    !memcmp(osb->osb_cluster_stack, OCFS2_CLASSIC_CLUSTER_STACK,
    663		   OCFS2_STACK_LABEL_LEN))
    664		return 1;
    665	return 0;
    666}
    667
    668static inline int ocfs2_cluster_o2cb_global_heartbeat(struct ocfs2_super *osb)
    669{
    670	return ocfs2_o2cb_stack(osb) &&
    671		(osb->osb_stackflags & OCFS2_CLUSTER_O2CB_GLOBAL_HEARTBEAT);
    672}
    673
    674static inline int ocfs2_mount_local(struct ocfs2_super *osb)
    675{
    676	return ((osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT)
    677		|| (osb->s_mount_opt & OCFS2_MOUNT_NOCLUSTER));
    678}
    679
    680static inline int ocfs2_uses_extended_slot_map(struct ocfs2_super *osb)
    681{
    682	return (osb->s_feature_incompat &
    683		OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP);
    684}
    685
    686
    687#define OCFS2_IS_VALID_DINODE(ptr)					\
    688	(!strcmp((ptr)->i_signature, OCFS2_INODE_SIGNATURE))
    689
    690#define OCFS2_IS_VALID_EXTENT_BLOCK(ptr)				\
    691	(!strcmp((ptr)->h_signature, OCFS2_EXTENT_BLOCK_SIGNATURE))
    692
    693#define OCFS2_IS_VALID_GROUP_DESC(ptr)					\
    694	(!strcmp((ptr)->bg_signature, OCFS2_GROUP_DESC_SIGNATURE))
    695
    696
    697#define OCFS2_IS_VALID_XATTR_BLOCK(ptr)					\
    698	(!strcmp((ptr)->xb_signature, OCFS2_XATTR_BLOCK_SIGNATURE))
    699
    700#define OCFS2_IS_VALID_DIR_TRAILER(ptr)					\
    701	(!strcmp((ptr)->db_signature, OCFS2_DIR_TRAILER_SIGNATURE))
    702
    703#define OCFS2_IS_VALID_DX_ROOT(ptr)					\
    704	(!strcmp((ptr)->dr_signature, OCFS2_DX_ROOT_SIGNATURE))
    705
    706#define OCFS2_IS_VALID_DX_LEAF(ptr)					\
    707	(!strcmp((ptr)->dl_signature, OCFS2_DX_LEAF_SIGNATURE))
    708
    709#define OCFS2_IS_VALID_REFCOUNT_BLOCK(ptr)				\
    710	(!strcmp((ptr)->rf_signature, OCFS2_REFCOUNT_BLOCK_SIGNATURE))
    711
    712static inline unsigned long ino_from_blkno(struct super_block *sb,
    713					   u64 blkno)
    714{
    715	return (unsigned long)(blkno & (u64)ULONG_MAX);
    716}
    717
    718static inline u64 ocfs2_clusters_to_blocks(struct super_block *sb,
    719					   u32 clusters)
    720{
    721	int c_to_b_bits = OCFS2_SB(sb)->s_clustersize_bits -
    722		sb->s_blocksize_bits;
    723
    724	return (u64)clusters << c_to_b_bits;
    725}
    726
    727static inline u32 ocfs2_clusters_for_blocks(struct super_block *sb,
    728		u64 blocks)
    729{
    730	int b_to_c_bits = OCFS2_SB(sb)->s_clustersize_bits -
    731			sb->s_blocksize_bits;
    732
    733	blocks += (1 << b_to_c_bits) - 1;
    734	return (u32)(blocks >> b_to_c_bits);
    735}
    736
    737static inline u32 ocfs2_blocks_to_clusters(struct super_block *sb,
    738					   u64 blocks)
    739{
    740	int b_to_c_bits = OCFS2_SB(sb)->s_clustersize_bits -
    741		sb->s_blocksize_bits;
    742
    743	return (u32)(blocks >> b_to_c_bits);
    744}
    745
    746static inline unsigned int ocfs2_clusters_for_bytes(struct super_block *sb,
    747						    u64 bytes)
    748{
    749	int cl_bits = OCFS2_SB(sb)->s_clustersize_bits;
    750	unsigned int clusters;
    751
    752	bytes += OCFS2_SB(sb)->s_clustersize - 1;
    753	/* OCFS2 just cannot have enough clusters to overflow this */
    754	clusters = (unsigned int)(bytes >> cl_bits);
    755
    756	return clusters;
    757}
    758
    759static inline unsigned int ocfs2_bytes_to_clusters(struct super_block *sb,
    760		u64 bytes)
    761{
    762	int cl_bits = OCFS2_SB(sb)->s_clustersize_bits;
    763	unsigned int clusters;
    764
    765	clusters = (unsigned int)(bytes >> cl_bits);
    766	return clusters;
    767}
    768
    769static inline u64 ocfs2_blocks_for_bytes(struct super_block *sb,
    770					 u64 bytes)
    771{
    772	bytes += sb->s_blocksize - 1;
    773	return bytes >> sb->s_blocksize_bits;
    774}
    775
    776static inline u64 ocfs2_clusters_to_bytes(struct super_block *sb,
    777					  u32 clusters)
    778{
    779	return (u64)clusters << OCFS2_SB(sb)->s_clustersize_bits;
    780}
    781
    782static inline u64 ocfs2_block_to_cluster_start(struct super_block *sb,
    783					       u64 blocks)
    784{
    785	int bits = OCFS2_SB(sb)->s_clustersize_bits - sb->s_blocksize_bits;
    786	unsigned int clusters;
    787
    788	clusters = ocfs2_blocks_to_clusters(sb, blocks);
    789	return (u64)clusters << bits;
    790}
    791
    792static inline u64 ocfs2_align_bytes_to_clusters(struct super_block *sb,
    793						u64 bytes)
    794{
    795	int cl_bits = OCFS2_SB(sb)->s_clustersize_bits;
    796	unsigned int clusters;
    797
    798	clusters = ocfs2_clusters_for_bytes(sb, bytes);
    799	return (u64)clusters << cl_bits;
    800}
    801
    802static inline u64 ocfs2_align_bytes_to_blocks(struct super_block *sb,
    803					      u64 bytes)
    804{
    805	u64 blocks;
    806
    807        blocks = ocfs2_blocks_for_bytes(sb, bytes);
    808	return blocks << sb->s_blocksize_bits;
    809}
    810
    811static inline unsigned long ocfs2_align_bytes_to_sectors(u64 bytes)
    812{
    813	return (unsigned long)((bytes + 511) >> 9);
    814}
    815
    816static inline unsigned int ocfs2_page_index_to_clusters(struct super_block *sb,
    817							unsigned long pg_index)
    818{
    819	u32 clusters = pg_index;
    820	unsigned int cbits = OCFS2_SB(sb)->s_clustersize_bits;
    821
    822	if (unlikely(PAGE_SHIFT > cbits))
    823		clusters = pg_index << (PAGE_SHIFT - cbits);
    824	else if (PAGE_SHIFT < cbits)
    825		clusters = pg_index >> (cbits - PAGE_SHIFT);
    826
    827	return clusters;
    828}
    829
    830/*
    831 * Find the 1st page index which covers the given clusters.
    832 */
    833static inline pgoff_t ocfs2_align_clusters_to_page_index(struct super_block *sb,
    834							u32 clusters)
    835{
    836	unsigned int cbits = OCFS2_SB(sb)->s_clustersize_bits;
    837        pgoff_t index = clusters;
    838
    839	if (PAGE_SHIFT > cbits) {
    840		index = (pgoff_t)clusters >> (PAGE_SHIFT - cbits);
    841	} else if (PAGE_SHIFT < cbits) {
    842		index = (pgoff_t)clusters << (cbits - PAGE_SHIFT);
    843	}
    844
    845	return index;
    846}
    847
    848static inline unsigned int ocfs2_pages_per_cluster(struct super_block *sb)
    849{
    850	unsigned int cbits = OCFS2_SB(sb)->s_clustersize_bits;
    851	unsigned int pages_per_cluster = 1;
    852
    853	if (PAGE_SHIFT < cbits)
    854		pages_per_cluster = 1 << (cbits - PAGE_SHIFT);
    855
    856	return pages_per_cluster;
    857}
    858
    859static inline unsigned int ocfs2_megabytes_to_clusters(struct super_block *sb,
    860						       unsigned int megs)
    861{
    862	BUILD_BUG_ON(OCFS2_MAX_CLUSTERSIZE > 1048576);
    863
    864	return megs << (20 - OCFS2_SB(sb)->s_clustersize_bits);
    865}
    866
    867static inline unsigned int ocfs2_clusters_to_megabytes(struct super_block *sb,
    868						       unsigned int clusters)
    869{
    870	return clusters >> (20 - OCFS2_SB(sb)->s_clustersize_bits);
    871}
    872
    873static inline void _ocfs2_set_bit(unsigned int bit, unsigned long *bitmap)
    874{
    875	__set_bit_le(bit, bitmap);
    876}
    877#define ocfs2_set_bit(bit, addr) _ocfs2_set_bit((bit), (unsigned long *)(addr))
    878
    879static inline void _ocfs2_clear_bit(unsigned int bit, unsigned long *bitmap)
    880{
    881	__clear_bit_le(bit, bitmap);
    882}
    883#define ocfs2_clear_bit(bit, addr) _ocfs2_clear_bit((bit), (unsigned long *)(addr))
    884
    885#define ocfs2_test_bit test_bit_le
    886#define ocfs2_find_next_zero_bit find_next_zero_bit_le
    887#define ocfs2_find_next_bit find_next_bit_le
    888
    889static inline void *correct_addr_and_bit_unaligned(int *bit, void *addr)
    890{
    891#if BITS_PER_LONG == 64
    892	*bit += ((unsigned long) addr & 7UL) << 3;
    893	addr = (void *) ((unsigned long) addr & ~7UL);
    894#elif BITS_PER_LONG == 32
    895	*bit += ((unsigned long) addr & 3UL) << 3;
    896	addr = (void *) ((unsigned long) addr & ~3UL);
    897#else
    898#error "how many bits you are?!"
    899#endif
    900	return addr;
    901}
    902
    903static inline void ocfs2_set_bit_unaligned(int bit, void *bitmap)
    904{
    905	bitmap = correct_addr_and_bit_unaligned(&bit, bitmap);
    906	ocfs2_set_bit(bit, bitmap);
    907}
    908
    909static inline void ocfs2_clear_bit_unaligned(int bit, void *bitmap)
    910{
    911	bitmap = correct_addr_and_bit_unaligned(&bit, bitmap);
    912	ocfs2_clear_bit(bit, bitmap);
    913}
    914
    915static inline int ocfs2_test_bit_unaligned(int bit, void *bitmap)
    916{
    917	bitmap = correct_addr_and_bit_unaligned(&bit, bitmap);
    918	return ocfs2_test_bit(bit, bitmap);
    919}
    920
    921static inline int ocfs2_find_next_zero_bit_unaligned(void *bitmap, int max,
    922							int start)
    923{
    924	int fix = 0, ret, tmpmax;
    925	bitmap = correct_addr_and_bit_unaligned(&fix, bitmap);
    926	tmpmax = max + fix;
    927	start += fix;
    928
    929	ret = ocfs2_find_next_zero_bit(bitmap, tmpmax, start) - fix;
    930	if (ret > max)
    931		return max;
    932	return ret;
    933}
    934
    935#endif  /* OCFS2_H */
    936