2018-09-05 01:46:30 +03:00
/* SPDX-License-Identifier: GPL-2.0+ */
2009-04-07 06:01:29 +04:00
/*
2021-11-09 05:35:01 +03:00
* Persistent object ( dat entry / disk inode ) allocator / deallocator
2009-04-07 06:01:29 +04:00
*
* Copyright ( C ) 2006 - 2008 Nippon Telegraph and Telephone Corporation .
*
2016-05-24 02:23:09 +03:00
* Originally written by Koji Sato .
* Two allocators were unified by Ryusuke Konishi and Amagai Yoshiji .
2009-04-07 06:01:29 +04:00
*/
# ifndef _NILFS_ALLOC_H
# define _NILFS_ALLOC_H
# include <linux/types.h>
# include <linux/buffer_head.h>
# include <linux/fs.h>
2010-04-11 20:46:02 +04:00
/**
* nilfs_palloc_entries_per_group - get the number of entries per group
* @ inode : inode of metadata file using this allocator
*
* The number of entries per group is defined by the number of bits
* that a bitmap block can maintain .
*/
2009-04-07 06:01:29 +04:00
static inline unsigned long
nilfs_palloc_entries_per_group ( const struct inode * inode )
{
return 1UL < < ( inode - > i_blkbits + 3 /* log2(8 = CHAR_BITS) */ ) ;
}
2016-05-24 02:23:39 +03:00
int nilfs_palloc_init_blockgroup ( struct inode * , unsigned int ) ;
2009-04-07 06:01:29 +04:00
int nilfs_palloc_get_entry_block ( struct inode * , __u64 , int ,
struct buffer_head * * ) ;
void * nilfs_palloc_block_get_entry ( const struct inode * , __u64 ,
const struct buffer_head * , void * ) ;
2013-07-04 02:08:05 +04:00
int nilfs_palloc_count_max_entries ( struct inode * , u64 , u64 * ) ;
2009-04-07 06:01:29 +04:00
/**
2010-03-13 21:32:40 +03:00
* nilfs_palloc_req - persistent allocator request and reply
2009-04-07 06:01:29 +04:00
* @ pr_entry_nr : entry number ( vblocknr or inode number )
* @ pr_desc_bh : buffer head of the buffer containing block group descriptors
* @ pr_bitmap_bh : buffer head of the buffer containing a block group bitmap
* @ pr_entry_bh : buffer head of the buffer containing translation entries
*/
struct nilfs_palloc_req {
__u64 pr_entry_nr ;
struct buffer_head * pr_desc_bh ;
struct buffer_head * pr_bitmap_bh ;
struct buffer_head * pr_entry_bh ;
} ;
int nilfs_palloc_prepare_alloc_entry ( struct inode * ,
struct nilfs_palloc_req * ) ;
void nilfs_palloc_commit_alloc_entry ( struct inode * ,
struct nilfs_palloc_req * ) ;
void nilfs_palloc_abort_alloc_entry ( struct inode * , struct nilfs_palloc_req * ) ;
void nilfs_palloc_commit_free_entry ( struct inode * , struct nilfs_palloc_req * ) ;
int nilfs_palloc_prepare_free_entry ( struct inode * , struct nilfs_palloc_req * ) ;
void nilfs_palloc_abort_free_entry ( struct inode * , struct nilfs_palloc_req * ) ;
int nilfs_palloc_freev ( struct inode * , __u64 * , size_t ) ;
# define nilfs_set_bit_atomic ext2_set_bit_atomic
# define nilfs_clear_bit_atomic ext2_clear_bit_atomic
2011-03-24 02:42:08 +03:00
# define nilfs_find_next_zero_bit find_next_zero_bit_le
2015-11-07 03:31:56 +03:00
# define nilfs_find_next_bit find_next_bit_le
2009-04-07 06:01:29 +04:00
2012-07-31 01:42:10 +04:00
/**
* struct nilfs_bh_assoc - block offset and buffer head association
* @ blkoff : block offset
* @ bh : buffer head
2009-11-14 09:54:27 +03:00
*/
struct nilfs_bh_assoc {
unsigned long blkoff ;
struct buffer_head * bh ;
} ;
2012-07-31 01:42:10 +04:00
/**
* struct nilfs_palloc_cache - persistent object allocator cache
* @ lock : cache protecting lock
* @ prev_desc : blockgroup descriptors cache
* @ prev_bitmap : blockgroup bitmap cache
* @ prev_entry : translation entries cache
*/
2009-11-14 09:54:27 +03:00
struct nilfs_palloc_cache {
spinlock_t lock ;
struct nilfs_bh_assoc prev_desc ;
struct nilfs_bh_assoc prev_bitmap ;
struct nilfs_bh_assoc prev_entry ;
} ;
void nilfs_palloc_setup_cache ( struct inode * inode ,
struct nilfs_palloc_cache * cache ) ;
void nilfs_palloc_clear_cache ( struct inode * inode ) ;
void nilfs_palloc_destroy_cache ( struct inode * inode ) ;
2009-04-07 06:01:29 +04:00
# endif /* _NILFS_ALLOC_H */