Changeset View
Changeset View
Standalone View
Standalone View
head/usr.sbin/makefs/ffs/buf.c
/* $NetBSD: buf.c,v 1.12 2004/06/20 22:20:18 jmc Exp $ */ | /* $NetBSD: buf.c,v 1.13 2004/06/20 22:20:18 jmc Exp $ */ | ||||
/* | /* | ||||
* Copyright (c) 2001 Wasabi Systems, Inc. | * Copyright (c) 2001 Wasabi Systems, Inc. | ||||
* All rights reserved. | * All rights reserved. | ||||
* | * | ||||
* Written by Luke Mewburn for Wasabi Systems, Inc. | * Written by Luke Mewburn for Wasabi Systems, Inc. | ||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
#include "ffs/buf.h" | #include "ffs/buf.h" | ||||
#include "ffs/ufs_inode.h" | #include "ffs/ufs_inode.h" | ||||
extern int sectorsize; /* XXX: from ffs.c & mkfs.c */ | extern int sectorsize; /* XXX: from ffs.c & mkfs.c */ | ||||
TAILQ_HEAD(buftailhead,buf) buftail; | TAILQ_HEAD(buftailhead,buf) buftail; | ||||
int | int | ||||
bread(int fd, struct fs *fs, daddr_t blkno, int size, struct buf **bpp) | bread(struct vnode *vp, daddr_t blkno, int size, struct ucred *u1 __unused, | ||||
struct buf **bpp) | |||||
{ | { | ||||
off_t offset; | off_t offset; | ||||
ssize_t rv; | ssize_t rv; | ||||
struct fs *fs = vp->fs; | |||||
assert (fs != NULL); | assert (fs != NULL); | ||||
assert (bpp != NULL); | assert (bpp != NULL); | ||||
if (debug & DEBUG_BUF_BREAD) | if (debug & DEBUG_BUF_BREAD) | ||||
printf("bread: fs %p blkno %lld size %d\n", | printf("bread: fs %p blkno %lld size %d\n", | ||||
fs, (long long)blkno, size); | fs, (long long)blkno, size); | ||||
*bpp = getblk(fd, fs, blkno, size); | *bpp = getblk(vp, blkno, size, 0, 0, 0); | ||||
offset = (*bpp)->b_blkno * sectorsize; /* XXX */ | offset = (*bpp)->b_blkno * sectorsize; /* XXX */ | ||||
if (debug & DEBUG_BUF_BREAD) | if (debug & DEBUG_BUF_BREAD) | ||||
printf("bread: bp %p blkno %lld offset %lld bcount %ld\n", | printf("bread: bp %p blkno %lld offset %lld bcount %ld\n", | ||||
(*bpp), (long long)(*bpp)->b_blkno, (long long) offset, | (*bpp), (long long)(*bpp)->b_blkno, (long long) offset, | ||||
(*bpp)->b_bcount); | (*bpp)->b_bcount); | ||||
if (lseek((*bpp)->b_fd, offset, SEEK_SET) == -1) | if (lseek((*bpp)->b_fd, offset, SEEK_SET) == -1) | ||||
err(1, "bread: lseek %lld (%lld)", | err(1, "bread: lseek %lld (%lld)", | ||||
(long long)(*bpp)->b_blkno, (long long)offset); | (long long)(*bpp)->b_blkno, (long long)offset); | ||||
rv = read((*bpp)->b_fd, (*bpp)->b_data, (*bpp)->b_bcount); | rv = read((*bpp)->b_fd, (*bpp)->b_data, (*bpp)->b_bcount); | ||||
if (debug & DEBUG_BUF_BREAD) | if (debug & DEBUG_BUF_BREAD) | ||||
printf("bread: read %ld (%lld) returned %d\n", | printf("bread: read %ld (%lld) returned %d\n", | ||||
(*bpp)->b_bcount, (long long)offset, (int)rv); | (*bpp)->b_bcount, (long long)offset, (int)rv); | ||||
if (rv == -1) /* read error */ | if (rv == -1) /* read error */ | ||||
err(1, "bread: read %ld (%lld) returned %d", | err(1, "bread: read %ld (%lld) returned %d", | ||||
(*bpp)->b_bcount, (long long)offset, (int)rv); | (*bpp)->b_bcount, (long long)offset, (int)rv); | ||||
else if (rv != (*bpp)->b_bcount) /* short read */ | else if (rv != (*bpp)->b_bcount) /* short read */ | ||||
err(1, "bread: read %ld (%lld) returned %d", | err(1, "bread: read %ld (%lld) returned %d", | ||||
(*bpp)->b_bcount, (long long)offset, (int)rv); | (*bpp)->b_bcount, (long long)offset, (int)rv); | ||||
else | else | ||||
return (0); | return (0); | ||||
} | } | ||||
void | void | ||||
brelse(struct buf *bp) | brelse(struct buf *bp, int u1 __unused) | ||||
{ | { | ||||
assert (bp != NULL); | assert (bp != NULL); | ||||
assert (bp->b_data != NULL); | assert (bp->b_data != NULL); | ||||
if (bp->b_lblkno < 0) { | if (bp->b_lblkno < 0) { | ||||
/* | /* | ||||
* XXX don't remove any buffers with negative logical block | * XXX don't remove any buffers with negative logical block | ||||
▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | TAILQ_FOREACH(bp, &buftail, b_tailq) { | ||||
printf("\tlblkno %10lld blkno %10lld count %6ld bufsize %6ld\n", | printf("\tlblkno %10lld blkno %10lld count %6ld bufsize %6ld\n", | ||||
(long long)bp->b_lblkno, (long long)bp->b_blkno, | (long long)bp->b_lblkno, (long long)bp->b_blkno, | ||||
bp->b_bcount, bp->b_bufsize); | bp->b_bcount, bp->b_bufsize); | ||||
} | } | ||||
printf("bcleanup: done\n"); | printf("bcleanup: done\n"); | ||||
} | } | ||||
struct buf * | struct buf * | ||||
getblk(int fd, struct fs *fs, daddr_t blkno, int size) | getblk(struct vnode *vp, daddr_t blkno, int size, int u1 __unused, | ||||
int u2 __unused, int u3 __unused) | |||||
{ | { | ||||
static int buftailinitted; | static int buftailinitted; | ||||
struct buf *bp; | struct buf *bp; | ||||
void *n; | void *n; | ||||
int fd = vp->fd; | |||||
struct fs *fs = vp->fs; | |||||
blkno += vp->offset; | |||||
assert (fs != NULL); | assert (fs != NULL); | ||||
if (debug & DEBUG_BUF_GETBLK) | if (debug & DEBUG_BUF_GETBLK) | ||||
printf("getblk: fs %p blkno %lld size %d\n", fs, | printf("getblk: fs %p blkno %lld size %d\n", fs, | ||||
(long long)blkno, size); | (long long)blkno, size); | ||||
bp = NULL; | bp = NULL; | ||||
if (!buftailinitted) { | if (!buftailinitted) { | ||||
if (debug & DEBUG_BUF_GETBLK) | if (debug & DEBUG_BUF_GETBLK) | ||||
Show All 32 Lines |