2012-11-29 08:28:09 +04:00
/*
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
* fs / f2fs / node . h
*
* Copyright ( c ) 2012 Samsung Electronics Co . , Ltd .
* http : //www.samsung.com/
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
/* start node id of a node block dedicated to the given node id */
# define START_NID(nid) ((nid / NAT_ENTRY_PER_BLOCK) * NAT_ENTRY_PER_BLOCK)
/* node block offset on the NAT area dedicated to the given start node id */
# define NAT_BLOCK_OFFSET(start_nid) (start_nid / NAT_ENTRY_PER_BLOCK)
/* # of pages to perform readahead before building free nids */
# define FREE_NID_PAGES 4
/* maximum readahead size for node during getting data blocks */
# define MAX_RA_NODE 128
2014-03-19 08:31:37 +04:00
/* control the memory footprint threshold (10MB per 1GB ram) */
# define DEF_RAM_THRESHOLD 10
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
/* vector size for gang look-up from nat cache that consists of radix tree */
# define NATVEC_SIZE 64
2013-03-31 07:47:20 +04:00
/* return value for read_node_page */
# define LOCKED_PAGE 1
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
/*
* For node information
*/
struct node_info {
nid_t nid ; /* node id */
nid_t ino ; /* inode number of the node's owner */
block_t blk_addr ; /* block address of the node */
unsigned char version ; /* version of the node */
} ;
struct nat_entry {
struct list_head list ; /* for clean or dirty nat list */
bool checkpointed ; /* whether it is checkpointed or not */
2014-03-20 16:52:53 +04:00
bool fsync_done ; /* whether the latest node has fsync mark */
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
struct node_info ni ; /* in-memory node information */
} ;
# define nat_get_nid(nat) (nat->ni.nid)
# define nat_set_nid(nat, n) (nat->ni.nid = n)
# define nat_get_blkaddr(nat) (nat->ni.blk_addr)
# define nat_set_blkaddr(nat, b) (nat->ni.blk_addr = b)
# define nat_get_ino(nat) (nat->ni.ino)
# define nat_set_ino(nat, i) (nat->ni.ino = i)
# define nat_get_version(nat) (nat->ni.version)
# define nat_set_version(nat, v) (nat->ni.version = v)
# define __set_nat_cache_dirty(nm_i, ne) \
2014-02-21 08:17:22 +04:00
do { \
ne - > checkpointed = false ; \
list_move_tail ( & ne - > list , & nm_i - > dirty_nat_entries ) ; \
} while ( 0 ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
# define __clear_nat_cache_dirty(nm_i, ne) \
2014-02-21 08:17:22 +04:00
do { \
ne - > checkpointed = true ; \
list_move_tail ( & ne - > list , & nm_i - > nat_entries ) ; \
} while ( 0 ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
# define inc_node_version(version) (++version)
static inline void node_info_from_raw_nat ( struct node_info * ni ,
struct f2fs_nat_entry * raw_ne )
{
ni - > ino = le32_to_cpu ( raw_ne - > ino ) ;
ni - > blk_addr = le32_to_cpu ( raw_ne - > block_addr ) ;
ni - > version = raw_ne - > version ;
}
2014-03-19 08:31:37 +04:00
enum nid_type {
FREE_NIDS , /* indicates the free nid list */
NAT_ENTRIES /* indicates the cached nat entry */
} ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
/*
* For free nid mangement
*/
enum nid_state {
NID_NEW , /* newly added to free nid list */
NID_ALLOC /* it is allocated */
} ;
struct free_nid {
struct list_head list ; /* for free node id list */
nid_t nid ; /* node id */
int state ; /* in use or not: NID_NEW or NID_ALLOC */
} ;
static inline int next_free_nid ( struct f2fs_sb_info * sbi , nid_t * nid )
{
struct f2fs_nm_info * nm_i = NM_I ( sbi ) ;
struct free_nid * fnid ;
if ( nm_i - > fcnt < = 0 )
return - 1 ;
spin_lock ( & nm_i - > free_nid_list_lock ) ;
fnid = list_entry ( nm_i - > free_nid_list . next , struct free_nid , list ) ;
* nid = fnid - > nid ;
spin_unlock ( & nm_i - > free_nid_list_lock ) ;
return 0 ;
}
/*
* inline functions
*/
static inline void get_nat_bitmap ( struct f2fs_sb_info * sbi , void * addr )
{
struct f2fs_nm_info * nm_i = NM_I ( sbi ) ;
memcpy ( addr , nm_i - > nat_bitmap , nm_i - > bitmap_size ) ;
}
static inline pgoff_t current_nat_addr ( struct f2fs_sb_info * sbi , nid_t start )
{
struct f2fs_nm_info * nm_i = NM_I ( sbi ) ;
pgoff_t block_off ;
pgoff_t block_addr ;
int seg_off ;
block_off = NAT_BLOCK_OFFSET ( start ) ;
seg_off = block_off > > sbi - > log_blocks_per_seg ;
block_addr = ( pgoff_t ) ( nm_i - > nat_blkaddr +
( seg_off < < sbi - > log_blocks_per_seg < < 1 ) +
( block_off & ( ( 1 < < sbi - > log_blocks_per_seg ) - 1 ) ) ) ;
if ( f2fs_test_bit ( block_off , nm_i - > nat_bitmap ) )
block_addr + = sbi - > blocks_per_seg ;
return block_addr ;
}
static inline pgoff_t next_nat_addr ( struct f2fs_sb_info * sbi ,
pgoff_t block_addr )
{
struct f2fs_nm_info * nm_i = NM_I ( sbi ) ;
block_addr - = nm_i - > nat_blkaddr ;
if ( ( block_addr > > sbi - > log_blocks_per_seg ) % 2 )
block_addr - = sbi - > blocks_per_seg ;
else
block_addr + = sbi - > blocks_per_seg ;
return block_addr + nm_i - > nat_blkaddr ;
}
static inline void set_to_next_nat ( struct f2fs_nm_info * nm_i , nid_t start_nid )
{
unsigned int block_off = NAT_BLOCK_OFFSET ( start_nid ) ;
if ( f2fs_test_bit ( block_off , nm_i - > nat_bitmap ) )
f2fs_clear_bit ( block_off , nm_i - > nat_bitmap ) ;
else
f2fs_set_bit ( block_off , nm_i - > nat_bitmap ) ;
}
static inline void fill_node_footer ( struct page * page , nid_t nid ,
nid_t ino , unsigned int ofs , bool reset )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
if ( reset )
memset ( rn , 0 , sizeof ( * rn ) ) ;
rn - > footer . nid = cpu_to_le32 ( nid ) ;
rn - > footer . ino = cpu_to_le32 ( ino ) ;
rn - > footer . flag = cpu_to_le32 ( ofs < < OFFSET_BIT_SHIFT ) ;
}
static inline void copy_node_footer ( struct page * dst , struct page * src )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * src_rn = F2FS_NODE ( src ) ;
struct f2fs_node * dst_rn = F2FS_NODE ( dst ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
memcpy ( & dst_rn - > footer , & src_rn - > footer , sizeof ( struct node_footer ) ) ;
}
static inline void fill_node_footer_blkaddr ( struct page * page , block_t blkaddr )
{
struct f2fs_sb_info * sbi = F2FS_SB ( page - > mapping - > host - > i_sb ) ;
struct f2fs_checkpoint * ckpt = F2FS_CKPT ( sbi ) ;
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
rn - > footer . cp_ver = ckpt - > checkpoint_ver ;
2012-11-28 11:12:41 +04:00
rn - > footer . next_blkaddr = cpu_to_le32 ( blkaddr ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
}
static inline nid_t ino_of_node ( struct page * node_page )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( node_page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
return le32_to_cpu ( rn - > footer . ino ) ;
}
static inline nid_t nid_of_node ( struct page * node_page )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( node_page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
return le32_to_cpu ( rn - > footer . nid ) ;
}
static inline unsigned int ofs_of_node ( struct page * node_page )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( node_page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
unsigned flag = le32_to_cpu ( rn - > footer . flag ) ;
return flag > > OFFSET_BIT_SHIFT ;
}
static inline unsigned long long cpver_of_node ( struct page * node_page )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( node_page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
return le64_to_cpu ( rn - > footer . cp_ver ) ;
}
static inline block_t next_blkaddr_of_node ( struct page * node_page )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( node_page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
return le32_to_cpu ( rn - > footer . next_blkaddr ) ;
}
/*
* f2fs assigns the following node offsets described as ( num ) .
* N = NIDS_PER_BLOCK
*
* Inode block ( 0 )
* | - direct node ( 1 )
* | - direct node ( 2 )
* | - indirect node ( 3 )
* | ` - direct node ( 4 = > 4 + N - 1 )
* | - indirect node ( 4 + N )
* | ` - direct node ( 5 + N = > 5 + 2 N - 1 )
* ` - double indirect node ( 5 + 2 N )
* ` - indirect node ( 6 + 2 N )
2013-12-21 14:02:14 +04:00
* ` - direct node
* . . . . . .
* ` - indirect node ( ( 6 + 2 N ) + x ( N + 1 ) )
* ` - direct node
* . . . . . .
* ` - indirect node ( ( 6 + 2 N ) + ( N - 1 ) ( N + 1 ) )
* ` - direct node
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
*/
static inline bool IS_DNODE ( struct page * node_page )
{
unsigned int ofs = ofs_of_node ( node_page ) ;
2013-08-09 03:14:06 +04:00
2014-03-17 12:35:06 +04:00
if ( f2fs_has_xattr_block ( ofs ) )
2013-08-09 03:14:06 +04:00
return false ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
if ( ofs = = 3 | | ofs = = 4 + NIDS_PER_BLOCK | |
ofs = = 5 + 2 * NIDS_PER_BLOCK )
return false ;
if ( ofs > = 6 + 2 * NIDS_PER_BLOCK ) {
ofs - = 6 + 2 * NIDS_PER_BLOCK ;
2013-04-07 20:57:04 +04:00
if ( ! ( ( long int ) ofs % ( NIDS_PER_BLOCK + 1 ) ) )
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
return false ;
}
return true ;
}
static inline void set_nid ( struct page * p , int off , nid_t nid , bool i )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( p ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
wait_on_page_writeback ( p ) ;
if ( i )
rn - > i . i_nid [ off - NODE_DIR1_BLOCK ] = cpu_to_le32 ( nid ) ;
else
rn - > in . nid [ off ] = cpu_to_le32 ( nid ) ;
set_page_dirty ( p ) ;
}
static inline nid_t get_nid ( struct page * p , int off , bool i )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( p ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
if ( i )
return le32_to_cpu ( rn - > i . i_nid [ off - NODE_DIR1_BLOCK ] ) ;
return le32_to_cpu ( rn - > in . nid [ off ] ) ;
}
/*
* Coldness identification :
* - Mark cold files in f2fs_inode_info
* - Mark cold node blocks in their node footer
* - Mark cold data pages in page cache
*/
2013-05-23 17:58:40 +04:00
static inline int is_file ( struct inode * inode , int type )
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
{
2013-05-23 17:58:40 +04:00
return F2FS_I ( inode ) - > i_advise & type ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
}
2013-05-23 17:58:40 +04:00
static inline void set_file ( struct inode * inode , int type )
2013-03-21 10:21:57 +04:00
{
2013-05-23 17:58:40 +04:00
F2FS_I ( inode ) - > i_advise | = type ;
2013-03-21 10:21:57 +04:00
}
2013-06-14 03:52:35 +04:00
static inline void clear_file ( struct inode * inode , int type )
{
F2FS_I ( inode ) - > i_advise & = ~ type ;
}
# define file_is_cold(inode) is_file(inode, FADVISE_COLD_BIT)
# define file_wrong_pino(inode) is_file(inode, FADVISE_LOST_PINO_BIT)
# define file_set_cold(inode) set_file(inode, FADVISE_COLD_BIT)
# define file_lost_pino(inode) set_file(inode, FADVISE_LOST_PINO_BIT)
# define file_clear_cold(inode) clear_file(inode, FADVISE_COLD_BIT)
# define file_got_pino(inode) clear_file(inode, FADVISE_LOST_PINO_BIT)
2013-03-21 10:21:57 +04:00
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
static inline int is_cold_data ( struct page * page )
{
return PageChecked ( page ) ;
}
static inline void set_cold_data ( struct page * page )
{
SetPageChecked ( page ) ;
}
static inline void clear_cold_data ( struct page * page )
{
ClearPageChecked ( page ) ;
}
2013-05-23 17:58:40 +04:00
static inline int is_node ( struct page * page , int type )
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( page ) ;
2013-05-23 17:58:40 +04:00
return le32_to_cpu ( rn - > footer . flag ) & ( 1 < < type ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
}
2013-05-23 17:58:40 +04:00
# define is_cold_node(page) is_node(page, COLD_BIT_SHIFT)
# define is_fsync_dnode(page) is_node(page, FSYNC_BIT_SHIFT)
# define is_dent_dnode(page) is_node(page, DENT_BIT_SHIFT)
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
static inline void set_cold_node ( struct inode * inode , struct page * page )
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
unsigned int flag = le32_to_cpu ( rn - > footer . flag ) ;
if ( S_ISDIR ( inode - > i_mode ) )
flag & = ~ ( 0x1 < < COLD_BIT_SHIFT ) ;
else
flag | = ( 0x1 < < COLD_BIT_SHIFT ) ;
rn - > footer . flag = cpu_to_le32 ( flag ) ;
}
2013-05-23 17:58:40 +04:00
static inline void set_mark ( struct page * page , int mark , int type )
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
{
2013-07-15 13:57:38 +04:00
struct f2fs_node * rn = F2FS_NODE ( page ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
unsigned int flag = le32_to_cpu ( rn - > footer . flag ) ;
if ( mark )
2013-05-23 17:58:40 +04:00
flag | = ( 0x1 < < type ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
else
2013-05-23 17:58:40 +04:00
flag & = ~ ( 0x1 < < type ) ;
f2fs: add superblock and major in-memory structure
This adds the following major in-memory structures in f2fs.
- f2fs_sb_info:
contains f2fs-specific information, two special inode pointers for node and
meta address spaces, and orphan inode management.
- f2fs_inode_info:
contains vfs_inode and other fs-specific information.
- f2fs_nm_info:
contains node manager information such as NAT entry cache, free nid list,
and NAT page management.
- f2fs_node_info:
represents a node as node id, inode number, block address, and its version.
- f2fs_sm_info:
contains segment manager information such as SIT entry cache, free segment
map, current active logs, dirty segment management, and segment utilization.
The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
curseg_info.
In addition, add F2FS_SUPER_MAGIC in magic.h.
Signed-off-by: Chul Lee <chur.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-28 08:37:31 +04:00
rn - > footer . flag = cpu_to_le32 ( flag ) ;
}
2013-05-23 17:58:40 +04:00
# define set_dentry_mark(page, mark) set_mark(page, mark, DENT_BIT_SHIFT)
# define set_fsync_mark(page, mark) set_mark(page, mark, FSYNC_BIT_SHIFT)