Skip to content

Commit

Permalink
Restore support for in-kernel ZFS ioctls
Browse files Browse the repository at this point in the history
In Illumos it is possible to call ioctl functions from within the
kernel by passing the FKIOCTL flag. Neither FreeBSD nor Linux support
that, but it doesn't hurt to keep it around, as all the code is there.

Before this commit it was a dead code and zc_iflags was always zero.
Restore this functionality by allowing to pass a flag to the
zfsdev_ioctl_common() function.

Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by:	Pawel Jakub Dawidek <pawel@dawidek.net>
Closes openzfs#10417
  • Loading branch information
pjd authored and RageLtMan committed May 31, 2021
1 parent 93e7465 commit f3abe76
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 5 deletions.
2 changes: 1 addition & 1 deletion include/sys/zfs_ioctl_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ boolean_t zfs_vfs_held(zfsvfs_t *);
int zfs_vfs_ref(zfsvfs_t **);
void zfs_vfs_rele(zfsvfs_t *);

long zfsdev_ioctl_common(uint_t, zfs_cmd_t *);
long zfsdev_ioctl_common(uint_t, zfs_cmd_t *, int);
int zfsdev_attach(void);
void zfsdev_detach(void);
int zfs_kmod_init(void);
Expand Down
2 changes: 1 addition & 1 deletion module/os/freebsd/zfs/kmod_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ zfsdev_ioctl(struct cdev *dev, ulong_t zcmd, caddr_t arg, int flag,
error = SET_ERROR(EFAULT);
goto out;
}
error = zfsdev_ioctl_common(vecnum, zc);
error = zfsdev_ioctl_common(vecnum, zc, 0);
if (zcl) {
zfs_cmd_zof_to_bsd12(zc, zcl);
rc = copyout(zcl, uaddr, sizeof (*zcl));
Expand Down
2 changes: 1 addition & 1 deletion module/os/linux/zfs/zfs_ioctl_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg)
error = -SET_ERROR(EFAULT);
goto out;
}
error = -zfsdev_ioctl_common(vecnum, zc);
error = -zfsdev_ioctl_common(vecnum, zc, 0);
rc = ddi_copyout(zc, (void *)(uintptr_t)arg, sizeof (zfs_cmd_t), 0);
if (error == 0 && rc != 0)
error = -SET_ERROR(EFAULT);
Expand Down
4 changes: 2 additions & 2 deletions module/zfs/zfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -7375,9 +7375,9 @@ zfsdev_minor_alloc(void)
}

long
zfsdev_ioctl_common(uint_t vecnum, zfs_cmd_t *zc)
zfsdev_ioctl_common(uint_t vecnum, zfs_cmd_t *zc, int flag)
{
int error, cmd, flag = 0;
int error, cmd;
const zfs_ioc_vec_t *vec;
char *saved_poolname = NULL;
nvlist_t *innvl = NULL;
Expand Down

0 comments on commit f3abe76

Please sign in to comment.