Back to home page

OSCL-LXR

 
 

    


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 */