]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
[SPARC]: Fix RTC compat ioctl kernel log spam.
authorChristoph Hellwig <hch@lst.de>
Sat, 12 Nov 2005 20:10:54 +0000 (12:10 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 12 Nov 2005 20:10:54 +0000 (12:10 -0800)
On Fri, Nov 11, 2005 at 12:58:40PM -0800, David S. Miller wrote:
>
> This change:
>
> diff-tree 8ca2bdc7a98b9584ac5f640761501405154171c7 (from feee207e44d3643d19e648aAuthor: Christoph Hellwig <hch@lst.de>
> Date:   Wed Nov 9 12:07:18 2005 -0800
>
>     [SPARC] sbus rtc: implement ->compat_ioctl
>
>     Signed-off-by: Christoph Hellwig <hch@lst.de>
>     Signed-off-by: David S. Miller <davem@davemloft.net>
>
> results in the console now getting spewed on sparc64 systems
> with messages like:
>
> [   11.968298] ioctl32(hwclock:464): Unknown cmd fd(3) cmd(401c7014){00} arg(efc
> What's happening is hwclock tries first the SBUS rtc device ioctls
> then the normal rtc driver ones.
>
> So things actually worked better when we had the SBUS rtc compat ioctl
> directly handled via the generic compat ioctl code.
>
> There are _so_ many rtc drivers in the kernel implementing the
> generic rtc ioctls that I don't think putting a ->compat_ioctl
> into all of them to fix this problem is feasible.  Unless we
> write a single rtc_compat_ioctl(), export it to modules, and hook
> it into all of those somehow.
>
> But even that doesn't appear to have any pretty implementation.
>
> Any better ideas?

We had similar problems with other ioctls where userspace did things
like that.  What we did there was to put the compat handler to generic
code.  The patch below does that, adding a big comment about what's
going on and removing the COMPAT_IOCTL entires for these on powerpc
that not only weren't ever useful but are duplicated now aswell.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/powerpc/kernel/ioctl32.c
drivers/sbus/char/rtc.c
include/linux/compat_ioctl.h

index 3fa6a93adbd00664ebf554f649437554b01155d7..0fa3d27fef013f5ce5c3311e01d29f7e78b5ad17 100644 (file)
@@ -40,10 +40,6 @@ IOCTL_TABLE_START
 #define DECLARES
 #include "compat_ioctl.c"
 
-/* Little p (/dev/rtc, /dev/envctrl, etc.) */
-COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
-COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
-
 IOCTL_TABLE_END
 
 int ioctl_table_size = ARRAY_SIZE(ioctl_start);
index 5774bdd0e26faaa2e70ba1362978251fac2f19ca..9b988baf0b5191304ca00ac042851b055f002bd7 100644 (file)
@@ -210,27 +210,6 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        }
 }
 
-static long rtc_compat_ioctl(struct file *file, unsigned int cmd,
-       unsigned long arg)
-{
-       int rval = -ENOIOCTLCMD;
-
-       switch (cmd) {
-       /*
-        * These two are specific to this driver, the generic rtc ioctls
-        * are hanlded elsewhere.
-        */
-       case RTCGET:
-       case RTCSET:
-               lock_kernel();
-               rval = rtc_ioctl(file->f_dentry->d_inode, file, cmd, arg);
-               unlock_kernel();
-               break;
-       }
-
-       return rval;
-}
-
 static int rtc_open(struct inode *inode, struct file *file)
 {
        int ret;
@@ -258,7 +237,6 @@ static struct file_operations rtc_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        rtc_ioctl,
-       .compat_ioctl = rtc_compat_ioctl,
        .open =         rtc_open,
        .release =      rtc_release,
 };
index 2209ad3499a3b4b9dd0be3a32451dd161e0765d5..174f3379e5d9a76b30affb43e2679c4ea55b5351 100644 (file)
@@ -259,6 +259,14 @@ COMPATIBLE_IOCTL(RTC_RD_TIME)
 COMPATIBLE_IOCTL(RTC_SET_TIME)
 COMPATIBLE_IOCTL(RTC_WKALM_SET)
 COMPATIBLE_IOCTL(RTC_WKALM_RD)
+/*
+ * These two are only for the sbus rtc driver, but
+ * hwclock tries them on every rtc device first when
+ * running on sparc.  On other architectures the entries
+ * are useless but harmless.
+ */
+COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
+COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
 /* Little m */
 COMPATIBLE_IOCTL(MTIOCTOP)
 /* Socket level stuff */