usr/src/grub/grub-0.97/stage2/fsys_jfs.c
author William Kucharski <William.Kucharski@Sun.COM>
Fri, 07 Nov 2008 21:36:41 -0700
changeset 8044 b3af80bbf173
parent 0 usr/src/grub/grub-0.95/stage2/fsys_jfs.c@68f95e015346
permissions -rw-r--r--
6731552 GRUB should have the ability to overlay a logo on the graphical splash screen 6762035 GRUB needs to understand new ext3 256 Byte inodes 6762243 GRUB should be updated to version 0.97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/* fsys_jfs.c - an implementation for the IBM JFS file system */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
/*  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *  GRUB  --  GRand Unified Bootloader
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 *  Copyright (C) 2001,2002  Free Software Foundation, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 *  This program is free software; you can redistribute it and/or modify
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *  it under the terms of the GNU General Public License as published by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *  the Free Software Foundation; either version 2 of the License, or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 *  (at your option) any later version.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 *  This program is distributed in the hope that it will be useful,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 *  GNU General Public License for more details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 *  You should have received a copy of the GNU General Public License
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 *  along with this program; if not, write to the Free Software
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
#ifdef FSYS_JFS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
#include "shared.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
#include "filesys.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
#include "jfs.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#define MAX_LINK_COUNT	8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#define DTTYPE_INLINE	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#define DTTYPE_PAGE	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
struct jfs_info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
	int bsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
	int l2bsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
	int bdlog;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
	int xindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
	int xlastindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
	int sindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
	int slastindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
	int de_index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
	int dttype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
	xad_t *xad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
	ldtentry_t *de;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
static struct jfs_info jfs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#define xtpage		((xtpage_t *)FSYS_BUF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#define dtpage		((dtpage_t *)((char *)FSYS_BUF + 4096))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#define fileset		((dinode_t *)((char *)FSYS_BUF + 8192))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define inode		((dinode_t *)((char *)FSYS_BUF + 8192 + sizeof(dinode_t)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#define dtroot		((dtroot_t *)(&inode->di_btroot))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
static ldtentry_t de_always[2] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	{1, -1, 2, {'.', '.'}},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	{1, -1, 1, {'.'}}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
isinxt (s64 key, s64 offset, s64 len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	return (key >= offset) ? (key < offset + len ? 1 : 0) : 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
static xad_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
first_extent (dinode_t *di)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	xtpage_t *xtp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	jfs.xindex = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	xtp = (xtpage_t *)&di->di_btroot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	jfs.xad = &xtp->xad[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	if (xtp->header.flag & BT_LEAF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	    	jfs.xlastindex = xtp->header.nextindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
			devread (addressXAD (jfs.xad) << jfs.bdlog, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
				 sizeof(xtpage_t), (char *)xtpage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
			jfs.xad = &xtpage->xad[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
		} while (!(xtpage->header.flag & BT_LEAF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
		jfs.xlastindex = xtpage->header.nextindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	return jfs.xad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
static xad_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
next_extent (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	if (++jfs.xindex < jfs.xlastindex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	} else if (xtpage->header.next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		devread (xtpage->header.next << jfs.bdlog, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
			 sizeof(xtpage_t), (char *)xtpage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		jfs.xlastindex = xtpage->header.nextindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
		jfs.xindex = XTENTRYSTART;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
		jfs.xad = &xtpage->xad[XTENTRYSTART];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		return NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	return ++jfs.xad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
di_read (u32 inum, dinode_t *di)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	s64 key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	u32 xd, ioffset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	s64 offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	xad_t *xad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	pxd_t pxd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	key = (((inum >> L2INOSPERIAG) << L2INOSPERIAG) + 4096) >> jfs.l2bsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	xd = (inum & (INOSPERIAG - 1)) >> L2INOSPEREXT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	ioffset = ((inum & (INOSPERIAG - 1)) & (INOSPEREXT - 1)) << L2DISIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	xad = first_extent (fileset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		offset = offsetXAD (xad);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
		if (isinxt (key, offset, lengthXAD (xad))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
			devread ((addressXAD (xad) + key - offset) << jfs.bdlog,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
				 3072 + xd*sizeof(pxd_t), sizeof(pxd_t), (char *)&pxd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
			devread (addressPXD (&pxd) << jfs.bdlog,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
				 ioffset, DISIZE, (char *)di);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	} while ((xad = next_extent ()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
static ldtentry_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
next_dentry (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	ldtentry_t *de;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	s8 *stbl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	if (jfs.dttype == DTTYPE_INLINE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		if (jfs.sindex < jfs.slastindex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
			return (ldtentry_t *)&dtroot->slot[(int)dtroot->header.stbl[jfs.sindex++]];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		de = (ldtentry_t *)dtpage->slot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		stbl = (s8 *)&de[(int)dtpage->header.stblindex];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		if (jfs.sindex < jfs.slastindex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
			return &de[(int)stbl[jfs.sindex++]];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		} else if (dtpage->header.next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
			devread (dtpage->header.next << jfs.bdlog, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
				 sizeof(dtpage_t), (char *)dtpage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
			jfs.slastindex = dtpage->header.nextindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
			jfs.sindex = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
			return &de[(int)((s8 *)&de[(int)dtpage->header.stblindex])[0]];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	return (jfs.de_index < 2) ? &de_always[jfs.de_index++] : NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
static ldtentry_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
first_dentry (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	dtroot_t *dtr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	pxd_t *xd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	idtentry_t *de;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	dtr = (dtroot_t *)&inode->di_btroot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	jfs.sindex = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	jfs.de_index = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	de_always[0].inumber = inode->di_parent;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	de_always[1].inumber = inode->di_number;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	if (dtr->header.flag & BT_LEAF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		jfs.dttype = DTTYPE_INLINE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		jfs.slastindex = dtr->header.nextindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		de = (idtentry_t *)dtpage->slot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		jfs.dttype = DTTYPE_PAGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		xd = &((idtentry_t *)dtr->slot)[(int)dtr->header.stbl[0]].xd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
		for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
			devread (addressPXD (xd) << jfs.bdlog, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
				 sizeof(dtpage_t), (char *)dtpage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
			if (dtpage->header.flag & BT_LEAF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
			xd = &de[(int)((s8 *)&de[(int)dtpage->header.stblindex])[0]].xd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		jfs.slastindex = dtpage->header.nextindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	return next_dentry ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
static dtslot_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
next_dslot (int next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	return (jfs.dttype == DTTYPE_INLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		? (dtslot_t *)&dtroot->slot[next]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		: &((dtslot_t *)dtpage->slot)[next];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
uni2ansi (UniChar *uni, char *ansi, int len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	for (; len; len--, uni++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		*ansi++ = (*uni & 0xff80) ? '?' : *(char *)uni;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
jfs_mount (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	struct jfs_superblock super;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	if (part_length < MINJFS >> SECTOR_BITS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	    || !devread (SUPER1_OFF >> SECTOR_BITS, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
			 sizeof(struct jfs_superblock), (char *)&super)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	    || (super.s_magic != JFS_MAGIC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	    || !devread ((AITBL_OFF >> SECTOR_BITS) + FILESYSTEM_I,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
			 0, DISIZE, (char*)fileset)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	jfs.bsize = super.s_bsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	jfs.l2bsize = super.s_l2bsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	jfs.bdlog = jfs.l2bsize - SECTOR_BITS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
jfs_read (char *buf, int len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	xad_t *xad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	s64 endofprev, endofcur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	s64 offset, xadlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	int toread, startpos, endpos;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	startpos = filepos;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	endpos = filepos + len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	endofprev = (1ULL << 62) - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	xad = first_extent (inode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
		offset = offsetXAD (xad);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		xadlen = lengthXAD (xad);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
		if (isinxt (filepos >> jfs.l2bsize, offset, xadlen)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
			endofcur = (offset + xadlen) << jfs.l2bsize; 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
			toread = (endofcur >= endpos)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				  ? len : (endofcur - filepos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
			disk_read_func = disk_read_hook;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
			devread (addressXAD (xad) << jfs.bdlog,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
				 filepos - (offset << jfs.l2bsize), toread, buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			disk_read_func = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
			buf += toread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
			len -= toread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			filepos += toread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		} else if (offset > endofprev) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
			toread = ((offset << jfs.l2bsize) >= endpos)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
				  ? len : ((offset - endofprev) << jfs.l2bsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			len -= toread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			filepos += toread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
			for (; toread; toread--) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
				*buf++ = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		endofprev = offset + xadlen; 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		xad = next_extent ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	} while (len > 0 && xad);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	return filepos - startpos;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
jfs_dir (char *dirname)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	char *ptr, *rest, ch;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	ldtentry_t *de;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	dtslot_t *ds;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	u32 inum, parent_inum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	s64 di_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	u32 di_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	int namlen, cmp, n, link_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	char namebuf[JFS_NAME_MAX + 1], linkbuf[JFS_PATH_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	parent_inum = inum = ROOT_I;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	link_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		di_read (inum, inode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		di_size = inode->di_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
		di_mode = inode->di_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		if ((di_mode & IFMT) == IFLNK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
			if (++link_count > MAX_LINK_COUNT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
				errnum = ERR_SYMLINK_LOOP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
				return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			if (di_size < (di_mode & INLINEEA ? 256 : 128)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
				grub_memmove (linkbuf, inode->di_fastsymlink, di_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
				n = di_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			} else if (di_size < JFS_PATH_MAX - 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
				filepos = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
				filemax = di_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
				n = jfs_read (linkbuf, filemax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
				errnum = ERR_FILELENGTH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
				return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			inum = (linkbuf[0] == '/') ? ROOT_I : parent_inum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
			while (n < (JFS_PATH_MAX - 1) && (linkbuf[n++] = *dirname++));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
			linkbuf[n] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
			dirname = linkbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		if (!*dirname || isspace (*dirname)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
			if ((di_mode & IFMT) != IFREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
				errnum = ERR_BAD_FILETYPE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
				return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
			filepos = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			filemax = di_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
			return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		if ((di_mode & IFMT) != IFDIR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
			errnum = ERR_BAD_FILETYPE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
			return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		for (; *dirname == '/'; dirname++);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		for (rest = dirname; (ch = *rest) && !isspace (ch) && ch != '/'; rest++);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		*rest = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		de = first_dentry ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
			namlen = de->namlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
			if (de->next == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
				uni2ansi (de->name, namebuf, namlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
				namebuf[namlen] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
				uni2ansi (de->name, namebuf, DTLHDRDATALEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
				ptr = namebuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
				ptr += DTLHDRDATALEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
				namlen -= DTLHDRDATALEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
				ds = next_dslot (de->next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
				while (ds->next != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
					uni2ansi (ds->name, ptr, DTSLOTDATALEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
					ptr += DTSLOTDATALEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
					namlen -= DTSLOTDATALEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
					ds = next_dslot (ds->next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
				uni2ansi (ds->name, ptr, namlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
				ptr += namlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
				*ptr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
			cmp = (!*dirname) ? -1 : substring (dirname, namebuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
#ifndef STAGE1_5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			if (print_possibilities && ch != '/'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
			    && cmp <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
				if (print_possibilities > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
					print_possibilities = -print_possibilities;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
				print_a_completion (namebuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			if (cmp == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
				parent_inum = inum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
				inum = de->inumber;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		        	*(dirname = rest) = ch;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
			de = next_dentry ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
			if (de == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
				if (print_possibilities < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
					return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
				errnum = ERR_FILE_NOT_FOUND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
				*rest = ch;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
				return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
jfs_embed (int *start_sector, int needed_sectors)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	struct jfs_superblock super;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	if (needed_sectors > 63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	    || !devread (SUPER1_OFF >> SECTOR_BITS, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
			 sizeof (struct jfs_superblock),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
			 (char *)&super)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	    || (super.s_magic != JFS_MAGIC)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	*start_sector = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
#endif /* FSYS_JFS */