Lines Matching refs:imap

48  * imap locks
51 #define IAGFREE_LOCK_INIT(imap) mutex_init(&imap->im_freelock)
52 #define IAGFREE_LOCK(imap) mutex_lock(&imap->im_freelock)
53 #define IAGFREE_UNLOCK(imap) mutex_unlock(&imap->im_freelock)
56 #define AG_LOCK_INIT(imap,index) mutex_init(&(imap->im_aglock[index]))
57 #define AG_LOCK(imap,agno) mutex_lock(&imap->im_aglock[agno])
58 #define AG_UNLOCK(imap,agno) mutex_unlock(&imap->im_aglock[agno])
73 static int diIAGRead(struct inomap * imap, int, struct metapage **);
96 struct inomap *imap;
105 imap = kmalloc(sizeof(struct inomap), GFP_KERNEL);
106 if (imap == NULL)
115 kfree(imap);
121 imap->im_freeiag = le32_to_cpu(dinom_le->in_freeiag);
122 imap->im_nextiag = le32_to_cpu(dinom_le->in_nextiag);
123 atomic_set(&imap->im_numinos, le32_to_cpu(dinom_le->in_numinos));
124 atomic_set(&imap->im_numfree, le32_to_cpu(dinom_le->in_numfree));
125 imap->im_nbperiext = le32_to_cpu(dinom_le->in_nbperiext);
126 imap->im_l2nbperiext = le32_to_cpu(dinom_le->in_l2nbperiext);
128 imap->im_agctl[index].inofree =
130 imap->im_agctl[index].extfree =
132 imap->im_agctl[index].numinos =
134 imap->im_agctl[index].numfree =
145 IAGFREE_LOCK_INIT(imap);
149 AG_LOCK_INIT(imap, index);
155 imap->im_ipimap = ipimap;
156 JFS_IP(ipimap)->i_imap = imap;
178 struct inomap *imap = JFS_IP(ipimap)->i_imap;
195 kfree(imap);
213 * write imap global conrol page
247 * write out dirty pages of imap
299 struct inomap *imap;
315 imap = JFS_IP(ipimap)->i_imap;
316 rc = diIAGRead(imap, iagno, &mp);
329 if ((lengthPXD(&iagp->inoext[extno]) != imap->im_nbperiext) ||
852 struct inomap *imap = JFS_IP(ipimap)->i_imap;
872 if (iagno >= imap->im_nextiag) {
873 print_hex_dump(KERN_ERR, "imap: ", DUMP_PREFIX_ADDRESS, 16, 4,
874 imap, 32, 0);
876 (uint) inum, iagno, imap->im_nextiag);
886 AG_LOCK(imap, agno);
888 /* Obtain read lock in imap inode. Don't release it until we have
895 if ((rc = diIAGRead(imap, iagno, &mp))) {
897 AG_UNLOCK(imap, agno);
917 AG_UNLOCK(imap, agno);
926 if (imap->im_agctl[agno].numfree > imap->im_agctl[agno].numinos) {
929 AG_UNLOCK(imap, agno);
938 imap->im_agctl[agno].numfree < 96 ||
939 (imap->im_agctl[agno].numfree < 288 &&
940 (((imap->im_agctl[agno].numfree * 100) /
941 imap->im_agctl[agno].numinos) <= 25))) {
952 if ((fwd = imap->im_agctl[agno].inofree) >= 0) {
956 if ((rc = diIAGRead(imap, fwd, &amp))) {
958 AG_UNLOCK(imap, agno);
975 cpu_to_le32(imap->im_agctl[agno].inofree);
977 imap->im_agctl[agno].inofree = iagno;
1001 imap->im_agctl[agno].numfree += 1;
1002 atomic_inc(&imap->im_numfree);
1006 AG_UNLOCK(imap, agno);
1036 if ((fwd = imap->im_agctl[agno].extfree) >= 0) {
1037 if ((rc = diIAGRead(imap, fwd, &amp)))
1054 if ((rc = diIAGRead(imap, fwd, &amp)))
1060 if ((rc = diIAGRead(imap, back, &bmp)))
1090 diIAGRead(imap, inofreefwd, &cmp)))
1104 diIAGRead(imap, inofreeback, &dmp)))
1131 cpu_to_le32(imap->im_agctl[agno].extfree);
1133 imap->im_agctl[agno].extfree = iagno;
1145 imap->im_agctl[agno].extfree =
1150 IAGFREE_LOCK(imap);
1151 iagp->iagfree = cpu_to_le32(imap->im_freeiag);
1152 imap->im_freeiag = iagno;
1153 IAGFREE_UNLOCK(imap);
1167 imap->im_agctl[agno].inofree =
1205 imap->im_agctl[agno].numfree -= (INOSPEREXT - 1);
1206 imap->im_agctl[agno].numinos -= INOSPEREXT;
1207 atomic_sub(INOSPEREXT - 1, &imap->im_numfree);
1208 atomic_sub(INOSPEREXT, &imap->im_numinos);
1265 AG_UNLOCK(imap, agno);
1281 AG_UNLOCK(imap, agno);
1329 struct inomap *imap;
1332 * corresponding imap control structure.
1335 imap = JFS_IP(ipimap)->i_imap;
1344 AG_LOCK(imap, agno);
1370 AG_LOCK(imap, agno);
1382 AG_LOCK(imap, agno);
1384 /* Get read lock on imap inode */
1389 if ((rc = diIAGRead(imap, iagno, &mp))) {
1391 AG_UNLOCK(imap, agno);
1400 addext = (imap->im_agctl[agno].numfree < 32 && iagp->nfreeexts);
1427 rc = diAllocBit(imap, iagp, ino);
1443 AG_UNLOCK(imap, agno);
1499 AG_UNLOCK(imap, agno);
1510 rc = diAllocBit(imap, iagp, ino);
1526 AG_UNLOCK(imap, agno);
1544 if ((rc = diNewExt(imap, iagp, extno))) {
1563 /* free the imap inode & the AG lock & return.
1566 AG_UNLOCK(imap, agno);
1577 /* unlock imap inode */
1587 rc = diAllocAG(imap, agno, dir, ip);
1589 AG_UNLOCK(imap, agno);
1597 return (diAllocAny(imap, agno, dir, ip));
1602 * NAME: diAllocAG(imap,agno,dir,ip)
1618 * imap - pointer to inode map control structure.
1631 diAllocAG(struct inomap * imap, int agno, bool dir, struct inode *ip)
1638 numfree = imap->im_agctl[agno].numfree;
1639 numinos = imap->im_agctl[agno].numinos;
1666 if ((rc = diAllocExt(imap, agno, ip)) != -ENOSPC)
1673 return (diAllocIno(imap, agno, ip));
1678 * NAME: diAllocAny(imap,agno,dir,iap)
1688 * imap - pointer to inode map control structure.
1701 diAllocAny(struct inomap * imap, int agno, bool dir, struct inode *ip)
1704 int maxag = JFS_SBI(imap->im_ipimap->i_sb)->bmap->db_maxag;
1711 AG_LOCK(imap, ag);
1713 rc = diAllocAG(imap, ag, dir, ip);
1715 AG_UNLOCK(imap, ag);
1724 AG_LOCK(imap, ag);
1726 rc = diAllocAG(imap, ag, dir, ip);
1728 AG_UNLOCK(imap, ag);
1741 * NAME: diAllocIno(imap,agno,ip)
1754 * imap - pointer to inode map control structure.
1765 static int diAllocIno(struct inomap * imap, int agno, struct inode *ip)
1773 if ((iagno = imap->im_agctl[agno].inofree) < 0)
1776 /* obtain read lock on imap inode */
1777 IREAD_LOCK(imap->im_ipimap, RDWRLOCK_IMAP);
1781 if ((rc = diIAGRead(imap, iagno, &mp))) {
1782 IREAD_UNLOCK(imap->im_ipimap);
1791 IREAD_UNLOCK(imap->im_ipimap);
1802 IREAD_UNLOCK(imap->im_ipimap);
1818 IREAD_UNLOCK(imap->im_ipimap);
1829 IREAD_UNLOCK(imap->im_ipimap);
1841 rc = diAllocBit(imap, iagp, ino);
1842 IREAD_UNLOCK(imap->im_ipimap);
1858 * NAME: diAllocExt(imap,agno,ip)
1878 * imap - pointer to inode map control structure.
1889 static int diAllocExt(struct inomap * imap, int agno, struct inode *ip)
1898 if ((iagno = imap->im_agctl[agno].extfree) < 0) {
1900 * imap inode.
1902 if ((rc = diNewIAG(imap, &iagno, agno, &mp))) {
1910 cpu_to_le64(AGTOBLK(agno, imap->im_ipimap));
1914 IREAD_LOCK(imap->im_ipimap, RDWRLOCK_IMAP);
1915 if ((rc = diIAGRead(imap, iagno, &mp))) {
1916 IREAD_UNLOCK(imap->im_ipimap);
1928 IREAD_UNLOCK(imap->im_ipimap);
1941 IREAD_UNLOCK(imap->im_ipimap);
1949 rc = diNewExt(imap, iagp, extno);
1950 IREAD_UNLOCK(imap->im_ipimap);
1957 IAGFREE_LOCK(imap);
1958 iagp->iagfree = cpu_to_le32(imap->im_freeiag);
1959 imap->im_freeiag = iagno;
1960 IAGFREE_UNLOCK(imap);
1977 * NAME: diAllocBit(imap,iagp,ino)
1994 * this AG. Must have read lock on imap inode.
1997 * imap - pointer to inode map control structure.
2006 static int diAllocBit(struct inomap * imap, struct iag * iagp, int ino)
2021 diIAGRead(imap, le32_to_cpu(iagp->inofreefwd),
2029 diIAGRead(imap,
2043 agno = BLKTOAG(le64_to_cpu(iagp->agstart), JFS_SBI(imap->im_ipimap->i_sb));
2061 jfs_error(imap->im_ipimap->i_sb, "iag inconsistent\n");
2092 imap->im_agctl[agno].inofree =
2102 imap->im_agctl[agno].numfree -= 1;
2103 atomic_dec(&imap->im_numfree);
2110 * NAME: diNewExt(imap,iagp,extno)
2140 * this AG. Must have read lock on imap inode.
2143 * imap - pointer to inode map control structure.
2152 static int diNewExt(struct inomap * imap, struct iag * iagp, int extno)
2168 jfs_error(imap->im_ipimap->i_sb, "no free extents\n");
2174 ipimap = imap->im_ipimap;
2194 if ((rc = diIAGRead(imap, fwd, &amp)))
2200 if ((rc = diIAGRead(imap, back, &bmp)))
2213 if ((fwd = imap->im_agctl[agno].extfree) >= 0) {
2214 if ((rc = diIAGRead(imap, fwd, &amp)))
2229 freei = imap->im_agctl[agno].inofree;
2237 if ((rc = diIAGRead(imap, freei, &cmp)))
2242 jfs_error(imap->im_ipimap->i_sb,
2258 if ((rc = dbAlloc(ipimap, hint, (s64) imap->im_nbperiext, &blkno)))
2269 for (i = 0; i < imap->im_nbperiext; i += sbi->nbperpage) {
2289 PXDlength(&(dp->di_ixpxd), imap->im_nbperiext);
2304 imap->im_agctl[agno].extfree =
2318 imap->im_agctl[agno].extfree = iagno;
2330 cpu_to_le32(imap->im_agctl[agno].inofree);
2332 imap->im_agctl[agno].inofree = iagno;
2336 PXDlength(&iagp->inoext[extno], imap->im_nbperiext);
2363 imap->im_agctl[agno].numfree += (INOSPEREXT - 1);
2364 imap->im_agctl[agno].numinos += INOSPEREXT;
2368 atomic_add(INOSPEREXT - 1, &imap->im_numfree);
2369 atomic_add(INOSPEREXT, &imap->im_numinos);
2398 * NAME: diNewIAG(imap,iagnop,agno)
2411 * imap - pointer to inode map control structure.
2429 * . write log of xtree and inode of imap;
2432 * . at start of logredo(): init in-memory imap with one additional iag page;
2433 * . at end of logredo(): re-read imap inode to determine
2434 * new imap size;
2437 diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)
2452 ipimap = imap->im_ipimap;
2457 IAGFREE_LOCK(imap);
2462 if (imap->im_freeiag >= 0) {
2464 iagno = imap->im_freeiag;
2476 if (ipimap->i_size >> L2PSIZE != imap->im_nextiag + 1) {
2478 IAGFREE_UNLOCK(imap);
2479 jfs_error(imap->im_ipimap->i_sb,
2486 iagno = imap->im_nextiag;
2597 imap->im_nextiag += 1;
2602 imap->im_freeiag = iagno;
2604 /* Until we have logredo working, we want the imap inode &
2617 if ((rc = diIAGRead(imap, iagno, &mp))) {
2625 imap->im_freeiag = le32_to_cpu(iagp->iagfree);
2634 IAGFREE_UNLOCK(imap);
2646 * imap - pointer to inode map control structure.
2652 * must have read lock on imap inode
2660 static int diIAGRead(struct inomap * imap, int iagno, struct metapage ** mpp)
2662 struct inode *ipimap = imap->im_ipimap;
2729 struct inomap *imap;
2735 imap = JFS_IP(ipimap)->i_imap;
2739 if (iagno >= imap->im_nextiag) {
2745 rc = diIAGRead(imap, iagno, &mp);
2839 * function: update imap for extendfs();
2847 struct inomap *imap = JFS_IP(ipimap)->i_imap;
2856 imap->im_nextiag, atomic_read(&imap->im_numinos),
2857 atomic_read(&imap->im_numfree));
2860 * reconstruct imap
2869 imap->im_agctl[i].inofree = -1;
2870 imap->im_agctl[i].extfree = -1;
2871 imap->im_agctl[i].numinos = 0; /* number of backed inodes */
2872 imap->im_agctl[i].numfree = 0; /* number of free backed inodes */
2880 for (i = 0; i < imap->im_nextiag; i++) {
2881 if ((rc = diIAGRead(imap, i, &bp))) {
2907 imap->im_agctl[n].numinos += numinos;
2913 if ((head = imap->im_agctl[n].inofree) == -1) {
2917 if ((rc = diIAGRead(imap, head, &hbp))) {
2928 imap->im_agctl[n].inofree =
2932 imap->im_agctl[n].numfree +=
2939 if ((head = imap->im_agctl[n].extfree) == -1) {
2943 if ((rc = diIAGRead(imap, head, &hbp))) {
2954 imap->im_agctl[n].extfree =
2962 if (xnuminos != atomic_read(&imap->im_numinos) ||
2963 xnumfree != atomic_read(&imap->im_numfree)) {