Deleted Added
full compact
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 ---