[PATCH] RTC: rtc-dev tweak for 64-bit kernel
Make rtc-dev work well on 64-bit platforms with 32-bit userland. On those platforms, users might try to read 32-bit integer value. This patch make rtc-dev's read() work well for both "int" and "long" size. This tweak is came from genrtc driver. Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Cc: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
b44df334a7
commit
3418ff7611
1 changed files with 10 additions and 5 deletions
|
@ -58,7 +58,7 @@ rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
|||
unsigned long data;
|
||||
ssize_t ret;
|
||||
|
||||
if (count < sizeof(unsigned long))
|
||||
if (count != sizeof(unsigned int) && count < sizeof(unsigned long))
|
||||
return -EINVAL;
|
||||
|
||||
add_wait_queue(&rtc->irq_queue, &wait);
|
||||
|
@ -90,11 +90,16 @@ rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
|||
if (ret == 0) {
|
||||
/* Check for any data updates */
|
||||
if (rtc->ops->read_callback)
|
||||
data = rtc->ops->read_callback(rtc->class_dev.dev, data);
|
||||
data = rtc->ops->read_callback(rtc->class_dev.dev,
|
||||
data);
|
||||
|
||||
ret = put_user(data, (unsigned long __user *)buf);
|
||||
if (ret == 0)
|
||||
ret = sizeof(unsigned long);
|
||||
if (sizeof(int) != sizeof(long) &&
|
||||
count == sizeof(unsigned int))
|
||||
ret = put_user(data, (unsigned int __user *)buf) ?:
|
||||
sizeof(unsigned int);
|
||||
else
|
||||
ret = put_user(data, (unsigned long __user *)buf) ?:
|
||||
sizeof(unsigned long);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue