NAME
disklabel,
readdisklabel,
writedisklabel,
setdisklabel,
bounds_check_with_label —
disk label
management routines
SYNOPSIS
char *
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);
DESCRIPTION
This collection of routines provides a disklabel management interface to kernel
device drivers. These routines are classified as machine- or
architecture-dependent because of restrictions imposed by the machine
architecture and boot-strapping code on the location of the label, or because
cooperation with other operating systems requires specialized conversion code.
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.
SEE ALSO
disklabel(5),
disklabel(8)