ufs.c (39529) | ufs.c (39665) |
---|---|
1/* $NetBSD: ufs.c,v 1.20 1998/03/01 07:15:39 ross Exp $ */ 2 3/*- 4 * Copyright (c) 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * The Mach Operating System project at Carnegie-Mellon University. --- 70 unchanged lines hidden (view full) --- 79static int ufs_read(struct open_file *f, void *buf, size_t size, size_t *resid); 80static off_t ufs_seek(struct open_file *f, off_t offset, int where); 81static int ufs_stat(struct open_file *f, struct stat *sb); 82 83struct fs_ops ufs_fsops = { 84 "ufs", ufs_open, ufs_close, ufs_read, null_write, ufs_seek, ufs_stat 85}; 86 | 1/* $NetBSD: ufs.c,v 1.20 1998/03/01 07:15:39 ross Exp $ */ 2 3/*- 4 * Copyright (c) 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * The Mach Operating System project at Carnegie-Mellon University. --- 70 unchanged lines hidden (view full) --- 79static int ufs_read(struct open_file *f, void *buf, size_t size, size_t *resid); 80static off_t ufs_seek(struct open_file *f, off_t offset, int where); 81static int ufs_stat(struct open_file *f, struct stat *sb); 82 83struct fs_ops ufs_fsops = { 84 "ufs", ufs_open, ufs_close, ufs_read, null_write, ufs_seek, ufs_stat 85}; 86 |
87 | |
88/* 89 * In-core open file. 90 */ 91struct file { 92 off_t f_seekp; /* seek pointer */ 93 struct fs *f_fs; /* pointer to super-block */ 94 struct dinode f_di; /* copy of on-disk inode */ 95 int f_nindir[NIADDR]; --- 12 unchanged lines hidden (view full) --- 108static int read_inode(ino_t, struct open_file *); 109static int block_map(struct open_file *, daddr_t, daddr_t *); 110static int buf_read_file(struct open_file *, char **, size_t *); 111static int search_directory(char *, struct open_file *, ino_t *); 112#ifdef COMPAT_UFS 113static void ffs_oldfscompat(struct fs *); 114#endif 115 | 87/* 88 * In-core open file. 89 */ 90struct file { 91 off_t f_seekp; /* seek pointer */ 92 struct fs *f_fs; /* pointer to super-block */ 93 struct dinode f_di; /* copy of on-disk inode */ 94 int f_nindir[NIADDR]; --- 12 unchanged lines hidden (view full) --- 107static int read_inode(ino_t, struct open_file *); 108static int block_map(struct open_file *, daddr_t, daddr_t *); 109static int buf_read_file(struct open_file *, char **, size_t *); 110static int search_directory(char *, struct open_file *, ino_t *); 111#ifdef COMPAT_UFS 112static void ffs_oldfscompat(struct fs *); 113#endif 114 |
116static void *buffers4 = 0; 117static void *buffers8 = 0; 118 119static void * 120getbuf(size_t size) 121{ 122 void *p = 0; 123 if (size == 8192 && buffers8) { 124 p = buffers8; 125 buffers8 = *(void **) p; 126 } 127 if (size == 4096 && buffers4) { 128 p = buffers4; 129 buffers4 = *(void **) p; 130 } 131 if (!p) 132 p = malloc(size); 133 return p; 134} 135 136static void 137relbuf(void *p, size_t size) 138{ 139 if (size == 8192) { 140 *(void**) p = buffers8; 141 buffers8 = p; 142 } else if (size == 4096) { 143 *(void**) p = buffers4; 144 buffers8 = p; 145 } else 146 free(p); 147} 148 | |
149/* 150 * Read a new inode into a file structure. 151 */ 152static int 153read_inode(inumber, f) 154 ino_t inumber; 155 struct open_file *f; 156{ 157 register struct file *fp = (struct file *)f->f_fsdata; 158 register struct fs *fs = fp->f_fs; 159 char *buf; 160 size_t rsize; 161 int rc; 162 | 115/* 116 * Read a new inode into a file structure. 117 */ 118static int 119read_inode(inumber, f) 120 ino_t inumber; 121 struct open_file *f; 122{ 123 register struct file *fp = (struct file *)f->f_fsdata; 124 register struct fs *fs = fp->f_fs; 125 char *buf; 126 size_t rsize; 127 int rc; 128 |
129 if (fs == NULL) 130 panic("fs == NULL"); 131 |
|
163 /* 164 * Read inode and save it. 165 */ | 132 /* 133 * Read inode and save it. 134 */ |
166 buf = getbuf(fs->fs_bsize); | 135 buf = malloc(fs->fs_bsize); |
167 twiddle(); 168 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 169 fsbtodb(fs, ino_to_fsba(fs, inumber)), fs->fs_bsize, 170 buf, &rsize); 171 if (rc) 172 goto out; 173 if (rsize != fs->fs_bsize) { 174 rc = EIO; --- 13 unchanged lines hidden (view full) --- 188 { 189 register int level; 190 191 for (level = 0; level < NIADDR; level++) 192 fp->f_blkno[level] = -1; 193 fp->f_buf_blkno = -1; 194 } 195out: | 136 twiddle(); 137 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 138 fsbtodb(fs, ino_to_fsba(fs, inumber)), fs->fs_bsize, 139 buf, &rsize); 140 if (rc) 141 goto out; 142 if (rsize != fs->fs_bsize) { 143 rc = EIO; --- 13 unchanged lines hidden (view full) --- 157 { 158 register int level; 159 160 for (level = 0; level < NIADDR; level++) 161 fp->f_blkno[level] = -1; 162 fp->f_buf_blkno = -1; 163 } 164out: |
196 relbuf(buf, fs->fs_bsize); | 165 free(buf); |
197 return (rc); 198} 199 200/* 201 * Given an offset in a file, find the disk block number that 202 * contains that block. 203 */ 204static int --- 63 unchanged lines hidden (view full) --- 268 if (ind_block_num == 0) { 269 *disk_block_p = 0; /* missing */ 270 return (0); 271 } 272 273 if (fp->f_blkno[level] != ind_block_num) { 274 if (fp->f_blk[level] == (char *)0) 275 fp->f_blk[level] = | 166 return (rc); 167} 168 169/* 170 * Given an offset in a file, find the disk block number that 171 * contains that block. 172 */ 173static int --- 63 unchanged lines hidden (view full) --- 237 if (ind_block_num == 0) { 238 *disk_block_p = 0; /* missing */ 239 return (0); 240 } 241 242 if (fp->f_blkno[level] != ind_block_num) { 243 if (fp->f_blk[level] == (char *)0) 244 fp->f_blk[level] = |
276 getbuf(fs->fs_bsize); | 245 malloc(fs->fs_bsize); |
277 twiddle(); 278 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 279 fsbtodb(fp->f_fs, ind_block_num), 280 fs->fs_bsize, 281 fp->f_blk[level], 282 &fp->f_blksize[level]); 283 if (rc) 284 return (rc); --- 41 unchanged lines hidden (view full) --- 326 block_size = dblksize(fs, &fp->f_di, file_block); 327 328 if (file_block != fp->f_buf_blkno) { 329 rc = block_map(f, file_block, &disk_block); 330 if (rc) 331 return (rc); 332 333 if (fp->f_buf == (char *)0) | 246 twiddle(); 247 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 248 fsbtodb(fp->f_fs, ind_block_num), 249 fs->fs_bsize, 250 fp->f_blk[level], 251 &fp->f_blksize[level]); 252 if (rc) 253 return (rc); --- 41 unchanged lines hidden (view full) --- 295 block_size = dblksize(fs, &fp->f_di, file_block); 296 297 if (file_block != fp->f_buf_blkno) { 298 rc = block_map(f, file_block, &disk_block); 299 if (rc) 300 return (rc); 301 302 if (fp->f_buf == (char *)0) |
334 fp->f_buf = getbuf(fs->fs_bsize); | 303 fp->f_buf = malloc(fs->fs_bsize); |
335 336 if (disk_block == 0) { 337 bzero(fp->f_buf, block_size); 338 fp->f_buf_size = block_size; 339 } else { 340 twiddle(); 341 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 342 fsbtodb(fs, disk_block), --- 94 unchanged lines hidden (view full) --- 437 char *path = NULL; 438 439 /* allocate file system specific data structure */ 440 fp = malloc(sizeof(struct file)); 441 bzero(fp, sizeof(struct file)); 442 f->f_fsdata = (void *)fp; 443 444 /* allocate space and read super block */ | 304 305 if (disk_block == 0) { 306 bzero(fp->f_buf, block_size); 307 fp->f_buf_size = block_size; 308 } else { 309 twiddle(); 310 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 311 fsbtodb(fs, disk_block), --- 94 unchanged lines hidden (view full) --- 406 char *path = NULL; 407 408 /* allocate file system specific data structure */ 409 fp = malloc(sizeof(struct file)); 410 bzero(fp, sizeof(struct file)); 411 f->f_fsdata = (void *)fp; 412 413 /* allocate space and read super block */ |
445 fs = getbuf(SBSIZE); | 414 fs = malloc(SBSIZE); |
446 fp->f_fs = fs; 447 twiddle(); 448 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 449 SBLOCK, SBSIZE, (char *)fs, &buf_size); 450 if (rc) 451 goto out; 452 453 if (buf_size != SBSIZE || fs->fs_magic != FS_MAGIC || --- 104 unchanged lines hidden (view full) --- 558 /* 559 * Read file for symbolic link 560 */ 561 size_t buf_size; 562 daddr_t disk_block; 563 register struct fs *fs = fp->f_fs; 564 565 if (!buf) | 415 fp->f_fs = fs; 416 twiddle(); 417 rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 418 SBLOCK, SBSIZE, (char *)fs, &buf_size); 419 if (rc) 420 goto out; 421 422 if (buf_size != SBSIZE || fs->fs_magic != FS_MAGIC || --- 104 unchanged lines hidden (view full) --- 527 /* 528 * Read file for symbolic link 529 */ 530 size_t buf_size; 531 daddr_t disk_block; 532 register struct fs *fs = fp->f_fs; 533 534 if (!buf) |
566 buf = getbuf(fs->fs_bsize); | 535 buf = malloc(fs->fs_bsize); |
567 rc = block_map(f, (daddr_t)0, &disk_block); 568 if (rc) 569 goto out; 570 571 twiddle(); 572 rc = (f->f_dev->dv_strategy)(f->f_devdata, 573 F_READ, fsbtodb(fs, disk_block), 574 fs->fs_bsize, buf, &buf_size); --- 19 unchanged lines hidden (view full) --- 594 } 595 596 /* 597 * Found terminal component. 598 */ 599 rc = 0; 600out: 601 if (buf) | 536 rc = block_map(f, (daddr_t)0, &disk_block); 537 if (rc) 538 goto out; 539 540 twiddle(); 541 rc = (f->f_dev->dv_strategy)(f->f_devdata, 542 F_READ, fsbtodb(fs, disk_block), 543 fs->fs_bsize, buf, &buf_size); --- 19 unchanged lines hidden (view full) --- 563 } 564 565 /* 566 * Found terminal component. 567 */ 568 rc = 0; 569out: 570 if (buf) |
602 relbuf(buf, fs->fs_bsize); | 571 free(buf); |
603 if (path) 604 free(path); 605 if (rc) { 606 if (fp->f_buf) | 572 if (path) 573 free(path); 574 if (rc) { 575 if (fp->f_buf) |
607 relbuf(fp->f_buf, fs->fs_bsize); | 576 free(fp->f_buf); |
608 free(fp->f_fs); 609 free(fp); 610 } 611 return (rc); 612} 613 614static int 615ufs_close(f) 616 struct open_file *f; 617{ 618 register struct file *fp = (struct file *)f->f_fsdata; | 577 free(fp->f_fs); 578 free(fp); 579 } 580 return (rc); 581} 582 583static int 584ufs_close(f) 585 struct open_file *f; 586{ 587 register struct file *fp = (struct file *)f->f_fsdata; |
619 struct fs *fs = fp->f_fs; | |
620 int level; 621 622 f->f_fsdata = (void *)0; 623 if (fp == (struct file *)0) 624 return (0); 625 626 for (level = 0; level < NIADDR; level++) { 627 if (fp->f_blk[level]) | 588 int level; 589 590 f->f_fsdata = (void *)0; 591 if (fp == (struct file *)0) 592 return (0); 593 594 for (level = 0; level < NIADDR; level++) { 595 if (fp->f_blk[level]) |
628 relbuf(fp->f_blk[level], fs->fs_bsize); | 596 free(fp->f_blk[level]); |
629 } 630 if (fp->f_buf) | 597 } 598 if (fp->f_buf) |
631 relbuf(fp->f_buf, fs->fs_bsize); 632 relbuf(fp->f_fs, SBSIZE); | 599 free(fp->f_buf); 600 free(fp->f_fs); |
633 free(fp); 634 return (0); 635} 636 637/* 638 * Copy a portion of a file into kernel memory. 639 * Cross block boundaries when necessary. 640 */ --- 105 unchanged lines hidden --- | 601 free(fp); 602 return (0); 603} 604 605/* 606 * Copy a portion of a file into kernel memory. 607 * Cross block boundaries when necessary. 608 */ --- 105 unchanged lines hidden --- |