mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 09:13:38 +00:00
nilfs2: separate inode type information from i_state field
In nilfs_iget_locked() and nilfs_ilookup(), which are used to find or obtain nilfs2 inodes, the nilfs_iget_args structure used to identify inodes has type information divided into multiple booleans, making type determination complicated. Simplify inode type determination by consolidating inode type information into an unsigned integer represented by a comibination of flags and by separating the type identification information for on-memory inodes from the i_state member in the nilfs_inode_info structure. Link: https://lkml.kernel.org/r/20240826174116.5008-4-konishi.ryusuke@gmail.com Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com> Cc: Huang Xiaojia <huangxiaojia2@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
21176c0ae4
commit
d7cee0b342
@ -28,17 +28,13 @@
|
|||||||
* @ino: inode number
|
* @ino: inode number
|
||||||
* @cno: checkpoint number
|
* @cno: checkpoint number
|
||||||
* @root: pointer on NILFS root object (mounted checkpoint)
|
* @root: pointer on NILFS root object (mounted checkpoint)
|
||||||
* @for_gc: inode for GC flag
|
* @type: inode type
|
||||||
* @for_btnc: inode for B-tree node cache flag
|
|
||||||
* @for_shadow: inode for shadowed page cache flag
|
|
||||||
*/
|
*/
|
||||||
struct nilfs_iget_args {
|
struct nilfs_iget_args {
|
||||||
u64 ino;
|
u64 ino;
|
||||||
__u64 cno;
|
__u64 cno;
|
||||||
struct nilfs_root *root;
|
struct nilfs_root *root;
|
||||||
bool for_gc;
|
unsigned int type;
|
||||||
bool for_btnc;
|
|
||||||
bool for_shadow;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int nilfs_iget_test(struct inode *inode, void *opaque);
|
static int nilfs_iget_test(struct inode *inode, void *opaque);
|
||||||
@ -315,8 +311,7 @@ static int nilfs_insert_inode_locked(struct inode *inode,
|
|||||||
unsigned long ino)
|
unsigned long ino)
|
||||||
{
|
{
|
||||||
struct nilfs_iget_args args = {
|
struct nilfs_iget_args args = {
|
||||||
.ino = ino, .root = root, .cno = 0, .for_gc = false,
|
.ino = ino, .root = root, .cno = 0, .type = NILFS_I_TYPE_NORMAL
|
||||||
.for_btnc = false, .for_shadow = false
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return insert_inode_locked4(inode, ino, nilfs_iget_test, &args);
|
return insert_inode_locked4(inode, ino, nilfs_iget_test, &args);
|
||||||
@ -343,6 +338,7 @@ struct inode *nilfs_new_inode(struct inode *dir, umode_t mode)
|
|||||||
root = NILFS_I(dir)->i_root;
|
root = NILFS_I(dir)->i_root;
|
||||||
ii = NILFS_I(inode);
|
ii = NILFS_I(inode);
|
||||||
ii->i_state = BIT(NILFS_I_NEW);
|
ii->i_state = BIT(NILFS_I_NEW);
|
||||||
|
ii->i_type = NILFS_I_TYPE_NORMAL;
|
||||||
ii->i_root = root;
|
ii->i_root = root;
|
||||||
|
|
||||||
err = nilfs_ifile_create_inode(root->ifile, &ino, &bh);
|
err = nilfs_ifile_create_inode(root->ifile, &ino, &bh);
|
||||||
@ -546,23 +542,10 @@ static int nilfs_iget_test(struct inode *inode, void *opaque)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ii = NILFS_I(inode);
|
ii = NILFS_I(inode);
|
||||||
if (test_bit(NILFS_I_BTNC, &ii->i_state)) {
|
if (ii->i_type != args->type)
|
||||||
if (!args->for_btnc)
|
|
||||||
return 0;
|
|
||||||
} else if (args->for_btnc) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
if (test_bit(NILFS_I_SHADOW, &ii->i_state)) {
|
|
||||||
if (!args->for_shadow)
|
|
||||||
return 0;
|
|
||||||
} else if (args->for_shadow) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!test_bit(NILFS_I_GCINODE, &ii->i_state))
|
return !(args->type & NILFS_I_TYPE_GC) || args->cno == ii->i_cno;
|
||||||
return !args->for_gc;
|
|
||||||
|
|
||||||
return args->for_gc && args->cno == ii->i_cno;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nilfs_iget_set(struct inode *inode, void *opaque)
|
static int nilfs_iget_set(struct inode *inode, void *opaque)
|
||||||
@ -572,15 +555,9 @@ static int nilfs_iget_set(struct inode *inode, void *opaque)
|
|||||||
inode->i_ino = args->ino;
|
inode->i_ino = args->ino;
|
||||||
NILFS_I(inode)->i_cno = args->cno;
|
NILFS_I(inode)->i_cno = args->cno;
|
||||||
NILFS_I(inode)->i_root = args->root;
|
NILFS_I(inode)->i_root = args->root;
|
||||||
|
NILFS_I(inode)->i_type = args->type;
|
||||||
if (args->root && args->ino == NILFS_ROOT_INO)
|
if (args->root && args->ino == NILFS_ROOT_INO)
|
||||||
nilfs_get_root(args->root);
|
nilfs_get_root(args->root);
|
||||||
|
|
||||||
if (args->for_gc)
|
|
||||||
NILFS_I(inode)->i_state = BIT(NILFS_I_GCINODE);
|
|
||||||
if (args->for_btnc)
|
|
||||||
NILFS_I(inode)->i_state |= BIT(NILFS_I_BTNC);
|
|
||||||
if (args->for_shadow)
|
|
||||||
NILFS_I(inode)->i_state |= BIT(NILFS_I_SHADOW);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,8 +565,7 @@ struct inode *nilfs_ilookup(struct super_block *sb, struct nilfs_root *root,
|
|||||||
unsigned long ino)
|
unsigned long ino)
|
||||||
{
|
{
|
||||||
struct nilfs_iget_args args = {
|
struct nilfs_iget_args args = {
|
||||||
.ino = ino, .root = root, .cno = 0, .for_gc = false,
|
.ino = ino, .root = root, .cno = 0, .type = NILFS_I_TYPE_NORMAL
|
||||||
.for_btnc = false, .for_shadow = false
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return ilookup5(sb, ino, nilfs_iget_test, &args);
|
return ilookup5(sb, ino, nilfs_iget_test, &args);
|
||||||
@ -599,8 +575,7 @@ struct inode *nilfs_iget_locked(struct super_block *sb, struct nilfs_root *root,
|
|||||||
unsigned long ino)
|
unsigned long ino)
|
||||||
{
|
{
|
||||||
struct nilfs_iget_args args = {
|
struct nilfs_iget_args args = {
|
||||||
.ino = ino, .root = root, .cno = 0, .for_gc = false,
|
.ino = ino, .root = root, .cno = 0, .type = NILFS_I_TYPE_NORMAL
|
||||||
.for_btnc = false, .for_shadow = false
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return iget5_locked(sb, ino, nilfs_iget_test, nilfs_iget_set, &args);
|
return iget5_locked(sb, ino, nilfs_iget_test, nilfs_iget_set, &args);
|
||||||
@ -631,8 +606,7 @@ struct inode *nilfs_iget_for_gc(struct super_block *sb, unsigned long ino,
|
|||||||
__u64 cno)
|
__u64 cno)
|
||||||
{
|
{
|
||||||
struct nilfs_iget_args args = {
|
struct nilfs_iget_args args = {
|
||||||
.ino = ino, .root = NULL, .cno = cno, .for_gc = true,
|
.ino = ino, .root = NULL, .cno = cno, .type = NILFS_I_TYPE_GC
|
||||||
.for_btnc = false, .for_shadow = false
|
|
||||||
};
|
};
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
int err;
|
int err;
|
||||||
@ -677,9 +651,7 @@ int nilfs_attach_btree_node_cache(struct inode *inode)
|
|||||||
args.ino = inode->i_ino;
|
args.ino = inode->i_ino;
|
||||||
args.root = ii->i_root;
|
args.root = ii->i_root;
|
||||||
args.cno = ii->i_cno;
|
args.cno = ii->i_cno;
|
||||||
args.for_gc = test_bit(NILFS_I_GCINODE, &ii->i_state) != 0;
|
args.type = ii->i_type | NILFS_I_TYPE_BTNC;
|
||||||
args.for_btnc = true;
|
|
||||||
args.for_shadow = test_bit(NILFS_I_SHADOW, &ii->i_state) != 0;
|
|
||||||
|
|
||||||
btnc_inode = iget5_locked(inode->i_sb, inode->i_ino, nilfs_iget_test,
|
btnc_inode = iget5_locked(inode->i_sb, inode->i_ino, nilfs_iget_test,
|
||||||
nilfs_iget_set, &args);
|
nilfs_iget_set, &args);
|
||||||
@ -733,8 +705,8 @@ void nilfs_detach_btree_node_cache(struct inode *inode)
|
|||||||
struct inode *nilfs_iget_for_shadow(struct inode *inode)
|
struct inode *nilfs_iget_for_shadow(struct inode *inode)
|
||||||
{
|
{
|
||||||
struct nilfs_iget_args args = {
|
struct nilfs_iget_args args = {
|
||||||
.ino = inode->i_ino, .root = NULL, .cno = 0, .for_gc = false,
|
.ino = inode->i_ino, .root = NULL, .cno = 0,
|
||||||
.for_btnc = false, .for_shadow = true
|
.type = NILFS_I_TYPE_SHADOW
|
||||||
};
|
};
|
||||||
struct inode *s_inode;
|
struct inode *s_inode;
|
||||||
int err;
|
int err;
|
||||||
@ -900,7 +872,7 @@ static void nilfs_clear_inode(struct inode *inode)
|
|||||||
if (test_bit(NILFS_I_BMAP, &ii->i_state))
|
if (test_bit(NILFS_I_BMAP, &ii->i_state))
|
||||||
nilfs_bmap_clear(ii->i_bmap);
|
nilfs_bmap_clear(ii->i_bmap);
|
||||||
|
|
||||||
if (!test_bit(NILFS_I_BTNC, &ii->i_state))
|
if (!(ii->i_type & NILFS_I_TYPE_BTNC))
|
||||||
nilfs_detach_btree_node_cache(inode);
|
nilfs_detach_btree_node_cache(inode);
|
||||||
|
|
||||||
if (ii->i_root && inode->i_ino == NILFS_ROOT_INO)
|
if (ii->i_root && inode->i_ino == NILFS_ROOT_INO)
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
/**
|
/**
|
||||||
* struct nilfs_inode_info - nilfs inode data in memory
|
* struct nilfs_inode_info - nilfs inode data in memory
|
||||||
* @i_flags: inode flags
|
* @i_flags: inode flags
|
||||||
|
* @i_type: inode type (combination of flags that inidicate usage)
|
||||||
* @i_state: dynamic state flags
|
* @i_state: dynamic state flags
|
||||||
* @i_bmap: pointer on i_bmap_data
|
* @i_bmap: pointer on i_bmap_data
|
||||||
* @i_bmap_data: raw block mapping
|
* @i_bmap_data: raw block mapping
|
||||||
@ -37,6 +38,7 @@
|
|||||||
*/
|
*/
|
||||||
struct nilfs_inode_info {
|
struct nilfs_inode_info {
|
||||||
__u32 i_flags;
|
__u32 i_flags;
|
||||||
|
unsigned int i_type;
|
||||||
unsigned long i_state; /* Dynamic state flags */
|
unsigned long i_state; /* Dynamic state flags */
|
||||||
struct nilfs_bmap *i_bmap;
|
struct nilfs_bmap *i_bmap;
|
||||||
struct nilfs_bmap i_bmap_data;
|
struct nilfs_bmap i_bmap_data;
|
||||||
@ -90,9 +92,16 @@ enum {
|
|||||||
NILFS_I_UPDATED, /* The file has been written back */
|
NILFS_I_UPDATED, /* The file has been written back */
|
||||||
NILFS_I_INODE_SYNC, /* dsync is not allowed for inode */
|
NILFS_I_INODE_SYNC, /* dsync is not allowed for inode */
|
||||||
NILFS_I_BMAP, /* has bmap and btnode_cache */
|
NILFS_I_BMAP, /* has bmap and btnode_cache */
|
||||||
NILFS_I_GCINODE, /* inode for GC, on memory only */
|
};
|
||||||
NILFS_I_BTNC, /* inode for btree node cache */
|
|
||||||
NILFS_I_SHADOW, /* inode for shadowed page cache */
|
/*
|
||||||
|
* Flags to identify the usage of on-memory inodes (i_type)
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
NILFS_I_TYPE_NORMAL = 0,
|
||||||
|
NILFS_I_TYPE_GC = 0x0001, /* For data caching during GC */
|
||||||
|
NILFS_I_TYPE_BTNC = 0x0002, /* For btree node cache */
|
||||||
|
NILFS_I_TYPE_SHADOW = 0x0004, /* For shadowed page cache */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -519,7 +519,7 @@ static void nilfs_segctor_end_finfo(struct nilfs_sc_info *sci,
|
|||||||
|
|
||||||
ii = NILFS_I(inode);
|
ii = NILFS_I(inode);
|
||||||
|
|
||||||
if (test_bit(NILFS_I_GCINODE, &ii->i_state))
|
if (ii->i_type & NILFS_I_TYPE_GC)
|
||||||
cno = ii->i_cno;
|
cno = ii->i_cno;
|
||||||
else if (NILFS_ROOT_METADATA_FILE(inode->i_ino))
|
else if (NILFS_ROOT_METADATA_FILE(inode->i_ino))
|
||||||
cno = 0;
|
cno = 0;
|
||||||
|
@ -160,6 +160,7 @@ struct inode *nilfs_alloc_inode(struct super_block *sb)
|
|||||||
return NULL;
|
return NULL;
|
||||||
ii->i_bh = NULL;
|
ii->i_bh = NULL;
|
||||||
ii->i_state = 0;
|
ii->i_state = 0;
|
||||||
|
ii->i_type = 0;
|
||||||
ii->i_cno = 0;
|
ii->i_cno = 0;
|
||||||
ii->i_assoc_inode = NULL;
|
ii->i_assoc_inode = NULL;
|
||||||
ii->i_bmap = &ii->i_bmap_data;
|
ii->i_bmap = &ii->i_bmap_data;
|
||||||
|
Loading…
Reference in New Issue
Block a user