stand: Introduce new dv_parsedev routine

Allow device classes to define a parsing routine. Most device classes
already have these routines, but there's much duplication in their
use. Define an interface for a common routine to parse an individual
device. By convetion, files have the form "[device:]/path/to/file"
where device is optional (filled in to be the value of currdev)
and it starts with the dv_name field of the device, with the rest
of the name up to the device (typically a unit number, but disks
add partition inforation, and other devices may do artibtrary
otehr things).

Sponsored by:		Netflix
Differential Revision:	https://reviews.freebsd.org/D37337
This commit is contained in:
Warner Losh 2022-11-30 15:08:36 -07:00
parent ba11bc368e
commit a0aad69f95
2 changed files with 32 additions and 1 deletions

View File

@ -710,7 +710,9 @@ struct devsw {
int (*dv_ioctl)(struct open_file *f, u_long cmd, void *data);
int (*dv_print)(int verbose);
void (*dv_cleanup)(void);
void (*dv_fmtdev)(struct devdesc *);
char * (*dv_fmtdev)(struct devdesc *);
int (*dv_parsedev)(struct devdesc **dev, const char *devpart,
const char **path);
};
.Ed
.Bl -tag -width ".Fn dv_strategy"
@ -751,6 +753,34 @@ Cleans up any memory used by the device before the next stage is run.
.It Fn dv_fmtdev
Converts the specified devdesc to the canonical string representation
for that device.
.It Fn dv_parsedev
Parses the device portion of a file path.
The
.Dv devpart
will point to the
.Sq tail
of device name, possibly followed by a colon and a path within the device.
The
.Sq tail
is, by convention, the part of the device specification that follows the
.Fa dv_name
part of the string.
So when parsing the string
.Dq disk3p5:/xxx
.Dv devpart
will point to the
.Sq 3
in that string.
The parsing routine is expected to allocate a new
.Dv struct devdesc
or subclass and return it in
.Dv dev
when successful.
This routine should set
.Dv path
to point to the portion of the string after device specification, or
.Dq /xxx
in the earlier example.
.El
.Sh HISTORY
The

View File

@ -160,6 +160,7 @@ struct devsw {
int (*dv_print)(int verbose); /* print device information */
void (*dv_cleanup)(void);
char * (*dv_fmtdev)(struct devdesc *);
int (*dv_parsedev)(struct devdesc **, const char *, const char **);
};
/*