diff options
author | Sakari Ailus <sakari.ailus@iki.fi> | 2013-01-22 10:27:55 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-18 19:44:36 -0400 |
commit | c6c1d50b51e76b57fbf0651d38a7ae0c3fb9d5cc (patch) | |
tree | 448be2161521c9af331e4ea5468528b6a388dcd4 /drivers/media/media-devnode.c | |
parent | cab3e1ffbe1b9c7a607506338f590dc1e6ca9909 (diff) |
[media] media: Add 64--32 bit compat ioctl handler
Provide an ioctl handler for 32-bit binaries on 64-bit systems.
Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/media-devnode.c')
-rw-r--r-- | drivers/media/media-devnode.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/drivers/media/media-devnode.c b/drivers/media/media-devnode.c index 023b2a1cbb9b..fb0f0469fad7 100644 --- a/drivers/media/media-devnode.c +++ b/drivers/media/media-devnode.c | |||
@@ -116,19 +116,41 @@ static unsigned int media_poll(struct file *filp, | |||
116 | return mdev->fops->poll(filp, poll); | 116 | return mdev->fops->poll(filp, poll); |
117 | } | 117 | } |
118 | 118 | ||
119 | static long media_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | 119 | static long |
120 | __media_ioctl(struct file *filp, unsigned int cmd, unsigned long arg, | ||
121 | long (*ioctl_func)(struct file *filp, unsigned int cmd, | ||
122 | unsigned long arg)) | ||
120 | { | 123 | { |
121 | struct media_devnode *mdev = media_devnode_data(filp); | 124 | struct media_devnode *mdev = media_devnode_data(filp); |
122 | 125 | ||
123 | if (!mdev->fops->ioctl) | 126 | if (!ioctl_func) |
124 | return -ENOTTY; | 127 | return -ENOTTY; |
125 | 128 | ||
126 | if (!media_devnode_is_registered(mdev)) | 129 | if (!media_devnode_is_registered(mdev)) |
127 | return -EIO; | 130 | return -EIO; |
128 | 131 | ||
129 | return mdev->fops->ioctl(filp, cmd, arg); | 132 | return ioctl_func(filp, cmd, arg); |
133 | } | ||
134 | |||
135 | static long media_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
136 | { | ||
137 | struct media_devnode *mdev = media_devnode_data(filp); | ||
138 | |||
139 | return __media_ioctl(filp, cmd, arg, mdev->fops->ioctl); | ||
130 | } | 140 | } |
131 | 141 | ||
142 | #ifdef CONFIG_COMPAT | ||
143 | |||
144 | static long media_compat_ioctl(struct file *filp, unsigned int cmd, | ||
145 | unsigned long arg) | ||
146 | { | ||
147 | struct media_devnode *mdev = media_devnode_data(filp); | ||
148 | |||
149 | return __media_ioctl(filp, cmd, arg, mdev->fops->compat_ioctl); | ||
150 | } | ||
151 | |||
152 | #endif /* CONFIG_COMPAT */ | ||
153 | |||
132 | /* Override for the open function */ | 154 | /* Override for the open function */ |
133 | static int media_open(struct inode *inode, struct file *filp) | 155 | static int media_open(struct inode *inode, struct file *filp) |
134 | { | 156 | { |
@@ -188,6 +210,9 @@ static const struct file_operations media_devnode_fops = { | |||
188 | .write = media_write, | 210 | .write = media_write, |
189 | .open = media_open, | 211 | .open = media_open, |
190 | .unlocked_ioctl = media_ioctl, | 212 | .unlocked_ioctl = media_ioctl, |
213 | #ifdef CONFIG_COMPAT | ||
214 | .compat_ioctl = media_compat_ioctl, | ||
215 | #endif /* CONFIG_COMPAT */ | ||
191 | .release = media_release, | 216 | .release = media_release, |
192 | .poll = media_poll, | 217 | .poll = media_poll, |
193 | .llseek = no_llseek, | 218 | .llseek = no_llseek, |