diff options
author | nsayer <nsayer@FreeBSD.org> | 2000-03-09 15:14:14 +0000 |
---|---|---|
committer | nsayer <nsayer@FreeBSD.org> | 2000-03-09 15:14:14 +0000 |
commit | 1ed48e03edb7a3a5fdf30c86c348d76918682802 (patch) | |
tree | 9f2700e504084f7e81f75454bf94252e393b8a9e /sys/compat/linux | |
parent | 4bd515c32ffabb15de94b74baf8b0f8667f7af57 (diff) | |
download | FreeBSD-src-1ed48e03edb7a3a5fdf30c86c348d76918682802.zip FreeBSD-src-1ed48e03edb7a3a5fdf30c86c348d76918682802.tar.gz |
Implement Linux BLKGETSIZE ioctl, and open the door to implementing
other BLK.* ioctls should the desire arize.
Approved by: jkh (via dufault)
Diffstat (limited to 'sys/compat/linux')
-rw-r--r-- | sys/compat/linux/linux_ioctl.c | 23 | ||||
-rw-r--r-- | sys/compat/linux/linux_ioctl.h | 19 |
2 files changed, 42 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c index a4747c6..cd532e6 100644 --- a/sys/compat/linux/linux_ioctl.c +++ b/sys/compat/linux/linux_ioctl.c @@ -46,6 +46,7 @@ #include <net/if_types.h> #include <sys/sockio.h> #include <sys/soundcard.h> +#include <sys/disklabel.h> #include <machine/console.h> @@ -55,12 +56,15 @@ #include <i386/linux/linux_proto.h> #include <i386/linux/linux_util.h> +static linux_ioctl_function_t linux_ioctl_disk; static linux_ioctl_function_t linux_ioctl_cdrom; static linux_ioctl_function_t linux_ioctl_console; static linux_ioctl_function_t linux_ioctl_socket; static linux_ioctl_function_t linux_ioctl_sound; static linux_ioctl_function_t linux_ioctl_termio; +static struct linux_ioctl_handler disk_handler = +{ linux_ioctl_disk, LINUX_IOCTL_DISK_MIN, LINUX_IOCTL_DISK_MAX }; static struct linux_ioctl_handler cdrom_handler = { linux_ioctl_cdrom, LINUX_IOCTL_CDROM_MIN, LINUX_IOCTL_CDROM_MAX }; static struct linux_ioctl_handler console_handler = @@ -72,6 +76,7 @@ static struct linux_ioctl_handler sound_handler = static struct linux_ioctl_handler termio_handler = { linux_ioctl_termio, LINUX_IOCTL_TERMIO_MIN, LINUX_IOCTL_TERMIO_MAX }; +DATA_SET(linux_ioctl_handler_set, disk_handler); DATA_SET(linux_ioctl_handler_set, cdrom_handler); DATA_SET(linux_ioctl_handler_set, console_handler); DATA_SET(linux_ioctl_handler_set, socket_handler); @@ -88,6 +93,24 @@ struct handler_element static TAILQ_HEAD(, handler_element) handlers = TAILQ_HEAD_INITIALIZER(handlers); +static int +linux_ioctl_disk(struct proc *p, struct linux_ioctl_args *args) +{ + struct file *fp = p->p_fd->fd_ofiles[args->fd]; + int error; + struct disklabel dl; + + switch (args->cmd & 0xffff) { + case LINUX_BLKGETSIZE: + error = fo_ioctl(fp, DIOCGDINFO, (caddr_t)&dl, p); + if (error) + return (error); + return copyout(&(dl.d_secperunit), (caddr_t)args->arg, sizeof(dl.d_secperunit)); + break; + } + return (ENOIOCTL); +} + /* * termio related ioctls */ diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h index fd637b4..1ed4901 100644 --- a/sys/compat/linux/linux_ioctl.h +++ b/sys/compat/linux/linux_ioctl.h @@ -32,6 +32,25 @@ #define _LINUX_IOCTL_H_ /* + * disk + */ +#define LINUX_BLKROSET 0x125d +#define LINUX_BLKROGET 0x125e +#define LINUX_BLKRRPART 0x125f +#define LINUX_BLKGETSIZE 0x1260 +#define LINUX_BLKFLSBUF 0x1261 +#define LINUX_BLKRASET 0x1262 +#define LINUX_BLKRAGET 0x1263 +#define LINUX_BLKFRASET 0x1264 +#define LINUX_BLKFRAGET 0x1265 +#define LINUX_BLKSECTSET 0x1266 +#define LINUX_BLKSECTGET 0x1267 +#define LINUX_BLKSSZGET 0x1268 + +#define LINUX_IOCTL_DISK_MIN LINUX_BLKROSET +#define LINUX_IOCTL_DISK_MAX LINUX_BLKSSZGET + +/* * cdrom */ #define LINUX_CDROMPAUSE 0x5301 |