Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Jan 1999 11:20:21 -0800
From:      John Plevyak <jplevyak@inktomi.com>
To:        Robert Nordier <rnordier@nordier.com>
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   Re: raw devices and disk geometry
Message-ID:  <19990127112021.A13567@proxydev.inktomi.com>
In-Reply-To: <199901271220.OAA22838@ceia.nordier.com>; from Robert Nordier on Wed, Jan 27, 1999 at 02:19:59PM %2B0200
References:  <19990126140251.G19158@proxydev.inktomi.com> <199901271220.OAA22838@ceia.nordier.com>

next in thread | previous in thread | raw e-mail | index | archive | help
> I think you need to look at the code of an actual utility that does
> this stuff, and that you can also try out.  I'd suggest newfs_msdos(8),
> which will allow you to specify any of
> 
>     o  the whole physical disk
>     o  a slice (what DOS calls a partition)
>     o  a partition (what BSD calls a partition)

Thanx. That code parses the device file name and pulls the
slice and partition from the filename:

  /dev/rwd2cs4
             ^ slice
          ^ partition

Not pretty, but it works so long as nobody changes the format of
device names.

> > Also, why shouldn't lseek work on a device?  Is this something
> > we would like FreeBSD to do, or is the current undefined behavior
> > what we want?  Given that this would solve my problem I would consider
> > making a patch if there was some expectation that it would be accepted.
> 
> You can't expect lseek(fd, 0, SEEK_END) to work as you expect unless
> the file descriptor is associated with a regular file.  For other file
> types, file size information is not available at that level.  "It's
> a UNIX thing," and there's no patching it now.  Size information 
> usually is available -- in the FreeBSD case, via ioctl -- but not very
> portably across UNIX-like systems.

I see that lseek is using vop_getattr to determine the size of the file
via the 'va_size' field which is 0 for devices.

The structure vattr contains:

        u_quad_t        va_size;        /* file size in bytes */
and
        u_quad_t        va_bytes;       /* bytes of disk space held by file */

In the function devfs_getattr in sys/miscfs/devfs_vnops.c
these are both set to file_node->len (0).  While it is clear
that va_bytes should be 0, but there seems to be
no reason for va_size to not be the size of data on the disk
(modula other code which depends on it being 0).

The code would be something like:

	switch (file_node->type) {
        case    DEV_CDEV:
                vap->va_rdev = file_node->by.Cdev.dev;
                vap->va_size = (u_quad_t)(*file_node->by.Cdev.cdevsw.d_size)(vap->va_rdev) << DEV_BSHIFT;
                break;
        case    DEV_BDEV:
                vap->va_rdev = file_node->by.Bdev.dev;
                vap->va_size = (u_quad_t)(*file_node->by.Bdev.cdevsw.d_size)(vap->va_rdev) << DEV_BSHIFT;
                break;
	default:
                vap->va_size = file_node->len;
		break;
	}

Of course someone might be counting on va_size being 0 for devices.

Comments?

john
-- 
John Bradley Plevyak,    PhD,    jplevyak@inktomi.com,     PGP KeyID: 051130BD
Inktomi Corporation,  1900 S. Norfolk Street,  Suite 110,  San Mateo, CA 94403
W:(415)653-2830 F:(415)653-2801 P:(888)491-1332/5103192436.4911332@pagenet.net

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990127112021.A13567>