summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2009-07-10 10:56:32 -0700
committerBrian Behlendorf <[email protected]>2009-07-10 10:56:32 -0700
commitd3126abe75a6502d55bfa2339b48d4fa263e1b02 (patch)
tree69524df2de86f7030d86687dd96f407b8d2502f4
parent2a734e9c266f5fd31db84153a61263b529167732 (diff)
Add ddi_copyin/ddi_copyout support for fake kernel originated ioctls.
-rw-r--r--include/sys/sunddi.h3
-rw-r--r--module/spl/spl-generic.c27
2 files changed, 30 insertions, 0 deletions
diff --git a/include/sys/sunddi.h b/include/sys/sunddi.h
index 404b14b38..c1773f504 100644
--- a/include/sys/sunddi.h
+++ b/include/sys/sunddi.h
@@ -213,6 +213,9 @@ extern int ddi_strtol(const char *, char **, int, long *);
extern int ddi_strtoull(const char *, char **, int, unsigned long long *);
extern int ddi_strtoll(const char *, char **, int, long long *);
+extern int ddi_copyin(const void *from, void *to, size_t len, int flags);
+extern int ddi_copyout(const void *from, void *to, size_t len, int flags);
+
static __inline__ void ddi_report_dev(dev_info_t *d) { }
static __inline__ void ddi_prop_remove_all(dev_info_t *dip) { }
diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c
index 568d40635..b81dabc56 100644
--- a/module/spl/spl-generic.c
+++ b/module/spl/spl-generic.c
@@ -35,6 +35,7 @@
#include <sys/proc.h>
#include <sys/kstat.h>
#include <sys/utsname.h>
+#include <sys/file.h>
#include <linux/kmod.h>
#ifdef DEBUG_SUBSYSTEM
@@ -226,6 +227,32 @@ EXPORT_SYMBOL(ddi_strtol);
EXPORT_SYMBOL(ddi_strtoll);
EXPORT_SYMBOL(ddi_strtoull);
+int
+ddi_copyin(const void *from, void *to, size_t len, int flags)
+{
+ /* Fake ioctl() issued by kernel, 'from' is a kernel address */
+ if (flags & FKIOCTL) {
+ memcpy(to, from, len);
+ return 0;
+ }
+
+ return copyin(from, to, len);
+}
+EXPORT_SYMBOL(ddi_copyin);
+
+int
+ddi_copyout(const void *from, void *to, size_t len, int flags)
+{
+ /* Fake ioctl() issued by kernel, 'from' is a kernel address */
+ if (flags & FKIOCTL) {
+ memcpy(to, from, len);
+ return 0;
+ }
+
+ return copyout(from, to, len);
+}
+EXPORT_SYMBOL(ddi_copyout);
+
struct new_utsname *__utsname(void)
{
#ifdef HAVE_INIT_UTSNAME