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
)
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.