![]() |
|
|||
0001 /* SPDX-License-Identifier: GPL-2.0-or-later */ 0002 /* 0003 * Copyright (C) International Business Machines Corp., 2000-2002 0004 */ 0005 #ifndef _H_JFS_IMAP 0006 #define _H_JFS_IMAP 0007 0008 #include "jfs_txnmgr.h" 0009 0010 /* 0011 * jfs_imap.h: disk inode manager 0012 */ 0013 0014 #define EXTSPERIAG 128 /* number of disk inode extent per iag */ 0015 #define IMAPBLKNO 0 /* lblkno of dinomap within inode map */ 0016 #define SMAPSZ 4 /* number of words per summary map */ 0017 #define EXTSPERSUM 32 /* number of extents per summary map entry */ 0018 #define L2EXTSPERSUM 5 /* l2 number of extents per summary map */ 0019 #define PGSPERIEXT 4 /* number of 4K pages per dinode extent */ 0020 #define MAXIAGS ((1<<20)-1) /* maximum number of iags */ 0021 #define MAXAG 128 /* maximum number of allocation groups */ 0022 0023 #define AMAPSIZE 512 /* bytes in the IAG allocation maps */ 0024 #define SMAPSIZE 16 /* bytes in the IAG summary maps */ 0025 0026 /* convert inode number to iag number */ 0027 #define INOTOIAG(ino) ((ino) >> L2INOSPERIAG) 0028 0029 /* convert iag number to logical block number of the iag page */ 0030 #define IAGTOLBLK(iagno,l2nbperpg) (((iagno) + 1) << (l2nbperpg)) 0031 0032 /* get the starting block number of the 4K page of an inode extent 0033 * that contains ino. 0034 */ 0035 #define INOPBLK(pxd,ino,l2nbperpg) (addressPXD((pxd)) + \ 0036 ((((ino) & (INOSPEREXT-1)) >> L2INOSPERPAGE) << (l2nbperpg))) 0037 0038 /* 0039 * inode allocation map: 0040 * 0041 * inode allocation map consists of 0042 * . the inode map control page and 0043 * . inode allocation group pages (per 4096 inodes) 0044 * which are addressed by standard JFS xtree. 0045 */ 0046 /* 0047 * inode allocation group page (per 4096 inodes of an AG) 0048 */ 0049 struct iag { 0050 __le64 agstart; /* 8: starting block of ag */ 0051 __le32 iagnum; /* 4: inode allocation group number */ 0052 __le32 inofreefwd; /* 4: ag inode free list forward */ 0053 __le32 inofreeback; /* 4: ag inode free list back */ 0054 __le32 extfreefwd; /* 4: ag inode extent free list forward */ 0055 __le32 extfreeback; /* 4: ag inode extent free list back */ 0056 __le32 iagfree; /* 4: iag free list */ 0057 0058 /* summary map: 1 bit per inode extent */ 0059 __le32 inosmap[SMAPSZ]; /* 16: sum map of mapwords w/ free inodes; 0060 * note: this indicates free and backed 0061 * inodes, if the extent is not backed the 0062 * value will be 1. if the extent is 0063 * backed but all inodes are being used the 0064 * value will be 1. if the extent is 0065 * backed but at least one of the inodes is 0066 * free the value will be 0. 0067 */ 0068 __le32 extsmap[SMAPSZ]; /* 16: sum map of mapwords w/ free extents */ 0069 __le32 nfreeinos; /* 4: number of free inodes */ 0070 __le32 nfreeexts; /* 4: number of free extents */ 0071 /* (72) */ 0072 u8 pad[1976]; /* 1976: pad to 2048 bytes */ 0073 /* allocation bit map: 1 bit per inode (0 - free, 1 - allocated) */ 0074 __le32 wmap[EXTSPERIAG]; /* 512: working allocation map */ 0075 __le32 pmap[EXTSPERIAG]; /* 512: persistent allocation map */ 0076 pxd_t inoext[EXTSPERIAG]; /* 1024: inode extent addresses */ 0077 }; /* (4096) */ 0078 0079 /* 0080 * per AG control information (in inode map control page) 0081 */ 0082 struct iagctl_disk { 0083 __le32 inofree; /* 4: free inode list anchor */ 0084 __le32 extfree; /* 4: free extent list anchor */ 0085 __le32 numinos; /* 4: number of backed inodes */ 0086 __le32 numfree; /* 4: number of free inodes */ 0087 }; /* (16) */ 0088 0089 struct iagctl { 0090 int inofree; /* free inode list anchor */ 0091 int extfree; /* free extent list anchor */ 0092 int numinos; /* number of backed inodes */ 0093 int numfree; /* number of free inodes */ 0094 }; 0095 0096 /* 0097 * per fileset/aggregate inode map control page 0098 */ 0099 struct dinomap_disk { 0100 __le32 in_freeiag; /* 4: free iag list anchor */ 0101 __le32 in_nextiag; /* 4: next free iag number */ 0102 __le32 in_numinos; /* 4: num of backed inodes */ 0103 __le32 in_numfree; /* 4: num of free backed inodes */ 0104 __le32 in_nbperiext; /* 4: num of blocks per inode extent */ 0105 __le32 in_l2nbperiext; /* 4: l2 of in_nbperiext */ 0106 __le32 in_diskblock; /* 4: for standalone test driver */ 0107 __le32 in_maxag; /* 4: for standalone test driver */ 0108 u8 pad[2016]; /* 2016: pad to 2048 */ 0109 struct iagctl_disk in_agctl[MAXAG]; /* 2048: AG control information */ 0110 }; /* (4096) */ 0111 0112 struct dinomap { 0113 int in_freeiag; /* free iag list anchor */ 0114 int in_nextiag; /* next free iag number */ 0115 int in_numinos; /* num of backed inodes */ 0116 int in_numfree; /* num of free backed inodes */ 0117 int in_nbperiext; /* num of blocks per inode extent */ 0118 int in_l2nbperiext; /* l2 of in_nbperiext */ 0119 int in_diskblock; /* for standalone test driver */ 0120 int in_maxag; /* for standalone test driver */ 0121 struct iagctl in_agctl[MAXAG]; /* AG control information */ 0122 }; 0123 0124 /* 0125 * In-core inode map control page 0126 */ 0127 struct inomap { 0128 struct dinomap im_imap; /* 4096: inode allocation control */ 0129 struct inode *im_ipimap; /* 4: ptr to inode for imap */ 0130 struct mutex im_freelock; /* 4: iag free list lock */ 0131 struct mutex im_aglock[MAXAG]; /* 512: per AG locks */ 0132 u32 *im_DBGdimap; 0133 atomic_t im_numinos; /* num of backed inodes */ 0134 atomic_t im_numfree; /* num of free backed inodes */ 0135 }; 0136 0137 #define im_freeiag im_imap.in_freeiag 0138 #define im_nextiag im_imap.in_nextiag 0139 #define im_agctl im_imap.in_agctl 0140 #define im_nbperiext im_imap.in_nbperiext 0141 #define im_l2nbperiext im_imap.in_l2nbperiext 0142 0143 /* for standalone testdriver 0144 */ 0145 #define im_diskblock im_imap.in_diskblock 0146 #define im_maxag im_imap.in_maxag 0147 0148 extern int diFree(struct inode *); 0149 extern int diAlloc(struct inode *, bool, struct inode *); 0150 extern int diSync(struct inode *); 0151 /* external references */ 0152 extern int diUpdatePMap(struct inode *ipimap, unsigned long inum, 0153 bool is_free, struct tblock * tblk); 0154 extern int diExtendFS(struct inode *ipimap, struct inode *ipbmap); 0155 extern int diMount(struct inode *); 0156 extern int diUnmount(struct inode *, int); 0157 extern int diRead(struct inode *); 0158 extern struct inode *diReadSpecial(struct super_block *, ino_t, int); 0159 extern void diWriteSpecial(struct inode *, int); 0160 extern void diFreeSpecial(struct inode *); 0161 extern int diWrite(tid_t tid, struct inode *); 0162 #endif /* _H_JFS_IMAP */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |
![]() ![]() |