jfs_imap.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:86k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *   Copyright (c) International Business Machines Corp., 2000-2002
  3.  *
  4.  *   This program is free software;  you can redistribute it and/or modify
  5.  *   it under the terms of the GNU General Public License as published by
  6.  *   the Free Software Foundation; either version 2 of the License, or 
  7.  *   (at your option) any later version.
  8.  * 
  9.  *   This program is distributed in the hope that it will be useful,
  10.  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
  11.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  12.  *   the GNU General Public License for more details.
  13.  *
  14.  *   You should have received a copy of the GNU General Public License
  15.  *   along with this program;  if not, write to the Free Software 
  16.  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17.  */
  18. /*
  19.  * jfs_imap.c: inode allocation map manager
  20.  *
  21.  * Serialization:
  22.  *   Each AG has a simple lock which is used to control the serialization of
  23.  * the AG level lists.  This lock should be taken first whenever an AG
  24.  * level list will be modified or accessed.
  25.  *
  26.  *   Each IAG is locked by obtaining the buffer for the IAG page.
  27.  *
  28.  *   There is also a inode lock for the inode map inode.  A read lock needs to
  29.  * be taken whenever an IAG is read from the map or the global level
  30.  * information is read.  A write lock needs to be taken whenever the global
  31.  * level information is modified or an atomic operation needs to be used.
  32.  *
  33.  * If more than one IAG is read at one time, the read lock may not
  34.  * be given up until all of the IAG's are read.  Otherwise, a deadlock
  35.  * may occur when trying to obtain the read lock while another thread
  36.  * holding the read lock is waiting on the IAG already being held.
  37.  *
  38.  *   The control page of the inode map is read into memory by diMount().
  39.  * Thereafter it should only be modified in memory and then it will be
  40.  * written out when the filesystem is unmounted by diUnmount().
  41.  */
  42. #include <linux/fs.h>
  43. #include <linux/locks.h>
  44. #include "jfs_incore.h"
  45. #include "jfs_filsys.h"
  46. #include "jfs_dinode.h"
  47. #include "jfs_dmap.h"
  48. #include "jfs_imap.h"
  49. #include "jfs_metapage.h"
  50. #include "jfs_superblock.h"
  51. #include "jfs_debug.h"
  52. /*
  53.  * imap locks
  54.  */
  55. /* iag free list lock */
  56. #define IAGFREE_LOCK_INIT(imap) init_MUTEX(&imap->im_freelock)
  57. #define IAGFREE_LOCK(imap) down(&imap->im_freelock)
  58. #define IAGFREE_UNLOCK(imap) up(&imap->im_freelock)
  59. /* per ag iag list locks */
  60. #define AG_LOCK_INIT(imap,index) init_MUTEX(&(imap->im_aglock[index]))
  61. #define AG_LOCK(imap,agno) down(&imap->im_aglock[agno])
  62. #define AG_UNLOCK(imap,agno) up(&imap->im_aglock[agno])
  63. /*
  64.  * external references
  65.  */
  66. extern struct address_space_operations jfs_aops;
  67. /*
  68.  * forward references
  69.  */
  70. static int diAllocAG(struct inomap *, int, boolean_t, struct inode *);
  71. static int diAllocAny(struct inomap *, int, boolean_t, struct inode *);
  72. static int diAllocBit(struct inomap *, struct iag *, int);
  73. static int diAllocExt(struct inomap *, int, struct inode *);
  74. static int diAllocIno(struct inomap *, int, struct inode *);
  75. static int diFindFree(u32, int);
  76. static int diNewExt(struct inomap *, struct iag *, int);
  77. static int diNewIAG(struct inomap *, int *, int, struct metapage **);
  78. static void duplicateIXtree(struct super_block *, s64, int, s64 *);
  79. static int diIAGRead(struct inomap * imap, int, struct metapage **);
  80. static int copy_from_dinode(struct dinode *, struct inode *);
  81. static void copy_to_dinode(struct dinode *, struct inode *);
  82. /*
  83.  * debug code for double-checking inode map
  84.  */
  85. /* #define _JFS_DEBUG_IMAP 1 */
  86. #ifdef _JFS_DEBUG_IMAP
  87. #define DBG_DIINIT(imap) DBGdiInit(imap)
  88. #define DBG_DIALLOC(imap, ino) DBGdiAlloc(imap, ino)
  89. #define DBG_DIFREE(imap, ino) DBGdiFree(imap, ino)
  90. static void *DBGdiInit(struct inomap * imap);
  91. static void DBGdiAlloc(struct inomap * imap, ino_t ino);
  92. static void DBGdiFree(struct inomap * imap, ino_t ino);
  93. #else
  94. #define DBG_DIINIT(imap)
  95. #define DBG_DIALLOC(imap, ino)
  96. #define DBG_DIFREE(imap, ino)
  97. #endif /* _JFS_DEBUG_IMAP */
  98. /*
  99.  * NAME:        diMount()
  100.  *
  101.  * FUNCTION:    initialize the incore inode map control structures for
  102.  * a fileset or aggregate init time.
  103.  *
  104.  *              the inode map's control structure (dinomap) is 
  105.  *              brought in from disk and placed in virtual memory.
  106.  *
  107.  * PARAMETERS:
  108.  *      ipimap  - pointer to inode map inode for the aggregate or fileset.
  109.  *
  110.  * RETURN VALUES:
  111.  *      0       - success
  112.  *      ENOMEM  - insufficient free virtual memory.
  113.  *      EIO   - i/o error.
  114.  */
  115. int diMount(struct inode *ipimap)
  116. {
  117. struct inomap *imap;
  118. struct metapage *mp;
  119. int index;
  120. struct dinomap *dinom_le;
  121. /*
  122.  * allocate/initialize the in-memory inode map control structure
  123.  */
  124. /* allocate the in-memory inode map control structure. */
  125. imap = (struct inomap *) kmalloc(sizeof(struct inomap), GFP_KERNEL);
  126. if (imap == NULL) {
  127. jERROR(1, ("diMount: kmalloc returned NULL!n"));
  128. return (ENOMEM);
  129. }
  130. /* read the on-disk inode map control structure. */
  131. mp = read_metapage(ipimap,
  132.    IMAPBLKNO << JFS_SBI(ipimap->i_sb)->l2nbperpage,
  133.    PSIZE, 0);
  134. if (mp == NULL) {
  135. kfree(imap);
  136. return (EIO);
  137. }
  138. /* copy the on-disk version to the in-memory version. */
  139. dinom_le = (struct dinomap *) mp->data;
  140. imap->im_freeiag = le32_to_cpu(dinom_le->in_freeiag);
  141. imap->im_nextiag = le32_to_cpu(dinom_le->in_nextiag);
  142. atomic_set(&imap->im_numinos, le32_to_cpu(dinom_le->in_numinos));
  143. atomic_set(&imap->im_numfree, le32_to_cpu(dinom_le->in_numfree));
  144. imap->im_nbperiext = le32_to_cpu(dinom_le->in_nbperiext);
  145. imap->im_l2nbperiext = le32_to_cpu(dinom_le->in_l2nbperiext);
  146. for (index = 0; index < MAXAG; index++) {
  147. imap->im_agctl[index].inofree =
  148.     le32_to_cpu(dinom_le->in_agctl[index].inofree);
  149. imap->im_agctl[index].extfree =
  150.     le32_to_cpu(dinom_le->in_agctl[index].extfree);
  151. imap->im_agctl[index].numinos =
  152.     le32_to_cpu(dinom_le->in_agctl[index].numinos);
  153. imap->im_agctl[index].numfree =
  154.     le32_to_cpu(dinom_le->in_agctl[index].numfree);
  155. }
  156. /* release the buffer. */
  157. release_metapage(mp);
  158. /*
  159.  * allocate/initialize inode allocation map locks
  160.  */
  161. /* allocate and init iag free list lock */
  162. IAGFREE_LOCK_INIT(imap);
  163. /* allocate and init ag list locks */
  164. for (index = 0; index < MAXAG; index++) {
  165. AG_LOCK_INIT(imap, index);
  166. }
  167. /* bind the inode map inode and inode map control structure
  168.  * to each other.
  169.  */
  170. imap->im_ipimap = ipimap;
  171. JFS_IP(ipimap)->i_imap = imap;
  172. //      DBG_DIINIT(imap);
  173. return (0);
  174. }
  175. /*
  176.  * NAME:        diUnmount()
  177.  *
  178.  * FUNCTION:    write to disk the incore inode map control structures for
  179.  * a fileset or aggregate at unmount time.
  180.  *
  181.  * PARAMETERS:
  182.  *      ipimap  - pointer to inode map inode for the aggregate or fileset.
  183.  *
  184.  * RETURN VALUES:
  185.  *      0       - success
  186.  *      ENOMEM  - insufficient free virtual memory.
  187.  *      EIO   - i/o error.
  188.  */
  189. int diUnmount(struct inode *ipimap, int mounterror)
  190. {
  191. struct inomap *imap = JFS_IP(ipimap)->i_imap;
  192. /*
  193.  * update the on-disk inode map control structure
  194.  */
  195. if (!(mounterror || isReadOnly(ipimap)))
  196. diSync(ipimap);
  197. /*
  198.  * Invalidate the page cache buffers
  199.  */
  200. truncate_inode_pages(ipimap->i_mapping, 0);
  201. /*
  202.  * free in-memory control structure
  203.  */
  204. kfree(imap);
  205. return (0);
  206. }
  207. /*
  208.  * diSync()
  209.  */
  210. int diSync(struct inode *ipimap)
  211. {
  212. struct dinomap *dinom_le;
  213. struct inomap *imp = JFS_IP(ipimap)->i_imap;
  214. struct metapage *mp;
  215. int index;
  216. /*
  217.  * write imap global conrol page
  218.  */
  219. /* read the on-disk inode map control structure */
  220. mp = get_metapage(ipimap,
  221.   IMAPBLKNO << JFS_SBI(ipimap->i_sb)->l2nbperpage,
  222.   PSIZE, 0);
  223. if (mp == NULL) {
  224. jERROR(1,("diSync: get_metapage failed!n"));
  225. return EIO;
  226. }
  227. /* copy the in-memory version to the on-disk version */
  228. dinom_le = (struct dinomap *) mp->data;
  229. dinom_le->in_freeiag = cpu_to_le32(imp->im_freeiag);
  230. dinom_le->in_nextiag = cpu_to_le32(imp->im_nextiag);
  231. dinom_le->in_numinos = cpu_to_le32(atomic_read(&imp->im_numinos));
  232. dinom_le->in_numfree = cpu_to_le32(atomic_read(&imp->im_numfree));
  233. dinom_le->in_nbperiext = cpu_to_le32(imp->im_nbperiext);
  234. dinom_le->in_l2nbperiext = cpu_to_le32(imp->im_l2nbperiext);
  235. for (index = 0; index < MAXAG; index++) {
  236. dinom_le->in_agctl[index].inofree =
  237.     cpu_to_le32(imp->im_agctl[index].inofree);
  238. dinom_le->in_agctl[index].extfree =
  239.     cpu_to_le32(imp->im_agctl[index].extfree);
  240. dinom_le->in_agctl[index].numinos =
  241.     cpu_to_le32(imp->im_agctl[index].numinos);
  242. dinom_le->in_agctl[index].numfree =
  243.     cpu_to_le32(imp->im_agctl[index].numfree);
  244. }
  245. /* write out the control structure */
  246. write_metapage(mp);
  247. /*
  248.  * write out dirty pages of imap
  249.  */
  250. fsync_inode_data_buffers(ipimap);
  251. diWriteSpecial(ipimap, 0);
  252. return (0);
  253. }
  254. /*
  255.  * NAME:        diRead()
  256.  *
  257.  * FUNCTION:    initialize an incore inode from disk.
  258.  *
  259.  * on entry, the specifed incore inode should itself
  260.  * specify the disk inode number corresponding to the
  261.  * incore inode (i.e. i_number should be initialized).
  262.  *
  263.  * this routine handles incore inode initialization for
  264.  * both "special" and "regular" inodes.  special inodes
  265.  * are those required early in the mount process and
  266.  *         require special handling since much of the file system
  267.  * is not yet initialized.  these "special" inodes are
  268.  * identified by a NULL inode map inode pointer and are
  269.  * actually initialized by a call to diReadSpecial().
  270.  *
  271.  * for regular inodes, the iag describing the disk inode
  272.  * is read from disk to determine the inode extent address
  273.  * for the disk inode.  with the inode extent address in
  274.  * hand, the page of the extent that contains the disk
  275.  * inode is read and the disk inode is copied to the
  276.  * incore inode.
  277.  *
  278.  * PARAMETERS:
  279.  *      ip  -  pointer to incore inode to be initialized from disk.
  280.  *
  281.  * RETURN VALUES:
  282.  *      0       - success
  283.  *      EIO   - i/o error.
  284.  *      ENOMEM - insufficient memory
  285.  *      
  286.  */
  287. int diRead(struct inode *ip)
  288. {
  289. struct jfs_sb_info *sbi = JFS_SBI(ip->i_sb);
  290. int iagno, ino, extno, rc;
  291. struct inode *ipimap;
  292. struct dinode *dp;
  293. struct iag *iagp;
  294. struct metapage *mp;
  295. s64 blkno, agstart;
  296. struct inomap *imap;
  297. int block_offset;
  298. int inodes_left;
  299. uint pageno;
  300. int rel_inode;
  301. jFYI(1, ("diRead: ino = %ldn", ip->i_ino));
  302. ipimap = sbi->ipimap;
  303. JFS_IP(ip)->ipimap = ipimap;
  304. /* determine the iag number for this inode (number) */
  305. iagno = INOTOIAG(ip->i_ino);
  306. /* read the iag */
  307. imap = JFS_IP(ipimap)->i_imap;
  308. IREAD_LOCK(ipimap);
  309. rc = diIAGRead(imap, iagno, &mp);
  310. IREAD_UNLOCK(ipimap);
  311. if (rc) {
  312. jERROR(1, ("diRead: diIAGRead returned %dn", rc));
  313. return (rc);
  314. }
  315. iagp = (struct iag *) mp->data;
  316. /* determine inode extent that holds the disk inode */
  317. ino = ip->i_ino & (INOSPERIAG - 1);
  318. extno = ino >> L2INOSPEREXT;
  319. if ((lengthPXD(&iagp->inoext[extno]) != imap->im_nbperiext) ||
  320.     (addressPXD(&iagp->inoext[extno]) == 0)) {
  321. release_metapage(mp);
  322. return ESTALE;
  323. }
  324. /* get disk block number of the page within the inode extent
  325.  * that holds the disk inode.
  326.  */
  327. blkno = INOPBLK(&iagp->inoext[extno], ino, sbi->l2nbperpage);
  328. /* get the ag for the iag */
  329. agstart = le64_to_cpu(iagp->agstart);
  330. release_metapage(mp);
  331. rel_inode = (ino & (INOSPERPAGE - 1));
  332. pageno = blkno >> sbi->l2nbperpage;
  333. if ((block_offset = ((u32) blkno & (sbi->nbperpage - 1)))) {
  334. /*
  335.  * OS/2 didn't always align inode extents on page boundaries
  336.  */
  337. inodes_left =
  338.      (sbi->nbperpage - block_offset) << sbi->l2niperblk;
  339. if (rel_inode < inodes_left)
  340. rel_inode += block_offset << sbi->l2niperblk;
  341. else {
  342. pageno += 1;
  343. rel_inode -= inodes_left;
  344. }
  345. }
  346. /* read the page of disk inode */
  347. mp = read_metapage(ipimap, pageno << sbi->l2nbperpage, PSIZE, 1);
  348. if (mp == 0) {
  349. jERROR(1, ("diRead: read_metapage failedn"));
  350. return EIO;
  351. }
  352. /* locate the the disk inode requested */
  353. dp = (struct dinode *) mp->data;
  354. dp += rel_inode;
  355. if (ip->i_ino != le32_to_cpu(dp->di_number)) {
  356. jERROR(1, ("diRead: i_ino != di_numbern"));
  357. updateSuper(ip->i_sb, FM_DIRTY);
  358. rc = EIO;
  359. } else if (le32_to_cpu(dp->di_nlink) == 0)
  360. rc = ESTALE;
  361. else
  362. /* copy the disk inode to the in-memory inode */
  363. rc = copy_from_dinode(dp, ip);
  364. release_metapage(mp);
  365. /* set the ag for the inode */
  366. JFS_IP(ip)->agno = BLKTOAG(agstart, sbi);
  367. JFS_IP(ip)->active_ag = -1;
  368. return (rc);
  369. }
  370. /*
  371.  * NAME:        diReadSpecial()
  372.  *
  373.  * FUNCTION:    initialize a 'special' inode from disk.
  374.  *
  375.  * this routines handles aggregate level inodes.  The
  376.  * inode cache cannot differentiate between the
  377.  * aggregate inodes and the filesystem inodes, so we
  378.  * handle these here.  We don't actually use the aggregate
  379.  *         inode map, since these inodes are at a fixed location
  380.  * and in some cases the aggregate inode map isn't initialized
  381.  * yet.
  382.  *
  383.  * PARAMETERS:
  384.  *      sb - filesystem superblock
  385.  * inum - aggregate inode number
  386.  * secondary - 1 if secondary aggregate inode table
  387.  *
  388.  * RETURN VALUES:
  389.  *      new inode - success
  390.  *      NULL - i/o error.
  391.  */
  392. struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary)
  393. {
  394. struct jfs_sb_info *sbi = JFS_SBI(sb);
  395. uint address;
  396. struct dinode *dp;
  397. struct inode *ip;
  398. struct metapage *mp;
  399. int rc;
  400. ip = new_inode(sb);
  401. if (ip == NULL) {
  402. jERROR(1,
  403.        ("diReadSpecial: new_inode returned NULL!n"));
  404. return ip;
  405. }
  406. rc = alloc_jfs_inode(ip);
  407. if (rc) {
  408. make_bad_inode(ip);
  409. iput(ip);
  410. return NULL;
  411. }
  412. if (secondary) {
  413. address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage;
  414. JFS_IP(ip)->ipimap = sbi->ipaimap2;
  415. } else {
  416. address = AITBL_OFF >> L2PSIZE;
  417. JFS_IP(ip)->ipimap = sbi->ipaimap;
  418. }
  419. ASSERT(inum < INOSPEREXT);
  420. ip->i_ino = inum;
  421. address += inum >> 3; /* 8 inodes per 4K page */
  422. /* read the page of fixed disk inode (AIT) in raw mode */
  423. jEVENT(0,
  424.        ("Reading aggregate inode %d from block %dn", (uint) inum,
  425. address));
  426. mp = read_metapage(ip, address << sbi->l2nbperpage, PSIZE, 1);
  427. if (mp == NULL) {
  428. ip->i_sb = NULL;
  429. ip->i_nlink = 1; /* Don't want iput() deleting it */
  430. iput(ip);
  431. return (NULL);
  432. }
  433. /* get the pointer to the disk inode of interest */
  434. dp = (struct dinode *) (mp->data);
  435. dp += inum % 8; /* 8 inodes per 4K page */
  436. /* copy on-disk inode to in-memory inode */
  437. if ((copy_from_dinode(dp, ip)) != 0) {
  438. /* handle bad return by returning NULL for ip */
  439. ip->i_sb = NULL;
  440. ip->i_nlink = 1; /* Don't want iput() deleting it */
  441. iput(ip);
  442. /* release the page */
  443. release_metapage(mp);
  444. return (NULL);
  445. }
  446. ip->i_mapping->a_ops = &jfs_aops;
  447. ip->i_mapping->gfp_mask = GFP_NOFS;
  448. if ((inum == FILESYSTEM_I) && (JFS_IP(ip)->ipimap == sbi->ipaimap)) {
  449. sbi->gengen = le32_to_cpu(dp->di_gengen);
  450. sbi->inostamp = le32_to_cpu(dp->di_inostamp);
  451. }
  452. /* release the page */
  453. release_metapage(mp);
  454. return (ip);
  455. }
  456. /*
  457.  * NAME:        diWriteSpecial()
  458.  *
  459.  * FUNCTION:    Write the special inode to disk
  460.  *
  461.  * PARAMETERS:
  462.  *      ip - special inode
  463.  * secondary - 1 if secondary aggregate inode table
  464.  *
  465.  * RETURN VALUES: none
  466.  */
  467. void diWriteSpecial(struct inode *ip, int secondary)
  468. {
  469. struct jfs_sb_info *sbi = JFS_SBI(ip->i_sb);
  470. uint address;
  471. struct dinode *dp;
  472. ino_t inum = ip->i_ino;
  473. struct metapage *mp;
  474. ip->i_state &= ~I_DIRTY;
  475. if (secondary)
  476. address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage;
  477. else
  478. address = AITBL_OFF >> L2PSIZE;
  479. ASSERT(inum < INOSPEREXT);
  480. address += inum >> 3; /* 8 inodes per 4K page */
  481. /* read the page of fixed disk inode (AIT) in raw mode */
  482. jEVENT(0,
  483.        ("Reading aggregate inode %d from block %dn", (uint) inum,
  484. address));
  485. mp = read_metapage(ip, address << sbi->l2nbperpage, PSIZE, 1);
  486. if (mp == NULL) {
  487. jERROR(1,
  488.        ("diWriteSpecial: failed to read aggregate inode extent!n"));
  489. return;
  490. }
  491. /* get the pointer to the disk inode of interest */
  492. dp = (struct dinode *) (mp->data);
  493. dp += inum % 8; /* 8 inodes per 4K page */
  494. /* copy on-disk inode to in-memory inode */
  495. copy_to_dinode(dp, ip);
  496. memcpy(&dp->di_xtroot, &JFS_IP(ip)->i_xtroot, 288);
  497. if (inum == FILESYSTEM_I)
  498. dp->di_gengen = cpu_to_le32(sbi->gengen);
  499. /* write the page */
  500. write_metapage(mp);
  501. }
  502. /*
  503.  * NAME:        diFreeSpecial()
  504.  *
  505.  * FUNCTION:    Free allocated space for special inode
  506.  */
  507. void diFreeSpecial(struct inode *ip)
  508. {
  509. if (ip == NULL) {
  510. jERROR(1, ("diFreeSpecial called with NULL ip!n"));
  511. return;
  512. }
  513. fsync_inode_data_buffers(ip);
  514. truncate_inode_pages(ip->i_mapping, 0);
  515. iput(ip);
  516. }
  517. /*
  518.  * NAME:        diWrite()
  519.  *
  520.  * FUNCTION:    write the on-disk inode portion of the in-memory inode
  521.  * to its corresponding on-disk inode.
  522.  *
  523.  * on entry, the specifed incore inode should itself
  524.  * specify the disk inode number corresponding to the
  525.  * incore inode (i.e. i_number should be initialized).
  526.  *
  527.  * the inode contains the inode extent address for the disk
  528.  * inode.  with the inode extent address in hand, the
  529.  * page of the extent that contains the disk inode is
  530.  * read and the disk inode portion of the incore inode
  531.  * is copied to the disk inode.
  532.  *
  533.  * PARAMETERS:
  534.  * tid -  transacation id
  535.  *      ip  -  pointer to incore inode to be written to the inode extent.
  536.  *
  537.  * RETURN VALUES:
  538.  *      0       - success
  539.  *      EIO   - i/o error.
  540.  */
  541. int diWrite(tid_t tid, struct inode *ip)
  542. {
  543. struct jfs_sb_info *sbi = JFS_SBI(ip->i_sb);
  544. struct jfs_inode_info *jfs_ip = JFS_IP(ip);
  545. int rc = 0;
  546. s32 ino;
  547. struct dinode *dp;
  548. s64 blkno;
  549. int block_offset;
  550. int inodes_left;
  551. struct metapage *mp;
  552. uint pageno;
  553. int rel_inode;
  554. int dioffset;
  555. struct inode *ipimap;
  556. uint type;
  557. lid_t lid;
  558. struct tlock *ditlck, *tlck;
  559. struct linelock *dilinelock, *ilinelock;
  560. struct lv *lv;
  561. int n;
  562. ipimap = jfs_ip->ipimap;
  563. ino = ip->i_ino & (INOSPERIAG - 1);
  564. assert(lengthPXD(&(jfs_ip->ixpxd)) ==
  565.        JFS_IP(ipimap)->i_imap->im_nbperiext);
  566. assert(addressPXD(&(jfs_ip->ixpxd)));
  567. /*
  568.  * read the page of disk inode containing the specified inode:
  569.  */
  570. /* compute the block address of the page */
  571. blkno = INOPBLK(&(jfs_ip->ixpxd), ino, sbi->l2nbperpage);
  572. rel_inode = (ino & (INOSPERPAGE - 1));
  573. pageno = blkno >> sbi->l2nbperpage;
  574. if ((block_offset = ((u32) blkno & (sbi->nbperpage - 1)))) {
  575. /*
  576.  * OS/2 didn't always align inode extents on page boundaries
  577.  */
  578. inodes_left =
  579.     (sbi->nbperpage - block_offset) << sbi->l2niperblk;
  580. if (rel_inode < inodes_left)
  581. rel_inode += block_offset << sbi->l2niperblk;
  582. else {
  583. pageno += 1;
  584. rel_inode -= inodes_left;
  585. }
  586. }
  587. /* read the page of disk inode */
  588.       retry:
  589. mp = read_metapage(ipimap, pageno << sbi->l2nbperpage, PSIZE, 1);
  590. if (mp == 0)
  591. return (EIO);
  592. /* get the pointer to the disk inode */
  593. dp = (struct dinode *) mp->data;
  594. dp += rel_inode;
  595. dioffset = (ino & (INOSPERPAGE - 1)) << L2DISIZE;
  596. /*
  597.  * acquire transaction lock on the on-disk inode;
  598.  * N.B. tlock is acquired on ipimap not ip;
  599.  */
  600. if ((ditlck =
  601.      txLock(tid, ipimap, mp, tlckINODE | tlckENTRY)) == NULL)
  602. goto retry;
  603. dilinelock = (struct linelock *) & ditlck->lock;
  604. /*
  605.  * copy btree root from in-memory inode to on-disk inode
  606.  *
  607.  * (tlock is taken from inline B+-tree root in in-memory
  608.  * inode when the B+-tree root is updated, which is pointed 
  609.  * by jfs_ip->blid as well as being on tx tlock list)
  610.  *
  611.  * further processing of btree root is based on the copy 
  612.  * in in-memory inode, where txLog() will log from, and, 
  613.  * for xtree root, txUpdateMap() will update map and reset
  614.  * XAD_NEW bit;
  615.  */
  616. if (S_ISDIR(ip->i_mode) && (lid = jfs_ip->xtlid)) {
  617. /*
  618.  * This is the special xtree inside the directory for storing
  619.  * the directory table
  620.  */
  621. xtpage_t *p, *xp;
  622. xad_t *xad;
  623. jfs_ip->xtlid = 0;
  624. tlck = lid_to_tlock(lid);
  625. assert(tlck->type & tlckXTREE);
  626. tlck->type |= tlckBTROOT;
  627. tlck->mp = mp;
  628. ilinelock = (struct linelock *) & tlck->lock;
  629. /*
  630.  * copy xtree root from inode to dinode:
  631.  */
  632. p = &jfs_ip->i_xtroot;
  633. xp = (xtpage_t *) &dp->di_dirtable;
  634. lv = ilinelock->lv;
  635. for (n = 0; n < ilinelock->index; n++, lv++) {
  636. memcpy(&xp->xad[lv->offset], &p->xad[lv->offset],
  637.        lv->length << L2XTSLOTSIZE);
  638. }
  639. /* reset on-disk (metadata page) xtree XAD_NEW bit */
  640. xad = &xp->xad[XTENTRYSTART];
  641. for (n = XTENTRYSTART;
  642.      n < le16_to_cpu(xp->header.nextindex); n++, xad++)
  643. if (xad->flag & (XAD_NEW | XAD_EXTENDED))
  644. xad->flag &= ~(XAD_NEW | XAD_EXTENDED);
  645. }
  646. if ((lid = jfs_ip->blid) == 0)
  647. goto inlineData;
  648. jfs_ip->blid = 0;
  649. tlck = lid_to_tlock(lid);
  650. type = tlck->type;
  651. tlck->type |= tlckBTROOT;
  652. tlck->mp = mp;
  653. ilinelock = (struct linelock *) & tlck->lock;
  654. /*
  655.  *      regular file: 16 byte (XAD slot) granularity
  656.  */
  657. if (type & tlckXTREE) {
  658. xtpage_t *p, *xp;
  659. xad_t *xad;
  660. /*
  661.  * copy xtree root from inode to dinode:
  662.  */
  663. p = &jfs_ip->i_xtroot;
  664. xp = &dp->di_xtroot;
  665. lv = ilinelock->lv;
  666. for (n = 0; n < ilinelock->index; n++, lv++) {
  667. memcpy(&xp->xad[lv->offset], &p->xad[lv->offset],
  668.        lv->length << L2XTSLOTSIZE);
  669. }
  670. /* reset on-disk (metadata page) xtree XAD_NEW bit */
  671. xad = &xp->xad[XTENTRYSTART];
  672. for (n = XTENTRYSTART;
  673.      n < le16_to_cpu(xp->header.nextindex); n++, xad++)
  674. if (xad->flag & (XAD_NEW | XAD_EXTENDED))
  675. xad->flag &= ~(XAD_NEW | XAD_EXTENDED);
  676. }
  677. /*
  678.  *      directory: 32 byte (directory entry slot) granularity
  679.  */
  680. else if (type & tlckDTREE) {
  681. dtpage_t *p, *xp;
  682. /*
  683.  * copy dtree root from inode to dinode:
  684.  */
  685. p = (dtpage_t *) &jfs_ip->i_dtroot;
  686. xp = (dtpage_t *) & dp->di_dtroot;
  687. lv = ilinelock->lv;
  688. for (n = 0; n < ilinelock->index; n++, lv++) {
  689. memcpy(&xp->slot[lv->offset], &p->slot[lv->offset],
  690.        lv->length << L2DTSLOTSIZE);
  691. }
  692. } else {
  693. jERROR(1, ("diWrite: UFO tlockn"));
  694. }
  695.       inlineData:
  696. /*
  697.  * copy inline symlink from in-memory inode to on-disk inode
  698.  */
  699. if (S_ISLNK(ip->i_mode) && ip->i_size < IDATASIZE) {
  700. lv = & dilinelock->lv[dilinelock->index];
  701. lv->offset = (dioffset + 2 * 128) >> L2INODESLOTSIZE;
  702. lv->length = 2;
  703. memcpy(&dp->di_fastsymlink, jfs_ip->i_inline, IDATASIZE);
  704. dilinelock->index++;
  705. }
  706. /*
  707.  * copy inline data from in-memory inode to on-disk inode:
  708.  * 128 byte slot granularity
  709.  */
  710. if (test_cflag(COMMIT_Inlineea, ip)) {
  711. lv = & dilinelock->lv[dilinelock->index];
  712. lv->offset = (dioffset + 3 * 128) >> L2INODESLOTSIZE;
  713. lv->length = 1;
  714. memcpy(&dp->di_inlineea, jfs_ip->i_inline_ea, INODESLOTSIZE);
  715. dilinelock->index++;
  716. clear_cflag(COMMIT_Inlineea, ip);
  717. }
  718. /*
  719.  *      lock/copy inode base: 128 byte slot granularity
  720.  */
  721. // baseDinode:
  722. lv = & dilinelock->lv[dilinelock->index];
  723. lv->offset = dioffset >> L2INODESLOTSIZE;
  724. copy_to_dinode(dp, ip);
  725. if (test_and_clear_cflag(COMMIT_Dirtable, ip)) {
  726. lv->length = 2;
  727. memcpy(&dp->di_dirtable, &jfs_ip->i_dirtable, 96);
  728. } else
  729. lv->length = 1;
  730. dilinelock->index++;
  731. #ifdef _JFS_FASTDASD
  732. /*
  733.  * We aren't logging changes to the DASD used in directory inodes,
  734.  * but we need to write them to disk.  If we don't unmount cleanly,
  735.  * mount will recalculate the DASD used.
  736.  */
  737. if (S_ISDIR(ip->i_mode)
  738.     && (ip->i_ipmnt->i_mntflag & JFS_DASD_ENABLED))
  739. bcopy(&ip->i_DASD, &dp->di_DASD, sizeof(struct dasd));
  740. #endif /*  _JFS_FASTDASD */
  741. /* release the buffer holding the updated on-disk inode. 
  742.  * the buffer will be later written by commit processing.
  743.  */
  744. write_metapage(mp);
  745. return (rc);
  746. }
  747. /*
  748.  * NAME:        diFree(ip)
  749.  *
  750.  * FUNCTION:    free a specified inode from the inode working map
  751.  * for a fileset or aggregate.
  752.  *
  753.  * if the inode to be freed represents the first (only)
  754.  * free inode within the iag, the iag will be placed on
  755.  * the ag free inode list.
  756.  *
  757.  * freeing the inode will cause the inode extent to be
  758.  * freed if the inode is the only allocated inode within
  759.  * the extent.  in this case all the disk resource backing
  760.  * up the inode extent will be freed. in addition, the iag
  761.  * will be placed on the ag extent free list if the extent
  762.  * is the first free extent in the iag.  if freeing the
  763.  * extent also means that no free inodes will exist for
  764.  * the iag, the iag will also be removed from the ag free
  765.  * inode list.
  766.  *
  767.  * the iag describing the inode will be freed if the extent
  768.  * is to be freed and it is the only backed extent within
  769.  * the iag.  in this case, the iag will be removed from the
  770.  * ag free extent list and ag free inode list and placed on
  771.  * the inode map's free iag list.
  772.  *
  773.  * a careful update approach is used to provide consistency
  774.  * in the face of updates to multiple buffers.  under this
  775.  * approach, all required buffers are obtained before making
  776.  * any updates and are held until all updates are complete.
  777.  *
  778.  * PARAMETERS:
  779.  *      ip   - inode to be freed.
  780.  *
  781.  * RETURN VALUES:
  782.  *      0       - success
  783.  *      EIO   - i/o error.
  784.  */
  785. int diFree(struct inode *ip)
  786. {
  787. int rc;
  788. ino_t inum = ip->i_ino;
  789. struct iag *iagp, *aiagp, *biagp, *ciagp, *diagp;
  790. struct metapage *mp, *amp, *bmp, *cmp, *dmp;
  791. int iagno, ino, extno, bitno, sword, agno;
  792. int back, fwd;
  793. u32 bitmap, mask;
  794. struct inode *ipimap = JFS_SBI(ip->i_sb)->ipimap;
  795. struct inomap *imap = JFS_IP(ipimap)->i_imap;
  796. pxd_t freepxd;
  797. tid_t tid;
  798. struct inode *iplist[3];
  799. struct tlock *tlck;
  800. struct pxd_lock *pxdlock;
  801. /*
  802.  * This is just to suppress compiler warnings.  The same logic that
  803.  * references these variables is used to initialize them.
  804.  */
  805. aiagp = biagp = ciagp = diagp = NULL;
  806. /* get the iag number containing the inode.
  807.  */
  808. iagno = INOTOIAG(inum);
  809. /* make sure that the iag is contained within 
  810.  * the map.
  811.  */
  812. //assert(iagno < imap->im_nextiag);
  813. if (iagno >= imap->im_nextiag) {
  814. jERROR(1, ("diFree: inum = %d, iagno = %d, nextiag = %dn",
  815.    (uint) inum, iagno, imap->im_nextiag));
  816. dump_mem("imap", imap, 32);
  817. updateSuper(ip->i_sb, FM_DIRTY);
  818. return EIO;
  819. }
  820. /* get the allocation group for this ino.
  821.  */
  822. agno = JFS_IP(ip)->agno;
  823. /* Lock the AG specific inode map information
  824.  */
  825. AG_LOCK(imap, agno);
  826. /* Obtain read lock in imap inode.  Don't release it until we have
  827.  * read all of the IAG's that we are going to.
  828.  */
  829. IREAD_LOCK(ipimap);
  830. /* read the iag.
  831.  */
  832. if ((rc = diIAGRead(imap, iagno, &mp))) {
  833. IREAD_UNLOCK(ipimap);
  834. AG_UNLOCK(imap, agno);
  835. return (rc);
  836. }
  837. iagp = (struct iag *) mp->data;
  838. /* get the inode number and extent number of the inode within
  839.  * the iag and the inode number within the extent.
  840.  */
  841. ino = inum & (INOSPERIAG - 1);
  842. extno = ino >> L2INOSPEREXT;
  843. bitno = ino & (INOSPEREXT - 1);
  844. mask = HIGHORDER >> bitno;
  845. assert(le32_to_cpu(iagp->wmap[extno]) & mask);
  846. #ifdef _STILL_TO_PORT
  847. assert((le32_to_cpu(iagp->pmap[extno]) & mask) == 0);
  848. #endif /*  _STILL_TO_PORT */
  849. assert(addressPXD(&iagp->inoext[extno]));
  850. /* compute the bitmap for the extent reflecting the freed inode.
  851.  */
  852. bitmap = le32_to_cpu(iagp->wmap[extno]) & ~mask;
  853. if (imap->im_agctl[agno].numfree > imap->im_agctl[agno].numinos) {
  854. jERROR(1,("diFree: numfree > numinosn"));
  855. release_metapage(mp);
  856. IREAD_UNLOCK(ipimap);
  857. AG_UNLOCK(imap, agno);
  858. updateSuper(ip->i_sb, FM_DIRTY);
  859. return EIO;
  860. }
  861. /*
  862.  *      inode extent still has some inodes or below low water mark:
  863.  *      keep the inode extent;
  864.  */
  865. if (bitmap ||
  866.     imap->im_agctl[agno].numfree < 96 ||
  867.     (imap->im_agctl[agno].numfree < 288 &&
  868.      (((imap->im_agctl[agno].numfree * 100) /
  869.        imap->im_agctl[agno].numinos) <= 25))) {
  870. /* if the iag currently has no free inodes (i.e.,
  871.  * the inode being freed is the first free inode of iag),
  872.  * insert the iag at head of the inode free list for the ag.
  873.  */
  874. if (iagp->nfreeinos == 0) {
  875. /* check if there are any iags on the ag inode
  876.  * free list.  if so, read the first one so that
  877.  * we can link the current iag onto the list at
  878.  * the head.
  879.  */
  880. if ((fwd = imap->im_agctl[agno].inofree) >= 0) {
  881. /* read the iag that currently is the head
  882.  * of the list.
  883.  */
  884. if ((rc = diIAGRead(imap, fwd, &amp))) {
  885. IREAD_UNLOCK(ipimap);
  886. AG_UNLOCK(imap, agno);
  887. release_metapage(mp);
  888. return (rc);
  889. }
  890. aiagp = (struct iag *) amp->data;
  891. /* make current head point back to the iag.
  892.  */
  893. aiagp->inofreeback = cpu_to_le32(iagno);
  894. write_metapage(amp);
  895. }
  896. /* iag points forward to current head and iag
  897.  * becomes the new head of the list.
  898.  */
  899. iagp->inofreefwd =
  900.     cpu_to_le32(imap->im_agctl[agno].inofree);
  901. iagp->inofreeback = -1;
  902. imap->im_agctl[agno].inofree = iagno;
  903. }
  904. IREAD_UNLOCK(ipimap);
  905. /* update the free inode summary map for the extent if
  906.  * freeing the inode means the extent will now have free
  907.  * inodes (i.e., the inode being freed is the first free 
  908.  * inode of extent),
  909.  */
  910. if (iagp->wmap[extno] == ONES) {
  911. sword = extno >> L2EXTSPERSUM;
  912. bitno = extno & (EXTSPERSUM - 1);
  913. iagp->inosmap[sword] &=
  914.     cpu_to_le32(~(HIGHORDER >> bitno));
  915. }
  916. /* update the bitmap.
  917.  */
  918. iagp->wmap[extno] = cpu_to_le32(bitmap);
  919. DBG_DIFREE(imap, inum);
  920. /* update the free inode counts at the iag, ag and
  921.  * map level.
  922.  */
  923. iagp->nfreeinos =
  924.     cpu_to_le32(le32_to_cpu(iagp->nfreeinos) + 1);
  925. imap->im_agctl[agno].numfree += 1;
  926. atomic_inc(&imap->im_numfree);
  927. /* release the AG inode map lock
  928.  */
  929. AG_UNLOCK(imap, agno);
  930. /* write the iag */
  931. write_metapage(mp);
  932. return (0);
  933. }
  934. /*
  935.  *      inode extent has become free and above low water mark:
  936.  *      free the inode extent;
  937.  */
  938. /*
  939.  *      prepare to update iag list(s) (careful update step 1)
  940.  */
  941. amp = bmp = cmp = dmp = NULL;
  942. fwd = back = -1;
  943. /* check if the iag currently has no free extents.  if so,
  944.  * it will be placed on the head of the ag extent free list.
  945.  */
  946. if (iagp->nfreeexts == 0) {
  947. /* check if the ag extent free list has any iags.
  948.  * if so, read the iag at the head of the list now.
  949.  * this (head) iag will be updated later to reflect
  950.  * the addition of the current iag at the head of
  951.  * the list.
  952.  */
  953. if ((fwd = imap->im_agctl[agno].extfree) >= 0) {
  954. if ((rc = diIAGRead(imap, fwd, &amp)))
  955. goto error_out;
  956. aiagp = (struct iag *) amp->data;
  957. }
  958. } else {
  959. /* iag has free extents. check if the addition of a free
  960.  * extent will cause all extents to be free within this
  961.  * iag.  if so, the iag will be removed from the ag extent
  962.  * free list and placed on the inode map's free iag list.
  963.  */
  964. if (iagp->nfreeexts == cpu_to_le32(EXTSPERIAG - 1)) {
  965. /* in preparation for removing the iag from the
  966.  * ag extent free list, read the iags preceeding
  967.  * and following the iag on the ag extent free
  968.  * list.
  969.  */
  970. if ((fwd = le32_to_cpu(iagp->extfreefwd)) >= 0) {
  971. if ((rc = diIAGRead(imap, fwd, &amp)))
  972. goto error_out;
  973. aiagp = (struct iag *) amp->data;
  974. }
  975. if ((back = le32_to_cpu(iagp->extfreeback)) >= 0) {
  976. if ((rc = diIAGRead(imap, back, &bmp)))
  977. goto error_out;
  978. biagp = (struct iag *) bmp->data;
  979. }
  980. }
  981. }
  982. /* remove the iag from the ag inode free list if freeing
  983.  * this extent cause the iag to have no free inodes.
  984.  */
  985. if (iagp->nfreeinos == cpu_to_le32(INOSPEREXT - 1)) {
  986. int inofreeback = le32_to_cpu(iagp->inofreeback);
  987. int inofreefwd = le32_to_cpu(iagp->inofreefwd);
  988. /* in preparation for removing the iag from the
  989.  * ag inode free list, read the iags preceeding
  990.  * and following the iag on the ag inode free
  991.  * list.  before reading these iags, we must make
  992.  * sure that we already don't have them in hand
  993.  * from up above, since re-reading an iag (buffer)
  994.  * we are currently holding would cause a deadlock.
  995.  */
  996. if (inofreefwd >= 0) {
  997. if (inofreefwd == fwd)
  998. ciagp = (struct iag *) amp->data;
  999. else if (inofreefwd == back)
  1000. ciagp = (struct iag *) bmp->data;
  1001. else {
  1002. if ((rc =
  1003.      diIAGRead(imap, inofreefwd, &cmp)))
  1004. goto error_out;
  1005. assert(cmp != NULL);
  1006. ciagp = (struct iag *) cmp->data;
  1007. }
  1008. assert(ciagp != NULL);
  1009. }
  1010. if (inofreeback >= 0) {
  1011. if (inofreeback == fwd)
  1012. diagp = (struct iag *) amp->data;
  1013. else if (inofreeback == back)
  1014. diagp = (struct iag *) bmp->data;
  1015. else {
  1016. if ((rc =
  1017.      diIAGRead(imap, inofreeback, &dmp)))
  1018. goto error_out;
  1019. assert(dmp != NULL);
  1020. diagp = (struct iag *) dmp->data;
  1021. }
  1022. assert(diagp != NULL);
  1023. }
  1024. }
  1025. IREAD_UNLOCK(ipimap);
  1026. /*
  1027.  * invalidate any page of the inode extent freed from buffer cache;
  1028.  */
  1029. freepxd = iagp->inoext[extno];
  1030. invalidate_pxd_metapages(ip->i_sb->s_bdev->bd_inode, freepxd);
  1031. /*
  1032.  *      update iag list(s) (careful update step 2)
  1033.  */
  1034. /* add the iag to the ag extent free list if this is the
  1035.  * first free extent for the iag.
  1036.  */
  1037. if (iagp->nfreeexts == 0) {
  1038. if (fwd >= 0)
  1039. aiagp->extfreeback = cpu_to_le32(iagno);
  1040. iagp->extfreefwd =
  1041.     cpu_to_le32(imap->im_agctl[agno].extfree);
  1042. iagp->extfreeback = -1;
  1043. imap->im_agctl[agno].extfree = iagno;
  1044. } else {
  1045. /* remove the iag from the ag extent list if all extents
  1046.  * are now free and place it on the inode map iag free list.
  1047.  */
  1048. if (iagp->nfreeexts == cpu_to_le32(EXTSPERIAG - 1)) {
  1049. if (fwd >= 0)
  1050. aiagp->extfreeback = iagp->extfreeback;
  1051. if (back >= 0)
  1052. biagp->extfreefwd = iagp->extfreefwd;
  1053. else
  1054. imap->im_agctl[agno].extfree =
  1055.     le32_to_cpu(iagp->extfreefwd);
  1056. iagp->extfreefwd = iagp->extfreeback = -1;
  1057. IAGFREE_LOCK(imap);
  1058. iagp->iagfree = cpu_to_le32(imap->im_freeiag);
  1059. imap->im_freeiag = iagno;
  1060. IAGFREE_UNLOCK(imap);
  1061. }
  1062. }
  1063. /* remove the iag from the ag inode free list if freeing
  1064.  * this extent causes the iag to have no free inodes.
  1065.  */
  1066. if (iagp->nfreeinos == cpu_to_le32(INOSPEREXT - 1)) {
  1067. if ((int) le32_to_cpu(iagp->inofreefwd) >= 0)
  1068. ciagp->inofreeback = iagp->inofreeback;
  1069. if ((int) le32_to_cpu(iagp->inofreeback) >= 0)
  1070. diagp->inofreefwd = iagp->inofreefwd;
  1071. else
  1072. imap->im_agctl[agno].inofree =
  1073.     le32_to_cpu(iagp->inofreefwd);
  1074. iagp->inofreefwd = iagp->inofreeback = -1;
  1075. }
  1076. /* update the inode extent address and working map 
  1077.  * to reflect the free extent.
  1078.  * the permanent map should have been updated already 
  1079.  * for the inode being freed.
  1080.  */
  1081. assert(iagp->pmap[extno] == 0);
  1082. iagp->wmap[extno] = 0;
  1083. DBG_DIFREE(imap, inum);
  1084. PXDlength(&iagp->inoext[extno], 0);
  1085. PXDaddress(&iagp->inoext[extno], 0);
  1086. /* update the free extent and free inode summary maps
  1087.  * to reflect the freed extent.
  1088.  * the inode summary map is marked to indicate no inodes 
  1089.  * available for the freed extent.
  1090.  */
  1091. sword = extno >> L2EXTSPERSUM;
  1092. bitno = extno & (EXTSPERSUM - 1);
  1093. mask = HIGHORDER >> bitno;
  1094. iagp->inosmap[sword] |= cpu_to_le32(mask);
  1095. iagp->extsmap[sword] &= cpu_to_le32(~mask);
  1096. /* update the number of free inodes and number of free extents
  1097.  * for the iag.
  1098.  */
  1099. iagp->nfreeinos = cpu_to_le32(le32_to_cpu(iagp->nfreeinos) -
  1100.       (INOSPEREXT - 1));
  1101. iagp->nfreeexts = cpu_to_le32(le32_to_cpu(iagp->nfreeexts) + 1);
  1102. /* update the number of free inodes and backed inodes
  1103.  * at the ag and inode map level.
  1104.  */
  1105. imap->im_agctl[agno].numfree -= (INOSPEREXT - 1);
  1106. imap->im_agctl[agno].numinos -= INOSPEREXT;
  1107. atomic_sub(INOSPEREXT - 1, &imap->im_numfree);
  1108. atomic_sub(INOSPEREXT, &imap->im_numinos);
  1109. if (amp)
  1110. write_metapage(amp);
  1111. if (bmp)
  1112. write_metapage(bmp);
  1113. if (cmp)
  1114. write_metapage(cmp);
  1115. if (dmp)
  1116. write_metapage(dmp);
  1117. /*
  1118.  * start transaction to update block allocation map
  1119.  * for the inode extent freed;
  1120.  *
  1121.  * N.B. AG_LOCK is released and iag will be released below, and 
  1122.  * other thread may allocate inode from/reusing the ixad freed
  1123.  * BUT with new/different backing inode extent from the extent 
  1124.  * to be freed by the transaction;  
  1125.  */
  1126. tid = txBegin(ipimap->i_sb, COMMIT_FORCE);
  1127. /* acquire tlock of the iag page of the freed ixad 
  1128.  * to force the page NOHOMEOK (even though no data is
  1129.  * logged from the iag page) until NOREDOPAGE|FREEXTENT log 
  1130.  * for the free of the extent is committed;
  1131.  * write FREEXTENT|NOREDOPAGE log record
  1132.  * N.B. linelock is overlaid as freed extent descriptor;
  1133.  */
  1134. tlck = txLock(tid, ipimap, mp, tlckINODE | tlckFREE);
  1135. pxdlock = (struct pxd_lock *) & tlck->lock;
  1136. pxdlock->flag = mlckFREEPXD;
  1137. pxdlock->pxd = freepxd;
  1138. pxdlock->index = 1;
  1139. write_metapage(mp);
  1140. iplist[0] = ipimap;
  1141. /*
  1142.  * logredo needs the IAG number and IAG extent index in order
  1143.  * to ensure that the IMap is consistent.  The least disruptive
  1144.  * way to pass these values through  to the transaction manager
  1145.  * is in the iplist array.  
  1146.  * 
  1147.  * It's not pretty, but it works.
  1148.  */
  1149. iplist[1] = (struct inode *) (size_t)iagno;
  1150. iplist[2] = (struct inode *) (size_t)extno;
  1151. rc = txCommit(tid, 1, &iplist[0], COMMIT_FORCE); // D233382
  1152. txEnd(tid);
  1153. /* unlock the AG inode map information */
  1154. AG_UNLOCK(imap, agno);
  1155. return (0);
  1156.       error_out:
  1157. IREAD_UNLOCK(ipimap);
  1158. if (amp)
  1159. release_metapage(amp);
  1160. if (bmp)
  1161. release_metapage(bmp);
  1162. if (cmp)
  1163. release_metapage(cmp);
  1164. if (dmp)
  1165. release_metapage(dmp);
  1166. AG_UNLOCK(imap, agno);
  1167. release_metapage(mp);
  1168. return (rc);
  1169. }
  1170. /*
  1171.  * There are several places in the diAlloc* routines where we initialize
  1172.  * the inode.
  1173.  */
  1174. static inline void
  1175. diInitInode(struct inode *ip, int iagno, int ino, int extno, struct iag * iagp)
  1176. {
  1177. struct jfs_sb_info *sbi = JFS_SBI(ip->i_sb);
  1178. struct jfs_inode_info *jfs_ip = JFS_IP(ip);
  1179. ip->i_ino = (iagno << L2INOSPERIAG) + ino;
  1180. DBG_DIALLOC(JFS_IP(ipimap)->i_imap, ip->i_ino);
  1181. jfs_ip->ixpxd = iagp->inoext[extno];
  1182. jfs_ip->agno = BLKTOAG(le64_to_cpu(iagp->agstart), sbi);
  1183. jfs_ip->active_ag = -1;
  1184. }
  1185. /*
  1186.  * NAME:        diAlloc(pip,dir,ip)
  1187.  *
  1188.  * FUNCTION:    allocate a disk inode from the inode working map 
  1189.  * for a fileset or aggregate.
  1190.  *
  1191.  * PARAMETERS:
  1192.  *      pip   - pointer to incore inode for the parent inode.
  1193.  *      dir   - TRUE if the new disk inode is for a directory.
  1194.  *      ip   - pointer to a new inode
  1195.  *
  1196.  * RETURN VALUES:
  1197.  *      0       - success.
  1198.  *      ENOSPC  - insufficient disk resources.
  1199.  *      EIO   - i/o error.
  1200.  */
  1201. int diAlloc(struct inode *pip, boolean_t dir, struct inode *ip)
  1202. {
  1203. int rc, ino, iagno, addext, extno, bitno, sword;
  1204. int nwords, rem, i, agno;
  1205. u32 mask, inosmap, extsmap;
  1206. struct inode *ipimap;
  1207. struct metapage *mp;
  1208. ino_t inum;
  1209. struct iag *iagp;
  1210. struct inomap *imap;
  1211. /* get the pointers to the inode map inode and the
  1212.  * corresponding imap control structure.
  1213.  */
  1214. ipimap = JFS_SBI(pip->i_sb)->ipimap;
  1215. imap = JFS_IP(ipimap)->i_imap;
  1216. JFS_IP(ip)->ipimap = ipimap;
  1217. JFS_IP(ip)->fileset = FILESYSTEM_I;
  1218. /* for a directory, the allocation policy is to start 
  1219.  * at the ag level using the preferred ag.
  1220.  */
  1221. if (dir == TRUE) {
  1222. agno = dbNextAG(JFS_SBI(pip->i_sb)->ipbmap);
  1223. AG_LOCK(imap, agno);
  1224. goto tryag;
  1225. }
  1226. /* for files, the policy starts off by trying to allocate from
  1227.  * the same iag containing the parent disk inode:
  1228.  * try to allocate the new disk inode close to the parent disk
  1229.  * inode, using parent disk inode number + 1 as the allocation
  1230.  * hint.  (we use a left-to-right policy to attempt to avoid
  1231.  * moving backward on the disk.)  compute the hint within the
  1232.  * file system and the iag.
  1233.  */
  1234. /* get the ag number of this iag */
  1235. agno = JFS_IP(pip)->agno;
  1236. if (atomic_read(&JFS_SBI(pip->i_sb)->bmap->db_active[agno])) {
  1237. /*
  1238.  * There is an open file actively growing.  We want to
  1239.  * allocate new inodes from a different ag to avoid
  1240.  * fragmentation problems.
  1241.  */
  1242. agno = dbNextAG(JFS_SBI(pip->i_sb)->ipbmap);
  1243. AG_LOCK(imap, agno);
  1244. goto tryag;
  1245. }
  1246. inum = pip->i_ino + 1;
  1247. ino = inum & (INOSPERIAG - 1);
  1248. /* back off the the hint if it is outside of the iag */
  1249. if (ino == 0)
  1250. inum = pip->i_ino;
  1251. /* lock the AG inode map information */
  1252. AG_LOCK(imap, agno);
  1253. /* Get read lock on imap inode */
  1254. IREAD_LOCK(ipimap);
  1255. /* get the iag number and read the iag */
  1256. iagno = INOTOIAG(inum);
  1257. if ((rc = diIAGRead(imap, iagno, &mp))) {
  1258. IREAD_UNLOCK(ipimap);
  1259. return (rc);
  1260. }
  1261. iagp = (struct iag *) mp->data;
  1262. /* determine if new inode extent is allowed to be added to the iag.
  1263.  * new inode extent can be added to the iag if the ag
  1264.  * has less than 32 free disk inodes and the iag has free extents.
  1265.  */
  1266. addext = (imap->im_agctl[agno].numfree < 32 && iagp->nfreeexts);
  1267. /*
  1268.  *      try to allocate from the IAG
  1269.  */
  1270. /* check if the inode may be allocated from the iag 
  1271.  * (i.e. the inode has free inodes or new extent can be added).
  1272.  */
  1273. if (iagp->nfreeinos || addext) {
  1274. /* determine the extent number of the hint.
  1275.  */
  1276. extno = ino >> L2INOSPEREXT;
  1277. /* check if the extent containing the hint has backed
  1278.  * inodes.  if so, try to allocate within this extent.
  1279.  */
  1280. if (addressPXD(&iagp->inoext[extno])) {
  1281. bitno = ino & (INOSPEREXT - 1);
  1282. if ((bitno =
  1283.      diFindFree(le32_to_cpu(iagp->wmap[extno]),
  1284. bitno))
  1285.     < INOSPEREXT) {
  1286. ino = (extno << L2INOSPEREXT) + bitno;
  1287. /* a free inode (bit) was found within this
  1288.  * extent, so allocate it.
  1289.  */
  1290. rc = diAllocBit(imap, iagp, ino);
  1291. IREAD_UNLOCK(ipimap);
  1292. if (rc) {
  1293. assert(rc == EIO);
  1294. } else {
  1295. /* set the results of the allocation
  1296.  * and write the iag.
  1297.  */
  1298. diInitInode(ip, iagno, ino, extno,
  1299.     iagp);
  1300. mark_metapage_dirty(mp);
  1301. }
  1302. release_metapage(mp);
  1303. /* free the AG lock and return.
  1304.  */
  1305. AG_UNLOCK(imap, agno);
  1306. return (rc);
  1307. }
  1308. if (!addext)
  1309. extno =
  1310.     (extno ==
  1311.      EXTSPERIAG - 1) ? 0 : extno + 1;
  1312. }
  1313. /*
  1314.  * no free inodes within the extent containing the hint.
  1315.  *
  1316.  * try to allocate from the backed extents following
  1317.  * hint or, if appropriate (i.e. addext is true), allocate
  1318.  * an extent of free inodes at or following the extent
  1319.  * containing the hint.
  1320.  * 
  1321.  * the free inode and free extent summary maps are used
  1322.  * here, so determine the starting summary map position
  1323.  * and the number of words we'll have to examine.  again,
  1324.  * the approach is to allocate following the hint, so we
  1325.  * might have to initially ignore prior bits of the summary
  1326.  * map that represent extents prior to the extent containing
  1327.  * the hint and later revisit these bits.
  1328.  */
  1329. bitno = extno & (EXTSPERSUM - 1);
  1330. nwords = (bitno == 0) ? SMAPSZ : SMAPSZ + 1;
  1331. sword = extno >> L2EXTSPERSUM;
  1332. /* mask any prior bits for the starting words of the
  1333.  * summary map.
  1334.  */
  1335. mask = ONES << (EXTSPERSUM - bitno);
  1336. inosmap = le32_to_cpu(iagp->inosmap[sword]) | mask;
  1337. extsmap = le32_to_cpu(iagp->extsmap[sword]) | mask;
  1338. /* scan the free inode and free extent summary maps for
  1339.  * free resources.
  1340.  */
  1341. for (i = 0; i < nwords; i++) {
  1342. /* check if this word of the free inode summary
  1343.  * map describes an extent with free inodes.
  1344.  */
  1345. if (~inosmap) {
  1346. /* an extent with free inodes has been
  1347.  * found. determine the extent number
  1348.  * and the inode number within the extent.
  1349.  */
  1350. rem = diFindFree(inosmap, 0);
  1351. extno = (sword << L2EXTSPERSUM) + rem;
  1352. rem =
  1353.     diFindFree(le32_to_cpu
  1354.        (iagp->wmap[extno]), 0);
  1355. assert(rem < INOSPEREXT);
  1356. /* determine the inode number within the
  1357.  * iag and allocate the inode from the
  1358.  * map.
  1359.  */
  1360. ino = (extno << L2INOSPEREXT) + rem;
  1361. rc = diAllocBit(imap, iagp, ino);
  1362. IREAD_UNLOCK(ipimap);
  1363. if (rc) {
  1364. assert(rc == EIO);
  1365. } else {
  1366. /* set the results of the allocation
  1367.  * and write the iag.
  1368.  */
  1369. diInitInode(ip, iagno, ino, extno,
  1370.     iagp);
  1371. mark_metapage_dirty(mp);
  1372. }
  1373. release_metapage(mp);
  1374. /* free the AG lock and return.
  1375.  */
  1376. AG_UNLOCK(imap, agno);
  1377. return (rc);
  1378. }
  1379. /* check if we may allocate an extent of free
  1380.  * inodes and whether this word of the free
  1381.  * extents summary map describes a free extent.
  1382.  */
  1383. if (addext && ~extsmap) {
  1384. /* a free extent has been found.  determine
  1385.  * the extent number.
  1386.  */
  1387. rem = diFindFree(extsmap, 0);
  1388. extno = (sword << L2EXTSPERSUM) + rem;
  1389. /* allocate an extent of free inodes.
  1390.  */
  1391. if ((rc = diNewExt(imap, iagp, extno))) {
  1392. /* if there is no disk space for a
  1393.  * new extent, try to allocate the
  1394.  * disk inode from somewhere else.
  1395.  */
  1396. if (rc == ENOSPC)
  1397. break;
  1398. assert(rc == EIO);
  1399. } else {
  1400. /* set the results of the allocation
  1401.  * and write the iag.
  1402.  */
  1403. diInitInode(ip, iagno,
  1404.     extno << L2INOSPEREXT,
  1405.     extno, iagp);
  1406. mark_metapage_dirty(mp);
  1407. }
  1408. release_metapage(mp);
  1409. /* free the imap inode & the AG lock & return.
  1410.  */
  1411. IREAD_UNLOCK(ipimap);
  1412. AG_UNLOCK(imap, agno);
  1413. return (rc);
  1414. }
  1415. /* move on to the next set of summary map words.
  1416.  */
  1417. sword = (sword == SMAPSZ - 1) ? 0 : sword + 1;
  1418. inosmap = le32_to_cpu(iagp->inosmap[sword]);
  1419. extsmap = le32_to_cpu(iagp->extsmap[sword]);
  1420. }
  1421. }
  1422. /* unlock imap inode */
  1423. IREAD_UNLOCK(ipimap);
  1424. /* nothing doing in this iag, so release it. */
  1425. release_metapage(mp);
  1426.       tryag:
  1427. /*
  1428.  * try to allocate anywhere within the same AG as the parent inode.
  1429.  */
  1430. rc = diAllocAG(imap, agno, dir, ip);
  1431. AG_UNLOCK(imap, agno);
  1432. if (rc != ENOSPC)
  1433. return (rc);
  1434. /*
  1435.  * try to allocate in any AG.
  1436.  */
  1437. return (diAllocAny(imap, agno, dir, ip));
  1438. }
  1439. /*
  1440.  * NAME:        diAllocAG(imap,agno,dir,ip)
  1441.  *
  1442.  * FUNCTION:    allocate a disk inode from the allocation group.
  1443.  *
  1444.  * this routine first determines if a new extent of free
  1445.  * inodes should be added for the allocation group, with
  1446.  * the current request satisfied from this extent. if this
  1447.  * is the case, an attempt will be made to do just that.  if
  1448.  * this attempt fails or it has been determined that a new 
  1449.  * extent should not be added, an attempt is made to satisfy
  1450.  * the request by allocating an existing (backed) free inode
  1451.  * from the allocation group.
  1452.  *
  1453.  * PRE CONDITION: Already have the AG lock for this AG.
  1454.  *
  1455.  * PARAMETERS:
  1456.  *      imap   - pointer to inode map control structure.
  1457.  *      agno   - allocation group to allocate from.
  1458.  *      dir   - TRUE if the new disk inode is for a directory.
  1459.  *      ip   - pointer to the new inode to be filled in on successful return
  1460.  *   with the disk inode number allocated, its extent address
  1461.  *   and the start of the ag.
  1462.  *
  1463.  * RETURN VALUES:
  1464.  *      0       - success.
  1465.  *      ENOSPC  - insufficient disk resources.
  1466.  *      EIO   - i/o error.
  1467.  */
  1468. static int
  1469. diAllocAG(struct inomap * imap, int agno, boolean_t dir, struct inode *ip)
  1470. {
  1471. int rc, addext, numfree, numinos;
  1472. /* get the number of free and the number of backed disk 
  1473.  * inodes currently within the ag.
  1474.  */
  1475. numfree = imap->im_agctl[agno].numfree;
  1476. numinos = imap->im_agctl[agno].numinos;
  1477. if (numfree > numinos) {
  1478. jERROR(1,("diAllocAG: numfree > numinosn"));
  1479. updateSuper(ip->i_sb, FM_DIRTY);
  1480. return EIO;
  1481. }
  1482. /* determine if we should allocate a new extent of free inodes
  1483.  * within the ag: for directory inodes, add a new extent
  1484.  * if there are a small number of free inodes or number of free
  1485.  * inodes is a small percentage of the number of backed inodes.
  1486.  */
  1487. if (dir == TRUE)
  1488. addext = (numfree < 64 ||
  1489.   (numfree < 256
  1490.    && ((numfree * 100) / numinos) <= 20));
  1491. else
  1492. addext = (numfree == 0);
  1493. /*
  1494.  * try to allocate a new extent of free inodes.
  1495.  */
  1496. if (addext) {
  1497. /* if free space is not avaliable for this new extent, try
  1498.  * below to allocate a free and existing (already backed)
  1499.  * inode from the ag.
  1500.  */
  1501. if ((rc = diAllocExt(imap, agno, ip)) != ENOSPC)
  1502. return (rc);
  1503. }
  1504. /*
  1505.  * try to allocate an existing free inode from the ag.
  1506.  */
  1507. return (diAllocIno(imap, agno, ip));
  1508. }
  1509. /*
  1510.  * NAME:        diAllocAny(imap,agno,dir,iap)
  1511.  *
  1512.  * FUNCTION:    allocate a disk inode from any other allocation group.
  1513.  *
  1514.  * this routine is called when an allocation attempt within
  1515.  * the primary allocation group has failed. if attempts to
  1516.  * allocate an inode from any allocation group other than the
  1517.  * specified primary group.
  1518.  *
  1519.  * PARAMETERS:
  1520.  *      imap   - pointer to inode map control structure.
  1521.  *      agno   - primary allocation group (to avoid).
  1522.  *      dir   - TRUE if the new disk inode is for a directory.
  1523.  *      ip   - pointer to a new inode to be filled in on successful return
  1524.  *   with the disk inode number allocated, its extent address
  1525.  *   and the start of the ag.
  1526.  *
  1527.  * RETURN VALUES:
  1528.  *      0       - success.
  1529.  *      ENOSPC  - insufficient disk resources.
  1530.  *      EIO   - i/o error.
  1531.  */
  1532. static int
  1533. diAllocAny(struct inomap * imap, int agno, boolean_t dir, struct inode *ip)
  1534. {
  1535. int ag, rc;
  1536. int maxag = JFS_SBI(imap->im_ipimap->i_sb)->bmap->db_maxag;
  1537. /* try to allocate from the ags following agno up to 
  1538.  * the maximum ag number.
  1539.  */
  1540. for (ag = agno + 1; ag <= maxag; ag++) {
  1541. AG_LOCK(imap, ag);
  1542. rc = diAllocAG(imap, ag, dir, ip);
  1543. AG_UNLOCK(imap, ag);
  1544. if (rc != ENOSPC)
  1545. return (rc);
  1546. }
  1547. /* try to allocate from the ags in front of agno.
  1548.  */
  1549. for (ag = 0; ag < agno; ag++) {
  1550. AG_LOCK(imap, ag);
  1551. rc = diAllocAG(imap, ag, dir, ip);
  1552. AG_UNLOCK(imap, ag);
  1553. if (rc != ENOSPC)
  1554. return (rc);
  1555. }
  1556. /* no free disk inodes.
  1557.  */
  1558. return (ENOSPC);
  1559. }
  1560. /*
  1561.  * NAME:        diAllocIno(imap,agno,ip)
  1562.  *
  1563.  * FUNCTION:    allocate a disk inode from the allocation group's free
  1564.  * inode list, returning an error if this free list is
  1565.  * empty (i.e. no iags on the list).
  1566.  *
  1567.  * allocation occurs from the first iag on the list using
  1568.  * the iag's free inode summary map to find the leftmost
  1569.  * free inode in the iag. 
  1570.  *
  1571.  * PRE CONDITION: Already have AG lock for this AG.
  1572.  *
  1573.  * PARAMETERS:
  1574.  *      imap   - pointer to inode map control structure.
  1575.  *      agno   - allocation group.
  1576.  *      ip   - pointer to new inode to be filled in on successful return
  1577.  *   with the disk inode number allocated, its extent address
  1578.  *   and the start of the ag.
  1579.  *
  1580.  * RETURN VALUES:
  1581.  *      0       - success.
  1582.  *      ENOSPC  - insufficient disk resources.
  1583.  *      EIO   - i/o error.
  1584.  */
  1585. static int diAllocIno(struct inomap * imap, int agno, struct inode *ip)
  1586. {
  1587. int iagno, ino, rc, rem, extno, sword;
  1588. struct metapage *mp;
  1589. struct iag *iagp;
  1590. /* check if there are iags on the ag's free inode list.
  1591.  */
  1592. if ((iagno = imap->im_agctl[agno].inofree) < 0)
  1593. return (ENOSPC);
  1594. /* obtain read lock on imap inode */
  1595. IREAD_LOCK(imap->im_ipimap);
  1596. /* read the iag at the head of the list.
  1597.  */
  1598. if ((rc = diIAGRead(imap, iagno, &mp))) {
  1599. IREAD_UNLOCK(imap->im_ipimap);
  1600. return (rc);
  1601. }
  1602. iagp = (struct iag *) mp->data;
  1603. /* better be free inodes in this iag if it is on the
  1604.  * list.
  1605.  */
  1606. //assert(iagp->nfreeinos);
  1607. if (!iagp->nfreeinos) {
  1608. jERROR(1,
  1609.        ("diAllocIno: nfreeinos = 0, but iag on freelistn"));
  1610. jERROR(1, ("  agno = %d, iagno = %dn", agno, iagno));
  1611. dump_mem("iag", iagp, 64);
  1612. updateSuper(ip->i_sb, FM_DIRTY);
  1613. return EIO;
  1614. }
  1615. /* scan the free inode summary map to find an extent
  1616.  * with free inodes.
  1617.  */
  1618. for (sword = 0;; sword++) {
  1619. assert(sword < SMAPSZ);
  1620. if (~iagp->inosmap[sword])
  1621. break;
  1622. }
  1623. /* found a extent with free inodes. determine
  1624.  * the extent number.
  1625.  */
  1626. rem = diFindFree(le32_to_cpu(iagp->inosmap[sword]), 0);
  1627. assert(rem < EXTSPERSUM);
  1628. extno = (sword << L2EXTSPERSUM) + rem;
  1629. /* find the first free inode in the extent.
  1630.  */
  1631. rem = diFindFree(le32_to_cpu(iagp->wmap[extno]), 0);
  1632. assert(rem < INOSPEREXT);
  1633. /* compute the inode number within the iag. 
  1634.  */
  1635. ino = (extno << L2INOSPEREXT) + rem;
  1636. /* allocate the inode.
  1637.  */
  1638. rc = diAllocBit(imap, iagp, ino);
  1639. IREAD_UNLOCK(imap->im_ipimap);
  1640. if (rc) {
  1641. release_metapage(mp);
  1642. return (rc);
  1643. }
  1644. /* set the results of the allocation and write the iag.
  1645.  */
  1646. diInitInode(ip, iagno, ino, extno, iagp);
  1647. write_metapage(mp);
  1648. return (0);
  1649. }
  1650. /*
  1651.  * NAME:        diAllocExt(imap,agno,ip)
  1652.  *
  1653.  * FUNCTION:    add a new extent of free inodes to an iag, allocating
  1654.  *         an inode from this extent to satisfy the current allocation
  1655.  *         request.
  1656.  *
  1657.  * this routine first tries to find an existing iag with free
  1658.  * extents through the ag free extent list.  if list is not
  1659.  * empty, the head of the list will be selected as the home
  1660.  * of the new extent of free inodes.  otherwise (the list is
  1661.  * empty), a new iag will be allocated for the ag to contain
  1662.  * the extent.
  1663.  *
  1664.  * once an iag has been selected, the free extent summary map
  1665.  * is used to locate a free extent within the iag and diNewExt()
  1666.  * is called to initialize the extent, with initialization
  1667.  * including the allocation of the first inode of the extent
  1668.  * for the purpose of satisfying this request.
  1669.  *
  1670.  * PARAMETERS:
  1671.  *      imap   - pointer to inode map control structure.
  1672.  *      agno   - allocation group number.
  1673.  *      ip   - pointer to new inode to be filled in on successful return
  1674.  *   with the disk inode number allocated, its extent address
  1675.  *   and the start of the ag.
  1676.  *
  1677.  * RETURN VALUES:
  1678.  *      0       - success.
  1679.  *      ENOSPC  - insufficient disk resources.
  1680.  *      EIO   - i/o error.
  1681.  */
  1682. static int diAllocExt(struct inomap * imap, int agno, struct inode *ip)
  1683. {
  1684. int rem, iagno, sword, extno, rc;
  1685. struct metapage *mp;
  1686. struct iag *iagp;
  1687. /* check if the ag has any iags with free extents.  if not,
  1688.  * allocate a new iag for the ag.
  1689.  */
  1690. if ((iagno = imap->im_agctl[agno].extfree) < 0) {
  1691. /* If successful, diNewIAG will obtain the read lock on the
  1692.  * imap inode.
  1693.  */
  1694. if ((rc = diNewIAG(imap, &iagno, agno, &mp))) {
  1695. return (rc);
  1696. }
  1697. iagp = (struct iag *) mp->data;
  1698. /* set the ag number if this a brand new iag
  1699.  */
  1700. iagp->agstart =
  1701.     cpu_to_le64(AGTOBLK(agno, imap->im_ipimap));
  1702. } else {
  1703. /* read the iag.
  1704.  */
  1705. IREAD_LOCK(imap->im_ipimap);
  1706. if ((rc = diIAGRead(imap, iagno, &mp))) {
  1707. assert(0);
  1708. }
  1709. iagp = (struct iag *) mp->data;
  1710. }
  1711. /* using the free extent summary map, find a free extent.
  1712.  */
  1713. for (sword = 0;; sword++) {
  1714. assert(sword < SMAPSZ);
  1715. if (~iagp->extsmap[sword])
  1716. break;
  1717. }
  1718. /* determine the extent number of the free extent.
  1719.  */
  1720. rem = diFindFree(le32_to_cpu(iagp->extsmap[sword]), 0);
  1721. assert(rem < EXTSPERSUM);
  1722. extno = (sword << L2EXTSPERSUM) + rem;
  1723. /* initialize the new extent.
  1724.  */
  1725. rc = diNewExt(imap, iagp, extno);
  1726. IREAD_UNLOCK(imap->im_ipimap);
  1727. if (rc) {
  1728. /* something bad happened.  if a new iag was allocated,
  1729.  * place it back on the inode map's iag free list, and
  1730.  * clear the ag number information.
  1731.  */
  1732. if (iagp->nfreeexts == cpu_to_le32(EXTSPERIAG)) {
  1733. IAGFREE_LOCK(imap);
  1734. iagp->iagfree = cpu_to_le32(imap->im_freeiag);
  1735. imap->im_freeiag = iagno;
  1736. IAGFREE_UNLOCK(imap);
  1737. }
  1738. write_metapage(mp);
  1739. return (rc);
  1740. }
  1741. /* set the results of the allocation and write the iag.
  1742.  */
  1743. diInitInode(ip, iagno, extno << L2INOSPEREXT, extno, iagp);
  1744. write_metapage(mp);
  1745. return (0);
  1746. }
  1747. /*
  1748.  * NAME:        diAllocBit(imap,iagp,ino)
  1749.  *
  1750.  * FUNCTION:    allocate a backed inode from an iag.
  1751.  *
  1752.  * this routine performs the mechanics of allocating a
  1753.  * specified inode from a backed extent.
  1754.  *
  1755.  * if the inode to be allocated represents the last free
  1756.  * inode within the iag, the iag will be removed from the
  1757.  * ag free inode list.
  1758.  *
  1759.  * a careful update approach is used to provide consistency
  1760.  * in the face of updates to multiple buffers.  under this
  1761.  * approach, all required buffers are obtained before making
  1762.  * any updates and are held all are updates are complete.
  1763.  *
  1764.  * PRE CONDITION: Already have buffer lock on iagp.  Already have AG lock on
  1765.  * this AG.  Must have read lock on imap inode.
  1766.  *
  1767.  * PARAMETERS:
  1768.  *      imap   - pointer to inode map control structure.
  1769.  *      iagp   - pointer to iag. 
  1770.  *      ino    - inode number to be allocated within the iag.
  1771.  *
  1772.  * RETURN VALUES:
  1773.  *      0       - success.
  1774.  *      ENOSPC  - insufficient disk resources.
  1775.  *      EIO   - i/o error.
  1776.  */
  1777. static int diAllocBit(struct inomap * imap, struct iag * iagp, int ino)
  1778. {
  1779. int extno, bitno, agno, sword, rc;
  1780. struct metapage *amp, *bmp;
  1781. struct iag *aiagp = 0, *biagp = 0;
  1782. u32 mask;
  1783. /* check if this is the last free inode within the iag.
  1784.  * if so, it will have to be removed from the ag free
  1785.  * inode list, so get the iags preceeding and following
  1786.  * it on the list.
  1787.  */
  1788. if (iagp->nfreeinos == cpu_to_le32(1)) {
  1789. amp = bmp = NULL;
  1790. if ((int) le32_to_cpu(iagp->inofreefwd) >= 0) {
  1791. if ((rc =
  1792.      diIAGRead(imap, le32_to_cpu(iagp->inofreefwd),
  1793.        &amp)))
  1794. return (rc);
  1795. aiagp = (struct iag *) amp->data;
  1796. }
  1797. if ((int) le32_to_cpu(iagp->inofreeback) >= 0) {
  1798. if ((rc =
  1799.      diIAGRead(imap,
  1800.        le32_to_cpu(iagp->inofreeback),
  1801.        &bmp))) {
  1802. if (amp)
  1803. release_metapage(amp);
  1804. return (rc);
  1805. }
  1806. biagp = (struct iag *) bmp->data;
  1807. }
  1808. }
  1809. /* get the ag number, extent number, inode number within
  1810.  * the extent.
  1811.  */
  1812. agno = BLKTOAG(le64_to_cpu(iagp->agstart), JFS_SBI(imap->im_ipimap->i_sb));
  1813. extno = ino >> L2INOSPEREXT;
  1814. bitno = ino & (INOSPEREXT - 1);
  1815. /* compute the mask for setting the map.
  1816.  */
  1817. mask = HIGHORDER >> bitno;
  1818. /* the inode should be free and backed.
  1819.  */
  1820. assert((le32_to_cpu(iagp->pmap[extno]) & mask) == 0);
  1821. assert((le32_to_cpu(iagp->wmap[extno]) & mask) == 0);
  1822. assert(addressPXD(&iagp->inoext[extno]) != 0);
  1823. /* mark the inode as allocated in the working map.
  1824.  */
  1825. iagp->wmap[extno] |= cpu_to_le32(mask);
  1826. /* check if all inodes within the extent are now
  1827.  * allocated.  if so, update the free inode summary
  1828.  * map to reflect this.
  1829.  */
  1830. if (iagp->wmap[extno] == ONES) {
  1831. sword = extno >> L2EXTSPERSUM;
  1832. bitno = extno & (EXTSPERSUM - 1);
  1833. iagp->inosmap[sword] |= cpu_to_le32(HIGHORDER >> bitno);
  1834. }
  1835. /* if this was the last free inode in the iag, remove the
  1836.  * iag from the ag free inode list.
  1837.  */
  1838. if (iagp->nfreeinos == cpu_to_le32(1)) {
  1839. if (amp) {
  1840. aiagp->inofreeback = iagp->inofreeback;
  1841. write_metapage(amp);
  1842. }
  1843. if (bmp) {
  1844. biagp->inofreefwd = iagp->inofreefwd;
  1845. write_metapage(bmp);
  1846. } else {
  1847. imap->im_agctl[agno].inofree =
  1848.     le32_to_cpu(iagp->inofreefwd);
  1849. }
  1850. iagp->inofreefwd = iagp->inofreeback = -1;
  1851. }
  1852. /* update the free inode count at the iag, ag, inode
  1853.  * map levels.
  1854.  */
  1855. iagp->nfreeinos = cpu_to_le32(le32_to_cpu(iagp->nfreeinos) - 1);
  1856. imap->im_agctl[agno].numfree -= 1;
  1857. atomic_dec(&imap->im_numfree);
  1858. return (0);
  1859. }
  1860. /*
  1861.  * NAME:        diNewExt(imap,iagp,extno)
  1862.  *
  1863.  * FUNCTION:    initialize a new extent of inodes for an iag, allocating
  1864.  *         the first inode of the extent for use for the current
  1865.  *         allocation request.
  1866.  *
  1867.  * disk resources are allocated for the new extent of inodes
  1868.  * and the inodes themselves are initialized to reflect their
  1869.  * existence within the extent (i.e. their inode numbers and
  1870.  * inode extent addresses are set) and their initial state
  1871.  * (mode and link count are set to zero).
  1872.  *
  1873.  * if the iag is new, it is not yet on an ag extent free list
  1874.  * but will now be placed on this list.
  1875.  *
  1876.  * if the allocation of the new extent causes the iag to
  1877.  * have no free extent, the iag will be removed from the
  1878.  * ag extent free list.
  1879.  *
  1880.  * if the iag has no free backed inodes, it will be placed
  1881.  * on the ag free inode list, since the addition of the new
  1882.  * extent will now cause it to have free inodes.
  1883.  *
  1884.  * a careful update approach is used to provide consistency
  1885.  * (i.e. list consistency) in the face of updates to multiple
  1886.  * buffers.  under this approach, all required buffers are
  1887.  * obtained before making any updates and are held until all
  1888.  * updates are complete.
  1889.  *
  1890.  * PRE CONDITION: Already have buffer lock on iagp.  Already have AG lock on
  1891.  * this AG.  Must have read lock on imap inode.
  1892.  *
  1893.  * PARAMETERS:
  1894.  *      imap   - pointer to inode map control structure.
  1895.  *      iagp   - pointer to iag. 
  1896.  *      extno   - extent number.
  1897.  *
  1898.  * RETURN VALUES:
  1899.  *      0       - success.
  1900.  *      ENOSPC  - insufficient disk resources.
  1901.  *      EIO   - i/o error.
  1902.  */
  1903. static int diNewExt(struct inomap * imap, struct iag * iagp, int extno)
  1904. {
  1905. int agno, iagno, fwd, back, freei = 0, sword, rc;
  1906. struct iag *aiagp = 0, *biagp = 0, *ciagp = 0;
  1907. struct metapage *amp, *bmp, *cmp, *dmp;
  1908. struct inode *ipimap;
  1909. s64 blkno, hint;
  1910. int i, j;
  1911. u32 mask;
  1912. ino_t ino;
  1913. struct dinode *dp;
  1914. struct jfs_sb_info *sbi;
  1915. /* better have free extents.
  1916.  */
  1917. assert(iagp->nfreeexts);
  1918. /* get the inode map inode.
  1919.  */
  1920. ipimap = imap->im_ipimap;
  1921. sbi = JFS_SBI(ipimap->i_sb);
  1922. amp = bmp = cmp = NULL;
  1923. /* get the ag and iag numbers for this iag.
  1924.  */
  1925. agno = BLKTOAG(le64_to_cpu(iagp->agstart), sbi);
  1926. iagno = le32_to_cpu(iagp->iagnum);
  1927. /* check if this is the last free extent within the
  1928.  * iag.  if so, the iag must be removed from the ag
  1929.  * free extent list, so get the iags preceeding and
  1930.  * following the iag on this list.
  1931.  */
  1932. if (iagp->nfreeexts == cpu_to_le32(1)) {
  1933. if ((fwd = le32_to_cpu(iagp->extfreefwd)) >= 0) {
  1934. if ((rc = diIAGRead(imap, fwd, &amp)))
  1935. return (rc);
  1936. aiagp = (struct iag *) amp->data;
  1937. }
  1938. if ((back = le32_to_cpu(iagp->extfreeback)) >= 0) {
  1939. if ((rc = diIAGRead(imap, back, &bmp)))
  1940. goto error_out;
  1941. biagp = (struct iag *) bmp->data;
  1942. }
  1943. } else {
  1944. /* the iag has free extents.  if all extents are free
  1945.  * (as is the case for a newly allocated iag), the iag
  1946.  * must be added to the ag free extent list, so get
  1947.  * the iag at the head of the list in preparation for
  1948.  * adding this iag to this list.
  1949.  */
  1950. fwd = back = -1;
  1951. if (iagp->nfreeexts == cpu_to_le32(EXTSPERIAG)) {
  1952. if ((fwd = imap->im_agctl[agno].extfree) >= 0) {
  1953. if ((rc = diIAGRead(imap, fwd, &amp)))
  1954. goto error_out;
  1955. aiagp = (struct iag *) amp->data;
  1956. }
  1957. }
  1958. }
  1959. /* check if the iag has no free inodes.  if so, the iag
  1960.  * will have to be added to the ag free inode list, so get
  1961.  * the iag at the head of the list in preparation for
  1962.  * adding this iag to this list.  in doing this, we must
  1963.  * check if we already have the iag at the head of
  1964.  * the list in hand.
  1965.  */
  1966. if (iagp->nfreeinos == 0) {
  1967. freei = imap->im_agctl[agno].inofree;
  1968. if (freei >= 0) {
  1969. if (freei == fwd) {
  1970. ciagp = aiagp;
  1971. } else if (freei == back) {
  1972. ciagp = biagp;
  1973. } else {
  1974. if ((rc = diIAGRead(imap, freei, &cmp)))
  1975. goto error_out;
  1976. ciagp = (struct iag *) cmp->data;
  1977. }
  1978. assert(ciagp != NULL);
  1979. }
  1980. }
  1981. /* allocate disk space for the inode extent.
  1982.  */
  1983. if ((extno == 0) || (addressPXD(&iagp->inoext[extno - 1]) == 0))
  1984. hint = ((s64) agno << sbi->bmap->db_agl2size) - 1;
  1985. else
  1986. hint = addressPXD(&iagp->inoext[extno - 1]) +
  1987.     lengthPXD(&iagp->inoext[extno - 1]) - 1;
  1988. if ((rc = dbAlloc(ipimap, hint, (s64) imap->im_nbperiext, &blkno)))
  1989. goto error_out;
  1990. /* compute the inode number of the first inode within the
  1991.  * extent.
  1992.  */
  1993. ino = (iagno << L2INOSPERIAG) + (extno << L2INOSPEREXT);
  1994. /* initialize the inodes within the newly allocated extent a
  1995.  * page at a time.
  1996.  */
  1997. for (i = 0; i < imap->im_nbperiext; i += sbi->nbperpage) {
  1998. /* get a buffer for this page of disk inodes.
  1999.  */
  2000. dmp = get_metapage(ipimap, blkno + i, PSIZE, 1);
  2001. if (dmp == NULL) {
  2002. rc = EIO;
  2003. goto error_out;
  2004. }
  2005. dp = (struct dinode *) dmp->data;
  2006. /* initialize the inode number, mode, link count and
  2007.  * inode extent address.
  2008.  */
  2009. for (j = 0; j < INOSPERPAGE; j++, dp++, ino++) {
  2010. dp->di_inostamp = cpu_to_le32(sbi->inostamp);
  2011. dp->di_number = cpu_to_le32(ino);
  2012. dp->di_fileset = cpu_to_le32(FILESYSTEM_I);
  2013. dp->di_mode = 0;
  2014. dp->di_nlink = 0;
  2015. PXDaddress(&(dp->di_ixpxd), blkno);
  2016. PXDlength(&(dp->di_ixpxd), imap->im_nbperiext);
  2017. }
  2018. write_metapage(dmp);
  2019. }
  2020. /* if this is the last free extent within the iag, remove the
  2021.  * iag from the ag free extent list.
  2022.  */
  2023. if (iagp->nfreeexts == cpu_to_le32(1)) {
  2024. if (fwd >= 0)
  2025. aiagp->extfreeback = iagp->extfreeback;
  2026. if (back >= 0)
  2027. biagp->extfreefwd = iagp->extfreefwd;
  2028. else
  2029. imap->im_agctl[agno].extfree =
  2030.     le32_to_cpu(iagp->extfreefwd);
  2031. iagp->extfreefwd = iagp->extfreeback = -1;
  2032. } else {
  2033. /* if the iag has all free extents (newly allocated iag),
  2034.  * add the iag to the ag free extent list.
  2035.  */
  2036. if (iagp->nfreeexts == cpu_to_le32(EXTSPERIAG)) {
  2037. if (fwd >= 0)
  2038. aiagp->extfreeback = cpu_to_le32(iagno);
  2039. iagp->extfreefwd = cpu_to_le32(fwd);
  2040. iagp->extfreeback = -1;
  2041. imap->im_agctl[agno].extfree = iagno;
  2042. }
  2043. }
  2044. /* if the iag has no free inodes, add the iag to the
  2045.  * ag free inode list.
  2046.  */
  2047. if (iagp->nfreeinos == 0) {
  2048. if (freei >= 0)
  2049. ciagp->inofreeback = cpu_to_le32(iagno);
  2050. iagp->inofreefwd =
  2051.     cpu_to_le32(imap->im_agctl[agno].inofree);
  2052. iagp->inofreeback = -1;
  2053. imap->im_agctl[agno].inofree = iagno;
  2054. }
  2055. /* initialize the extent descriptor of the extent. */
  2056. PXDlength(&iagp->inoext[extno], imap->im_nbperiext);
  2057. PXDaddress(&iagp->inoext[extno], blkno);
  2058. /* initialize the working and persistent map of the extent.
  2059.  * the working map will be initialized such that
  2060.  * it indicates the first inode of the extent is allocated.
  2061.  */
  2062. iagp->wmap[extno] = cpu_to_le32(HIGHORDER);
  2063. iagp->pmap[extno] = 0;
  2064. /* update the free inode and free extent summary maps
  2065.  * for the extent to indicate the extent has free inodes
  2066.  * and no longer represents a free extent.
  2067.  */
  2068. sword = extno >> L2EXTSPERSUM;
  2069. mask = HIGHORDER >> (extno & (EXTSPERSUM - 1));
  2070. iagp->extsmap[sword] |= cpu_to_le32(mask);
  2071. iagp->inosmap[sword] &= cpu_to_le32(~mask);
  2072. /* update the free inode and free extent counts for the
  2073.  * iag.
  2074.  */
  2075. iagp->nfreeinos = cpu_to_le32(le32_to_cpu(iagp->nfreeinos) +
  2076.       (INOSPEREXT - 1));
  2077. iagp->nfreeexts = cpu_to_le32(le32_to_cpu(iagp->nfreeexts) - 1);
  2078. /* update the free and backed inode counts for the ag.
  2079.  */
  2080. imap->im_agctl[agno].numfree += (INOSPEREXT - 1);
  2081. imap->im_agctl[agno].numinos += INOSPEREXT;
  2082. /* update the free and backed inode counts for the inode map.
  2083.  */
  2084. atomic_add(INOSPEREXT - 1, &imap->im_numfree);
  2085. atomic_add(INOSPEREXT, &imap->im_numinos);
  2086. /* write the iags.
  2087.  */
  2088. if (amp)
  2089. write_metapage(amp);
  2090. if (bmp)
  2091. write_metapage(bmp);
  2092. if (cmp)
  2093. write_metapage(cmp);
  2094. return (0);
  2095.       error_out:
  2096. /* release the iags.
  2097.  */
  2098. if (amp)
  2099. release_metapage(amp);
  2100. if (bmp)
  2101. release_metapage(bmp);
  2102. if (cmp)
  2103. release_metapage(cmp);
  2104. return (rc);
  2105. }
  2106. /*
  2107.  * NAME:        diNewIAG(imap,iagnop,agno)
  2108.  *
  2109.  * FUNCTION:    allocate a new iag for an allocation group.
  2110.  *
  2111.  * first tries to allocate the iag from the inode map 
  2112.  * iagfree list:  
  2113.  * if the list has free iags, the head of the list is removed 
  2114.  * and returned to satisfy the request.
  2115.  * if the inode map's iag free list is empty, the inode map
  2116.  * is extended to hold a new iag. this new iag is initialized
  2117.  * and returned to satisfy the request.
  2118.  *
  2119.  * PARAMETERS:
  2120.  *      imap   - pointer to inode map control structure.
  2121.  *      iagnop  - pointer to an iag number set with the number of the
  2122.  *   newly allocated iag upon successful return.
  2123.  *      agno   - allocation group number.
  2124.  * bpp - Buffer pointer to be filled in with new IAG's buffer
  2125.  *
  2126.  * RETURN VALUES:
  2127.  *      0       - success.
  2128.  *      ENOSPC  - insufficient disk resources.
  2129.  *      EIO   - i/o error.
  2130.  *
  2131.  * serialization: 
  2132.  * AG lock held on entry/exit;
  2133.  * write lock on the map is held inside;
  2134.  * read lock on the map is held on successful completion;
  2135.  *
  2136.  * note: new iag transaction: 
  2137.  * . synchronously write iag;
  2138.  * . write log of xtree and inode  of imap;
  2139.  * . commit;
  2140.  * . synchronous write of xtree (right to left, bottom to top);
  2141.  * . at start of logredo(): init in-memory imap with one additional iag page;
  2142.  * . at end of logredo(): re-read imap inode to determine
  2143.  *   new imap size;
  2144.  */
  2145. static int
  2146. diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)
  2147. {
  2148. int rc;
  2149. int iagno, i, xlen;
  2150. struct inode *ipimap;
  2151. struct super_block *sb;
  2152. struct jfs_sb_info *sbi;
  2153. struct metapage *mp;
  2154. struct iag *iagp;
  2155. s64 xaddr = 0;
  2156. s64 blkno;
  2157. tid_t tid;
  2158. #ifdef _STILL_TO_PORT
  2159. xad_t xad;
  2160. #endif /*  _STILL_TO_PORT */
  2161. struct inode *iplist[1];
  2162. /* pick up pointers to the inode map and mount inodes */
  2163. ipimap = imap->im_ipimap;
  2164. sb = ipimap->i_sb;
  2165. sbi = JFS_SBI(sb);
  2166. /* acquire the free iag lock */
  2167. IAGFREE_LOCK(imap);
  2168. /* if there are any iags on the inode map free iag list, 
  2169.  * allocate the iag from the head of the list.
  2170.  */
  2171. if (imap->im_freeiag >= 0) {
  2172. /* pick up the iag number at the head of the list */
  2173. iagno = imap->im_freeiag;
  2174. /* determine the logical block number of the iag */
  2175. blkno = IAGTOLBLK(iagno, sbi->l2nbperpage);
  2176. } else {
  2177. /* no free iags. the inode map will have to be extented
  2178.  * to include a new iag.
  2179.  */
  2180. /* acquire inode map lock */
  2181. IWRITE_LOCK(ipimap);
  2182. assert(ipimap->i_size >> L2PSIZE == imap->im_nextiag + 1);
  2183. /* get the next avaliable iag number */
  2184. iagno = imap->im_nextiag;
  2185. /* make sure that we have not exceeded the maximum inode
  2186.  * number limit.
  2187.  */
  2188. if (iagno > (MAXIAGS - 1)) {
  2189. /* release the inode map lock */
  2190. IWRITE_UNLOCK(ipimap);
  2191. rc = ENOSPC;
  2192. goto out;
  2193. }
  2194. /*
  2195.  * synchronously append new iag page.
  2196.  */
  2197. /* determine the logical address of iag page to append */
  2198. blkno = IAGTOLBLK(iagno, sbi->l2nbperpage);
  2199. /* Allocate extent for new iag page */
  2200. xlen = sbi->nbperpage;
  2201. if ((rc = dbAlloc(ipimap, 0, (s64) xlen, &xaddr))) {
  2202. /* release the inode map lock */
  2203. IWRITE_UNLOCK(ipimap);
  2204. goto out;
  2205. }
  2206. /* assign a buffer for the page */
  2207. mp = get_metapage(ipimap, xaddr, PSIZE, 1);
  2208. //bp = bmAssign(ipimap, blkno, xaddr, PSIZE, bmREAD_PAGE);
  2209. if (!mp) {
  2210. /* Free the blocks allocated for the iag since it was
  2211.  * not successfully added to the inode map
  2212.  */
  2213. dbFree(ipimap, xaddr, (s64) xlen);
  2214. /* release the inode map lock */
  2215. IWRITE_UNLOCK(ipimap);
  2216. rc = EIO;
  2217. goto out;
  2218. }
  2219. iagp = (struct iag *) mp->data;
  2220. /* init the iag */
  2221. memset(iagp, 0, sizeof(struct iag));
  2222. iagp->iagnum = cpu_to_le32(iagno);
  2223. iagp->inofreefwd = iagp->inofreeback = -1;
  2224. iagp->extfreefwd = iagp->extfreeback = -1;
  2225. iagp->iagfree = -1;
  2226. iagp->nfreeinos = 0;
  2227. iagp->nfreeexts = cpu_to_le32(EXTSPERIAG);
  2228. /* initialize the free inode summary map (free extent
  2229.  * summary map initialization handled by bzero).
  2230.  */
  2231. for (i = 0; i < SMAPSZ; i++)
  2232. iagp->inosmap[i] = ONES;
  2233. flush_metapage(mp);
  2234. #ifdef _STILL_TO_PORT
  2235. /* synchronously write the iag page */
  2236. if (bmWrite(bp)) {
  2237. /* Free the blocks allocated for the iag since it was
  2238.  * not successfully added to the inode map
  2239.  */
  2240. dbFree(ipimap, xaddr, (s64) xlen);
  2241. /* release the inode map lock */
  2242. IWRITE_UNLOCK(ipimap);
  2243. rc = EIO;
  2244. goto out;
  2245. }
  2246. /* Now the iag is on disk */
  2247. /*
  2248.  * start tyransaction of update of the inode map
  2249.  * addressing structure pointing to the new iag page;
  2250.  */
  2251. #endif /*  _STILL_TO_PORT */
  2252. tid = txBegin(sb, COMMIT_FORCE);
  2253. /* update the inode map addressing structure to point to it */
  2254. if ((rc =
  2255.      xtInsert(tid, ipimap, 0, blkno, xlen, &xaddr, 0))) {
  2256. /* Free the blocks allocated for the iag since it was
  2257.  * not successfully added to the inode map
  2258.  */
  2259. dbFree(ipimap, xaddr, (s64) xlen);
  2260. /* release the inode map lock */
  2261. IWRITE_UNLOCK(ipimap);
  2262. goto out;
  2263. }
  2264. /* update the inode map's inode to reflect the extension */
  2265. ipimap->i_size += PSIZE;
  2266. ipimap->i_blocks += LBLK2PBLK(sb, xlen);
  2267. /*
  2268.  * txCommit(COMMIT_FORCE) will synchronously write address 
  2269.  * index pages and inode after commit in careful update order 
  2270.  * of address index pages (right to left, bottom up);
  2271.  */
  2272. iplist[0] = ipimap;
  2273. rc = txCommit(tid, 1, &iplist[0], COMMIT_FORCE);
  2274. txEnd(tid);
  2275. duplicateIXtree(sb, blkno, xlen, &xaddr);
  2276. /* update the next avaliable iag number */
  2277. imap->im_nextiag += 1;
  2278. /* Add the iag to the iag free list so we don't lose the iag
  2279.  * if a failure happens now.
  2280.  */
  2281. imap->im_freeiag = iagno;
  2282. /* Until we have logredo working, we want the imap inode &
  2283.  * control page to be up to date.
  2284.  */
  2285. diSync(ipimap);
  2286. /* release the inode map lock */
  2287. IWRITE_UNLOCK(ipimap);
  2288. }
  2289. /* obtain read lock on map */
  2290. IREAD_LOCK(ipimap);
  2291. /* read the iag */
  2292. if ((rc = diIAGRead(imap, iagno, &mp))) {
  2293. IREAD_UNLOCK(ipimap);
  2294. rc = EIO;
  2295. goto out;
  2296. }
  2297. iagp = (struct iag *) mp->data;
  2298. /* remove the iag from the iag free list */
  2299. imap->im_freeiag = le32_to_cpu(iagp->iagfree);
  2300. iagp->iagfree = -1;
  2301. /* set the return iag number and buffer pointer */
  2302. *iagnop = iagno;
  2303. *mpp = mp;
  2304.       out:
  2305. /* release the iag free lock */
  2306. IAGFREE_UNLOCK(imap);
  2307. return (rc);
  2308. }
  2309. /*
  2310.  * NAME:        diIAGRead()
  2311.  *
  2312.  * FUNCTION:    get the buffer for the specified iag within a fileset
  2313.  * or aggregate inode map.
  2314.  *
  2315.  * PARAMETERS:
  2316.  *      imap   - pointer to inode map control structure.
  2317.  *      iagno   - iag number.
  2318.  *      bpp   - point to buffer pointer to be filled in on successful
  2319.  *   exit.
  2320.  *
  2321.  * SERIALIZATION:
  2322.  * must have read lock on imap inode
  2323.  * (When called by diExtendFS, the filesystem is quiesced, therefore
  2324.  *  the read lock is unnecessary.)
  2325.  *
  2326.  * RETURN VALUES:
  2327.  *      0       - success.
  2328.  *      EIO   - i/o error.
  2329.  */
  2330. static int diIAGRead(struct inomap * imap, int iagno, struct metapage ** mpp)
  2331. {
  2332. struct inode *ipimap = imap->im_ipimap;
  2333. s64 blkno;
  2334. /* compute the logical block number of the iag. */
  2335. blkno = IAGTOLBLK(iagno, JFS_SBI(ipimap->i_sb)->l2nbperpage);
  2336. /* read the iag. */
  2337. *mpp = read_metapage(ipimap, blkno, PSIZE, 0);
  2338. if (*mpp == NULL) {
  2339. return (EIO);
  2340. }
  2341. return (0);
  2342. }
  2343. /*
  2344.  * NAME:        diFindFree()
  2345.  *
  2346.  * FUNCTION:    find the first free bit in a word starting at
  2347.  * the specified bit position.
  2348.  *
  2349.  * PARAMETERS:
  2350.  *      word   - word to be examined.
  2351.  *      start   - starting bit position.
  2352.  *
  2353.  * RETURN VALUES:
  2354.  *      bit position of first free bit in the word or 32 if
  2355.  * no free bits were found.
  2356.  */
  2357. static int diFindFree(u32 word, int start)
  2358. {
  2359. int bitno;
  2360. assert(start < 32);
  2361. /* scan the word for the first free bit. */
  2362. for (word <<= start, bitno = start; bitno < 32;
  2363.      bitno++, word <<= 1) {
  2364. if ((word & HIGHORDER) == 0)
  2365. break;
  2366. }
  2367. return (bitno);
  2368. }
  2369. /*
  2370.  * NAME: diUpdatePMap()
  2371.  *                                                                    
  2372.  * FUNCTION: Update the persistent map in an IAG for the allocation or 
  2373.  * freeing of the specified inode.
  2374.  *                                                                    
  2375.  * PRE CONDITIONS: Working map has already been updated for allocate.
  2376.  *
  2377.  * PARAMETERS:
  2378.  * ipimap - Incore inode map inode
  2379.  * inum - Number of inode to mark in permanent map
  2380.  * is_free - If TRUE indicates inode should be marked freed, otherwise
  2381.  *   indicates inode should be marked allocated.
  2382.  *
  2383.  * RETURNS: 0 for success
  2384.  */
  2385. int
  2386. diUpdatePMap(struct inode *ipimap,
  2387.      unsigned long inum, boolean_t is_free, struct tblock * tblk)
  2388. {
  2389. int rc;
  2390. struct iag *iagp;
  2391. struct metapage *mp;
  2392. int iagno, ino, extno, bitno;
  2393. struct inomap *imap;
  2394. u32 mask;
  2395. struct jfs_log *log;
  2396. int lsn, difft, diffp;
  2397. imap = JFS_IP(ipimap)->i_imap;
  2398. /* get the iag number containing the inode */
  2399. iagno = INOTOIAG(inum);
  2400. /* make sure that the iag is contained within the map */
  2401. assert(iagno < imap->im_nextiag);
  2402. /* read the iag */
  2403. IREAD_LOCK(ipimap);
  2404. rc = diIAGRead(imap, iagno, &mp);
  2405. IREAD_UNLOCK(ipimap);
  2406. if (rc)
  2407. return (rc);
  2408. iagp = (struct iag *) mp->data;
  2409. /* get the inode number and extent number of the inode within
  2410.  * the iag and the inode number within the extent.
  2411.  */
  2412. ino = inum & (INOSPERIAG - 1);
  2413. extno = ino >> L2INOSPEREXT;
  2414. bitno = ino & (INOSPEREXT - 1);
  2415. mask = HIGHORDER >> bitno;
  2416. /* 
  2417.  * mark the inode free in persistent map:
  2418.  */
  2419. if (is_free == TRUE) {
  2420. /* The inode should have been allocated both in working
  2421.  * map and in persistent map;
  2422.  * the inode will be freed from working map at the release
  2423.  * of last reference release;
  2424.  */
  2425. //              assert(le32_to_cpu(iagp->wmap[extno]) & mask);
  2426. if (!(le32_to_cpu(iagp->wmap[extno]) & mask)) {
  2427. jERROR(1,
  2428.        ("diUpdatePMap: inode %ld not marked as allocated in wmap!n",
  2429. inum));
  2430. updateSuper(ipimap->i_sb, FM_DIRTY);
  2431. }
  2432. //              assert(le32_to_cpu(iagp->pmap[extno]) & mask);
  2433. if (!(le32_to_cpu(iagp->pmap[extno]) & mask)) {
  2434. jERROR(1,
  2435.        ("diUpdatePMap: inode %ld not marked as allocated in pmap!n",
  2436. inum));
  2437. updateSuper(ipimap->i_sb, FM_DIRTY);
  2438. }
  2439. /* update the bitmap for the extent of the freed inode */
  2440. iagp->pmap[extno] &= cpu_to_le32(~mask);
  2441. }
  2442. /*
  2443.  * mark the inode allocated in persistent map:
  2444.  */
  2445. else {
  2446. /* The inode should be already allocated in the working map
  2447.  * and should be free in persistent map;
  2448.  */
  2449. assert(le32_to_cpu(iagp->wmap[extno]) & mask);
  2450. assert((le32_to_cpu(iagp->pmap[extno]) & mask) == 0);
  2451. /* update the bitmap for the extent of the allocated inode */
  2452. iagp->pmap[extno] |= cpu_to_le32(mask);
  2453. }
  2454. /*
  2455.  * update iag lsn
  2456.  */
  2457. lsn = tblk->lsn;
  2458. log = JFS_SBI(tblk->sb)->log;
  2459. if (mp->lsn != 0) {
  2460. /* inherit older/smaller lsn */
  2461. logdiff(difft, lsn, log);
  2462. logdiff(diffp, mp->lsn, log);
  2463. if (difft < diffp) {
  2464. mp->lsn = lsn;
  2465. /* move mp after tblock in logsync list */
  2466. LOGSYNC_LOCK(log);
  2467. list_del(&mp->synclist);
  2468. list_add(&mp->synclist, &tblk->synclist);
  2469. LOGSYNC_UNLOCK(log);
  2470. }
  2471. /* inherit younger/larger clsn */
  2472. LOGSYNC_LOCK(log);
  2473. assert(mp->clsn);
  2474. logdiff(difft, tblk->clsn, log);
  2475. logdiff(diffp, mp->clsn, log);
  2476. if (difft > diffp)
  2477. mp->clsn = tblk->clsn;
  2478. LOGSYNC_UNLOCK(log);
  2479. } else {
  2480. mp->log = log;
  2481. mp->lsn = lsn;
  2482. /* insert mp after tblock in logsync list */
  2483. LOGSYNC_LOCK(log);
  2484. log->count++;
  2485. list_add(&mp->synclist, &tblk->synclist);
  2486. mp->clsn = tblk->clsn;
  2487. LOGSYNC_UNLOCK(log);
  2488. }
  2489. //      bmLazyWrite(mp, log->flag & JFS_COMMIT);
  2490. write_metapage(mp);
  2491. return (0);
  2492. }
  2493. /*
  2494.  * diExtendFS()
  2495.  *
  2496.  * function: update imap for extendfs();
  2497.  * 
  2498.  * note: AG size has been increased s.t. each k old contiguous AGs are 
  2499.  * coalesced into a new AG;
  2500.  */
  2501. int diExtendFS(struct inode *ipimap, struct inode *ipbmap)
  2502. {
  2503. int rc, rcx = 0;
  2504. struct inomap *imap = JFS_IP(ipimap)->i_imap;
  2505. struct iag *iagp = 0, *hiagp = 0;
  2506. struct bmap *mp = JFS_SBI(ipbmap->i_sb)->bmap;
  2507. struct metapage *bp, *hbp;
  2508. int i, n, head;
  2509. int numinos, xnuminos = 0, xnumfree = 0;
  2510. s64 agstart;
  2511. jEVENT(0, ("diExtendFS: nextiag:%d numinos:%d numfree:%dn",
  2512.    imap->im_nextiag, atomic_read(&imap->im_numinos),
  2513.    atomic_read(&imap->im_numfree)));
  2514. /*
  2515.  *      reconstruct imap 
  2516.  *
  2517.  * coalesce contiguous k (newAGSize/oldAGSize) AGs;
  2518.  * i.e., (AGi, ..., AGj) where i = k*n and j = k*(n+1) - 1 to AGn;
  2519.  * note: new AG size = old AG size * (2**x).
  2520.  */
  2521. /* init per AG control information im_agctl[] */
  2522. for (i = 0; i < MAXAG; i++) {
  2523. imap->im_agctl[i].inofree = -1; /* free inode list */
  2524. imap->im_agctl[i].extfree = -1; /* free extent list */
  2525. imap->im_agctl[i].numinos = 0; /* number of backed inodes */
  2526. imap->im_agctl[i].numfree = 0; /* number of free backed inodes */
  2527. }
  2528. /*
  2529.  *      process each iag page of the map.
  2530.  *
  2531.  * rebuild AG Free Inode List, AG Free Inode Extent List;
  2532.  */
  2533. for (i = 0; i < imap->im_nextiag; i++) {
  2534. if ((rc = diIAGRead(imap, i, &bp))) {
  2535. rcx = rc;
  2536. continue;
  2537. }
  2538. iagp = (struct iag *) bp->data;
  2539. assert(le32_to_cpu(iagp->iagnum) == i);
  2540. /* leave free iag in the free iag list */
  2541. if (iagp->nfreeexts == cpu_to_le32(EXTSPERIAG)) {  
  2542.         release_metapage(bp);
  2543. continue;
  2544. }
  2545. /* agstart that computes to the same ag is treated as same; */
  2546. agstart = le64_to_cpu(iagp->agstart);
  2547. /* iagp->agstart = agstart & ~(mp->db_agsize - 1); */
  2548. n = agstart >> mp->db_agl2size;
  2549. /*
  2550. printf("diExtendFS: iag:%d agstart:%Ld agno:%dn", i, agstart, n);
  2551. */
  2552. /* compute backed inodes */
  2553. numinos = (EXTSPERIAG - le32_to_cpu(iagp->nfreeexts))
  2554.     << L2INOSPEREXT;
  2555. if (numinos > 0) {
  2556. /* merge AG backed inodes */
  2557. imap->im_agctl[n].numinos += numinos;
  2558. xnuminos += numinos;
  2559. }
  2560. /* if any backed free inodes, insert at AG free inode list */
  2561. if ((int) le32_to_cpu(iagp->nfreeinos) > 0) {
  2562. if ((head = imap->im_agctl[n].inofree) == -1)
  2563. iagp->inofreefwd = iagp->inofreeback = -1;
  2564. else {
  2565. if ((rc = diIAGRead(imap, head, &hbp))) {
  2566. rcx = rc;
  2567. goto nextiag;
  2568. }
  2569. hiagp = (struct iag *) hbp->data;
  2570. hiagp->inofreeback =
  2571.     le32_to_cpu(iagp->iagnum);
  2572. iagp->inofreefwd = cpu_to_le32(head);
  2573. iagp->inofreeback = -1;
  2574. write_metapage(hbp);
  2575. }
  2576. imap->im_agctl[n].inofree =
  2577.     le32_to_cpu(iagp->iagnum);
  2578. /* merge AG backed free inodes */
  2579. imap->im_agctl[n].numfree +=
  2580.     le32_to_cpu(iagp->nfreeinos);
  2581. xnumfree += le32_to_cpu(iagp->nfreeinos);
  2582. }
  2583. /* if any free extents, insert at AG free extent list */
  2584. if (le32_to_cpu(iagp->nfreeexts) > 0) {
  2585. if ((head = imap->im_agctl[n].extfree) == -1)
  2586. iagp->extfreefwd = iagp->extfreeback = -1;
  2587. else {
  2588. if ((rc = diIAGRead(imap, head, &hbp))) {
  2589. rcx = rc;
  2590. goto nextiag;
  2591. }
  2592. hiagp = (struct iag *) hbp->data;
  2593. hiagp->extfreeback = iagp->iagnum;
  2594. iagp->extfreefwd = cpu_to_le32(head);
  2595. iagp->extfreeback = -1;
  2596. write_metapage(hbp);
  2597. }
  2598. imap->im_agctl[n].extfree =
  2599.     le32_to_cpu(iagp->iagnum);
  2600. }
  2601.       nextiag:
  2602. write_metapage(bp);
  2603. }
  2604. ASSERT(xnuminos == atomic_read(&imap->im_numinos) &&
  2605.        xnumfree == atomic_read(&imap->im_numfree));
  2606. return rcx;
  2607. }
  2608. /*
  2609.  * duplicateIXtree()
  2610.  *
  2611.  * serialization: IWRITE_LOCK held on entry/exit
  2612.  *
  2613.  * note: shadow page with regular inode (rel.2);
  2614.  */
  2615. static void duplicateIXtree(struct super_block *sb, s64 blkno,
  2616.     int xlen, s64 *xaddr)
  2617. {
  2618. struct jfs_superblock *j_sb;
  2619. struct buffer_head *bh;
  2620. struct inode *ip;
  2621. tid_t tid;
  2622. int rc;
  2623. /* if AIT2 ipmap2 is bad, do not try to update it */
  2624. if (JFS_SBI(sb)->mntflag & JFS_BAD_SAIT) /* s_flag */
  2625. return;
  2626. ip = diReadSpecial(sb, FILESYSTEM_I, 1);
  2627. if (ip == NULL) {
  2628. JFS_SBI(sb)->mntflag |= JFS_BAD_SAIT;
  2629. if ((rc = readSuper(sb, &bh)))
  2630. return;
  2631. j_sb = (struct jfs_superblock *)bh->b_data;
  2632. j_sb->s_flag |= JFS_BAD_SAIT;
  2633. mark_buffer_dirty(bh);
  2634. ll_rw_block(WRITE, 1, &bh);
  2635. wait_on_buffer(bh);
  2636. brelse(bh);
  2637. return;
  2638. }
  2639. /* start transaction */
  2640. tid = txBegin(sb, COMMIT_FORCE);
  2641. /* update the inode map addressing structure to point to it */
  2642. if ((rc = xtInsert(tid, ip, 0, blkno, xlen, xaddr, 0))) {
  2643. JFS_SBI(sb)->mntflag |= JFS_BAD_SAIT;
  2644. txAbort(tid, 1);
  2645. goto cleanup;
  2646. }
  2647. /* update the inode map's inode to reflect the extension */
  2648. ip->i_size += PSIZE;
  2649. ip->i_blocks += LBLK2PBLK(sb, xlen);
  2650. rc = txCommit(tid, 1, &ip, COMMIT_FORCE);
  2651.       cleanup:
  2652. txEnd(tid);
  2653. diFreeSpecial(ip);
  2654. }
  2655. /*
  2656.  * NAME:        copy_from_dinode()
  2657.  *
  2658.  * FUNCTION:    Copies inode info from disk inode to in-memory inode
  2659.  *
  2660.  * RETURN VALUES:
  2661.  *      0       - success
  2662.  *      ENOMEM - insufficient memory
  2663.  */
  2664. static int copy_from_dinode(struct dinode * dip, struct inode *ip)
  2665. {
  2666. struct jfs_inode_info *jfs_ip = JFS_IP(ip);
  2667. jfs_ip->fileset = le32_to_cpu(dip->di_fileset);
  2668. jfs_ip->mode2 = le32_to_cpu(dip->di_mode);
  2669. ip->i_mode = le32_to_cpu(dip->di_mode) & 0xffff;
  2670. ip->i_nlink = le32_to_cpu(dip->di_nlink);
  2671. ip->i_uid = le32_to_cpu(dip->di_uid);
  2672. ip->i_gid = le32_to_cpu(dip->di_gid);
  2673. ip->i_size = le64_to_cpu(dip->di_size);
  2674. ip->i_atime = le32_to_cpu(dip->di_atime.tv_sec);
  2675. ip->i_mtime = le32_to_cpu(dip->di_mtime.tv_sec);
  2676. ip->i_ctime = le32_to_cpu(dip->di_ctime.tv_sec);
  2677. ip->i_blksize = ip->i_sb->s_blocksize;
  2678. ip->i_blocks = LBLK2PBLK(ip->i_sb, le64_to_cpu(dip->di_nblocks));
  2679. ip->i_generation = le32_to_cpu(dip->di_gen);
  2680. jfs_ip->ixpxd = dip->di_ixpxd; /* in-memory pxd's are little-endian */
  2681. jfs_ip->acl = dip->di_acl; /* as are dxd's */
  2682. jfs_ip->ea = dip->di_ea;
  2683. jfs_ip->next_index = le32_to_cpu(dip->di_next_index);
  2684. jfs_ip->otime = le32_to_cpu(dip->di_otime.tv_sec);
  2685. jfs_ip->acltype = le32_to_cpu(dip->di_acltype);
  2686. if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode))
  2687. ip->i_rdev = to_kdev_t(le32_to_cpu(dip->di_rdev));
  2688. if (S_ISDIR(ip->i_mode)) {
  2689. memcpy(&jfs_ip->i_dirtable, &dip->di_dirtable, 384);
  2690. } else if (S_ISREG(ip->i_mode) || S_ISLNK(ip->i_mode)) {
  2691. memcpy(&jfs_ip->i_xtroot, &dip->di_xtroot, 288);
  2692. } else
  2693. memcpy(&jfs_ip->i_inline_ea, &dip->di_inlineea, 128);
  2694. /* Zero the in-memory-only stuff */
  2695. jfs_ip->cflag = 0;
  2696. jfs_ip->btindex = 0;
  2697. jfs_ip->btorder = 0;
  2698. jfs_ip->bxflag = 0;
  2699. jfs_ip->blid = 0;
  2700. jfs_ip->atlhead = 0;
  2701. jfs_ip->atltail = 0;
  2702. jfs_ip->xtlid = 0;
  2703. return (0);
  2704. }
  2705. /*
  2706.  * NAME:        copy_to_dinode()
  2707.  *
  2708.  * FUNCTION:    Copies inode info from in-memory inode to disk inode
  2709.  */
  2710. static void copy_to_dinode(struct dinode * dip, struct inode *ip)
  2711. {
  2712. struct jfs_inode_info *jfs_ip = JFS_IP(ip);
  2713. dip->di_fileset = cpu_to_le32(jfs_ip->fileset);
  2714. dip->di_inostamp = cpu_to_le32(JFS_SBI(ip->i_sb)->inostamp);
  2715. dip->di_number = cpu_to_le32(ip->i_ino);
  2716. dip->di_gen = cpu_to_le32(ip->i_generation);
  2717. dip->di_size = cpu_to_le64(ip->i_size);
  2718. dip->di_nblocks = cpu_to_le64(PBLK2LBLK(ip->i_sb, ip->i_blocks));
  2719. dip->di_nlink = cpu_to_le32(ip->i_nlink);
  2720. dip->di_uid = cpu_to_le32(ip->i_uid);
  2721. dip->di_gid = cpu_to_le32(ip->i_gid);
  2722. /*
  2723.  * mode2 is only needed for storing the higher order bits.
  2724.  * Trust i_mode for the lower order ones
  2725.  */
  2726. dip->di_mode = cpu_to_le32((jfs_ip->mode2 & 0xffff0000) | ip->i_mode);
  2727. dip->di_atime.tv_sec = cpu_to_le32(ip->i_atime);
  2728. dip->di_atime.tv_nsec = 0;
  2729. dip->di_ctime.tv_sec = cpu_to_le32(ip->i_ctime);
  2730. dip->di_ctime.tv_nsec = 0;
  2731. dip->di_mtime.tv_sec = cpu_to_le32(ip->i_mtime);
  2732. dip->di_mtime.tv_nsec = 0;
  2733. dip->di_ixpxd = jfs_ip->ixpxd; /* in-memory pxd's are little-endian */
  2734. dip->di_acl = jfs_ip->acl; /* as are dxd's */
  2735. dip->di_ea = jfs_ip->ea;
  2736. dip->di_next_index = cpu_to_le32(jfs_ip->next_index);
  2737. dip->di_otime.tv_sec = cpu_to_le32(jfs_ip->otime);
  2738. dip->di_otime.tv_nsec = 0;
  2739. dip->di_acltype = cpu_to_le32(jfs_ip->acltype);
  2740. if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode))
  2741. dip->di_rdev = cpu_to_le32(kdev_t_to_nr(ip->i_rdev));
  2742. }
  2743. #ifdef _JFS_DEBUG_IMAP
  2744. /*
  2745.  * DBGdiInit()
  2746.  */
  2747. static void *DBGdiInit(struct inomap * imap)
  2748. {
  2749. u32 *dimap;
  2750. int size;
  2751. size = 64 * 1024;
  2752. if ((dimap = (u32 *) xmalloc(size, L2PSIZE, kernel_heap)) == NULL)
  2753. assert(0);
  2754. bzero((void *) dimap, size);
  2755. imap->im_DBGdimap = dimap;
  2756. }
  2757. /*
  2758.  * DBGdiAlloc()
  2759.  */
  2760. static void DBGdiAlloc(struct inomap * imap, ino_t ino)
  2761. {
  2762. u32 *dimap = imap->im_DBGdimap;
  2763. int w, b;
  2764. u32 m;
  2765. w = ino >> 5;
  2766. b = ino & 31;
  2767. m = 0x80000000 >> b;
  2768. assert(w < 64 * 256);
  2769. if (dimap[w] & m) {
  2770. printk("DEBUG diAlloc: duplicate alloc ino:0x%xn", ino);
  2771. }
  2772. dimap[w] |= m;
  2773. }
  2774. /*
  2775.  * DBGdiFree()
  2776.  */
  2777. static void DBGdiFree(struct inomap * imap, ino_t ino)
  2778. {
  2779. u32 *dimap = imap->im_DBGdimap;
  2780. int w, b;
  2781. u32 m;
  2782. w = ino >> 5;
  2783. b = ino & 31;
  2784. m = 0x80000000 >> b;
  2785. assert(w < 64 * 256);
  2786. if ((dimap[w] & m) == 0) {
  2787. printk("DEBUG diFree: duplicate free ino:0x%xn", ino);
  2788. }
  2789. dimap[w] &= ~m;
  2790. }
  2791. static void dump_cp(struct inomap * ipimap, char *function, int line)
  2792. {
  2793. printk("n* ********* *nControl Page %s %dn", function, line);
  2794. printk("FreeIAG %dtNextIAG %dn", ipimap->im_freeiag,
  2795.        ipimap->im_nextiag);
  2796. printk("NumInos %dtNumFree %dn",
  2797.        atomic_read(&ipimap->im_numinos),
  2798.        atomic_read(&ipimap->im_numfree));
  2799. printk("AG InoFree %dtAG ExtFree %dn",
  2800.        ipimap->im_agctl[0].inofree, ipimap->im_agctl[0].extfree);
  2801. printk("AG NumInos %dtAG NumFree %dn",
  2802.        ipimap->im_agctl[0].numinos, ipimap->im_agctl[0].numfree);
  2803. }
  2804. static void dump_iag(struct iag * iag, char *function, int line)
  2805. {
  2806. printk("n* ********* *nIAG %s %dn", function, line);
  2807. printk("IagNum %dtIAG Free %dn", le32_to_cpu(iag->iagnum),
  2808.        le32_to_cpu(iag->iagfree));
  2809. printk("InoFreeFwd %dtInoFreeBack %dn",
  2810.        le32_to_cpu(iag->inofreefwd),
  2811.        le32_to_cpu(iag->inofreeback));
  2812. printk("ExtFreeFwd %dtExtFreeBack %dn",
  2813.        le32_to_cpu(iag->extfreefwd),
  2814.        le32_to_cpu(iag->extfreeback));
  2815. printk("NFreeInos %dtNFreeExts %dn", le32_to_cpu(iag->nfreeinos),
  2816.        le32_to_cpu(iag->nfreeexts));
  2817. }
  2818. #endif /* _JFS_DEBUG_IMAP */