Changeset View
Changeset View
Standalone View
Standalone View
head/lib/libstand/ext2fs.c
Show First 20 Lines • Show All 349 Lines • ▼ Show 20 Lines | ext2fs_open(const char *upath, struct open_file *f) | ||||
bzero(fp, sizeof(struct file)); | bzero(fp, sizeof(struct file)); | ||||
f->f_fsdata = (void *)fp; | f->f_fsdata = (void *)fp; | ||||
/* allocate space and read super block */ | /* allocate space and read super block */ | ||||
fs = (struct ext2fs *)malloc(sizeof(*fs)); | fs = (struct ext2fs *)malloc(sizeof(*fs)); | ||||
fp->f_fs = fs; | fp->f_fs = fs; | ||||
twiddle(1); | twiddle(1); | ||||
error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
EXT2_SBLOCK, EXT2_SBSIZE, (char *)fs, &buf_size); | EXT2_SBLOCK, 0, EXT2_SBSIZE, (char *)fs, &buf_size); | ||||
if (error) | if (error) | ||||
goto out; | goto out; | ||||
if (buf_size != EXT2_SBSIZE || fs->fs_magic != EXT2_MAGIC) { | if (buf_size != EXT2_SBSIZE || fs->fs_magic != EXT2_MAGIC) { | ||||
error = EINVAL; | error = EINVAL; | ||||
goto out; | goto out; | ||||
} | } | ||||
Show All 25 Lines | ext2fs_open(const char *upath, struct open_file *f) | ||||
groups = howmany(fs->fs_blocks - fs->fs_firstblk, fs->fs_bpg); | groups = howmany(fs->fs_blocks - fs->fs_firstblk, fs->fs_bpg); | ||||
bg_per_blk = fs->fs_bsize / sizeof(struct ext2blkgrp); | bg_per_blk = fs->fs_bsize / sizeof(struct ext2blkgrp); | ||||
blkgrps = howmany(groups, bg_per_blk); | blkgrps = howmany(groups, bg_per_blk); | ||||
len = blkgrps * fs->fs_bsize; | len = blkgrps * fs->fs_bsize; | ||||
fp->f_bg = malloc(len); | fp->f_bg = malloc(len); | ||||
twiddle(1); | twiddle(1); | ||||
error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
EXT2_SBLOCK + EXT2_SBSIZE / DEV_BSIZE, len, | EXT2_SBLOCK + EXT2_SBSIZE / DEV_BSIZE, 0, len, | ||||
(char *)fp->f_bg, &buf_size); | (char *)fp->f_bg, &buf_size); | ||||
if (error) | if (error) | ||||
goto out; | goto out; | ||||
/* | /* | ||||
* XXX | * XXX | ||||
* validation of values? (blocksize, descriptors, etc?) | * validation of values? (blocksize, descriptors, etc?) | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | if (S_ISLNK(fp->f_di.di_mode)) { | ||||
if (! buf) | if (! buf) | ||||
buf = malloc(fs->fs_bsize); | buf = malloc(fs->fs_bsize); | ||||
error = block_map(f, (daddr_t)0, &disk_block); | error = block_map(f, (daddr_t)0, &disk_block); | ||||
if (error) | if (error) | ||||
goto out; | goto out; | ||||
twiddle(1); | twiddle(1); | ||||
error = (f->f_dev->dv_strategy)(f->f_devdata, | error = (f->f_dev->dv_strategy)(f->f_devdata, | ||||
F_READ, fsb_to_db(fs, disk_block), | F_READ, fsb_to_db(fs, disk_block), 0, | ||||
fs->fs_bsize, buf, &buf_size); | fs->fs_bsize, buf, &buf_size); | ||||
if (error) | if (error) | ||||
goto out; | goto out; | ||||
bcopy((char *)buf, namebuf, link_len); | bcopy((char *)buf, namebuf, link_len); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | read_inode(ino_t inumber, struct open_file *f) | ||||
int level, error = 0; | int level, error = 0; | ||||
/* | /* | ||||
* Read inode and save it. | * Read inode and save it. | ||||
*/ | */ | ||||
buf = malloc(fs->fs_bsize); | buf = malloc(fs->fs_bsize); | ||||
twiddle(1); | twiddle(1); | ||||
error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
ino_to_db(fs, fp->f_bg, inumber), fs->fs_bsize, buf, &rsize); | ino_to_db(fs, fp->f_bg, inumber), 0, fs->fs_bsize, buf, &rsize); | ||||
if (error) | if (error) | ||||
goto out; | goto out; | ||||
if (rsize != fs->fs_bsize) { | if (rsize != fs->fs_bsize) { | ||||
error = EIO; | error = EIO; | ||||
goto out; | goto out; | ||||
} | } | ||||
dp = (struct ext2dinode *)buf; | dp = (struct ext2dinode *)buf; | ||||
▲ Show 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | for (; level >= 0; level--) { | ||||
} | } | ||||
if (fp->f_blkno[level] != ind_block_num) { | if (fp->f_blkno[level] != ind_block_num) { | ||||
if (fp->f_blk[level] == (char *)0) | if (fp->f_blk[level] == (char *)0) | ||||
fp->f_blk[level] = | fp->f_blk[level] = | ||||
malloc(fs->fs_bsize); | malloc(fs->fs_bsize); | ||||
twiddle(1); | twiddle(1); | ||||
error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
fsb_to_db(fp->f_fs, ind_block_num), fs->fs_bsize, | fsb_to_db(fp->f_fs, ind_block_num), 0, fs->fs_bsize, | ||||
fp->f_blk[level], &fp->f_blksize[level]); | fp->f_blk[level], &fp->f_blksize[level]); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
if (fp->f_blksize[level] != fs->fs_bsize) | if (fp->f_blksize[level] != fs->fs_bsize) | ||||
return (EIO); | return (EIO); | ||||
fp->f_blkno[level] = ind_block_num; | fp->f_blkno[level] = ind_block_num; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | if (fp->f_buf == (char *)0) | ||||
fp->f_buf = malloc(fs->fs_bsize); | fp->f_buf = malloc(fs->fs_bsize); | ||||
if (disk_block == 0) { | if (disk_block == 0) { | ||||
bzero(fp->f_buf, block_size); | bzero(fp->f_buf, block_size); | ||||
fp->f_buf_size = block_size; | fp->f_buf_size = block_size; | ||||
} else { | } else { | ||||
twiddle(4); | twiddle(4); | ||||
error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
fsb_to_db(fs, disk_block), block_size, | fsb_to_db(fs, disk_block), 0, block_size, | ||||
fp->f_buf, &fp->f_buf_size); | fp->f_buf, &fp->f_buf_size); | ||||
if (error) | if (error) | ||||
goto done; | goto done; | ||||
} | } | ||||
fp->f_buf_blkno = file_block; | fp->f_buf_blkno = file_block; | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 172 Lines • Show Last 20 Lines |