Lines Matching +full:smp +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) International Business Machines Corp., 2000-2005
6 * jfs_xtree.c: extent allocation descriptor B+-tree manager
27 * xtree key/entry comparison: extent offset
30 * -1: k < start of extent
38 ((K) < OFFSET64) ? -1 : 0;\
44 (XAD)->flag = (FLAG);\
58 if ((le16_to_cpu((P)->header.nextindex) < XTENTRYSTART) || \
59 (le16_to_cpu((P)->header.nextindex) > \
60 le16_to_cpu((P)->header.maxentry)) || \
61 (le16_to_cpu((P)->header.maxentry) > \
63 jfs_error((IP)->i_sb, \
67 RC = -EIO; \
152 /* is lookup offset beyond eof ? */ in xtLookup()
153 size = ((u64) ip->i_size + (JFS_SBI(ip->i_sb)->bsize - 1)) >> in xtLookup()
154 JFS_SBI(ip->i_sb)->l2bsize; in xtLookup()
183 *plen = min(next - lstart, llen); in xtLookup()
190 xad = &p->xad[index]; in xtLookup()
197 *pflag = xad->flag; in xtLookup()
198 *paddr = xaddr + (lstart - xoff); in xtLookup()
200 *plen = min(xend - lstart, llen); in xtLookup()
211 * function: search for the xad entry covering specified offset.
214 * ip - file object;
215 * xoff - extent offset;
216 * nextp - address of next extent (if any) for search miss
217 * cmpp - comparison result:
218 * btstack - traverse stack;
219 * flag - search process flag (XT_INSERT);
246 btstack->nsplit = 0; in xtSearch()
277 if ((jfs_ip->btorder & BT_SEQUENTIAL) && in xtSearch()
278 (p->header.flag & BT_LEAF) && in xtSearch()
279 (index = jfs_ip->btindex) < in xtSearch()
280 le16_to_cpu(p->header.nextindex)) { in xtSearch()
281 xad = &p->xad[index]; in xtSearch()
296 le16_to_cpu(p->header.nextindex)) { in xtSearch()
321 /* (index == p->header.nextindex); in xtSearch()
337 if (p->header.nextindex == /* little-endian */ in xtSearch()
338 p->header.maxentry) in xtSearch()
342 btstack->nsplit = nsplit; in xtSearch()
346 btsp = btstack->top; in xtSearch()
347 btsp->bn = bn; in xtSearch()
348 btsp->index = index; in xtSearch()
349 btsp->mp = mp; in xtSearch()
352 jfs_ip->btindex = index; in xtSearch()
363 lim = le16_to_cpu(p->header.nextindex) - XTENTRYSTART; in xtSearch()
371 XT_CMP(cmp, xoff, &p->xad[index], t64); in xtSearch()
376 /* search hit - leaf page: in xtSearch()
379 if (p->header.flag & BT_LEAF) { in xtSearch()
384 if (p->header.nextindex == in xtSearch()
385 p->header.maxentry) in xtSearch()
389 btstack->nsplit = nsplit; in xtSearch()
393 btsp = btstack->top; in xtSearch()
394 btsp->bn = bn; in xtSearch()
395 btsp->index = index; in xtSearch()
396 btsp->mp = mp; in xtSearch()
399 btindex = jfs_ip->btindex; in xtSearch()
402 jfs_ip->btorder = BT_SEQUENTIAL; in xtSearch()
404 jfs_ip->btorder = BT_RANDOM; in xtSearch()
405 jfs_ip->btindex = index; in xtSearch()
409 /* search hit - internal page: in xtSearch()
412 if (index < le16_to_cpu(p->header.nextindex)-1) in xtSearch()
413 next = offsetXAD(&p->xad[index + 1]); in xtSearch()
419 --lim; in xtSearch()
429 if (base < le16_to_cpu(p->header.nextindex)) in xtSearch()
430 next = offsetXAD(&p->xad[base]); in xtSearch()
432 * search miss - leaf page: in xtSearch()
437 if (p->header.flag & BT_LEAF) { in xtSearch()
442 if (p->header.nextindex == in xtSearch()
443 p->header.maxentry) in xtSearch()
447 btstack->nsplit = nsplit; in xtSearch()
451 btsp = btstack->top; in xtSearch()
452 btsp->bn = bn; in xtSearch()
453 btsp->index = base; in xtSearch()
454 btsp->mp = mp; in xtSearch()
457 btindex = jfs_ip->btindex; in xtSearch()
459 jfs_ip->btorder = BT_SEQUENTIAL; in xtSearch()
461 jfs_ip->btorder = BT_RANDOM; in xtSearch()
462 jfs_ip->btindex = base; in xtSearch()
471 * search miss - non-leaf page: in xtSearch()
473 * if base is non-zero, decrement base by one to get the parent in xtSearch()
476 index = base ? base - 1 : base; in xtSearch()
483 if (p->header.nextindex == p->header.maxentry) in xtSearch()
490 jfs_error(ip->i_sb, "stack overrun!\n"); in xtSearch()
492 return -EIO; in xtSearch()
497 bn = addressXAD(&p->xad[index]); in xtSearch()
510 * tid - transaction id;
511 * ip - file object;
512 * xflag - extent flag (XAD_NOTRECORDED):
513 * xoff - extent offset;
514 * xlen - extent length;
515 * xaddrp - extent address pointer (in/out):
520 * flag -
530 struct metapage *mp; /* meta-page buffer */ in xtInsert()
531 xtpage_t *p; /* base B+-tree index page */ in xtInsert()
560 if ((cmp == 0) || (next && (xlen > next - xoff))) { in xtInsert()
561 rc = -EEXIST; in xtInsert()
572 xad = &p->xad[index - 1]; in xtInsert()
573 hint = addressXAD(xad) + lengthXAD(xad) - 1; in xtInsert()
595 nextindex = le16_to_cpu(p->header.nextindex); in xtInsert()
596 if (nextindex == le16_to_cpu(p->header.maxentry)) { in xtInsert()
629 memmove(&p->xad[index + 1], &p->xad[index], in xtInsert()
630 (nextindex - index) * sizeof(xad_t)); in xtInsert()
633 xad = &p->xad[index]; in xtInsert()
637 le16_add_cpu(&p->header.nextindex, 1); in xtInsert()
642 xtlck = (struct xtlock *) & tlck->lock; in xtInsert()
643 xtlck->lwm.offset = in xtInsert()
644 (xtlck->lwm.offset) ? min(index, in xtInsert()
645 (int)xtlck->lwm.offset) : index; in xtInsert()
646 xtlck->lwm.length = in xtInsert()
647 le16_to_cpu(p->header.nextindex) - xtlck->lwm.offset; in xtInsert()
667 * tid - transaction id;
668 * ip - file object;
669 * split - entry parameter descriptor;
670 * btstack - traverse stack from xtSearch()
679 struct metapage *smp; in xtSplitUp() local
698 smp = split->mp; in xtSplitUp()
699 sp = XT_PAGE(ip, smp); in xtSplitUp()
702 if ((sp->header.flag & BT_ROOT) && (!S_ISDIR(ip->i_mode)) && in xtSplitUp()
703 (le16_to_cpu(sp->header.maxentry) < XTROOTMAXSLOT) && in xtSplitUp()
704 (JFS_IP(ip)->mode2 & INLINEEA)) { in xtSplitUp()
705 sp->header.maxentry = cpu_to_le16(XTROOTMAXSLOT); in xtSplitUp()
706 JFS_IP(ip)->mode2 &= ~INLINEEA; in xtSplitUp()
708 BT_MARK_DIRTY(smp, ip); in xtSplitUp()
716 skip = split->index; in xtSplitUp()
717 nextindex = le16_to_cpu(sp->header.nextindex); in xtSplitUp()
719 memmove(&sp->xad[skip + 1], &sp->xad[skip], in xtSplitUp()
720 (nextindex - skip) * sizeof(xad_t)); in xtSplitUp()
723 xad = &sp->xad[skip]; in xtSplitUp()
724 XT_PUTENTRY(xad, split->flag, split->off, split->len, in xtSplitUp()
725 split->addr); in xtSplitUp()
728 le16_add_cpu(&sp->header.nextindex, 1); in xtSplitUp()
732 tlck = txLock(tid, ip, smp, tlckXTREE | tlckGROW); in xtSplitUp()
733 xtlck = (struct xtlock *) & tlck->lock; in xtSplitUp()
734 xtlck->lwm.offset = (xtlck->lwm.offset) ? in xtSplitUp()
735 min(skip, (int)xtlck->lwm.offset) : skip; in xtSplitUp()
736 xtlck->lwm.length = in xtSplitUp()
737 le16_to_cpu(sp->header.nextindex) - in xtSplitUp()
738 xtlck->lwm.offset; in xtSplitUp()
749 if (split->pxdlist == NULL) { in xtSplitUp()
750 nsplit = btstack->nsplit; in xtSplitUp()
751 split->pxdlist = &pxdlist; in xtSplitUp()
754 xlen = JFS_SBI(ip->i_sb)->nbperpage; in xtSplitUp()
755 for (; nsplit > 0; nsplit--, pxd++) { in xtSplitUp()
768 XT_PUTPAGE(smp); in xtSplitUp()
780 rc = (sp->header.flag & BT_ROOT) ? in xtSplitUp()
784 XT_PUTPAGE(smp); in xtSplitUp()
787 return -EIO; in xtSplitUp()
821 XT_GETPAGE(ip, parent->bn, smp, PSIZE, sp, rc); in xtSplitUp()
831 skip = parent->index + 1; in xtSplitUp()
836 nextindex = le16_to_cpu(sp->header.nextindex); in xtSplitUp()
838 * parent page is full - split the parent page in xtSplitUp()
840 if (nextindex == le16_to_cpu(sp->header.maxentry)) { in xtSplitUp()
842 split->mp = smp; in xtSplitUp()
843 split->index = skip; /* index at insert */ in xtSplitUp()
844 split->flag = XAD_NEW; in xtSplitUp()
845 split->off = offsetXAD(&rcp->xad[XTENTRYSTART]); in xtSplitUp()
846 split->len = JFS_SBI(ip->i_sb)->nbperpage; in xtSplitUp()
847 split->addr = rcbn; in xtSplitUp()
856 rc = (sp->header.flag & BT_ROOT) ? in xtSplitUp()
860 XT_PUTPAGE(smp); in xtSplitUp()
864 XT_PUTPAGE(smp); in xtSplitUp()
868 * parent page is not full - insert in parent page in xtSplitUp()
880 BT_MARK_DIRTY(smp, ip); in xtSplitUp()
886 memmove(&sp->xad[skip + 1], &sp->xad[skip], in xtSplitUp()
887 (nextindex - in xtSplitUp()
891 xad = &sp->xad[skip]; in xtSplitUp()
893 offsetXAD(&rcp->xad[XTENTRYSTART]), in xtSplitUp()
894 JFS_SBI(ip->i_sb)->nbperpage, rcbn); in xtSplitUp()
897 le16_add_cpu(&sp->header.nextindex, 1); in xtSplitUp()
901 tlck = txLock(tid, ip, smp, in xtSplitUp()
903 xtlck = (struct xtlock *) & tlck->lock; in xtSplitUp()
904 xtlck->lwm.offset = (xtlck->lwm.offset) ? in xtSplitUp()
905 min(skip, (int)xtlck->lwm.offset) : skip; in xtSplitUp()
906 xtlck->lwm.length = in xtSplitUp()
907 le16_to_cpu(sp->header.nextindex) - in xtSplitUp()
908 xtlck->lwm.offset; in xtSplitUp()
912 XT_PUTPAGE(smp); in xtSplitUp()
930 * split a full non-root page into
949 struct metapage *smp; in xtSplitPage() local
965 smp = split->mp; in xtSplitPage()
966 sp = XT_PAGE(ip, smp); in xtSplitPage()
970 pxdlist = split->pxdlist; in xtSplitPage()
971 pxd = &pxdlist->pxd[pxdlist->npxd]; in xtSplitPage()
972 pxdlist->npxd++; in xtSplitPage()
987 rc = -EIO; in xtSplitPage()
991 jfs_info("xtSplitPage: ip:0x%p smp:0x%p rmp:0x%p", ip, smp, rmp); in xtSplitPage()
998 rp = (xtpage_t *) rmp->data; in xtSplitPage()
999 rp->header.self = *pxd; in xtSplitPage()
1000 rp->header.flag = sp->header.flag & BT_TYPE; in xtSplitPage()
1001 rp->header.maxentry = sp->header.maxentry; /* little-endian */ in xtSplitPage()
1002 rp->header.nextindex = cpu_to_le16(XTENTRYSTART); in xtSplitPage()
1004 BT_MARK_DIRTY(smp, ip); in xtSplitPage()
1011 rxtlck = (struct xtlock *) & tlck->lock; in xtSplitPage()
1012 rxtlck->lwm.offset = XTENTRYSTART; in xtSplitPage()
1016 tlck = txLock(tid, ip, smp, tlckXTREE | tlckGROW); in xtSplitPage()
1017 sxtlck = (struct xtlock *) & tlck->lock; in xtSplitPage()
1023 nextbn = le64_to_cpu(sp->header.next); in xtSplitPage()
1024 rp->header.next = cpu_to_le64(nextbn); in xtSplitPage()
1025 rp->header.prev = cpu_to_le64(addressPXD(&sp->header.self)); in xtSplitPage()
1026 sp->header.next = cpu_to_le64(rbn); in xtSplitPage()
1028 skip = split->index; in xtSplitPage()
1037 * if we're wrong it's no big deal - we will do the split the right in xtSplitPage()
1043 if (nextbn == 0 && skip == le16_to_cpu(sp->header.maxentry)) { in xtSplitPage()
1050 xad = &rp->xad[XTENTRYSTART]; in xtSplitPage()
1051 XT_PUTENTRY(xad, split->flag, split->off, split->len, in xtSplitPage()
1052 split->addr); in xtSplitPage()
1054 rp->header.nextindex = cpu_to_le16(XTENTRYSTART + 1); in xtSplitPage()
1057 /* rxtlck->lwm.offset = XTENTRYSTART; */ in xtSplitPage()
1058 rxtlck->lwm.length = 1; in xtSplitPage()
1069 * non-sequential insert (at possibly middle page) in xtSplitPage()
1091 p->header.prev = cpu_to_le64(rbn); in xtSplitPage()
1103 maxentry = le16_to_cpu(sp->header.maxentry); in xtSplitPage()
1105 righthalf = maxentry - middle; in xtSplitPage()
1108 * skip index in old split/left page - insert into left page: in xtSplitPage()
1112 memmove(&rp->xad[XTENTRYSTART], &sp->xad[middle], in xtSplitPage()
1117 memmove(&sp->xad[skip + 1], &sp->xad[skip], in xtSplitPage()
1118 (middle - skip) << L2XTSLOTSIZE); in xtSplitPage()
1121 xad = &sp->xad[skip]; in xtSplitPage()
1122 XT_PUTENTRY(xad, split->flag, split->off, split->len, in xtSplitPage()
1123 split->addr); in xtSplitPage()
1126 sp->header.nextindex = cpu_to_le16(middle + 1); in xtSplitPage()
1128 sxtlck->lwm.offset = (sxtlck->lwm.offset) ? in xtSplitPage()
1129 min(skip, (int)sxtlck->lwm.offset) : skip; in xtSplitPage()
1132 rp->header.nextindex = in xtSplitPage()
1136 * skip index in new right page - insert into right page: in xtSplitPage()
1140 n = skip - middle; in xtSplitPage()
1141 memmove(&rp->xad[XTENTRYSTART], &sp->xad[middle], in xtSplitPage()
1146 xad = &rp->xad[n]; in xtSplitPage()
1147 XT_PUTENTRY(xad, split->flag, split->off, split->len, in xtSplitPage()
1148 split->addr); in xtSplitPage()
1152 memmove(&rp->xad[n + 1], &sp->xad[skip], in xtSplitPage()
1153 (maxentry - skip) << L2XTSLOTSIZE); in xtSplitPage()
1156 sp->header.nextindex = cpu_to_le16(middle); in xtSplitPage()
1158 sxtlck->lwm.offset = (sxtlck->lwm.offset) ? in xtSplitPage()
1159 min(middle, (int)sxtlck->lwm.offset) : middle; in xtSplitPage()
1162 rp->header.nextindex = cpu_to_le16(XTENTRYSTART + in xtSplitPage()
1167 sxtlck->lwm.length = le16_to_cpu(sp->header.nextindex) - in xtSplitPage()
1168 sxtlck->lwm.offset; in xtSplitPage()
1170 /* rxtlck->lwm.offset = XTENTRYSTART; */ in xtSplitPage()
1171 rxtlck->lwm.length = le16_to_cpu(rp->header.nextindex) - in xtSplitPage()
1199 * non-root page, and the split root page contains a single entry
1227 sp = &JFS_IP(ip)->i_xtroot; in xtSplitRoot()
1234 pxdlist = split->pxdlist; in xtSplitRoot()
1235 pxd = &pxdlist->pxd[pxdlist->npxd]; in xtSplitRoot()
1236 pxdlist->npxd++; in xtSplitRoot()
1240 return -EIO; in xtSplitRoot()
1258 rp = (xtpage_t *) rmp->data; in xtSplitRoot()
1259 rp->header.flag = in xtSplitRoot()
1260 (sp->header.flag & BT_LEAF) ? BT_LEAF : BT_INTERNAL; in xtSplitRoot()
1261 rp->header.self = *pxd; in xtSplitRoot()
1262 rp->header.nextindex = cpu_to_le16(XTENTRYSTART); in xtSplitRoot()
1263 rp->header.maxentry = cpu_to_le16(PSIZE >> L2XTSLOTSIZE); in xtSplitRoot()
1266 rp->header.next = 0; in xtSplitRoot()
1267 rp->header.prev = 0; in xtSplitRoot()
1270 * copy the in-line root page into new right page extent in xtSplitRoot()
1272 nextindex = le16_to_cpu(sp->header.maxentry); in xtSplitRoot()
1273 memmove(&rp->xad[XTENTRYSTART], &sp->xad[XTENTRYSTART], in xtSplitRoot()
1274 (nextindex - XTENTRYSTART) << L2XTSLOTSIZE); in xtSplitRoot()
1280 skip = split->index; in xtSplitRoot()
1283 memmove(&rp->xad[skip + 1], &rp->xad[skip], in xtSplitRoot()
1284 (nextindex - skip) * sizeof(xad_t)); in xtSplitRoot()
1286 xad = &rp->xad[skip]; in xtSplitRoot()
1287 XT_PUTENTRY(xad, split->flag, split->off, split->len, split->addr); in xtSplitRoot()
1290 rp->header.nextindex = cpu_to_le16(nextindex + 1); in xtSplitRoot()
1294 xtlck = (struct xtlock *) & tlck->lock; in xtSplitRoot()
1295 xtlck->lwm.offset = XTENTRYSTART; in xtSplitRoot()
1296 xtlck->lwm.length = le16_to_cpu(rp->header.nextindex) - in xtSplitRoot()
1304 * set the 1st entry offset to 0, which force the left-most key in xtSplitRoot()
1308 * acquire a transaction lock on the root page (in-memory inode); in xtSplitRoot()
1312 BT_MARK_DIRTY(split->mp, ip); in xtSplitRoot()
1314 xad = &sp->xad[XTENTRYSTART]; in xtSplitRoot()
1315 XT_PUTENTRY(xad, XAD_NEW, 0, JFS_SBI(ip->i_sb)->nbperpage, rbn); in xtSplitRoot()
1318 sp->header.flag &= ~BT_LEAF; in xtSplitRoot()
1319 sp->header.flag |= BT_INTERNAL; in xtSplitRoot()
1321 sp->header.nextindex = cpu_to_le16(XTENTRYSTART + 1); in xtSplitRoot()
1324 tlck = txLock(tid, ip, split->mp, tlckXTREE | tlckGROW); in xtSplitRoot()
1325 xtlck = (struct xtlock *) & tlck->lock; in xtSplitRoot()
1326 xtlck->lwm.offset = XTENTRYSTART; in xtSplitRoot()
1327 xtlck->lwm.length = 1; in xtSplitRoot()
1340 * function: extend in-place;
1348 struct inode *ip, s64 xoff, /* delta extent offset */ in xtExtend()
1354 struct metapage *mp; /* meta-page buffer */ in xtExtend()
1355 xtpage_t *p; /* base B+-tree index page */ in xtExtend()
1368 if ((rc = xtSearch(ip, xoff - 1, NULL, &cmp, &btstack, XT_INSERT))) in xtExtend()
1376 jfs_error(ip->i_sb, "xtSearch did not find extent\n"); in xtExtend()
1377 return -EIO; in xtExtend()
1381 xad = &p->xad[index]; in xtExtend()
1384 jfs_error(ip->i_sb, "extension is not contiguous\n"); in xtExtend()
1385 return -EIO; in xtExtend()
1396 xtlck = (struct xtlock *) & tlck->lock; in xtExtend()
1401 if ((len = xlen - MAXXLEN) <= 0) in xtExtend()
1410 nextindex = le16_to_cpu(p->header.nextindex); in xtExtend()
1418 if (nextindex == le16_to_cpu(p->header.maxentry)) { in xtExtend()
1423 split.off = xoff; /* split offset */ in xtExtend()
1439 if (p->header.flag & BT_INTERNAL) { in xtExtend()
1440 ASSERT(p->header.nextindex == in xtExtend()
1442 xad = &p->xad[XTENTRYSTART]; in xtExtend()
1454 xtlck = (struct xtlock *) & tlck->lock; in xtExtend()
1463 xad = &p->xad[index + 1]; in xtExtend()
1467 le16_add_cpu(&p->header.nextindex, 1); in xtExtend()
1471 xad = &p->xad[index]; in xtExtend()
1479 if (!(xad->flag & XAD_NEW)) in xtExtend()
1480 xad->flag |= XAD_EXTENDED; in xtExtend()
1483 xtlck->lwm.offset = in xtExtend()
1484 (xtlck->lwm.offset) ? min(index, in xtExtend()
1485 (int)xtlck->lwm.offset) : index; in xtExtend()
1486 xtlck->lwm.length = in xtExtend()
1487 le16_to_cpu(p->header.nextindex) - xtlck->lwm.offset; in xtExtend()
1501 * (split offset >= start offset of tail extent), and
1510 struct inode *ip, s64 xoff, /* split/new extent offset */ in xtTailgate()
1517 struct metapage *mp; /* meta-page buffer */ in xtTailgate()
1518 xtpage_t *p; /* base B+-tree index page */ in xtTailgate()
1543 jfs_error(ip->i_sb, "couldn't find extent\n"); in xtTailgate()
1544 return -EIO; in xtTailgate()
1548 nextindex = le16_to_cpu(p->header.nextindex); in xtTailgate()
1549 if (index != nextindex - 1) { in xtTailgate()
1551 jfs_error(ip->i_sb, "the entry found is not the last entry\n"); in xtTailgate()
1552 return -EIO; in xtTailgate()
1561 xtlck = (struct xtlock *) & tlck->lock; in xtTailgate()
1565 xad = &p->xad[index]; in xtTailgate()
1570 if ((llen = xoff - offsetXAD(xad)) == 0) in xtTailgate()
1583 if (nextindex == le16_to_cpu(p->header.maxentry)) { in xtTailgate()
1588 split.off = xoff; /* split offset */ in xtTailgate()
1604 if (p->header.flag & BT_INTERNAL) { in xtTailgate()
1605 ASSERT(p->header.nextindex == in xtTailgate()
1607 xad = &p->xad[XTENTRYSTART]; in xtTailgate()
1619 xtlck = (struct xtlock *) & tlck->lock; in xtTailgate()
1628 xad = &p->xad[index + 1]; in xtTailgate()
1632 le16_add_cpu(&p->header.nextindex, 1); in xtTailgate()
1636 xad = &p->xad[index]; in xtTailgate()
1639 * truncate/relocate old extent at split offset in xtTailgate()
1643 rlen = lengthXAD(xad) - llen; in xtTailgate()
1644 if (!(xad->flag & XAD_NEW)) { in xtTailgate()
1648 pxdlock = (struct maplock *) & mtlck->lock; in xtTailgate()
1649 pxdlock->flag = mlckFREEPXD; in xtTailgate()
1650 PXDaddress(&pxdlock->pxd, addressXAD(xad) + llen); in xtTailgate()
1651 PXDlength(&pxdlock->pxd, rlen); in xtTailgate()
1652 pxdlock->index = 1; in xtTailgate()
1666 xtlck->lwm.offset = (xtlck->lwm.offset) ? in xtTailgate()
1667 min(index, (int)xtlck->lwm.offset) : index; in xtTailgate()
1668 xtlck->lwm.length = le16_to_cpu(p->header.nextindex) - in xtTailgate()
1669 xtlck->lwm.offset; in xtTailgate()
1688 * nxad - new XAD;
1696 struct metapage *mp; /* meta-page buffer */ in xtUpdate()
1697 xtpage_t *p; /* base B+-tree index page */ in xtUpdate()
1724 jfs_error(ip->i_sb, "Could not find extent\n"); in xtUpdate()
1725 return -EIO; in xtUpdate()
1734 xtlck = (struct xtlock *) & tlck->lock; in xtUpdate()
1737 xad = &p->xad[index0]; in xtUpdate()
1738 xflag = xad->flag; in xtUpdate()
1747 jfs_error(ip->i_sb, in xtUpdate()
1749 return -EIO; in xtUpdate()
1754 nextindex = le16_to_cpu(p->header.nextindex); in xtUpdate()
1767 xad->flag = xflag & ~XAD_NOTRECORDED; in xtUpdate()
1787 lxad = &p->xad[index - 1]; in xtUpdate()
1789 if (!(lxad->flag & XAD_NOTRECORDED) && in xtUpdate()
1794 index0 = index - 1; in xtUpdate()
1802 if (!(lxad->flag & XAD_NEW)) in xtUpdate()
1803 lxad->flag |= XAD_EXTENDED; in xtUpdate()
1808 XADlength(xad, xlen - nxlen); in xtUpdate()
1814 if (index < nextindex - 1) in xtUpdate()
1815 memmove(&p->xad[index], &p->xad[index + 1], in xtUpdate()
1816 (nextindex - index - in xtUpdate()
1819 p->header.nextindex = in xtUpdate()
1820 cpu_to_le16(le16_to_cpu(p->header.nextindex) - in xtUpdate()
1825 nextindex = le16_to_cpu(p->header.nextindex); in xtUpdate()
1840 xad->flag = xflag & ~XAD_NOTRECORDED; in xtUpdate()
1858 rxad = &p->xad[index + 1]; in xtUpdate()
1860 if (!(rxad->flag & XAD_NOTRECORDED) && in xtUpdate()
1874 if (!(rxad->flag & XAD_NEW)) in xtUpdate()
1875 rxad->flag |= XAD_EXTENDED; in xtUpdate()
1879 XADlength(xad, xlen - nxlen); in xtUpdate()
1883 memmove(&p->xad[index], &p->xad[index + 1], in xtUpdate()
1884 (nextindex - index - 1) << L2XTSLOTSIZE); in xtUpdate()
1886 p->header.nextindex = in xtUpdate()
1887 cpu_to_le16(le16_to_cpu(p->header.nextindex) - in xtUpdate()
1897 jfs_error(ip->i_sb, "xoff >= nxoff\n"); in xtUpdate()
1898 return -EIO; in xtUpdate()
1905 * |---nXAD---> in xtUpdate()
1906 * --|----------XAD----------|-- in xtUpdate()
1907 * |-lXAD-| in xtUpdate()
1911 xad = &p->xad[index]; in xtUpdate()
1912 XADlength(xad, nxoff - xoff); in xtUpdate()
1915 if (nextindex == le16_to_cpu(p->header.maxentry)) { in xtUpdate()
1937 if (p->header.flag & BT_INTERNAL) { in xtUpdate()
1938 ASSERT(p->header.nextindex == in xtUpdate()
1940 xad = &p->xad[XTENTRYSTART]; in xtUpdate()
1952 xtlck = (struct xtlock *) & tlck->lock; in xtUpdate()
1957 (le16_to_cpu(p->header.maxentry) >> 1)) { in xtUpdate()
1959 newindex - in xtUpdate()
1960 le16_to_cpu(p->header.nextindex) + in xtUpdate()
1968 memmove(&p->xad[newindex + 1], &p->xad[newindex], in xtUpdate()
1969 (nextindex - newindex) << L2XTSLOTSIZE); in xtUpdate()
1972 xad = &p->xad[newindex]; in xtUpdate()
1974 xad->flag = xflag & ~XAD_NOTRECORDED; in xtUpdate()
1977 p->header.nextindex = in xtUpdate()
1978 cpu_to_le16(le16_to_cpu(p->header.nextindex) + 1); in xtUpdate()
1982 * does nXAD force 3-way split ? in xtUpdate()
1984 * |---nXAD--->| in xtUpdate()
1985 * --|----------XAD-------------|-- in xtUpdate()
1986 * |-lXAD-| |-rXAD -| in xtUpdate()
1995 xtlck->lwm.offset = (xtlck->lwm.offset) ? in xtUpdate()
1996 min(index0, (int)xtlck->lwm.offset) : index0; in xtUpdate()
1997 xtlck->lwm.length = in xtUpdate()
1998 le16_to_cpu(p->header.nextindex) - in xtUpdate()
1999 xtlck->lwm.offset; in xtUpdate()
2002 bn = le64_to_cpu(p->header.next); in xtUpdate()
2013 xtlck = (struct xtlock *) & tlck->lock; in xtUpdate()
2021 nextindex = le16_to_cpu(p->header.nextindex); in xtUpdate()
2022 xlen = xlen - (nxoff - xoff); in xtUpdate()
2027 if (nextindex == le16_to_cpu(p->header.maxentry)) { in xtUpdate()
2038 jfs_error(ip->i_sb, "xtSearch failed\n"); in xtUpdate()
2039 return -EIO; in xtUpdate()
2044 jfs_error(ip->i_sb, "unexpected value of index\n"); in xtUpdate()
2045 return -EIO; in xtUpdate()
2052 * ---nXAD---| in xtUpdate()
2053 * --|----------XAD----------|-- in xtUpdate()
2054 * |-rXAD-| in xtUpdate()
2058 xad = &p->xad[index]; in xtUpdate()
2060 xad->flag = xflag & ~XAD_NOTRECORDED; in xtUpdate()
2064 xlen = xlen - nxlen; in xtUpdate()
2066 if (nextindex == le16_to_cpu(p->header.maxentry)) { in xtUpdate()
2091 if (p->header.flag & BT_INTERNAL) { in xtUpdate()
2092 ASSERT(p->header.nextindex == in xtUpdate()
2094 xad = &p->xad[XTENTRYSTART]; in xtUpdate()
2106 xtlck = (struct xtlock *) & tlck->lock; in xtUpdate()
2112 memmove(&p->xad[newindex + 1], &p->xad[newindex], in xtUpdate()
2113 (nextindex - newindex) << L2XTSLOTSIZE); in xtUpdate()
2116 xad = &p->xad[newindex]; in xtUpdate()
2120 p->header.nextindex = in xtUpdate()
2121 cpu_to_le16(le16_to_cpu(p->header.nextindex) + 1); in xtUpdate()
2126 xtlck->lwm.offset = (xtlck->lwm.offset) ? in xtUpdate()
2127 min(index0, (int)xtlck->lwm.offset) : index0; in xtUpdate()
2128 xtlck->lwm.length = le16_to_cpu(p->header.nextindex) - in xtUpdate()
2129 xtlck->lwm.offset; in xtUpdate()
2145 * tid - transaction id;
2146 * ip - file object;
2147 * xflag - extent flag:
2148 * xoff - extent offset;
2149 * maxblocks - max extent length;
2150 * xlen - extent length (in/out);
2151 * xaddrp - extent address pointer (in/out):
2152 * flag -
2163 struct metapage *mp; /* meta-page buffer */ in xtAppend()
2164 xtpage_t *p; /* base B+-tree index page */ in xtAppend()
2198 rc = -EEXIST; in xtAppend()
2203 xlen = min(xlen, (int)(next - xoff)); in xtAppend()
2216 nextindex = le16_to_cpu(p->header.nextindex); in xtAppend()
2217 if (nextindex < le16_to_cpu(p->header.maxentry)) in xtAppend()
2227 nblocks = JFS_SBI(ip->i_sb)->nbperpage; in xtAppend()
2228 for (; nsplit > 0; nsplit--, pxd++, xaddr += nblocks, maxblocks -= nblocks) { in xtAppend()
2285 xtlck = (struct xtlock *) & tlck->lock; in xtAppend()
2288 xad = &p->xad[index]; in xtAppend()
2292 le16_add_cpu(&p->header.nextindex, 1); in xtAppend()
2294 xtlck->lwm.offset = in xtAppend()
2295 (xtlck->lwm.offset) ? min(index,(int) xtlck->lwm.offset) : index; in xtAppend()
2296 xtlck->lwm.length = le16_to_cpu(p->header.nextindex) - in xtAppend()
2297 xtlck->lwm.offset; in xtAppend()
2310 /* - TBD for defragmentaion/reorganization -
2348 return -ENOENT; in xtDelete()
2354 nextindex = le16_to_cpu(p->header.nextindex); in xtDelete()
2355 le16_add_cpu(&p->header.nextindex, -1); in xtDelete()
2360 if (p->header.nextindex == cpu_to_le16(XTENTRYSTART)) in xtDelete()
2370 xtlck = (struct xtlock *) & tlck->lock; in xtDelete()
2371 xtlck->lwm.offset = in xtDelete()
2372 (xtlck->lwm.offset) ? min(index, xtlck->lwm.offset) : index; in xtDelete()
2375 if (index < nextindex - 1) in xtDelete()
2376 memmove(&p->xad[index], &p->xad[index + 1], in xtDelete()
2377 (nextindex - index - 1) * sizeof(xad_t)); in xtDelete()
2385 /* - TBD for defragmentaion/reorganization -
2413 if (fp->header.flag & BT_ROOT) { in xtDeleteUp()
2415 fp->header.flag &= ~BT_INTERNAL; in xtDeleteUp()
2416 fp->header.flag |= BT_LEAF; in xtDeleteUp()
2417 fp->header.nextindex = cpu_to_le16(XTENTRYSTART); in xtDeleteUp()
2425 * free non-root leaf page in xtDeleteUp()
2432 xaddr = addressPXD(&fp->header.self); in xtDeleteUp()
2433 xlen = lengthPXD(&fp->header.self); in xtDeleteUp()
2450 XT_GETPAGE(ip, parent->bn, mp, PSIZE, p, rc); in xtDeleteUp()
2454 index = parent->index; in xtDeleteUp()
2458 nextindex = le16_to_cpu(p->header.nextindex); in xtDeleteUp()
2465 if (p->header.flag & BT_ROOT) { in xtDeleteUp()
2467 p->header.flag &= ~BT_INTERNAL; in xtDeleteUp()
2468 p->header.flag |= BT_LEAF; in xtDeleteUp()
2469 p->header.nextindex = in xtDeleteUp()
2480 xaddr = addressPXD(&p->header.self); in xtDeleteUp()
2483 (s64) JFS_SBI(ip->i_sb)->nbperpage); in xtDeleteUp()
2504 xtlck = (struct xtlock *) & tlck->lock; in xtDeleteUp()
2505 xtlck->lwm.offset = in xtDeleteUp()
2506 (xtlck->lwm.offset) ? min(index, in xtDeleteUp()
2507 xtlck->lwm. in xtDeleteUp()
2508 offset) : index; in xtDeleteUp()
2513 if (index < nextindex - 1) in xtDeleteUp()
2514 memmove(&p->xad[index], &p->xad[index + 1], in xtDeleteUp()
2515 (nextindex - index - in xtDeleteUp()
2518 le16_add_cpu(&p->header.nextindex, -1); in xtDeleteUp()
2520 (ulong) parent->bn, index); in xtDeleteUp()
2554 struct metapage *mp, *pmp, *lmp, *rmp; /* meta-page buffer */ in xtRelocate()
2555 xtpage_t *p, *pp, *rp, *lp; /* base B+-tree index page */ in xtRelocate()
2562 s64 offset, nbytes, nbrd, pno; in xtRelocate() local
2576 /* validate extent offset */ in xtRelocate()
2577 offset = xoff << JFS_SBI(ip->i_sb)->l2bsize; in xtRelocate()
2578 if (offset >= ip->i_size) in xtRelocate()
2579 return -ESTALE; /* stale extent */ in xtRelocate()
2599 return -ESTALE; in xtRelocate()
2603 xad = &pp->xad[index]; in xtRelocate()
2606 return -ESTALE; in xtRelocate()
2620 return -ESTALE; in xtRelocate()
2625 xad = &pp->xad[index]; in xtRelocate()
2633 /* if the extent is allocated-but-not-recorded in xtRelocate()
2636 if (xad->flag & XAD_NOTRECORDED) in xtRelocate()
2659 offset = xoff << JFS_SBI(ip->i_sb)->l2bsize; in xtRelocate()
2660 assert((offset & CM_OFFSET) == 0); in xtRelocate()
2661 nbytes = xlen << JFS_SBI(ip->i_sb)->l2bsize; in xtRelocate()
2662 pno = offset >> CM_L2BSIZE; in xtRelocate()
2663 npages = (nbytes + (CM_BSIZE - 1)) >> CM_L2BSIZE; in xtRelocate()
2665 npages = ((offset + nbytes - 1) >> CM_L2BSIZE) - in xtRelocate()
2666 (offset >> CM_L2BSIZE) + 1; in xtRelocate()
2673 offset += nb, pno++, npages--) { in xtRelocate()
2675 nb = min(nbytes - nbrd, CM_BSIZE); in xtRelocate()
2678 if (rc = cmRead(ip, offset, npages, &cp)) in xtRelocate()
2681 assert(addressPXD(&cp->cm_pxd) == sxaddr); in xtRelocate()
2682 assert(!cp->cm_modified); in xtRelocate()
2685 nblks = nb >> JFS_IP(ip->i_sb)->l2bsize; in xtRelocate()
2716 if (p->header.next) { in xtRelocate()
2717 nextbn = le64_to_cpu(p->header.next); in xtRelocate()
2727 if (p->header.prev) { in xtRelocate()
2728 prevbn = le64_to_cpu(p->header.prev); in xtRelocate()
2747 lp->header.next = cpu_to_le64(nxaddr); in xtRelocate()
2754 rp->header.prev = cpu_to_le64(nxaddr); in xtRelocate()
2780 /* tlckNEW init xtlck->lwm.offset = XTENTRYSTART; */ in xtRelocate()
2782 xtlck = (struct xtlock *) & tlck->lock; in xtRelocate()
2785 pxd = &p->header.self; in xtRelocate()
2789 xtlck->lwm.length = in xtRelocate()
2790 le16_to_cpu(p->header.nextindex) - xtlck->lwm.offset; in xtRelocate()
2793 xsize = xlen << JFS_SBI(ip->i_sb)->l2bsize; in xtRelocate()
2826 pxdlock = (struct pxd_lock *) & tlck->lock; in xtRelocate()
2827 pxdlock->flag = mlckFREEPXD; in xtRelocate()
2828 PXDaddress(&pxdlock->pxd, oxaddr); in xtRelocate()
2829 PXDlength(&pxdlock->pxd, xlen); in xtRelocate()
2830 pxdlock->index = 1; in xtRelocate()
2842 xtlck = (struct xtlock *) & tlck->lock; in xtRelocate()
2845 xad = &pp->xad[index]; in xtRelocate()
2846 xad->flag |= XAD_NEW; in xtRelocate()
2849 xtlck->lwm.offset = min(index, xtlck->lwm.offset); in xtRelocate()
2850 xtlck->lwm.length = le16_to_cpu(pp->header.nextindex) - in xtRelocate()
2851 xtlck->lwm.offset; in xtRelocate()
2867 * ip - file object;
2868 * xad - extent to find;
2869 * cmpp - comparison result:
2870 * btstack - traverse stack;
2871 * flag - search process flag;
2886 struct metapage *mp; /* meta-page buffer */ in xtSearchNode()
2919 if (p->header.flag & BT_LEAF) { in xtSearchNode()
2921 return -ESTALE; in xtSearchNode()
2924 lim = le16_to_cpu(p->header.nextindex) - XTENTRYSTART; in xtSearchNode()
2932 XT_CMP(cmp, xoff, &p->xad[index], t64); in xtSearchNode()
2939 if (xaddr == addressXAD(&p->xad[index]) && in xtSearchNode()
2940 xoff == offsetXAD(&p->xad[index])) { in xtSearchNode()
2944 btsp = btstack->top; in xtSearchNode()
2945 btsp->bn = bn; in xtSearchNode()
2946 btsp->index = index; in xtSearchNode()
2947 btsp->mp = mp; in xtSearchNode()
2958 --lim; in xtSearchNode()
2963 * search miss - non-leaf page: in xtSearchNode()
2967 * if base is non-zero, decrement base by one to get the parent in xtSearchNode()
2970 index = base ? base - 1 : base; in xtSearchNode()
2977 bn = addressXAD(&p->xad[index]); in xtSearchNode()
3005 nextbn = le64_to_cpu(p->header.next); in xtRelink()
3006 prevbn = le64_to_cpu(p->header.prev); in xtRelink()
3024 p->header.prev = cpu_to_le64(prevbn); in xtRelink()
3045 p->header.next = le64_to_cpu(nextbn); in xtRelink()
3069 txLock(tid, ip, (struct metapage *) &JFS_IP(ip)->bxflag, in xtInitRoot()
3071 p = &JFS_IP(ip)->i_xtroot; in xtInitRoot()
3073 p->header.flag = DXD_INDEX | BT_ROOT | BT_LEAF; in xtInitRoot()
3074 p->header.nextindex = cpu_to_le16(XTENTRYSTART); in xtInitRoot()
3076 if (S_ISDIR(ip->i_mode)) in xtInitRoot()
3077 p->header.maxentry = cpu_to_le16(XTROOTINITSLOT_DIR); in xtInitRoot()
3079 p->header.maxentry = cpu_to_le16(XTROOTINITSLOT); in xtInitRoot()
3080 ip->i_size = 0; in xtInitRoot()
3121 * 1. truncate (non-COMMIT_NOLINK file)
3174 tblk->xflag |= flag; in xtTruncate()
3213 * temporary file (zerolink count file truncated to zero-length)). in xtTruncate()
3215 teof = (newsize + (JFS_SBI(ip->i_sb)->bsize - 1)) >> in xtTruncate()
3216 JFS_SBI(ip->i_sb)->l2bsize; in xtTruncate()
3237 index = le16_to_cpu(p->header.nextindex) - 1; in xtTruncate()
3244 if (p->header.next) { in xtTruncate()
3253 p->header.next = 0; in xtTruncate()
3256 if (p->header.flag & BT_INTERNAL) in xtTruncate()
3265 xad = &p->xad[index]; in xtTruncate()
3281 newsize = (xoff + xlen) << JFS_SBI(ip->i_sb)->l2bsize; in xtTruncate()
3285 tlck->type = tlckXTREE | tlckTRUNCATE; in xtTruncate()
3286 xtlck = (struct xtlock *) & tlck->lock; in xtTruncate()
3287 xtlck->hwm.offset = le16_to_cpu(p->header.nextindex) - 1; in xtTruncate()
3294 for (; index >= XTENTRYSTART; index--) { in xtTruncate()
3295 xad = &p->xad[index]; in xtTruncate()
3305 if (S_ISDIR(ip->i_mode) && (teof == 0)) in xtTruncate()
3310 * ---|---=======-------> in xtTruncate()
3326 * -------|=======-------> in xtTruncate()
3341 * -------===|===-------> in xtTruncate()
3346 len = teof - xoff; in xtTruncate()
3347 freexlen = xlen - len; in xtTruncate()
3353 xtlck->lwm.offset = (xtlck->lwm.offset) ? in xtTruncate()
3354 min(index, (int)xtlck->lwm.offset) : index; in xtTruncate()
3355 xtlck->lwm.length = index + 1 - in xtTruncate()
3356 xtlck->lwm.offset; in xtTruncate()
3357 xtlck->twm.offset = index; in xtTruncate()
3358 pxdlock = (struct pxd_lock *) & xtlck->pxdlock; in xtTruncate()
3359 pxdlock->flag = mlckFREEPXD; in xtTruncate()
3360 PXDaddress(&pxdlock->pxd, xaddr); in xtTruncate()
3361 PXDlength(&pxdlock->pxd, freexlen); in xtTruncate()
3367 pxdlock->flag = mlckFREEPXD; in xtTruncate()
3368 PXDaddress(&pxdlock->pxd, xaddr); in xtTruncate()
3369 PXDlength(&pxdlock->pxd, freexlen); in xtTruncate()
3384 * -------=======---|---> in xtTruncate()
3392 if (nextindex < le16_to_cpu(p->header.nextindex)) { in xtTruncate()
3394 xadlock.xdlist = &p->xad[nextindex]; in xtTruncate()
3396 le16_to_cpu(p->header.nextindex) - in xtTruncate()
3401 p->header.nextindex = cpu_to_le16(nextindex); in xtTruncate()
3421 tlck->type = tlckXTREE | tlckFREE; in xtTruncate()
3425 xadlock.xdlist = &p->xad[XTENTRYSTART]; in xtTruncate()
3427 le16_to_cpu(p->header.nextindex) - XTENTRYSTART; in xtTruncate()
3431 if (p->header.flag & BT_ROOT) { in xtTruncate()
3432 p->header.flag &= ~BT_INTERNAL; in xtTruncate()
3433 p->header.flag |= BT_LEAF; in xtTruncate()
3434 p->header.nextindex = cpu_to_le16(XTENTRYSTART); in xtTruncate()
3445 if (mp->lid) in xtTruncate()
3446 lid_to_tlock(mp->lid)->flag |= tlckFREELOCK; in xtTruncate()
3469 bn = parent->bn; in xtTruncate()
3474 index = parent->index; in xtTruncate()
3481 if (index < le16_to_cpu(p->header.nextindex) - 1) { in xtTruncate()
3488 xtlck = (struct xtlock *) & tlck->lock; in xtTruncate()
3489 if (!(tlck->type & tlckTRUNCATE)) { in xtTruncate()
3490 xtlck->hwm.offset = in xtTruncate()
3491 le16_to_cpu(p->header. in xtTruncate()
3492 nextindex) - 1; in xtTruncate()
3493 tlck->type = in xtTruncate()
3499 xadlock.xdlist = &p->xad[index + 1]; in xtTruncate()
3501 le16_to_cpu(p->header.nextindex) - in xtTruncate()
3502 index - 1; in xtTruncate()
3508 p->header.nextindex = cpu_to_le16(index + 1); in xtTruncate()
3517 nfreed += lengthXAD(&p->xad[index]); in xtTruncate()
3525 * ToDo: tlocks should be on doubly-linked list, so we can in xtTruncate()
3532 if (log && mp->lid && (tblk->last != mp->lid) && in xtTruncate()
3533 lid_to_tlock(mp->lid)->tid) { in xtTruncate()
3534 lid_t lid = mp->lid; in xtTruncate()
3539 if (tblk->next == lid) in xtTruncate()
3540 tblk->next = tlck->next; in xtTruncate()
3542 for (prev = lid_to_tlock(tblk->next); in xtTruncate()
3543 prev->next != lid; in xtTruncate()
3544 prev = lid_to_tlock(prev->next)) { in xtTruncate()
3545 assert(prev->next); in xtTruncate()
3547 prev->next = tlck->next; in xtTruncate()
3549 lid_to_tlock(tblk->last)->next = lid; in xtTruncate()
3550 tlck->next = 0; in xtTruncate()
3551 tblk->last = lid; in xtTruncate()
3564 xtlck = (struct xtlock *) & tlck->lock; in xtTruncate()
3565 xtlck->hwm.offset = in xtTruncate()
3566 le16_to_cpu(p->header.nextindex) - 1; in xtTruncate()
3567 tlck->type = tlckXTREE | tlckFREE; in xtTruncate()
3571 xadlock.xdlist = &p->xad[XTENTRYSTART]; in xtTruncate()
3573 le16_to_cpu(p->header.nextindex) - in xtTruncate()
3580 if (p->header.flag & BT_ROOT) { in xtTruncate()
3581 p->header.flag &= ~BT_INTERNAL; in xtTruncate()
3582 p->header.flag |= BT_LEAF; in xtTruncate()
3583 p->header.nextindex = cpu_to_le16(XTENTRYSTART); in xtTruncate()
3584 if (le16_to_cpu(p->header.maxentry) == XTROOTMAXSLOT) { in xtTruncate()
3589 p->header.maxentry = in xtTruncate()
3591 JFS_IP(ip)->mode2 |= INLINEEA; in xtTruncate()
3603 if (mp->lid) in xtTruncate()
3604 lid_to_tlock(mp->lid)->flag |= in xtTruncate()
3625 index--; in xtTruncate()
3639 jfs_error(ip->i_sb, "stack overrun!\n"); in xtTruncate()
3641 return -EIO; in xtTruncate()
3646 xad = &p->xad[index]; in xtTruncate()
3664 if (S_ISDIR(ip->i_mode) && !newsize) in xtTruncate()
3665 ip->i_size = 1; /* fsck hates zero-length directories */ in xtTruncate()
3667 ip->i_size = newsize; in xtTruncate()
3725 tblk->xflag |= COMMIT_PMAP; in xtTruncate_pmap()
3731 xoff = (committed_size >> JFS_SBI(ip->i_sb)->l2bsize) - 1; in xtTruncate_pmap()
3740 jfs_error(ip->i_sb, "did not find extent\n"); in xtTruncate_pmap()
3741 return -EIO; in xtTruncate_pmap()
3760 index = le16_to_cpu(p->header.nextindex) - 1; in xtTruncate_pmap()
3762 if (p->header.flag & BT_INTERNAL) in xtTruncate_pmap()
3775 xad = &p->xad[index]; in xtTruncate_pmap()
3779 return (xoff + xlen) << JFS_SBI(ip->i_sb)->l2bsize; in xtTruncate_pmap()
3782 tlck->type = tlckXTREE | tlckFREE; in xtTruncate_pmap()
3783 xtlck = (struct xtlock *) & tlck->lock; in xtTruncate_pmap()
3784 xtlck->hwm.offset = index; in xtTruncate_pmap()
3799 bn = parent->bn; in xtTruncate_pmap()
3804 index = parent->index; in xtTruncate_pmap()
3815 xtlck = (struct xtlock *) & tlck->lock; in xtTruncate_pmap()
3816 xtlck->hwm.offset = le16_to_cpu(p->header.nextindex) - 1; in xtTruncate_pmap()
3817 tlck->type = tlckXTREE | tlckFREE; in xtTruncate_pmap()
3821 if (p->header.flag & BT_ROOT) { in xtTruncate_pmap()
3832 index--; in xtTruncate_pmap()
3839 jfs_error(ip->i_sb, "stack overrun!\n"); in xtTruncate_pmap()
3841 return -EIO; in xtTruncate_pmap()
3846 xad = &p->xad[index]; in xtTruncate_pmap()