From 159c18b98bd316fb4cac390c631d13bd34f7a130 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Tue, 19 Sep 2017 12:50:13 +0900 Subject: [PATCH] hfi1/ioctl: only forward ioctl if hfi1_file_ioctl didn't handle it Conflicts: kernel/syscall.c --- kernel/file_ops.c | 4 ++-- kernel/syscall.c | 22 +++++++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/kernel/file_ops.c b/kernel/file_ops.c index e75ee0f9..730386ab 100644 --- a/kernel/file_ops.c +++ b/kernel/file_ops.c @@ -424,7 +424,7 @@ long hfi1_file_ioctl(void *private_data, unsigned int cmd, struct hfi1_ctxtdata *uctxt = fd->uctxt; struct hfi1_tid_info tinfo; unsigned long addr; - int ret = 0; + int ret = -ENOTSUPP; hfi1_cdbg(IOCTL, "IOCTL recv: 0x%x", cmd); if (cmd != HFI1_IOCTL_ASSIGN_CTXT && @@ -649,7 +649,7 @@ long hfi1_file_ioctl(void *private_data, unsigned int cmd, break; default: - return -EINVAL; + return -ENOTSUPP; } return ret; } diff --git a/kernel/syscall.c b/kernel/syscall.c index ebb8a7ad..a8d1aa15 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -3157,24 +3157,28 @@ SYSCALL_DECLARE(ioctl) break; ihk_mc_spinlock_unlock(&proc->mckfd_lock, irqstate); - if(fdp && fdp->ioctl_cb){ - //kprintf("ioctl: found system fd %d\n", fd); - rc = fdp->ioctl_cb(fdp, ctx); - } - else{ - rc = syscall_generic_forwarding(__NR_ioctl, ctx); - } - if (private_data) { extern long hfi1_file_ioctl(void *private_data, unsigned int cmd, unsigned long arg, unsigned long t_s); - hfi1_file_ioctl(private_data, + rc = hfi1_file_ioctl(private_data, ihk_mc_syscall_arg1(ctx), ihk_mc_syscall_arg2(ctx), t_s); + /* continue forwarding iff hfi1 didn't handle it */ + // TODO: improve heuristics? + if (rc != -ENOTSUPP) + return rc; + } + + if (fdp && fdp->ioctl_cb) { + //kprintf("ioctl: found system fd %d\n", fd); + rc = fdp->ioctl_cb(fdp, ctx); + } + else { + rc = syscall_generic_forwarding(__NR_ioctl, ctx); } return rc;