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 29*83418978SMark Fasheh #include "extent_map.h" 30*83418978SMark 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; 37ccd979bdSMark Fasheh struct ocfs2_lock_res ip_meta_lockres; 38ccd979bdSMark Fasheh struct ocfs2_lock_res ip_data_lockres; 3950008630STiger Yang struct ocfs2_lock_res ip_open_lockres; 40ccd979bdSMark Fasheh 41ccd979bdSMark Fasheh /* protects allocation changes on this inode. */ 42ccd979bdSMark Fasheh struct rw_semaphore ip_alloc_sem; 43ccd979bdSMark Fasheh 44ccd979bdSMark Fasheh /* These fields are protected by ip_lock */ 45ccd979bdSMark Fasheh spinlock_t ip_lock; 46ccd979bdSMark Fasheh u32 ip_open_count; 47ccd979bdSMark Fasheh u32 ip_clusters; 48ccd979bdSMark Fasheh struct list_head ip_io_markers; 49ccd979bdSMark Fasheh 50251b6eccSMark Fasheh struct mutex ip_io_mutex; 51ccd979bdSMark Fasheh 52ccd979bdSMark Fasheh u32 ip_flags; /* see below */ 53ca4d147eSHerbert Poetzl u32 ip_attr; /* inode attributes */ 54ccd979bdSMark Fasheh 55ccd979bdSMark Fasheh /* protected by recovery_lock. */ 56ccd979bdSMark Fasheh struct inode *ip_next_orphan; 57ccd979bdSMark Fasheh 58ccd979bdSMark Fasheh u32 ip_dir_start_lookup; 59ccd979bdSMark Fasheh 60ccd979bdSMark Fasheh /* next two are protected by trans_inc_lock */ 61ccd979bdSMark Fasheh /* which transaction were we created on? Zero if none. */ 62ccd979bdSMark Fasheh unsigned long ip_created_trans; 63ccd979bdSMark Fasheh /* last transaction we were a part of. */ 64ccd979bdSMark Fasheh unsigned long ip_last_trans; 65ccd979bdSMark Fasheh 66ccd979bdSMark Fasheh struct ocfs2_caching_info ip_metadata_cache; 67ccd979bdSMark Fasheh 68*83418978SMark Fasheh struct ocfs2_extent_map ip_extent_map; 69*83418978SMark Fasheh 70ccd979bdSMark Fasheh struct inode vfs_inode; 71ccd979bdSMark Fasheh }; 72ccd979bdSMark Fasheh 73ccd979bdSMark Fasheh /* 74ccd979bdSMark Fasheh * Flags for the ip_flags field 75ccd979bdSMark Fasheh */ 76ccd979bdSMark Fasheh /* System file inodes */ 77ccd979bdSMark Fasheh #define OCFS2_INODE_SYSTEM_FILE 0x00000001 78ccd979bdSMark Fasheh #define OCFS2_INODE_JOURNAL 0x00000002 79ccd979bdSMark Fasheh #define OCFS2_INODE_BITMAP 0x00000004 80ccd979bdSMark Fasheh /* This inode has been wiped from disk */ 81ccd979bdSMark Fasheh #define OCFS2_INODE_DELETED 0x00000008 82ccd979bdSMark Fasheh /* Another node is deleting, so our delete is a nop */ 83ccd979bdSMark Fasheh #define OCFS2_INODE_SKIP_DELETE 0x00000010 84ccd979bdSMark Fasheh /* Has the inode been orphaned on another node? 85ccd979bdSMark Fasheh * 86ccd979bdSMark Fasheh * This hints to ocfs2_drop_inode that it should clear i_nlink before 87ccd979bdSMark Fasheh * continuing. 88ccd979bdSMark Fasheh * 89ccd979bdSMark Fasheh * We *only* set this on unlink vote from another node. If the inode 90ccd979bdSMark Fasheh * was locally orphaned, then we're sure of the state and don't need 91ccd979bdSMark Fasheh * to twiddle i_nlink later - it's either zero or not depending on 92ccd979bdSMark Fasheh * whether our unlink succeeded. Otherwise we got this from a node 93ccd979bdSMark Fasheh * whose intention was to orphan the inode, however he may have 94ccd979bdSMark Fasheh * crashed, failed etc, so we let ocfs2_drop_inode zero the value and 95ccd979bdSMark Fasheh * rely on ocfs2_delete_inode to sort things out under the proper 96ccd979bdSMark Fasheh * cluster locks. 97ccd979bdSMark Fasheh */ 98ccd979bdSMark Fasheh #define OCFS2_INODE_MAYBE_ORPHANED 0x00000020 99ccd979bdSMark Fasheh /* Does someone have the file open O_DIRECT */ 100ccd979bdSMark Fasheh #define OCFS2_INODE_OPEN_DIRECT 0x00000040 101ccd979bdSMark Fasheh /* Indicates that the metadata cache should be used as an array. */ 102ccd979bdSMark Fasheh #define OCFS2_INODE_CACHE_INLINE 0x00000080 103ccd979bdSMark Fasheh 104ccd979bdSMark Fasheh static inline struct ocfs2_inode_info *OCFS2_I(struct inode *inode) 105ccd979bdSMark Fasheh { 106ccd979bdSMark Fasheh return container_of(inode, struct ocfs2_inode_info, vfs_inode); 107ccd979bdSMark Fasheh } 108ccd979bdSMark Fasheh 109ccd979bdSMark Fasheh #define INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags & OCFS2_INODE_JOURNAL) 110ccd979bdSMark Fasheh #define SET_INODE_JOURNAL(i) (OCFS2_I(i)->ip_flags |= OCFS2_INODE_JOURNAL) 111ccd979bdSMark Fasheh 112e18b890bSChristoph Lameter extern struct kmem_cache *ocfs2_inode_cache; 113ccd979bdSMark Fasheh 114f5e54d6eSChristoph Hellwig extern const struct address_space_operations ocfs2_aops; 115ccd979bdSMark Fasheh 116ccd979bdSMark Fasheh struct buffer_head *ocfs2_bread(struct inode *inode, int block, 117ccd979bdSMark Fasheh int *err, int reada); 118ccd979bdSMark Fasheh void ocfs2_clear_inode(struct inode *inode); 119ccd979bdSMark Fasheh void ocfs2_delete_inode(struct inode *inode); 120ccd979bdSMark Fasheh void ocfs2_drop_inode(struct inode *inode); 12124c19ef4SMark Fasheh 12224c19ef4SMark Fasheh /* Flags for ocfs2_iget() */ 12324c19ef4SMark Fasheh #define OCFS2_FI_FLAG_SYSFILE 0x4 12450008630STiger Yang #define OCFS2_FI_FLAG_ORPHAN_RECOVERY 0x8 12524c19ef4SMark Fasheh struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 feoff, int flags); 126ccd979bdSMark Fasheh int ocfs2_inode_init_private(struct inode *inode); 127ccd979bdSMark Fasheh int ocfs2_inode_revalidate(struct dentry *dentry); 128ccd979bdSMark Fasheh int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, 129ccd979bdSMark Fasheh int create_ino); 130ccd979bdSMark Fasheh void ocfs2_read_inode(struct inode *inode); 131ccd979bdSMark Fasheh void ocfs2_read_inode2(struct inode *inode, void *opaque); 132ccd979bdSMark Fasheh ssize_t ocfs2_rw_direct(int rw, struct file *filp, char *buf, 133ccd979bdSMark Fasheh size_t size, loff_t *offp); 134ccd979bdSMark Fasheh void ocfs2_sync_blockdev(struct super_block *sb); 135ccd979bdSMark Fasheh void ocfs2_refresh_inode(struct inode *inode, 136ccd979bdSMark Fasheh struct ocfs2_dinode *fe); 1371fabe148SMark Fasheh int ocfs2_mark_inode_dirty(handle_t *handle, 138ccd979bdSMark Fasheh struct inode *inode, 139ccd979bdSMark Fasheh struct buffer_head *bh); 140ccd979bdSMark Fasheh int ocfs2_aio_read(struct file *file, struct kiocb *req, struct iocb *iocb); 141ccd979bdSMark Fasheh int ocfs2_aio_write(struct file *file, struct kiocb *req, struct iocb *iocb); 142ccd979bdSMark Fasheh 143ca4d147eSHerbert Poetzl void ocfs2_set_inode_flags(struct inode *inode); 144ca4d147eSHerbert Poetzl 1458110b073SMark Fasheh static inline blkcnt_t ocfs2_inode_sector_count(struct inode *inode) 1468110b073SMark Fasheh { 1478110b073SMark Fasheh int c_to_s_bits = OCFS2_SB(inode->i_sb)->s_clustersize_bits - 9; 1488110b073SMark Fasheh 1498110b073SMark Fasheh return (blkcnt_t)(OCFS2_I(inode)->ip_clusters << c_to_s_bits); 1508110b073SMark Fasheh } 1518110b073SMark Fasheh 152ccd979bdSMark Fasheh #endif /* OCFS2_INODE_H */ 153