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