DISKLABEL(9) | Kernel Developer's Manual | DISKLABEL(9) |
disklabel
, readdisklabel
,
writedisklabel
, setdisklabel
,
bounds_check_with_label
—
readdisklabel
(dev_t
dev, void (*strat)(struct
buf *), struct disklabel
*lp, struct cpu_disklabel
*clp);
int
writedisklabel
(dev_t
dev, void (*strat)(struct
buf *), struct disklabel
*lp, struct cpu_disklabel
*clp);
int
setdisklabel
(struct
disklabel *olp, struct
disklabel *nlp, u_long
openmask, struct
cpu_disklabel *clp);
int
bounds_check_with_label
(struct
buf *bp, struct disklabel
*lp, int
wlabel);
readdisklabel
() attempts to read a
disklabel from the device identified by dev, using the
device strategy routine passed in strat. Note that a
buffer structure is required to pass to the strategy routine; it needs to be
acquired and parameterized for the intended I/O operation, and disposed of
when the operation has completed. Some fields in the disklabel passed in
lp may be pre-initialized by the caller in order to
meet device driver requirements for the I/O operation initiated to get to
the disklabel data on the medium. In particular, the field
“d_secsize”, if non-zero, is used by
readdisklabel
() to get an appropriately sized buffer
to pass to the device strategy routine. Unspecified fields in
lp should be set to zero. If the medium does not
contain a native disklabel that can be read in directly,
readdisklabel
() may resort to constructing a label
from other machine-dependent information using the provided buffer passed in
the clp argument. If a disk label can not be found or
constructed, a string containing an approximated description of the failure
mode is returned. Otherwise the NULL
string is
returned.
writedisklabel
() stores disk label
information contained in the disk label structure given by
lp on the device identified by
dev. Like readdisklabel
(), it
acquires and sets up an I/O buffer to pass to the strategy routine
strat. writedisklabel
() may
elect to do a machine-dependent conversion of the native disk label
structure (using the buffer pointed at by clp), to
store the disk label onto the medium in a format complying with
architectural constraints. writedisklabel
() returns
0 on success and EINVAL
if the disk label specifies
invalid or inconvertible values. Otherwise, any error condition reported by
the device strategy routine in the buffer's
“b_error” field is returned.
setdisklabel
() checks a proposed new disk
label passed in nlp for some amount of basic sanity.
This includes a check on attempts to change the location, or reduce the
size, of an existing disk partition that is currently in use by the system.
The current disposition of the disk partitions is made available through
olp and openmask, which provide,
respectively, the existing disk label and a bit mask identifying the
partitions that are currently in use. Failure to pass on “basic
sanity”, results in a EINVAL
return value,
while a vetoed update of the partition layout is signaled by a
EBUSY
return value. Otherwise, 0 is returned.
bounds_check_with_label
() is used to check
whether a device transfer described by bp to the
device identified by dev, is properly contained within
a disk partition of the disk with label lp. If this
check fails, bounds_check_with_label
() sets the
buffer's “b_error” field to
EINVAL
, sets the B_ERROR
flag in “b_flags”, and returns -1. If
the argument wlabel is zero, and the transfer is a
write operation, a check is done if the transfer would overwrite (a portion
of) the disklabel area on the medium. If that is the case,
EROFS
is set in
“b_error”, the
B_ERROR
flag is set in
“b_flags”, and -1 is returned. Note that
wlabel should be set to a non-zero value if the
intended operation is expected to install or update the disk label. Programs
that intend to do so using the raw device interface should notify the driver
by using a DIOCWLABEL
ioctl function.
December 26, 1996 | NetBSD 9.0 |