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 29ccd979bdSMark Fasheh /* OCFS2 Inode Private Data */ 30ccd979bdSMark Fasheh struct ocfs2_inode_info 31ccd979bdSMark Fasheh { 32ccd979bdSMark Fasheh u64 ip_blkno; 33ccd979bdSMark Fasheh 34ccd979bdSMark Fasheh struct ocfs2_lock_res ip_rw_lockres; 35ccd979bdSMark Fasheh struct ocfs2_lock_res ip_meta_lockres; 36ccd979bdSMark Fasheh struct ocfs2_lock_res ip_data_lockres; 37ccd979bdSMark Fasheh 38ccd979bdSMark Fasheh /* protects allocation changes on this inode. */ 39ccd979bdSMark Fasheh struct rw_semaphore ip_alloc_sem; 40ccd979bdSMark Fasheh 41ccd979bdSMark Fasheh /* These fields are protected by ip_lock */ 42ccd979bdSMark Fasheh spinlock_t ip_lock; 43ccd979bdSMark Fasheh u32 ip_open_count; 44ccd979bdSMark Fasheh u32 ip_clusters; 45ccd979bdSMark Fasheh struct ocfs2_extent_map ip_map; 46ccd979bdSMark Fasheh struct list_head ip_io_markers; 47ccd979bdSMark Fasheh int ip_orphaned_slot; 48ccd979bdSMark Fasheh 49251b6eccSMark Fasheh struct mutex ip_io_mutex; 50ccd979bdSMark Fasheh 51ccd979bdSMark Fasheh /* Used by the journalling code to attach an inode to a 52251b6eccSMark Fasheh * handle. These are protected by ip_io_mutex in order to lock 53ccd979bdSMark Fasheh * out other I/O to the inode until we either commit or 54ccd979bdSMark Fasheh * abort. */ 55ccd979bdSMark Fasheh struct list_head ip_handle_list; 56ccd979bdSMark Fasheh struct ocfs2_journal_handle *ip_handle; 57ccd979bdSMark Fasheh 58ccd979bdSMark Fasheh u32 ip_flags; /* see below */ 59ca4d147eSHerbert Poetzl u32 ip_attr; /* inode attributes */ 60ccd979bdSMark Fasheh 61ccd979bdSMark Fasheh /* protected by recovery_lock. */ 62ccd979bdSMark Fasheh struct inode *ip_next_orphan; 63ccd979bdSMark Fasheh 64ccd979bdSMark Fasheh u32 ip_dir_start_lookup; 65ccd979bdSMark Fasheh 66ccd979bdSMark Fasheh /* next two are protected by trans_inc_lock */ 67ccd979bdSMark Fasheh /* which transaction were we created on? Zero if none. */ 68ccd979bdSMark Fasheh unsigned long ip_created_trans; 69ccd979bdSMark Fasheh /* last transaction we were a part of. */ 70ccd979bdSMark Fasheh unsigned long ip_last_trans; 71ccd979bdSMark Fasheh 72ccd979bdSMark Fasheh struct ocfs2_caching_info ip_metadata_cache; 73ccd979bdSMark Fasheh 74ccd979bdSMark Fasheh struct inode vfs_inode; 75ccd979bdSMark Fasheh }; 76ccd979bdSMark Fasheh 77ccd979bdSMark Fasheh /* 78ccd979bdSMark Fasheh * Flags for the ip_flags field 79ccd979bdSMark Fasheh */ 80ccd979bdSMark Fasheh /* System file inodes */ 81ccd979bdSMark Fasheh #define OCFS2_INODE_SYSTEM_FILE 0x00000001 82ccd979bdSMark Fasheh #define OCFS2_INODE_JOURNAL 0x00000002 83ccd979bdSMark Fasheh #define OCFS2_INODE_BITMAP 0x00000004 84ccd979bdSMark Fasheh /* This inode has been wiped from disk */ 85ccd979bdSMark Fasheh #define OCFS2_INODE_DELETED 0x00000008 86ccd979bdSMark Fasheh /* Another node is deleting, so our delete is a nop */ 87ccd979bdSMark Fasheh #define OCFS2_INODE_SKIP_DELETE 0x00000010 88ccd979bdSMark Fasheh /* Has the inode been orphaned on another node? 89ccd979bdSMark Fasheh * 90ccd979bdSMark Fasheh * This hints to ocfs2_drop_inode that it should clear i_nlink before 91ccd979bdSMark Fasheh * continuing. 92ccd979bdSMark Fasheh * 93ccd979bdSMark Fasheh * We *only* set this on unlink vote from another node. If the inode 94ccd979bdSMark Fasheh * was locally orphaned, then we're sure of the state and don't need 95ccd979bdSMark Fasheh * to twiddle i_nlink later - it's either zero or not depending on 96ccd979bdSMark Fasheh * whether our unlink succeeded. Otherwise we got this from a node 97ccd979bdSMark Fasheh * whose intention was to orphan the inode, however he may have 98ccd979bdSMark Fasheh * crashed, failed etc, so we let ocfs2_drop_inode zero the value and 99ccd979bdSMark Fasheh * rely on ocfs2_delete_inode to sort things out under the proper 100ccd979bdSMark Fasheh * cluster locks. 101ccd979bdSMark Fasheh */ 102ccd979bdSMark Fasheh #define OCFS2_INODE_MAYBE_ORPHANED 0x00000020 103ccd979bdSMark Fasheh /* Does someone have the file open O_DIRECT */ 104ccd979bdSMark Fasheh #define OCFS2_INODE_OPEN_DIRECT 0x00000040 105ccd979bdSMark Fasheh /* Indicates that the metadata cache should be used as an array. */ 106ccd979bdSMark Fasheh #define OCFS2_INODE_CACHE_INLINE 0x00000080 107ccd979bdSMark Fasheh 108ccd979bdSMark Fasheh static inline struct ocfs2_inode_info *OCFS2_I(struct inode *inode) 109ccd979bdSMark Fasheh { 110ccd979bdSMark Fasheh return container_of(inode, struct ocfs2_inode_info, vfs_inode); 111ccd979bdSMark Fasheh } 112ccd979bdSMark Fasheh 113ccd979bdSMark Fasheh #define INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags & OCFS2_INODE_JOURNAL) 114ccd979bdSMark Fasheh #define SET_INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags |= OCFS2_INODE_JOURNAL) 115ccd979bdSMark Fasheh 116ccd979bdSMark Fasheh extern kmem_cache_t *ocfs2_inode_cache; 117ccd979bdSMark Fasheh 118f5e54d6eSChristoph Hellwig extern const struct address_space_operations ocfs2_aops; 119ccd979bdSMark Fasheh 120ccd979bdSMark Fasheh struct buffer_head *ocfs2_bread(struct inode *inode, int block, 121ccd979bdSMark Fasheh int *err, int reada); 122ccd979bdSMark Fasheh void ocfs2_clear_inode(struct inode *inode); 123ccd979bdSMark Fasheh void ocfs2_delete_inode(struct inode *inode); 124ccd979bdSMark Fasheh void ocfs2_drop_inode(struct inode *inode); 125*24c19ef4SMark Fasheh 126*24c19ef4SMark Fasheh /* Flags for ocfs2_iget() */ 127*24c19ef4SMark Fasheh #define OCFS2_FI_FLAG_NOWAIT 0x1 128*24c19ef4SMark Fasheh #define OCFS2_FI_FLAG_DELETE 0x2 129*24c19ef4SMark Fasheh #define OCFS2_FI_FLAG_SYSFILE 0x4 130*24c19ef4SMark Fasheh #define OCFS2_FI_FLAG_NOLOCK 0x8 131*24c19ef4SMark Fasheh struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 feoff, int flags); 132ccd979bdSMark Fasheh struct inode *ocfs2_ilookup_for_vote(struct ocfs2_super *osb, 133ccd979bdSMark Fasheh u64 blkno, 134ccd979bdSMark Fasheh int delete_vote); 135ccd979bdSMark Fasheh int ocfs2_inode_init_private(struct inode *inode); 136ccd979bdSMark Fasheh int ocfs2_inode_revalidate(struct dentry *dentry); 137ccd979bdSMark Fasheh int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, 138ccd979bdSMark Fasheh int create_ino); 139ccd979bdSMark Fasheh void ocfs2_read_inode(struct inode *inode); 140ccd979bdSMark Fasheh void ocfs2_read_inode2(struct inode *inode, void *opaque); 141ccd979bdSMark Fasheh ssize_t ocfs2_rw_direct(int rw, struct file *filp, char *buf, 142ccd979bdSMark Fasheh size_t size, loff_t *offp); 143ccd979bdSMark Fasheh void ocfs2_sync_blockdev(struct super_block *sb); 144ccd979bdSMark Fasheh void ocfs2_refresh_inode(struct inode *inode, 145ccd979bdSMark Fasheh struct ocfs2_dinode *fe); 146ccd979bdSMark Fasheh int ocfs2_mark_inode_dirty(struct ocfs2_journal_handle *handle, 147ccd979bdSMark Fasheh struct inode *inode, 148ccd979bdSMark Fasheh struct buffer_head *bh); 149ccd979bdSMark Fasheh int ocfs2_aio_read(struct file *file, struct kiocb *req, struct iocb *iocb); 150ccd979bdSMark Fasheh int ocfs2_aio_write(struct file *file, struct kiocb *req, struct iocb *iocb); 151ccd979bdSMark Fasheh 152ca4d147eSHerbert Poetzl void ocfs2_set_inode_flags(struct inode *inode); 153ca4d147eSHerbert Poetzl 154ccd979bdSMark Fasheh #endif /* OCFS2_INODE_H */ 155