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) {
117 kfree(imap);
123 imap->im_freeiag = le32_to_cpu(dinom_le->in_freeiag);
124 imap->im_nextiag = le32_to_cpu(dinom_le->in_nextiag);
125 atomic_set(&imap->im_numinos, le32_to_cpu(dinom_le->in_numinos));
126 atomic_set(&imap->im_numfree, le32_to_cpu(dinom_le->in_numfree));
127 imap->im_nbperiext = le32_to_cpu(dinom_le->in_nbperiext);
128 imap->im_l2nbperiext = le32_to_cpu(dinom_le->in_l2nbperiext);
130 imap->im_agctl[index].inofree =
132 imap->im_agctl[index].extfree =
134 imap->im_agctl[index].numinos =
136 imap->im_agctl[index].numfree =
147 IAGFREE_LOCK_INIT(imap);
151 AG_LOCK_INIT(imap, index);
157 imap->im_ipimap = ipimap;
158 JFS_IP(ipimap)->i_imap = imap;
180 struct inomap *imap = JFS_IP(ipimap)->i_imap;
197 kfree(imap);
215 * write imap global conrol page
249 * write out dirty pages of imap
301 struct inomap *imap;
316 imap = JFS_IP(ipimap)->i_imap;
318 rc = diIAGRead(imap, iagno, &mp);
331 if ((lengthPXD(&iagp->inoext[extno]) != imap->im_nbperiext) ||
854 struct inomap *imap = JFS_IP(ipimap)->i_imap;
874 if (iagno >= imap->im_nextiag) {
875 print_hex_dump(KERN_ERR, "imap: ", DUMP_PREFIX_ADDRESS, 16, 4,
876 imap, 32, 0);
878 (uint) inum, iagno, imap->im_nextiag);
888 AG_LOCK(imap, agno);
890 /* Obtain read lock in imap inode. Don't release it until we have
897 if ((rc = diIAGRead(imap, iagno, &mp))) {
899 AG_UNLOCK(imap, agno);
919 AG_UNLOCK(imap, agno);
928 if (imap->im_agctl[agno].numfree > imap->im_agctl[agno].numinos) {
931 AG_UNLOCK(imap, agno);
940 imap->im_agctl[agno].numfree < 96 ||
941 (imap->im_agctl[agno].numfree < 288 &&
942 (((imap->im_agctl[agno].numfree * 100) /
943 imap->im_agctl[agno].numinos) <= 25))) {
954 if ((fwd = imap->im_agctl[agno].inofree) >= 0) {
958 if ((rc = diIAGRead(imap, fwd, &amp))) {
960 AG_UNLOCK(imap, agno);
977 cpu_to_le32(imap->im_agctl[agno].inofree);
979 imap->im_agctl[agno].inofree = iagno;
1003 imap->im_agctl[agno].numfree += 1;
1004 atomic_inc(&imap->im_numfree);
1008 AG_UNLOCK(imap, agno);
1038 if ((fwd = imap->im_agctl[agno].extfree) >= 0) {
1039 if ((rc = diIAGRead(imap, fwd, &amp)))
1056 if ((rc = diIAGRead(imap, fwd, &amp)))
1062 if ((rc = diIAGRead(imap, back, &bmp)))
1092 diIAGRead(imap, inofreefwd, &cmp)))
1106 diIAGRead(imap, inofreeback, &dmp)))
1133 cpu_to_le32(imap->im_agctl[agno].extfree);
1135 imap->im_agctl[agno].extfree = iagno;
1147 imap->im_agctl[agno].extfree =
1152 IAGFREE_LOCK(imap);
1153 iagp->iagfree = cpu_to_le32(imap->im_freeiag);
1154 imap->im_freeiag = iagno;
1155 IAGFREE_UNLOCK(imap);
1169 imap->im_agctl[agno].inofree =
1207 imap->im_agctl[agno].numfree -= (INOSPEREXT - 1);
1208 imap->im_agctl[agno].numinos -= INOSPEREXT;
1209 atomic_sub(INOSPEREXT - 1, &imap->im_numfree);
1210 atomic_sub(INOSPEREXT, &imap->im_numinos);
1267 AG_UNLOCK(imap, agno);
1283 AG_UNLOCK(imap, agno);
1331 struct inomap *imap;
1334 * corresponding imap control structure.
1337 imap = JFS_IP(ipimap)->i_imap;
1346 AG_LOCK(imap, agno);
1372 AG_LOCK(imap, agno);
1384 AG_LOCK(imap, agno);
1386 /* Get read lock on imap inode */
1391 if ((rc = diIAGRead(imap, iagno, &mp))) {
1393 AG_UNLOCK(imap, agno);
1402 addext = (imap->im_agctl[agno].numfree < 32 && iagp->nfreeexts);
1429 rc = diAllocBit(imap, iagp, ino);
1445 AG_UNLOCK(imap, agno);
1501 AG_UNLOCK(imap, agno);
1512 rc = diAllocBit(imap, iagp, ino);
1528 AG_UNLOCK(imap, agno);
1546 if ((rc = diNewExt(imap, iagp, extno))) {
1565 /* free the imap inode & the AG lock & return.
1568 AG_UNLOCK(imap, agno);
1579 /* unlock imap inode */
1589 rc = diAllocAG(imap, agno, dir, ip);
1591 AG_UNLOCK(imap, agno);
1599 return (diAllocAny(imap, agno, dir, ip));
1604 * NAME: diAllocAG(imap,agno,dir,ip)
1620 * imap - pointer to inode map control structure.
1633 diAllocAG(struct inomap * imap, int agno, bool dir, struct inode *ip)
1640 numfree = imap->im_agctl[agno].numfree;
1641 numinos = imap->im_agctl[agno].numinos;
1668 if ((rc = diAllocExt(imap, agno, ip)) != -ENOSPC)
1675 return (diAllocIno(imap, agno, ip));
1680 * NAME: diAllocAny(imap,agno,dir,iap)
1690 * imap - pointer to inode map control structure.
1703 diAllocAny(struct inomap * imap, int agno, bool dir, struct inode *ip)
1706 int maxag = JFS_SBI(imap->im_ipimap->i_sb)->bmap->db_maxag;
1713 AG_LOCK(imap, ag);
1715 rc = diAllocAG(imap, ag, dir, ip);
1717 AG_UNLOCK(imap, ag);
1726 AG_LOCK(imap, ag);
1728 rc = diAllocAG(imap, ag, dir, ip);
1730 AG_UNLOCK(imap, ag);
1743 * NAME: diAllocIno(imap,agno,ip)
1756 * imap - pointer to inode map control structure.
1767 static int diAllocIno(struct inomap * imap, int agno, struct inode *ip)
1775 if ((iagno = imap->im_agctl[agno].inofree) < 0)
1778 /* obtain read lock on imap inode */
1779 IREAD_LOCK(imap->im_ipimap, RDWRLOCK_IMAP);
1783 if ((rc = diIAGRead(imap, iagno, &mp))) {
1784 IREAD_UNLOCK(imap->im_ipimap);
1793 IREAD_UNLOCK(imap->im_ipimap);
1804 IREAD_UNLOCK(imap->im_ipimap);
1820 IREAD_UNLOCK(imap->im_ipimap);
1831 IREAD_UNLOCK(imap->im_ipimap);
1843 rc = diAllocBit(imap, iagp, ino);
1844 IREAD_UNLOCK(imap->im_ipimap);
1860 * NAME: diAllocExt(imap,agno,ip)
1880 * imap - pointer to inode map control structure.
1891 static int diAllocExt(struct inomap * imap, int agno, struct inode *ip)
1900 if ((iagno = imap->im_agctl[agno].extfree) < 0) {
1902 * imap inode.
1904 if ((rc = diNewIAG(imap, &iagno, agno, &mp))) {
1912 cpu_to_le64(AGTOBLK(agno, imap->im_ipimap));
1916 IREAD_LOCK(imap->im_ipimap, RDWRLOCK_IMAP);
1917 if ((rc = diIAGRead(imap, iagno, &mp))) {
1918 IREAD_UNLOCK(imap->im_ipimap);
1930 IREAD_UNLOCK(imap->im_ipimap);
1943 IREAD_UNLOCK(imap->im_ipimap);
1951 rc = diNewExt(imap, iagp, extno);
1952 IREAD_UNLOCK(imap->im_ipimap);
1959 IAGFREE_LOCK(imap);
1960 iagp->iagfree = cpu_to_le32(imap->im_freeiag);
1961 imap->im_freeiag = iagno;
1962 IAGFREE_UNLOCK(imap);
1979 * NAME: diAllocBit(imap,iagp,ino)
1996 * this AG. Must have read lock on imap inode.
1999 * imap - pointer to inode map control structure.
2008 static int diAllocBit(struct inomap * imap, struct iag * iagp, int ino)
2023 diIAGRead(imap, le32_to_cpu(iagp->inofreefwd),
2031 diIAGRead(imap,
2045 agno = BLKTOAG(le64_to_cpu(iagp->agstart), JFS_SBI(imap->im_ipimap->i_sb));
2063 jfs_error(imap->im_ipimap->i_sb, "iag inconsistent\n");
2094 imap->im_agctl[agno].inofree =
2104 imap->im_agctl[agno].numfree -= 1;
2105 atomic_dec(&imap->im_numfree);
2112 * NAME: diNewExt(imap,iagp,extno)
2142 * this AG. Must have read lock on imap inode.
2145 * imap - pointer to inode map control structure.
2154 static int diNewExt(struct inomap * imap, struct iag * iagp, int extno)
2170 jfs_error(imap->im_ipimap->i_sb, "no free extents\n");
2176 ipimap = imap->im_ipimap;
2196 if ((rc = diIAGRead(imap, fwd, &amp)))
2202 if ((rc = diIAGRead(imap, back, &bmp)))
2215 if ((fwd = imap->im_agctl[agno].extfree) >= 0) {
2216 if ((rc = diIAGRead(imap, fwd, &amp)))
2231 freei = imap->im_agctl[agno].inofree;
2239 if ((rc = diIAGRead(imap, freei, &cmp)))
2244 jfs_error(imap->im_ipimap->i_sb,
2260 if ((rc = dbAlloc(ipimap, hint, (s64) imap->im_nbperiext, &blkno)))
2271 for (i = 0; i < imap->im_nbperiext; i += sbi->nbperpage) {
2291 PXDlength(&(dp->di_ixpxd), imap->im_nbperiext);
2306 imap->im_agctl[agno].extfree =
2320 imap->im_agctl[agno].extfree = iagno;
2332 cpu_to_le32(imap->im_agctl[agno].inofree);
2334 imap->im_agctl[agno].inofree = iagno;
2338 PXDlength(&iagp->inoext[extno], imap->im_nbperiext);
2365 imap->im_agctl[agno].numfree += (INOSPEREXT - 1);
2366 imap->im_agctl[agno].numinos += INOSPEREXT;
2370 atomic_add(INOSPEREXT - 1, &imap->im_numfree);
2371 atomic_add(INOSPEREXT, &imap->im_numinos);
2400 * NAME: diNewIAG(imap,iagnop,agno)
2413 * imap - pointer to inode map control structure.
2431 * . write log of xtree and inode of imap;
2434 * . at start of logredo(): init in-memory imap with one additional iag page;
2435 * . at end of logredo(): re-read imap inode to determine
2436 * new imap size;
2439 diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)
2454 ipimap = imap->im_ipimap;
2459 IAGFREE_LOCK(imap);
2464 if (imap->im_freeiag >= 0) {
2466 iagno = imap->im_freeiag;
2478 if (ipimap->i_size >> L2PSIZE != imap->im_nextiag + 1) {
2480 IAGFREE_UNLOCK(imap);
2481 jfs_error(imap->im_ipimap->i_sb,
2488 iagno = imap->im_nextiag;
2599 imap->im_nextiag += 1;
2604 imap->im_freeiag = iagno;
2606 /* Until we have logredo working, we want the imap inode &
2619 if ((rc = diIAGRead(imap, iagno, &mp))) {
2627 imap->im_freeiag = le32_to_cpu(iagp->iagfree);
2636 IAGFREE_UNLOCK(imap);
2648 * imap - pointer to inode map control structure.
2654 * must have read lock on imap inode
2662 static int diIAGRead(struct inomap * imap, int iagno, struct metapage ** mpp)
2664 struct inode *ipimap = imap->im_ipimap;
2731 struct inomap *imap;
2737 imap = JFS_IP(ipimap)->i_imap;
2741 if (iagno >= imap->im_nextiag) {
2747 rc = diIAGRead(imap, iagno, &mp);
2841 * function: update imap for extendfs();
2849 struct inomap *imap = JFS_IP(ipimap)->i_imap;
2858 imap->im_nextiag, atomic_read(&imap->im_numinos),
2859 atomic_read(&imap->im_numfree));
2862 * reconstruct imap
2871 imap->im_agctl[i].inofree = -1;
2872 imap->im_agctl[i].extfree = -1;
2873 imap->im_agctl[i].numinos = 0; /* number of backed inodes */
2874 imap->im_agctl[i].numfree = 0; /* number of free backed inodes */
2882 for (i = 0; i < imap->im_nextiag; i++) {
2883 if ((rc = diIAGRead(imap, i, &bp))) {
2909 imap->im_agctl[n].numinos += numinos;
2915 if ((head = imap->im_agctl[n].inofree) == -1) {
2919 if ((rc = diIAGRead(imap, head, &hbp))) {
2930 imap->im_agctl[n].inofree =
2934 imap->im_agctl[n].numfree +=
2941 if ((head = imap->im_agctl[n].extfree) == -1) {
2945 if ((rc = diIAGRead(imap, head, &hbp))) {
2956 imap->im_agctl[n].extfree =
2964 if (xnuminos != atomic_read(&imap->im_numinos) ||
2965 xnumfree != atomic_read(&imap->im_numfree)) {