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 * Return: Number of entries per group. 26 */ 27 static inline unsigned long 28 nilfs_palloc_entries_per_group(const struct inode *inode) 29 { 30 return 1UL << (inode->i_blkbits + 3 /* log2(8 = CHAR_BITS) */); 31 } 32 33 int nilfs_palloc_init_blockgroup(struct inode *, unsigned int); 34 int nilfs_palloc_get_entry_block(struct inode *, __u64, int, 35 struct buffer_head **); 36 size_t nilfs_palloc_entry_offset(const struct inode *inode, __u64 nr, 37 const struct buffer_head *bh); 38 39 int nilfs_palloc_count_max_entries(struct inode *, u64, u64 *); 40 41 /** 42 * struct nilfs_palloc_req - persistent allocator request and reply 43 * @pr_entry_nr: entry number (vblocknr or inode number) 44 * @pr_desc_bh: buffer head of the buffer containing block group descriptors 45 * @pr_bitmap_bh: buffer head of the buffer containing a block group bitmap 46 * @pr_entry_bh: buffer head of the buffer containing translation entries 47 */ 48 struct nilfs_palloc_req { 49 __u64 pr_entry_nr; 50 struct buffer_head *pr_desc_bh; 51 struct buffer_head *pr_bitmap_bh; 52 struct buffer_head *pr_entry_bh; 53 }; 54 55 int nilfs_palloc_prepare_alloc_entry(struct inode *inode, 56 struct nilfs_palloc_req *req, bool wrap); 57 void nilfs_palloc_commit_alloc_entry(struct inode *, 58 struct nilfs_palloc_req *); 59 void nilfs_palloc_abort_alloc_entry(struct inode *, struct nilfs_palloc_req *); 60 void nilfs_palloc_commit_free_entry(struct inode *, struct nilfs_palloc_req *); 61 int nilfs_palloc_prepare_free_entry(struct inode *, struct nilfs_palloc_req *); 62 void nilfs_palloc_abort_free_entry(struct inode *, struct nilfs_palloc_req *); 63 int nilfs_palloc_freev(struct inode *, __u64 *, size_t); 64 65 #define nilfs_set_bit_atomic ext2_set_bit_atomic 66 #define nilfs_clear_bit_atomic ext2_clear_bit_atomic 67 #define nilfs_find_next_zero_bit find_next_zero_bit_le 68 #define nilfs_find_next_bit find_next_bit_le 69 70 /** 71 * struct nilfs_bh_assoc - block offset and buffer head association 72 * @blkoff: block offset 73 * @bh: buffer head 74 */ 75 struct nilfs_bh_assoc { 76 unsigned long blkoff; 77 struct buffer_head *bh; 78 }; 79 80 /** 81 * struct nilfs_palloc_cache - persistent object allocator cache 82 * @lock: cache protecting lock 83 * @prev_desc: blockgroup descriptors cache 84 * @prev_bitmap: blockgroup bitmap cache 85 * @prev_entry: translation entries cache 86 */ 87 struct nilfs_palloc_cache { 88 spinlock_t lock; 89 struct nilfs_bh_assoc prev_desc; 90 struct nilfs_bh_assoc prev_bitmap; 91 struct nilfs_bh_assoc prev_entry; 92 }; 93 94 void nilfs_palloc_setup_cache(struct inode *inode, 95 struct nilfs_palloc_cache *cache); 96 void nilfs_palloc_clear_cache(struct inode *inode); 97 void nilfs_palloc_destroy_cache(struct inode *inode); 98 99 #endif /* _NILFS_ALLOC_H */ 100