Changeset View
Changeset View
Standalone View
Standalone View
lib/libstand/ufs.c
Show First 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
struct file { | struct file { | ||||
off_t f_seekp; /* seek pointer */ | off_t f_seekp; /* seek pointer */ | ||||
struct fs *f_fs; /* pointer to super-block */ | struct fs *f_fs; /* pointer to super-block */ | ||||
union dinode { | union dinode { | ||||
struct ufs1_dinode di1; | struct ufs1_dinode di1; | ||||
struct ufs2_dinode di2; | struct ufs2_dinode di2; | ||||
} f_di; /* copy of on-disk inode */ | } f_di; /* copy of on-disk inode */ | ||||
int f_nindir[NIADDR]; | int f_nindir[UFS_NIADDR]; | ||||
/* number of blocks mapped by | /* number of blocks mapped by | ||||
indirect block at level i */ | indirect block at level i */ | ||||
char *f_blk[NIADDR]; /* buffer for indirect block at | char *f_blk[UFS_NIADDR]; /* buffer for indirect block at | ||||
level i */ | level i */ | ||||
size_t f_blksize[NIADDR]; | size_t f_blksize[UFS_NIADDR]; | ||||
/* size of buffer */ | /* size of buffer */ | ||||
ufs2_daddr_t f_blkno[NIADDR];/* disk address of block in buffer */ | ufs2_daddr_t f_blkno[UFS_NIADDR];/* disk address of block in buffer */ | ||||
ufs2_daddr_t f_buf_blkno; /* block number of data block */ | ufs2_daddr_t f_buf_blkno; /* block number of data block */ | ||||
char *f_buf; /* buffer for data block */ | char *f_buf; /* buffer for data block */ | ||||
size_t f_buf_size; /* size of data block */ | size_t f_buf_size; /* size of data block */ | ||||
}; | }; | ||||
#define DIP(fp, field) \ | #define DIP(fp, field) \ | ||||
((fp)->f_fs->fs_magic == FS_UFS1_MAGIC ? \ | ((fp)->f_fs->fs_magic == FS_UFS1_MAGIC ? \ | ||||
(fp)->f_di.di1.field : (fp)->f_di.di2.field) | (fp)->f_di.di1.field : (fp)->f_di.di2.field) | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | fp->f_di.di2 = ((struct ufs2_dinode *)buf) | ||||
[ino_to_fsbo(fs, inumber)]; | [ino_to_fsbo(fs, inumber)]; | ||||
/* | /* | ||||
* Clear out the old buffers | * Clear out the old buffers | ||||
*/ | */ | ||||
{ | { | ||||
int level; | int level; | ||||
for (level = 0; level < NIADDR; level++) | for (level = 0; level < UFS_NIADDR; level++) | ||||
fp->f_blkno[level] = -1; | fp->f_blkno[level] = -1; | ||||
fp->f_buf_blkno = -1; | fp->f_buf_blkno = -1; | ||||
} | } | ||||
fp->f_seekp = 0; | fp->f_seekp = 0; | ||||
out: | out: | ||||
free(buf); | free(buf); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
Show All 13 Lines | block_map(f, file_block, disk_block_p) | ||||
int level; | int level; | ||||
int idx; | int idx; | ||||
ufs2_daddr_t ind_block_num; | ufs2_daddr_t ind_block_num; | ||||
int rc; | int rc; | ||||
/* | /* | ||||
* Index structure of an inode: | * Index structure of an inode: | ||||
* | * | ||||
* di_db[0..NDADDR-1] hold block numbers for blocks | * di_db[0..UFS_NDADDR-1] hold block numbers for blocks | ||||
* 0..NDADDR-1 | * 0..UFS_NDADDR-1 | ||||
* | * | ||||
* di_ib[0] index block 0 is the single indirect block | * di_ib[0] index block 0 is the single indirect block | ||||
* holds block numbers for blocks | * holds block numbers for blocks | ||||
* NDADDR .. NDADDR + NINDIR(fs)-1 | * UFS_NDADDR .. UFS_NDADDR + NINDIR(fs)-1 | ||||
* | * | ||||
* di_ib[1] index block 1 is the double indirect block | * di_ib[1] index block 1 is the double indirect block | ||||
* holds block numbers for INDEX blocks for blocks | * holds block numbers for INDEX blocks for blocks | ||||
* NDADDR + NINDIR(fs) .. | * UFS_NDADDR + NINDIR(fs) .. | ||||
* NDADDR + NINDIR(fs) + NINDIR(fs)**2 - 1 | * UFS_NDADDR + NINDIR(fs) + NINDIR(fs)**2 - 1 | ||||
* | * | ||||
* di_ib[2] index block 2 is the triple indirect block | * di_ib[2] index block 2 is the triple indirect block | ||||
* holds block numbers for double-indirect | * holds block numbers for double-indirect | ||||
* blocks for blocks | * blocks for blocks | ||||
* NDADDR + NINDIR(fs) + NINDIR(fs)**2 .. | * UFS_NDADDR + NINDIR(fs) + NINDIR(fs)**2 .. | ||||
* NDADDR + NINDIR(fs) + NINDIR(fs)**2 | * UFS_NDADDR + NINDIR(fs) + NINDIR(fs)**2 | ||||
* + NINDIR(fs)**3 - 1 | * + NINDIR(fs)**3 - 1 | ||||
*/ | */ | ||||
if (file_block < NDADDR) { | if (file_block < UFS_NDADDR) { | ||||
/* Direct block. */ | /* Direct block. */ | ||||
*disk_block_p = DIP(fp, di_db[file_block]); | *disk_block_p = DIP(fp, di_db[file_block]); | ||||
return (0); | return (0); | ||||
} | } | ||||
file_block -= NDADDR; | file_block -= UFS_NDADDR; | ||||
/* | /* | ||||
* nindir[0] = NINDIR | * nindir[0] = NINDIR | ||||
* nindir[1] = NINDIR**2 | * nindir[1] = NINDIR**2 | ||||
* nindir[2] = NINDIR**3 | * nindir[2] = NINDIR**3 | ||||
* etc | * etc | ||||
*/ | */ | ||||
for (level = 0; level < NIADDR; level++) { | for (level = 0; level < UFS_NIADDR; level++) { | ||||
if (file_block < fp->f_nindir[level]) | if (file_block < fp->f_nindir[level]) | ||||
break; | break; | ||||
file_block -= fp->f_nindir[level]; | file_block -= fp->f_nindir[level]; | ||||
} | } | ||||
if (level == NIADDR) { | if (level == UFS_NIADDR) { | ||||
/* Block number too high */ | /* Block number too high */ | ||||
return (EFBIG); | return (EFBIG); | ||||
} | } | ||||
ind_block_num = DIP(fp, di_ib[level]); | ind_block_num = DIP(fp, di_ib[level]); | ||||
for (; level >= 0; level--) { | for (; level >= 0; level--) { | ||||
if (ind_block_num == 0) { | if (ind_block_num == 0) { | ||||
▲ Show 20 Lines • Show All 280 Lines • ▼ Show 20 Lines | ufs_open(upath, f) | ||||
/* | /* | ||||
* Calculate indirect block levels. | * Calculate indirect block levels. | ||||
*/ | */ | ||||
{ | { | ||||
ufs2_daddr_t mult; | ufs2_daddr_t mult; | ||||
int level; | int level; | ||||
mult = 1; | mult = 1; | ||||
for (level = 0; level < NIADDR; level++) { | for (level = 0; level < UFS_NIADDR; level++) { | ||||
mult *= NINDIR(fs); | mult *= NINDIR(fs); | ||||
fp->f_nindir[level] = mult; | fp->f_nindir[level] = mult; | ||||
} | } | ||||
} | } | ||||
inumber = ROOTINO; | inumber = UFS_ROOTINO; | ||||
if ((rc = read_inode(inumber, f)) != 0) | if ((rc = read_inode(inumber, f)) != 0) | ||||
goto out; | goto out; | ||||
cp = path = strdup(upath); | cp = path = strdup(upath); | ||||
if (path == NULL) { | if (path == NULL) { | ||||
rc = ENOMEM; | rc = ENOMEM; | ||||
goto out; | goto out; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | if ((DIP(fp, di_mode) & IFMT) == IFLNK) { | ||||
/* | /* | ||||
* If relative pathname, restart at parent directory. | * If relative pathname, restart at parent directory. | ||||
* If absolute pathname, restart at root. | * If absolute pathname, restart at root. | ||||
*/ | */ | ||||
cp = namebuf; | cp = namebuf; | ||||
if (*cp != '/') | if (*cp != '/') | ||||
inumber = parent_inumber; | inumber = parent_inumber; | ||||
else | else | ||||
inumber = (ino_t)ROOTINO; | inumber = (ino_t)UFS_ROOTINO; | ||||
if ((rc = read_inode(inumber, f)) != 0) | if ((rc = read_inode(inumber, f)) != 0) | ||||
goto out; | goto out; | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* Found terminal component. | * Found terminal component. | ||||
Show All 20 Lines | |||||
{ | { | ||||
struct file *fp = (struct file *)f->f_fsdata; | struct file *fp = (struct file *)f->f_fsdata; | ||||
int level; | int level; | ||||
f->f_fsdata = (void *)0; | f->f_fsdata = (void *)0; | ||||
if (fp == (struct file *)0) | if (fp == (struct file *)0) | ||||
return (0); | return (0); | ||||
for (level = 0; level < NIADDR; level++) { | for (level = 0; level < UFS_NIADDR; level++) { | ||||
if (fp->f_blk[level]) | if (fp->f_blk[level]) | ||||
free(fp->f_blk[level]); | free(fp->f_blk[level]); | ||||
} | } | ||||
if (fp->f_buf) | if (fp->f_buf) | ||||
free(fp->f_buf); | free(fp->f_buf); | ||||
free(fp->f_fs); | free(fp->f_fs); | ||||
free(fp); | free(fp); | ||||
return (0); | return (0); | ||||
▲ Show 20 Lines • Show All 146 Lines • Show Last 20 Lines |