2019-05-24 13:04:05 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2021-05-07 04:06:44 +03:00
/*
2005-12-16 01:31:24 +03:00
* inode . h
*
* Function prototypes
*
* Copyright ( C ) 2002 , 2004 Oracle . All rights reserved .
*/
# ifndef OCFS2_INODE_H
# define OCFS2_INODE_H
2007-04-24 05:53:12 +04:00
# include "extent_map.h"
2005-12-16 01:31:24 +03:00
/* OCFS2 Inode Private Data */
struct ocfs2_inode_info
{
u64 ip_blkno ;
struct ocfs2_lock_res ip_rw_lockres ;
2007-10-19 02:30:42 +04:00
struct ocfs2_lock_res ip_inode_lockres ;
2007-03-21 02:01:38 +03:00
struct ocfs2_lock_res ip_open_lockres ;
2005-12-16 01:31:24 +03:00
/* protects allocation changes on this inode. */
struct rw_semaphore ip_alloc_sem ;
2008-08-18 13:11:00 +04:00
/* protects extended attribute changes on this inode */
struct rw_semaphore ip_xattr_sem ;
2005-12-16 01:31:24 +03:00
/* These fields are protected by ip_lock */
spinlock_t ip_lock ;
u32 ip_open_count ;
struct list_head ip_io_markers ;
2010-06-11 02:21:36 +04:00
u32 ip_clusters ;
2005-12-16 01:31:24 +03:00
2010-06-11 02:21:36 +04:00
u16 ip_dyn_features ;
2006-01-11 02:41:43 +03:00
struct mutex ip_io_mutex ;
2005-12-16 01:31:24 +03:00
u32 ip_flags ; /* see below */
2006-07-04 04:27:12 +04:00
u32 ip_attr ; /* inode attributes */
2005-12-16 01:31:24 +03:00
2016-03-26 00:21:06 +03:00
/* Record unwritten extents during direct io. */
struct list_head ip_unwritten_list ;
2005-12-16 01:31:24 +03:00
/* protected by recovery_lock. */
struct inode * ip_next_orphan ;
struct ocfs2_caching_info ip_metadata_cache ;
2007-04-24 05:53:12 +04:00
struct ocfs2_extent_map ip_extent_map ;
2005-12-16 01:31:24 +03:00
struct inode vfs_inode ;
2008-09-04 07:03:41 +04:00
struct jbd2_inode ip_jinode ;
2009-02-24 19:53:23 +03:00
2010-06-11 02:21:36 +04:00
u32 ip_dir_start_lookup ;
2009-02-24 19:53:23 +03:00
/* Only valid if the inode is the dir. */
u32 ip_last_used_slot ;
u64 ip_last_used_group ;
2010-06-28 19:04:32 +04:00
u32 ip_dir_lock_gen ;
2009-12-08 00:15:40 +03:00
struct ocfs2_alloc_reservation ip_la_data_resv ;
2014-04-04 01:46:48 +04:00
/*
* Transactions that contain inode ' s metadata needed to complete
* fsync and fdatasync , respectively .
*/
tid_t i_sync_tid ;
tid_t i_datasync_tid ;
2014-09-29 17:02:51 +04:00
struct dquot * i_dquot [ MAXQUOTAS ] ;
2005-12-16 01:31:24 +03:00
} ;
/*
* Flags for the ip_flags field
*/
/* System file inodes */
# define OCFS2_INODE_SYSTEM_FILE 0x00000001
# define OCFS2_INODE_JOURNAL 0x00000002
# define OCFS2_INODE_BITMAP 0x00000004
/* This inode has been wiped from disk */
# define OCFS2_INODE_DELETED 0x00000008
/* Has the inode been orphaned on another node?
*
* This hints to ocfs2_drop_inode that it should clear i_nlink before
* continuing .
*
* We * only * set this on unlink vote from another node . If the inode
* was locally orphaned , then we ' re sure of the state and don ' t need
* to twiddle i_nlink later - it ' s either zero or not depending on
* whether our unlink succeeded . Otherwise we got this from a node
* whose intention was to orphan the inode , however he may have
* crashed , failed etc , so we let ocfs2_drop_inode zero the value and
* rely on ocfs2_delete_inode to sort things out under the proper
* cluster locks .
*/
2014-04-04 01:46:53 +04:00
# define OCFS2_INODE_MAYBE_ORPHANED 0x00000010
2005-12-16 01:31:24 +03:00
/* Does someone have the file open O_DIRECT */
2014-04-04 01:46:53 +04:00
# define OCFS2_INODE_OPEN_DIRECT 0x00000020
2010-04-22 12:11:19 +04:00
/* Tell the inode wipe code it's not in orphan dir */
2014-04-04 01:46:53 +04:00
# define OCFS2_INODE_SKIP_ORPHAN_DIR 0x00000040
2015-11-06 05:44:04 +03:00
/* Entry in orphan dir with 'dio-' prefix */
# define OCFS2_INODE_DIO_ORPHAN_ENTRY 0x00000080
2005-12-16 01:31:24 +03:00
static inline struct ocfs2_inode_info * OCFS2_I ( struct inode * inode )
{
return container_of ( inode , struct ocfs2_inode_info , vfs_inode ) ;
}
# define INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags & OCFS2_INODE_JOURNAL)
# define SET_INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags |= OCFS2_INODE_JOURNAL)
2006-06-28 15:26:44 +04:00
extern const struct address_space_operations ocfs2_aops ;
2009-02-11 06:00:37 +03:00
extern const struct ocfs2_caching_operations ocfs2_inode_caching_ops ;
2005-12-16 01:31:24 +03:00
2009-02-11 07:00:41 +03:00
static inline struct ocfs2_caching_info * INODE_CACHE ( struct inode * inode )
{
return & OCFS2_I ( inode ) - > ip_metadata_cache ;
}
2010-06-09 05:28:10 +04:00
void ocfs2_evict_inode ( struct inode * inode ) ;
2010-06-07 21:43:19 +04:00
int ocfs2_drop_inode ( struct inode * inode ) ;
2006-09-23 04:28:19 +04:00
/* Flags for ocfs2_iget() */
2008-01-11 02:11:45 +03:00
# define OCFS2_FI_FLAG_SYSFILE 0x1
# define OCFS2_FI_FLAG_ORPHAN_RECOVERY 0x2
2016-03-23 00:24:24 +03:00
# define OCFS2_FI_FLAG_FILECHECK_CHK 0x4
# define OCFS2_FI_FLAG_FILECHECK_FIX 0x8
2009-03-06 16:29:10 +03:00
struct inode * ocfs2_ilookup ( struct super_block * sb , u64 feoff ) ;
2008-01-11 02:11:45 +03:00
struct inode * ocfs2_iget ( struct ocfs2_super * osb , u64 feoff , unsigned flags ,
int sysfile_type ) ;
2005-12-16 01:31:24 +03:00
int ocfs2_inode_revalidate ( struct dentry * dentry ) ;
2008-11-14 01:49:11 +03:00
void ocfs2_populate_inode ( struct inode * inode , struct ocfs2_dinode * fe ,
int create_ino ) ;
2005-12-16 01:31:24 +03:00
void ocfs2_sync_blockdev ( struct super_block * sb ) ;
void ocfs2_refresh_inode ( struct inode * inode ,
struct ocfs2_dinode * fe ) ;
2006-10-10 05:11:45 +04:00
int ocfs2_mark_inode_dirty ( handle_t * handle ,
2005-12-16 01:31:24 +03:00
struct inode * inode ,
struct buffer_head * bh ) ;
2006-07-04 04:27:12 +04:00
void ocfs2_set_inode_flags ( struct inode * inode ) ;
2007-04-27 22:08:01 +04:00
void ocfs2_get_inode_flags ( struct ocfs2_inode_info * oi ) ;
2006-07-04 04:27:12 +04:00
2007-03-23 02:53:23 +03:00
static inline blkcnt_t ocfs2_inode_sector_count ( struct inode * inode )
{
int c_to_s_bits = OCFS2_SB ( inode - > i_sb ) - > s_clustersize_bits - 9 ;
2014-10-10 02:24:56 +04:00
return ( blkcnt_t ) OCFS2_I ( inode ) - > ip_clusters < < c_to_s_bits ;
2007-03-23 02:53:23 +03:00
}
2008-11-14 01:49:11 +03:00
/* Validate that a bh contains a valid inode */
int ocfs2_validate_inode_block ( struct super_block * sb ,
struct buffer_head * bh ) ;
/*
* Read an inode block into * bh . If * bh is NULL , a bh will be allocated .
* This is a cached read . The inode will be validated with
* ocfs2_validate_inode_block ( ) .
*/
int ocfs2_read_inode_block ( struct inode * inode , struct buffer_head * * bh ) ;
/* The same, but can be passed OCFS2_BH_* flags */
int ocfs2_read_inode_block_full ( struct inode * inode , struct buffer_head * * bh ,
int flags ) ;
2009-02-13 06:32:43 +03:00
static inline struct ocfs2_inode_info * cache_info_to_inode ( struct ocfs2_caching_info * ci )
{
return container_of ( ci , struct ocfs2_inode_info , ip_metadata_cache ) ;
}
2016-11-10 01:13:09 +03:00
/* Does this inode have the reflink flag set? */
static inline bool ocfs2_is_refcount_inode ( struct inode * inode )
{
return ( OCFS2_I ( inode ) - > ip_dyn_features & OCFS2_HAS_REFCOUNT_FL ) ;
}
2005-12-16 01:31:24 +03:00
# endif /* OCFS2_INODE_H */