jfs_incore.h 6.1 KB
Newer Older
Dave Kleikamp's avatar
Dave Kleikamp committed
1
/*
2
 *   Copyright (c) International Business Machines Corp., 2000-2003
Dave Kleikamp's avatar
Dave Kleikamp committed
3
 *   Portions Copyright (c) Christoph Hellwig, 2001-2002
Dave Kleikamp's avatar
Dave Kleikamp committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17
 *
 *   This program is free software;  you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or 
 *   (at your option) any later version.
 * 
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 *   the GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program;  if not, write to the Free Software 
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
 */ 
Dave Kleikamp's avatar
Dave Kleikamp committed
19 20 21
#ifndef _H_JFS_INCORE
#define _H_JFS_INCORE

Dave Kleikamp's avatar
Dave Kleikamp committed
22
#include <linux/rwsem.h>
Dave Kleikamp's avatar
Dave Kleikamp committed
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#include <linux/slab.h>
#include <asm/bitops.h>
#include "jfs_types.h"
#include "jfs_xtree.h"
#include "jfs_dtree.h"

/*
 * JFS magic number
 */
#define JFS_SUPER_MAGIC 0x3153464a /* "JFS1" */

/*
 * JFS-private inode information
 */
struct jfs_inode_info {
	int	fileset;	/* fileset number (always 16)*/
	uint	mode2;		/* jfs-specific mode		*/
	pxd_t   ixpxd;		/* inode extent descriptor	*/
	dxd_t	acl;		/* dxd describing acl	*/
	dxd_t	ea;		/* dxd describing ea	*/
	time_t	otime;		/* time created	*/
	uint	next_index;	/* next available directory entry index */
	int	acltype;	/* Type of ACL	*/
	short	btorder;	/* access order	*/
	short	btindex;	/* btpage entry index*/
	struct inode *ipimap;	/* inode map			*/
	long	cflag;		/* commit flags		*/
	u16	bxflag;		/* xflag of pseudo buffer?	*/
	unchar	agno;		/* ag number			*/
52
	signed char active_ag;	/* ag currently allocating from	*/
Dave Kleikamp's avatar
Dave Kleikamp committed
53 54 55 56
	lid_t	blid;		/* lid of pseudo buffer?	*/
	lid_t	atlhead;	/* anonymous tlock list head	*/
	lid_t	atltail;	/* anonymous tlock list tail	*/
	struct list_head anon_inode_list; /* inodes having anonymous txns */
Dave Kleikamp's avatar
Dave Kleikamp committed
57 58 59 60 61 62 63 64 65 66 67 68 69
	/*
	 * rdwrlock serializes xtree between reads & writes and synchronizes
	 * changes to special inodes.  It's use would be redundant on
	 * directories since the i_sem taken in the VFS is sufficient.
	 */
	struct rw_semaphore rdwrlock;
	/*
	 * commit_sem serializes transaction processing on an inode.
	 * It must be taken after beginning a transaction (txBegin), since
	 * dirty inodes may be committed while a new transaction on the
	 * inode is blocked in txBegin or TxBeginAnon
	 */
	struct semaphore commit_sem;
70 71
	/* xattr_sem allows us to access the xattrs without taking i_sem */
	struct rw_semaphore xattr_sem;
Dave Kleikamp's avatar
Dave Kleikamp committed
72
	lid_t	xtlid;		/* lid of xtree lock on directory */
Dave Kleikamp's avatar
Dave Kleikamp committed
73 74 75 76
#ifdef CONFIG_JFS_POSIX_ACL
	struct posix_acl *i_acl;
	struct posix_acl *i_default_acl;
#endif
Dave Kleikamp's avatar
Dave Kleikamp committed
77 78 79 80 81 82
	union {
		struct {
			xtpage_t _xtroot;	/* 288: xtree root */
			struct inomap *_imap;	/* 4: inode map header	*/
		} file;
		struct {
83
			struct dir_table_slot _table[12]; /* 96: dir index */
Dave Kleikamp's avatar
Dave Kleikamp committed
84 85 86 87 88 89
			dtroot_t _dtroot;	/* 288: dtree root */
		} dir;
		struct {
			unchar _unused[16];	/* 16: */
			dxd_t _dxd;		/* 16: */
			unchar _inline[128];	/* 128: inline symlink */
Dave Kleikamp's avatar
Dave Kleikamp committed
90 91 92 93
			/* _inline_ea may overlay the last part of
			 * file._xtroot if maxentry = XTROOTINITSLOT
			 */
			unchar _inline_ea[128];	/* 128: inline extended attr */
Dave Kleikamp's avatar
Dave Kleikamp committed
94 95 96 97 98 99 100 101 102
		} link;
	} u;
	struct inode	vfs_inode;
};
#define i_xtroot u.file._xtroot
#define i_imap u.file._imap
#define i_dirtable u.dir._table
#define i_dtroot u.dir._dtroot
#define i_inline u.link._inline
Dave Kleikamp's avatar
Dave Kleikamp committed
103
#define i_inline_ea u.link._inline_ea
Dave Kleikamp's avatar
Dave Kleikamp committed
104

Dave Kleikamp's avatar
Dave Kleikamp committed
105
#define JFS_ACL_NOT_CACHED ((void *)-1)
Dave Kleikamp's avatar
Dave Kleikamp committed
106 107 108 109 110 111

#define IREAD_LOCK(ip)		down_read(&JFS_IP(ip)->rdwrlock)
#define IREAD_UNLOCK(ip)	up_read(&JFS_IP(ip)->rdwrlock)
#define IWRITE_LOCK(ip)		down_write(&JFS_IP(ip)->rdwrlock)
#define IWRITE_UNLOCK(ip)	up_write(&JFS_IP(ip)->rdwrlock)

Dave Kleikamp's avatar
Dave Kleikamp committed
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
/*
 * cflag
 */
enum cflags {
	COMMIT_New,		/* never committed inode   */
	COMMIT_Nolink,		/* inode committed with zero link count */
	COMMIT_Inlineea,	/* commit inode inline EA */
	COMMIT_Freewmap,	/* free WMAP at iClose() */
	COMMIT_Dirty,		/* Inode is really dirty */
	COMMIT_Dirtable,	/* commit changes to di_dirtable */
	COMMIT_Stale,		/* data extent is no longer valid */
	COMMIT_Synclist,	/* metadata pages on group commit synclist */
};

#define set_cflag(flag, ip)	set_bit(flag, &(JFS_IP(ip)->cflag))
#define clear_cflag(flag, ip)	clear_bit(flag, &(JFS_IP(ip)->cflag))
#define test_cflag(flag, ip)	test_bit(flag, &(JFS_IP(ip)->cflag))
#define test_and_clear_cflag(flag, ip) \
	test_and_clear_bit(flag, &(JFS_IP(ip)->cflag))
/*
 * JFS-private superblock information.
 */
struct jfs_sb_info {
135 136 137 138 139 140 141 142 143 144 145 146
	unsigned long	mntflag;	/* aggregate attributes	*/
	struct inode	*ipbmap;	/* block map inode		*/
	struct inode	*ipaimap;	/* aggregate inode map inode	*/
	struct inode	*ipaimap2;	/* secondary aimap inode	*/
	struct inode	*ipimap;	/* aggregate inode map inode	*/
	struct jfs_log	*log;		/* log			*/
	short		bsize;		/* logical block size	*/
	short		l2bsize;	/* log2 logical block size	*/
	short		nbperpage;	/* blocks per page		*/
	short		l2nbperpage;	/* log2 blocks per page	*/
	short		l2niperblk;	/* log2 inodes per page	*/
	u32		logdev;		/* external log device	*/
147
	uint		aggregate;	/* volume identifier in log record */
148 149 150 151 152
	pxd_t		logpxd;		/* pxd describing log	*/
	pxd_t		fsckpxd;	/* pxd describing fsck wkspc */
	pxd_t		ait2;		/* pxd describing AIT copy	*/
	char		uuid[16];	/* 128-bit uuid for volume	*/
	char		loguuid[16];	/* 128-bit uuid for log	*/
Dave Kleikamp's avatar
Dave Kleikamp committed
153
	/* Formerly in ipimap */
154 155
	uint		gengen;		/* inode generation generator*/
	uint		inostamp;	/* shows inode belongs to fileset*/
Dave Kleikamp's avatar
Dave Kleikamp committed
156 157

        /* Formerly in ipbmap */
158 159 160 161 162
	struct bmap	*bmap;		/* incore bmap descriptor	*/
	struct nls_table *nls_tab;	/* current codepage		*/
	uint		state;		/* mount/recovery state	*/
	unsigned long	flag;		/* mount time flags */
	uint		p_state;	/* state prior to going no integrity */
Dave Kleikamp's avatar
Dave Kleikamp committed
163 164 165 166 167 168 169
};

static inline struct jfs_inode_info *JFS_IP(struct inode *inode)
{
	return list_entry(inode, struct jfs_inode_info, vfs_inode);
}

Dave Kleikamp's avatar
Dave Kleikamp committed
170 171
static inline struct jfs_sb_info *JFS_SBI(struct super_block *sb)
{
172
	return sb->s_fs_info;
Dave Kleikamp's avatar
Dave Kleikamp committed
173 174 175 176 177 178 179 180
}

static inline int isReadOnly(struct inode *inode)
{
	if (JFS_SBI(inode->i_sb)->log)
		return 0;
	return 1;
}
Dave Kleikamp's avatar
Dave Kleikamp committed
181 182

#endif /* _H_JFS_INCORE */