OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [ocfs2/] [ocfs2.h] - Blame information for rev 62

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.