Changeset View
Changeset View
Standalone View
Standalone View
lib/libstand/ufs.c
Show First 20 Lines • Show All 151 Lines • ▼ Show 20 Lines | if (fs == NULL) | ||||
panic("fs == NULL"); | panic("fs == NULL"); | ||||
/* | /* | ||||
* Read inode and save it. | * Read inode and save it. | ||||
*/ | */ | ||||
buf = malloc(fs->fs_bsize); | buf = malloc(fs->fs_bsize); | ||||
twiddle(1); | twiddle(1); | ||||
rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
fsbtodb(fs, ino_to_fsba(fs, inumber)), fs->fs_bsize, | fsbtodb(fs, ino_to_fsba(fs, inumber)), 0, fs->fs_bsize, | ||||
buf, &rsize); | buf, &rsize); | ||||
if (rc) | if (rc) | ||||
goto out; | goto out; | ||||
if (rsize != fs->fs_bsize) { | if (rsize != fs->fs_bsize) { | ||||
rc = EIO; | rc = EIO; | ||||
goto out; | goto out; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 93 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); | ||||
rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
fsbtodb(fp->f_fs, ind_block_num), | fsbtodb(fp->f_fs, ind_block_num), 0, | ||||
fs->fs_bsize, | fs->fs_bsize, | ||||
fp->f_blk[level], | fp->f_blk[level], | ||||
&fp->f_blksize[level]); | &fp->f_blksize[level]); | ||||
if (rc) | if (rc) | ||||
return (rc); | return (rc); | ||||
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 64 Lines • ▼ Show 20 Lines | buf_write_file(f, buf_p, size_p) | ||||
if (((off > 0) || (*size_p + off < block_size)) && | if (((off > 0) || (*size_p + off < block_size)) && | ||||
(file_block != fp->f_buf_blkno)) { | (file_block != fp->f_buf_blkno)) { | ||||
if (fp->f_buf == (char *)0) | if (fp->f_buf == (char *)0) | ||||
fp->f_buf = malloc(fs->fs_bsize); | fp->f_buf = malloc(fs->fs_bsize); | ||||
twiddle(4); | twiddle(4); | ||||
rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
fsbtodb(fs, disk_block), | fsbtodb(fs, disk_block), 0, | ||||
block_size, fp->f_buf, &fp->f_buf_size); | block_size, fp->f_buf, &fp->f_buf_size); | ||||
if (rc) | if (rc) | ||||
return (rc); | return (rc); | ||||
fp->f_buf_blkno = file_block; | fp->f_buf_blkno = file_block; | ||||
} | } | ||||
/* | /* | ||||
* Copy the user data into the cached block. | * Copy the user data into the cached block. | ||||
*/ | */ | ||||
bcopy(buf_p, fp->f_buf + off, *size_p); | bcopy(buf_p, fp->f_buf + off, *size_p); | ||||
/* | /* | ||||
* Write the block out to storage. | * Write the block out to storage. | ||||
*/ | */ | ||||
twiddle(4); | twiddle(4); | ||||
rc = (f->f_dev->dv_strategy)(f->f_devdata, F_WRITE, | rc = (f->f_dev->dv_strategy)(f->f_devdata, F_WRITE, | ||||
fsbtodb(fs, disk_block), | fsbtodb(fs, disk_block), 0, | ||||
block_size, fp->f_buf, &fp->f_buf_size); | block_size, fp->f_buf, &fp->f_buf_size); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
/* | /* | ||||
* Read a portion of a file into an internal buffer. Return | * Read a portion of a file into an internal buffer. Return | ||||
* the location in the buffer and the amount in the buffer. | * the location in the buffer and the amount in the buffer. | ||||
*/ | */ | ||||
Show All 24 Lines | if (rc) | ||||
return (rc); | return (rc); | ||||
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); | ||||
rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
fsbtodb(fs, disk_block), | fsbtodb(fs, disk_block), 0, | ||||
block_size, fp->f_buf, &fp->f_buf_size); | block_size, fp->f_buf, &fp->f_buf_size); | ||||
if (rc) | if (rc) | ||||
return (rc); | return (rc); | ||||
} | } | ||||
fp->f_buf_blkno = file_block; | fp->f_buf_blkno = file_block; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | ufs_open(upath, f) | ||||
fs = malloc(SBLOCKSIZE); | fs = malloc(SBLOCKSIZE); | ||||
fp->f_fs = fs; | fp->f_fs = fs; | ||||
twiddle(1); | twiddle(1); | ||||
/* | /* | ||||
* Try reading the superblock in each of its possible locations. | * Try reading the superblock in each of its possible locations. | ||||
*/ | */ | ||||
for (i = 0; sblock_try[i] != -1; i++) { | for (i = 0; sblock_try[i] != -1; i++) { | ||||
rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, | ||||
sblock_try[i] / DEV_BSIZE, SBLOCKSIZE, | sblock_try[i] / DEV_BSIZE, 0, SBLOCKSIZE, | ||||
(char *)fs, &buf_size); | (char *)fs, &buf_size); | ||||
if (rc) | if (rc) | ||||
goto out; | goto out; | ||||
if ((fs->fs_magic == FS_UFS1_MAGIC || | if ((fs->fs_magic == FS_UFS1_MAGIC || | ||||
(fs->fs_magic == FS_UFS2_MAGIC && | (fs->fs_magic == FS_UFS2_MAGIC && | ||||
fs->fs_sblockloc == sblock_try[i])) && | fs->fs_sblockloc == sblock_try[i])) && | ||||
buf_size == SBLOCKSIZE && | buf_size == SBLOCKSIZE && | ||||
fs->fs_bsize <= MAXBSIZE && | fs->fs_bsize <= MAXBSIZE && | ||||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | if ((DIP(fp, di_mode) & IFMT) == IFLNK) { | ||||
if (!buf) | if (!buf) | ||||
buf = malloc(fs->fs_bsize); | buf = malloc(fs->fs_bsize); | ||||
rc = block_map(f, (ufs2_daddr_t)0, &disk_block); | rc = block_map(f, (ufs2_daddr_t)0, &disk_block); | ||||
if (rc) | if (rc) | ||||
goto out; | goto out; | ||||
twiddle(1); | twiddle(1); | ||||
rc = (f->f_dev->dv_strategy)(f->f_devdata, | rc = (f->f_dev->dv_strategy)(f->f_devdata, | ||||
F_READ, fsbtodb(fs, disk_block), | F_READ, fsbtodb(fs, disk_block), 0, | ||||
fs->fs_bsize, buf, &buf_size); | fs->fs_bsize, buf, &buf_size); | ||||
if (rc) | if (rc) | ||||
goto out; | goto out; | ||||
bcopy((char *)buf, namebuf, (unsigned)link_len); | bcopy((char *)buf, namebuf, (unsigned)link_len); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 199 Lines • Show Last 20 Lines |