1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* |
3 | * Persistent object (dat entry/disk inode) allocator/deallocator |
4 | * |
5 | * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation. |
6 | * |
7 | * Originally written by Koji Sato. |
8 | * Two allocators were unified by Ryusuke Konishi and Amagai Yoshiji. |
9 | */ |
10 | |
11 | #ifndef _NILFS_ALLOC_H |
12 | #define _NILFS_ALLOC_H |
13 | |
14 | #include <linux/types.h> |
15 | #include <linux/buffer_head.h> |
16 | #include <linux/fs.h> |
17 | |
18 | /** |
19 | * nilfs_palloc_entries_per_group - get the number of entries per group |
20 | * @inode: inode of metadata file using this allocator |
21 | * |
22 | * The number of entries per group is defined by the number of bits |
23 | * that a bitmap block can maintain. |
24 | */ |
25 | static inline unsigned long |
26 | nilfs_palloc_entries_per_group(const struct inode *inode) |
27 | { |
28 | return 1UL << (inode->i_blkbits + 3 /* log2(8 = CHAR_BITS) */); |
29 | } |
30 | |
31 | int nilfs_palloc_init_blockgroup(struct inode *, unsigned int); |
32 | int nilfs_palloc_get_entry_block(struct inode *, __u64, int, |
33 | struct buffer_head **); |
34 | void *nilfs_palloc_block_get_entry(const struct inode *, __u64, |
35 | const struct buffer_head *, void *); |
36 | |
37 | int nilfs_palloc_count_max_entries(struct inode *, u64, u64 *); |
38 | |
39 | /** |
40 | * nilfs_palloc_req - persistent allocator request and reply |
41 | * @pr_entry_nr: entry number (vblocknr or inode number) |
42 | * @pr_desc_bh: buffer head of the buffer containing block group descriptors |
43 | * @pr_bitmap_bh: buffer head of the buffer containing a block group bitmap |
44 | * @pr_entry_bh: buffer head of the buffer containing translation entries |
45 | */ |
46 | struct nilfs_palloc_req { |
47 | __u64 pr_entry_nr; |
48 | struct buffer_head *pr_desc_bh; |
49 | struct buffer_head *pr_bitmap_bh; |
50 | struct buffer_head *pr_entry_bh; |
51 | }; |
52 | |
53 | int nilfs_palloc_prepare_alloc_entry(struct inode *, |
54 | struct nilfs_palloc_req *); |
55 | void nilfs_palloc_commit_alloc_entry(struct inode *, |
56 | struct nilfs_palloc_req *); |
57 | void nilfs_palloc_abort_alloc_entry(struct inode *, struct nilfs_palloc_req *); |
58 | void nilfs_palloc_commit_free_entry(struct inode *, struct nilfs_palloc_req *); |
59 | int nilfs_palloc_prepare_free_entry(struct inode *, struct nilfs_palloc_req *); |
60 | void nilfs_palloc_abort_free_entry(struct inode *, struct nilfs_palloc_req *); |
61 | int nilfs_palloc_freev(struct inode *, __u64 *, size_t); |
62 | |
63 | #define nilfs_set_bit_atomic ext2_set_bit_atomic |
64 | #define nilfs_clear_bit_atomic ext2_clear_bit_atomic |
65 | #define nilfs_find_next_zero_bit find_next_zero_bit_le |
66 | #define nilfs_find_next_bit find_next_bit_le |
67 | |
68 | /** |
69 | * struct nilfs_bh_assoc - block offset and buffer head association |
70 | * @blkoff: block offset |
71 | * @bh: buffer head |
72 | */ |
73 | struct nilfs_bh_assoc { |
74 | unsigned long blkoff; |
75 | struct buffer_head *bh; |
76 | }; |
77 | |
78 | /** |
79 | * struct nilfs_palloc_cache - persistent object allocator cache |
80 | * @lock: cache protecting lock |
81 | * @prev_desc: blockgroup descriptors cache |
82 | * @prev_bitmap: blockgroup bitmap cache |
83 | * @prev_entry: translation entries cache |
84 | */ |
85 | struct nilfs_palloc_cache { |
86 | spinlock_t lock; |
87 | struct nilfs_bh_assoc prev_desc; |
88 | struct nilfs_bh_assoc prev_bitmap; |
89 | struct nilfs_bh_assoc prev_entry; |
90 | }; |
91 | |
92 | void nilfs_palloc_setup_cache(struct inode *inode, |
93 | struct nilfs_palloc_cache *cache); |
94 | void nilfs_palloc_clear_cache(struct inode *inode); |
95 | void nilfs_palloc_destroy_cache(struct inode *inode); |
96 | |
97 | #endif /* _NILFS_ALLOC_H */ |
98 | |