xref: /linux/fs/ocfs2/inode.h (revision 7fa05c6e46d76378d4403669ba6ea38364f910ac)
1ccd979bdSMark Fasheh /* -*- mode: c; c-basic-offset: 8; -*-
2ccd979bdSMark Fasheh  * vim: noexpandtab sw=8 ts=8 sts=0:
3ccd979bdSMark Fasheh  *
4ccd979bdSMark Fasheh  * inode.h
5ccd979bdSMark Fasheh  *
6ccd979bdSMark Fasheh  * Function prototypes
7ccd979bdSMark Fasheh  *
8ccd979bdSMark Fasheh  * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
9ccd979bdSMark Fasheh  *
10ccd979bdSMark Fasheh  * This program is free software; you can redistribute it and/or
11ccd979bdSMark Fasheh  * modify it under the terms of the GNU General Public
12ccd979bdSMark Fasheh  * License as published by the Free Software Foundation; either
13ccd979bdSMark Fasheh  * version 2 of the License, or (at your option) any later version.
14ccd979bdSMark Fasheh  *
15ccd979bdSMark Fasheh  * This program is distributed in the hope that it will be useful,
16ccd979bdSMark Fasheh  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17ccd979bdSMark Fasheh  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18ccd979bdSMark Fasheh  * General Public License for more details.
19ccd979bdSMark Fasheh  *
20ccd979bdSMark Fasheh  * You should have received a copy of the GNU General Public
21ccd979bdSMark Fasheh  * License along with this program; if not, write to the
22ccd979bdSMark Fasheh  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23ccd979bdSMark Fasheh  * Boston, MA 021110-1307, USA.
24ccd979bdSMark Fasheh  */
25ccd979bdSMark Fasheh 
26ccd979bdSMark Fasheh #ifndef OCFS2_INODE_H
27ccd979bdSMark Fasheh #define OCFS2_INODE_H
28ccd979bdSMark Fasheh 
2983418978SMark Fasheh #include "extent_map.h"
3083418978SMark Fasheh 
31ccd979bdSMark Fasheh /* OCFS2 Inode Private Data */
32ccd979bdSMark Fasheh struct ocfs2_inode_info
33ccd979bdSMark Fasheh {
34ccd979bdSMark Fasheh 	u64			ip_blkno;
35ccd979bdSMark Fasheh 
36ccd979bdSMark Fasheh 	struct ocfs2_lock_res		ip_rw_lockres;
37e63aecb6SMark Fasheh 	struct ocfs2_lock_res		ip_inode_lockres;
3850008630STiger Yang 	struct ocfs2_lock_res		ip_open_lockres;
39ccd979bdSMark Fasheh 
40ccd979bdSMark Fasheh 	/* protects allocation changes on this inode. */
41ccd979bdSMark Fasheh 	struct rw_semaphore		ip_alloc_sem;
42ccd979bdSMark Fasheh 
43cf1d6c76STiger Yang 	/* protects extended attribute changes on this inode */
44cf1d6c76STiger Yang 	struct rw_semaphore		ip_xattr_sem;
45cf1d6c76STiger Yang 
46a11f7e63SMark Fasheh 	/* Number of outstanding AIO's which are not page aligned */
47c18ceab0SWengang Wang 	struct mutex			ip_unaligned_aio;
48a11f7e63SMark Fasheh 
49ccd979bdSMark Fasheh 	/* These fields are protected by ip_lock */
50ccd979bdSMark Fasheh 	spinlock_t			ip_lock;
51ccd979bdSMark Fasheh 	u32				ip_open_count;
52ccd979bdSMark Fasheh 	struct list_head		ip_io_markers;
5383fd9c7fSGoldwyn Rodrigues 	u32				ip_clusters;
54ccd979bdSMark Fasheh 
5583fd9c7fSGoldwyn Rodrigues 	u16				ip_dyn_features;
56251b6eccSMark Fasheh 	struct mutex			ip_io_mutex;
57ccd979bdSMark Fasheh 	u32				ip_flags; /* see below */
58ca4d147eSHerbert Poetzl 	u32				ip_attr; /* inode attributes */
59ccd979bdSMark Fasheh 
60ccd979bdSMark Fasheh 	/* protected by recovery_lock. */
61ccd979bdSMark Fasheh 	struct inode			*ip_next_orphan;
62ccd979bdSMark Fasheh 
63ccd979bdSMark Fasheh 	struct ocfs2_caching_info	ip_metadata_cache;
6483418978SMark Fasheh 	struct ocfs2_extent_map		ip_extent_map;
65ccd979bdSMark Fasheh 	struct inode			vfs_inode;
662b4e30fbSJoel Becker 	struct jbd2_inode		ip_jinode;
6713821151STao Ma 
6883fd9c7fSGoldwyn Rodrigues 	u32				ip_dir_start_lookup;
6983fd9c7fSGoldwyn Rodrigues 
7013821151STao Ma 	/* Only valid if the inode is the dir. */
7113821151STao Ma 	u32				ip_last_used_slot;
7213821151STao Ma 	u64				ip_last_used_group;
735e98d492SGoldwyn Rodrigues 	u32				ip_dir_lock_gen;
744fe370afSMark Fasheh 
754fe370afSMark Fasheh 	struct ocfs2_alloc_reservation	ip_la_data_resv;
762931cdcbSDarrick J. Wong 
772931cdcbSDarrick J. Wong 	/*
782931cdcbSDarrick J. Wong 	 * Transactions that contain inode's metadata needed to complete
792931cdcbSDarrick J. Wong 	 * fsync and fdatasync, respectively.
802931cdcbSDarrick J. Wong 	 */
812931cdcbSDarrick J. Wong 	tid_t i_sync_tid;
822931cdcbSDarrick J. Wong 	tid_t i_datasync_tid;
83ccd979bdSMark Fasheh };
84ccd979bdSMark Fasheh 
85ccd979bdSMark Fasheh /*
86ccd979bdSMark Fasheh  * Flags for the ip_flags field
87ccd979bdSMark Fasheh  */
88ccd979bdSMark Fasheh /* System file inodes  */
89ccd979bdSMark Fasheh #define OCFS2_INODE_SYSTEM_FILE		0x00000001
90ccd979bdSMark Fasheh #define OCFS2_INODE_JOURNAL		0x00000002
91ccd979bdSMark Fasheh #define OCFS2_INODE_BITMAP		0x00000004
92ccd979bdSMark Fasheh /* This inode has been wiped from disk */
93ccd979bdSMark Fasheh #define OCFS2_INODE_DELETED		0x00000008
94ccd979bdSMark Fasheh /* Has the inode been orphaned on another node?
95ccd979bdSMark Fasheh  *
96ccd979bdSMark Fasheh  * This hints to ocfs2_drop_inode that it should clear i_nlink before
97ccd979bdSMark Fasheh  * continuing.
98ccd979bdSMark Fasheh  *
99ccd979bdSMark Fasheh  * We *only* set this on unlink vote from another node. If the inode
100ccd979bdSMark Fasheh  * was locally orphaned, then we're sure of the state and don't need
101ccd979bdSMark Fasheh  * to twiddle i_nlink later - it's either zero or not depending on
102ccd979bdSMark Fasheh  * whether our unlink succeeded. Otherwise we got this from a node
103ccd979bdSMark Fasheh  * whose intention was to orphan the inode, however he may have
104ccd979bdSMark Fasheh  * crashed, failed etc, so we let ocfs2_drop_inode zero the value and
105ccd979bdSMark Fasheh  * rely on ocfs2_delete_inode to sort things out under the proper
106ccd979bdSMark Fasheh  * cluster locks.
107ccd979bdSMark Fasheh  */
1087bf619c1SJan Kara #define OCFS2_INODE_MAYBE_ORPHANED	0x00000010
109ccd979bdSMark Fasheh /* Does someone have the file open O_DIRECT */
1107bf619c1SJan Kara #define OCFS2_INODE_OPEN_DIRECT		0x00000020
111d4cd1871SLi Dongyang /* Tell the inode wipe code it's not in orphan dir */
1127bf619c1SJan Kara #define OCFS2_INODE_SKIP_ORPHAN_DIR     0x00000040
113ccd979bdSMark Fasheh 
114ccd979bdSMark Fasheh static inline struct ocfs2_inode_info *OCFS2_I(struct inode *inode)
115ccd979bdSMark Fasheh {
116ccd979bdSMark Fasheh 	return container_of(inode, struct ocfs2_inode_info, vfs_inode);
117ccd979bdSMark Fasheh }
118ccd979bdSMark Fasheh 
119ccd979bdSMark Fasheh #define INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags & OCFS2_INODE_JOURNAL)
120ccd979bdSMark Fasheh #define SET_INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags |= OCFS2_INODE_JOURNAL)
121ccd979bdSMark Fasheh 
122e18b890bSChristoph Lameter extern struct kmem_cache *ocfs2_inode_cache;
123ccd979bdSMark Fasheh 
124f5e54d6eSChristoph Hellwig extern const struct address_space_operations ocfs2_aops;
1256e5a3d75SJoel Becker extern const struct ocfs2_caching_operations ocfs2_inode_caching_ops;
126ccd979bdSMark Fasheh 
1278cb471e8SJoel Becker static inline struct ocfs2_caching_info *INODE_CACHE(struct inode *inode)
1288cb471e8SJoel Becker {
1298cb471e8SJoel Becker 	return &OCFS2_I(inode)->ip_metadata_cache;
1308cb471e8SJoel Becker }
1318cb471e8SJoel Becker 
132066d92dcSAl Viro void ocfs2_evict_inode(struct inode *inode);
13345321ac5SAl Viro int ocfs2_drop_inode(struct inode *inode);
13424c19ef4SMark Fasheh 
13524c19ef4SMark Fasheh /* Flags for ocfs2_iget() */
1365fa0613eSJan Kara #define OCFS2_FI_FLAG_SYSFILE		0x1
1375fa0613eSJan Kara #define OCFS2_FI_FLAG_ORPHAN_RECOVERY	0x2
1386ca497a8Swengang wang struct inode *ocfs2_ilookup(struct super_block *sb, u64 feoff);
1395fa0613eSJan Kara struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 feoff, unsigned flags,
1405fa0613eSJan Kara 			 int sysfile_type);
141ccd979bdSMark Fasheh int ocfs2_inode_init_private(struct inode *inode);
142ccd979bdSMark Fasheh int ocfs2_inode_revalidate(struct dentry *dentry);
143b657c95cSJoel Becker void ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
144ccd979bdSMark Fasheh 			  int create_ino);
145ccd979bdSMark Fasheh void ocfs2_read_inode(struct inode *inode);
146ccd979bdSMark Fasheh void ocfs2_read_inode2(struct inode *inode, void *opaque);
147ccd979bdSMark Fasheh ssize_t ocfs2_rw_direct(int rw, struct file *filp, char *buf,
148ccd979bdSMark Fasheh 			size_t size, loff_t *offp);
149ccd979bdSMark Fasheh void ocfs2_sync_blockdev(struct super_block *sb);
150ccd979bdSMark Fasheh void ocfs2_refresh_inode(struct inode *inode,
151ccd979bdSMark Fasheh 			 struct ocfs2_dinode *fe);
1521fabe148SMark Fasheh int ocfs2_mark_inode_dirty(handle_t *handle,
153ccd979bdSMark Fasheh 			   struct inode *inode,
154ccd979bdSMark Fasheh 			   struct buffer_head *bh);
1559e33d69fSJan Kara struct buffer_head *ocfs2_bread(struct inode *inode,
1569e33d69fSJan Kara 				int block, int *err, int reada);
157ccd979bdSMark Fasheh 
158ca4d147eSHerbert Poetzl void ocfs2_set_inode_flags(struct inode *inode);
1596e4b0d56SJan Kara void ocfs2_get_inode_flags(struct ocfs2_inode_info *oi);
160ca4d147eSHerbert Poetzl 
1618110b073SMark Fasheh static inline blkcnt_t ocfs2_inode_sector_count(struct inode *inode)
1628110b073SMark Fasheh {
1638110b073SMark Fasheh 	int c_to_s_bits = OCFS2_SB(inode->i_sb)->s_clustersize_bits - 9;
1648110b073SMark Fasheh 
165*7fa05c6eSJoseph Qi 	return (blkcnt_t)OCFS2_I(inode)->ip_clusters << c_to_s_bits;
1668110b073SMark Fasheh }
1678110b073SMark Fasheh 
168b657c95cSJoel Becker /* Validate that a bh contains a valid inode */
169b657c95cSJoel Becker int ocfs2_validate_inode_block(struct super_block *sb,
170b657c95cSJoel Becker 			       struct buffer_head *bh);
171b657c95cSJoel Becker /*
172b657c95cSJoel Becker  * Read an inode block into *bh.  If *bh is NULL, a bh will be allocated.
173b657c95cSJoel Becker  * This is a cached read.  The inode will be validated with
174b657c95cSJoel Becker  * ocfs2_validate_inode_block().
175b657c95cSJoel Becker  */
176b657c95cSJoel Becker int ocfs2_read_inode_block(struct inode *inode, struct buffer_head **bh);
177b657c95cSJoel Becker /* The same, but can be passed OCFS2_BH_* flags */
178b657c95cSJoel Becker int ocfs2_read_inode_block_full(struct inode *inode, struct buffer_head **bh,
179b657c95cSJoel Becker 				int flags);
1806136ca5fSJoel Becker 
1816136ca5fSJoel Becker static inline struct ocfs2_inode_info *cache_info_to_inode(struct ocfs2_caching_info *ci)
1826136ca5fSJoel Becker {
1836136ca5fSJoel Becker 	return container_of(ci, struct ocfs2_inode_info, ip_metadata_cache);
1846136ca5fSJoel Becker }
1856136ca5fSJoel Becker 
186ccd979bdSMark Fasheh #endif /* OCFS2_INODE_H */
187