Date: Thu, 28 Jan 1999 06:56:29 +0200 (SAT) From: Robert Nordier <rnordier@nordier.com> To: jplevyak@inktomi.com (John Plevyak) Cc: freebsd-hackers@FreeBSD.ORG Subject: Re: raw devices and disk geometry Message-ID: <199901280456.GAA01103@ceia.nordier.com> In-Reply-To: <19990127112021.A13567@proxydev.inktomi.com> from John Plevyak at "Jan 27, 99 11:20:21 am"
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
It's /dev/rwd2s4c (unit, slice, partition), but the principle's
the same.
>
> Not pretty, but it works so long as nobody changes the format of
> device names.
It's the standard BSD way (in userland). Device naming is not
arbitrary but has a rigid format in order to make the internal
information accessible to utilities precisely to support this
approach.
>
> > > 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?
Without going into design decisions, va_size (or, rather, st_size in
the external sys/stat.h interface) is explicitly described in standards
as defined only for regular files.
--
Robert Nordier
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?199901280456.GAA01103>
