patch-2.4.21 linux-2.4.21/fs/jfs/jfs_dtree.c
Next file: linux-2.4.21/fs/jfs/jfs_extent.c
Previous file: linux-2.4.21/fs/jfs/jfs_dmap.c
Back to the patch index
Back to the overall index
- Lines: 524
- Date:
2003-06-13 07:51:37.000000000 -0700
- Orig file:
linux-2.4.20/fs/jfs/jfs_dtree.c
- Orig date:
2002-11-28 15:53:15.000000000 -0800
diff -urN linux-2.4.20/fs/jfs/jfs_dtree.c linux-2.4.21/fs/jfs/jfs_dtree.c
@@ -130,7 +130,7 @@
if (((P)->header.nextindex > (((BN)==0)?DTROOTMAXSLOT:(P)->header.maxslot)) ||\
((BN) && ((P)->header.maxslot > DTPAGEMAXSLOT)))\
{\
- jERROR(1,("DT_GETPAGE: dtree page corrupt\n"));\
+ jfs_err("DT_GETPAGE: dtree page corrupt");\
BT_PUTPAGE(MP);\
updateSuper((IP)->i_sb, FM_DIRTY);\
MP = NULL;\
@@ -200,6 +200,47 @@
#define ciToUpper(c) UniStrupr((c)->name)
/*
+ * read_index_page()
+ *
+ * Reads a page of a directory's index table.
+ * Having metadata mapped into the directory inode's address space
+ * presents a multitude of problems. We avoid this by mapping to
+ * the absolute address space outside of the *_metapage routines
+ */
+static struct metapage *read_index_page(struct inode *inode, s64 blkno)
+{
+ int rc;
+ s64 xaddr;
+ int xflag;
+ s32 xlen;
+
+ rc = xtLookup(inode, blkno, 1, &xflag, &xaddr, &xlen, 1);
+ if (rc || (xlen == 0))
+ return NULL;
+
+ return read_metapage(inode, xaddr, PSIZE, 1);
+}
+
+/*
+ * get_index_page()
+ *
+ * Same as get_index_page(), but get's a new page without reading
+ */
+static struct metapage *get_index_page(struct inode *inode, s64 blkno)
+{
+ int rc;
+ s64 xaddr;
+ int xflag;
+ s32 xlen;
+
+ rc = xtLookup(inode, blkno, 1, &xflag, &xaddr, &xlen, 1);
+ if (rc || (xlen == 0))
+ return NULL;
+
+ return get_metapage(inode, xaddr, PSIZE, 1);
+}
+
+/*
* find_index()
*
* Returns dtree page containing directory table entry for specified
@@ -208,7 +249,7 @@
* mp must be released by caller.
*/
static struct dir_table_slot *find_index(struct inode *ip, u32 index,
- struct metapage ** mp)
+ struct metapage ** mp, s64 *lblock)
{
struct jfs_inode_info *jfs_ip = JFS_IP(ip);
s64 blkno;
@@ -219,15 +260,14 @@
if (index < 2) {
if (maxWarnings) {
- jERROR(1, ("find_entry called with index = %d\n",
- index));
+ jfs_warn("find_entry called with index = %d", index);
maxWarnings--;
}
return 0;
}
if (index >= jfs_ip->next_index) {
- jFYI(1, ("find_entry called with index >= next_index\n"));
+ jfs_warn("find_entry called with index >= next_index");
return 0;
}
@@ -243,15 +283,16 @@
blkno = ((offset + 1) >> L2PSIZE) <<
JFS_SBI(ip->i_sb)->l2nbperpage;
- if (*mp && ((*mp)->index != blkno)) {
+ if (*mp && (*lblock != blkno)) {
release_metapage(*mp);
*mp = 0;
}
- if (*mp == 0)
- *mp = read_metapage(ip, blkno, PSIZE, 0);
if (*mp == 0) {
- jERROR(1,
- ("free_index: error reading directory table\n"));
+ *lblock = blkno;
+ *mp = read_index_page(ip, blkno);
+ }
+ if (*mp == 0) {
+ jfs_err("free_index: error reading directory table");
return 0;
}
@@ -312,8 +353,8 @@
ASSERT(DO_INDEX(ip));
if (jfs_ip->next_index < 2) {
- jERROR(1, ("next_index = %d. Please fix this!\n",
- jfs_ip->next_index));
+ jfs_warn("add_index: next_index = %d. Resetting!",
+ jfs_ip->next_index);
jfs_ip->next_index = 2;
}
@@ -362,14 +403,14 @@
if ((rc =
xtInsert(tid, ip, 0, 0, sbi->nbperpage,
&xaddr, 0))) {
- jFYI(1, ("add_index: xtInsert failed!\n"));
+ jfs_warn("add_index: xtInsert failed!");
return -1;
}
ip->i_size = PSIZE;
ip->i_blocks += LBLK2PBLK(sb, sbi->nbperpage);
- if ((mp = get_metapage(ip, 0, ip->i_blksize, 0)) == 0) {
- jERROR(1, ("add_index: get_metapage failed!\n"));
+ if ((mp = get_index_page(ip, 0)) == 0) {
+ jfs_err("add_index: get_metapage failed!");
xtTruncate(tid, ip, 0, COMMIT_PWMAP);
return -1;
}
@@ -404,22 +445,22 @@
if ((rc =
xtInsert(tid, ip, 0, blkno, sbi->nbperpage,
&xaddr, 0))) {
- jFYI(1, ("add_index: xtInsert failed!\n"));
+ jfs_warn("add_index: xtInsert failed!");
jfs_ip->next_index--;
return -1;
}
ip->i_size += PSIZE;
ip->i_blocks += LBLK2PBLK(sb, sbi->nbperpage);
- if ((mp = get_metapage(ip, blkno, PSIZE, 0)))
+ if ((mp = get_index_page(ip, blkno)))
memset(mp->data, 0, PSIZE); /* Just looks better */
else
xtTruncate(tid, ip, offset, COMMIT_PWMAP);
} else
- mp = read_metapage(ip, blkno, PSIZE, 0);
+ mp = read_index_page(ip, blkno);
if (mp == 0) {
- jERROR(1, ("add_index: get/read_metapage failed!\n"));
+ jfs_err("add_index: get/read_metapage failed!");
return -1;
}
@@ -445,9 +486,10 @@
static void free_index(tid_t tid, struct inode *ip, u32 index, u32 next)
{
struct dir_table_slot *dirtab_slot;
+ s64 lblock;
struct metapage *mp = 0;
- dirtab_slot = find_index(ip, index, &mp);
+ dirtab_slot = find_index(ip, index, &mp, &lblock);
if (dirtab_slot == 0)
return;
@@ -470,11 +512,11 @@
* Changes an entry in the directory index table
*/
static void modify_index(tid_t tid, struct inode *ip, u32 index, s64 bn,
- int slot, struct metapage ** mp)
+ int slot, struct metapage ** mp, u64 *lblock)
{
struct dir_table_slot *dirtab_slot;
- dirtab_slot = find_index(ip, index, mp);
+ dirtab_slot = find_index(ip, index, mp, lblock);
if (dirtab_slot == 0)
return;
@@ -497,10 +539,11 @@
static int read_index(struct inode *ip, u32 index,
struct dir_table_slot * dirtab_slot)
{
+ s64 lblock;
struct metapage *mp = 0;
struct dir_table_slot *slot;
- slot = find_index(ip, index, &mp);
+ slot = find_index(ip, index, &mp, &lblock);
if (slot == 0) {
return -EIO;
}
@@ -725,7 +768,7 @@
/* Something's corrupted, mark filesytem dirty so
* chkdsk will fix it.
*/
- jERROR(1, ("stack overrun in dtSearch!\n"));
+ jfs_err("stack overrun in dtSearch!");
updateSuper(sb, FM_DIRTY);
rc = EIO;
goto out;
@@ -1136,7 +1179,7 @@
break;
default:
- jERROR(2, ("dtSplitUp(): UFO!\n"));
+ jfs_err("dtSplitUp(): UFO!");
break;
}
@@ -1287,8 +1330,7 @@
if (rmp == NULL)
return EIO;
- jEVENT(0,
- ("dtSplitPage: ip:0x%p smp:0x%p rmp:0x%p\n", ip, smp, rmp));
+ jfs_info("dtSplitPage: ip:0x%p smp:0x%p rmp:0x%p", ip, smp, rmp);
BT_MARK_DIRTY(rmp, ip);
/*
@@ -1394,9 +1436,8 @@
* acquire a transaction lock on the next page
*/
tlck = txLock(tid, ip, mp, tlckDTREE | tlckRELINK);
- jEVENT(0,
- ("dtSplitPage: tlck = 0x%p, ip = 0x%p, mp=0x%p\n",
- tlck, ip, mp));
+ jfs_info("dtSplitPage: tlck = 0x%p, ip = 0x%p, mp=0x%p",
+ tlck, ip, mp);
dtlck = (struct dt_lock *) & tlck->lock;
/* linelock header of previous right sibling page */
@@ -1491,12 +1532,14 @@
* Update directory index table for entries now in right page
*/
if ((rp->header.flag & BT_LEAF) && DO_INDEX(ip)) {
+ s64 lblock;
+
mp = 0;
stbl = DT_GETSTBL(rp);
for (n = 0; n < rp->header.nextindex; n++) {
ldtentry = (struct ldtentry *) & rp->slot[stbl[n]];
modify_index(tid, ip, le32_to_cpu(ldtentry->index),
- rbn, n, &mp);
+ rbn, n, &mp, &lblock);
}
if (mp)
release_metapage(mp);
@@ -1536,7 +1579,6 @@
ip->i_blocks += LBLK2PBLK(sb, lengthPXD(pxd));
- jEVENT(0, ("dtSplitPage: ip:0x%p sp:0x%p rp:0x%p\n", ip, sp, rp));
return 0;
}
@@ -1616,6 +1658,8 @@
* Update directory index table to reflect new page address
*/
if (DO_INDEX(ip)) {
+ s64 lblock;
+
mp = 0;
stbl = DT_GETSTBL(sp);
for (n = 0; n < sp->header.nextindex; n++) {
@@ -1623,7 +1667,7 @@
(struct ldtentry *) & sp->slot[stbl[n]];
modify_index(tid, ip,
le32_to_cpu(ldtentry->index),
- xaddr, n, &mp);
+ xaddr, n, &mp, &lblock);
}
if (mp)
release_metapage(mp);
@@ -1635,8 +1679,7 @@
*/
sp->header.self = *pxd;
- jEVENT(0,
- ("dtExtendPage: ip:0x%p smp:0x%p sp:0x%p\n", ip, smp, sp));
+ jfs_info("dtExtendPage: ip:0x%p smp:0x%p sp:0x%p", ip, smp, sp);
BT_MARK_DIRTY(smp, ip);
/*
@@ -1774,10 +1817,6 @@
((JFS_IP(ip)->acl.flag & DXD_EXTENT) ?
lengthDXD(&JFS_IP(ip)->acl) : 0));
- jEVENT(0,
- ("dtExtendPage: ip:0x%p smp:0x%p sp:0x%p\n", ip, smp, sp));
-
-
DT_PUTPAGE(pmp);
return 0;
}
@@ -1911,6 +1950,7 @@
* Update directory index table for entries now in right page
*/
if ((rp->header.flag & BT_LEAF) && DO_INDEX(ip)) {
+ s64 lblock;
struct metapage *mp = 0;
struct ldtentry *ldtentry;
@@ -1918,7 +1958,7 @@
for (n = 0; n < rp->header.nextindex; n++) {
ldtentry = (struct ldtentry *) & rp->slot[stbl[n]];
modify_index(tid, ip, le32_to_cpu(ldtentry->index),
- rbn, n, &mp);
+ rbn, n, &mp, &lblock);
}
if (mp)
release_metapage(mp);
@@ -2120,6 +2160,8 @@
* Update directory index table for entries moved in stbl
*/
if (DO_INDEX(ip) && index < p->header.nextindex) {
+ s64 lblock;
+
imp = 0;
stbl = DT_GETSTBL(p);
for (i = index; i < p->header.nextindex; i++) {
@@ -2127,7 +2169,7 @@
(struct ldtentry *) & p->slot[stbl[i]];
modify_index(tid, ip,
le32_to_cpu(ldtentry->index),
- bn, i, &imp);
+ bn, i, &imp, &lblock);
}
if (imp)
release_metapage(imp);
@@ -2368,9 +2410,9 @@
oxaddr = addressPXD(opxd);
xlen = lengthPXD(opxd);
- jEVENT(0, ("dtRelocate: lmxaddr:%Ld xaddr:%Ld:%Ld xlen:%d\n",
+ jfs_info("dtRelocate: lmxaddr:%Ld xaddr:%Ld:%Ld xlen:%d",
(long long)lmxaddr, (long long)oxaddr, (long long)nxaddr,
- xlen));
+ xlen);
/*
* 1. get the internal parent dtpage covering
@@ -2382,7 +2424,7 @@
/* retrieve search result */
DT_GETSEARCH(ip, btstack.top, bn, pmp, pp, index);
- jEVENT(0, ("dtRelocate: parent router entry validated.\n"));
+ jfs_info("dtRelocate: parent router entry validated.");
/*
* 2. relocate the target dtpage
@@ -2488,7 +2530,7 @@
#endif /* _STILL_TO_PORT */
/* unpin the relocated page */
DT_PUTPAGE(mp);
- jEVENT(0, ("dtRelocate: target dtpage relocated.\n"));
+ jfs_info("dtRelocate: target dtpage relocated.");
/* the moved extent is dtpage, then a LOG_NOREDOPAGE log rec
* needs to be written (in logredo(), the LOG_NOREDOPAGE log rec
@@ -2516,7 +2558,7 @@
* acquire tlck for the parent entry covering the target dtpage;
* write LOG_REDOPAGE to apply after image only;
*/
- jEVENT(0, ("dtRelocate: update parent router entry.\n"));
+ jfs_info("dtRelocate: update parent router entry.");
tlck = txLock(tid, ip, pmp, tlckDTREE | tlckENTRY);
dtlck = (struct dt_lock *) & tlck->lock;
lv = & dtlck->lv[dtlck->index];
@@ -2675,9 +2717,8 @@
* action: update prev pointer;
*/
tlck = txLock(tid, ip, mp, tlckDTREE | tlckRELINK);
- jEVENT(0,
- ("dtRelink nextbn: tlck = 0x%p, ip = 0x%p, mp=0x%p\n",
- tlck, ip, mp));
+ jfs_info("dtRelink nextbn: tlck = 0x%p, ip = 0x%p, mp=0x%p",
+ tlck, ip, mp);
dtlck = (struct dt_lock *) & tlck->lock;
/* linelock header */
@@ -2705,9 +2746,8 @@
* action: update next pointer;
*/
tlck = txLock(tid, ip, mp, tlckDTREE | tlckRELINK);
- jEVENT(0,
- ("dtRelink prevbn: tlck = 0x%p, ip = 0x%p, mp=0x%p\n",
- tlck, ip, mp));
+ jfs_info("dtRelink prevbn: tlck = 0x%p, ip = 0x%p, mp=0x%p",
+ tlck, ip, mp);
dtlck = (struct dt_lock *) & tlck->lock;
/* linelock header */
@@ -2769,12 +2809,6 @@
set_cflag(COMMIT_Stale, ip);
tblk->xflag = xflag_save;
- /*
- * Tells jfs_metapage code that the metadata pages
- * for the index table are no longer useful, and
- * remove them from page cache.
- */
- invalidate_inode_metapages(ip);
} else
ip->i_size = 1;
@@ -2944,7 +2978,6 @@
int d_namleft, len, outlen;
unsigned long dirent_buf;
char *name_ptr;
- int dtlhdrdatalen;
u32 dir_index;
int do_index = 0;
uint loop_count = 0;
@@ -2964,7 +2997,6 @@
* -1 = End of directory
*/
do_index = 1;
- dtlhdrdatalen = DTLHDRDATALEN;
dir_index = (u32) filp->f_pos;
@@ -2985,8 +3017,8 @@
}
if (dirtab_slot.flag == DIR_INDEX_FREE) {
if (loop_count++ > JFS_IP(ip)->next_index) {
- jERROR(1, ("jfs_readdir detected "
- "infinite loop!\n"));
+ jfs_err("jfs_readdir detected "
+ "infinite loop!");
filp->f_pos = DIREND;
return 0;
}
@@ -3005,7 +3037,7 @@
return 0;
}
if (p->header.flag & BT_INTERNAL) {
- jERROR(1,("jfs_readdir: bad index table\n"));
+ jfs_err("jfs_readdir: bad index table");
DT_PUTPAGE(mp);
filp->f_pos = -1;
return 0;
@@ -3049,8 +3081,6 @@
* pn > 0: Real entries, pn=1 -> leftmost page
* pn = index = -1: No more entries
*/
- dtlhdrdatalen = DTLHDRDATALEN_LEGACY;
-
dtpos = filp->f_pos;
if (dtpos == 0) {
/* build "." entry */
@@ -3070,8 +3100,8 @@
PARENT(ip), DT_DIR))
return 0;
} else {
- jERROR(1,
- ("jfs_readdir called with invalid offset!\n"));
+ jfs_err("jfs_readdir called with "
+ "invalid offset!");
}
dtoffset->pn = 1;
dtoffset->index = 0;
@@ -3084,9 +3114,8 @@
}
if ((rc = dtReadNext(ip, &filp->f_pos, &btstack))) {
- jERROR(1,
- ("jfs_readdir: unexpected rc = %d from dtReadNext\n",
- rc));
+ jfs_err("jfs_readdir: unexpected rc = %d "
+ "from dtReadNext", rc);
filp->f_pos = DIREND;
return 0;
}
@@ -3103,7 +3132,7 @@
dirent_buf = __get_free_page(GFP_KERNEL);
if (dirent_buf == 0) {
DT_PUTPAGE(mp);
- jERROR(1, ("jfs_readdir: __get_free_page failed!\n"));
+ jfs_warn("jfs_readdir: __get_free_page failed!");
filp->f_pos = DIREND;
return -ENOMEM;
}
@@ -3175,9 +3204,10 @@
d_namleft -= len;
/* Sanity Check */
if (d_namleft == 0) {
- jERROR(1,("JFS:Dtree error: "
- "ino = %ld, bn=%Ld, index = %d\n",
- (long)ip->i_ino, (long long)bn, i));
+ jfs_err("JFS:Dtree error: ino = "
+ "%ld, bn=%Ld, index = %d",
+ (long)ip->i_ino,(long long)bn,
+ i);
updateSuper(ip->i_sb, FM_DIRTY);
goto skip_one;
}
@@ -3919,6 +3949,8 @@
memmove(stbl + index + 1, stbl + index, nextindex - index);
if ((p->header.flag & BT_LEAF) && data->leaf.ip) {
+ s64 lblock;
+
/*
* Need to update slot number for entries that moved
* in the stbl
@@ -3928,7 +3960,7 @@
lh = (struct ldtentry *) & (p->slot[stbl[n]]);
modify_index(data->leaf.tid, data->leaf.ip,
le32_to_cpu(lh->index), bn, n,
- &mp);
+ &mp, &lblock);
}
if (mp)
release_metapage(mp);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)