mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
RTC: convert mutex to bitfield
RTC code is using mutex to assure exclusive access to /dev/rtc. This is however wrong usage, as it leaves the mutex locked when returning into userspace, which is unacceptable. Convert rtc->char_lock into bit operation. Signed-off-by: Jiri Kosina <[email protected]> Acked-by: Alessandro Zummo <[email protected]> Cc: David Brownell <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
08b633070a
commit
8853c202b4
3 changed files with 10 additions and 11 deletions
|
|
@ -293,7 +293,7 @@ int rtc_irq_register(struct rtc_device *rtc, struct rtc_task *task)
|
|||
return -EINVAL;
|
||||
|
||||
/* Cannot register while the char dev is in use */
|
||||
if (!(mutex_trylock(&rtc->char_lock)))
|
||||
if (test_and_set_bit(RTC_DEV_BUSY, &rtc->flags))
|
||||
return -EBUSY;
|
||||
|
||||
spin_lock_irq(&rtc->irq_task_lock);
|
||||
|
|
@ -303,7 +303,7 @@ int rtc_irq_register(struct rtc_device *rtc, struct rtc_task *task)
|
|||
}
|
||||
spin_unlock_irq(&rtc->irq_task_lock);
|
||||
|
||||
mutex_unlock(&rtc->char_lock);
|
||||
clear_bit(RTC_DEV_BUSY, &rtc->flags);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,10 +26,7 @@ static int rtc_dev_open(struct inode *inode, struct file *file)
|
|||
struct rtc_device, char_dev);
|
||||
const struct rtc_class_ops *ops = rtc->ops;
|
||||
|
||||
/* We keep the lock as long as the device is in use
|
||||
* and return immediately if busy
|
||||
*/
|
||||
if (!(mutex_trylock(&rtc->char_lock)))
|
||||
if (test_and_set_bit(RTC_DEV_BUSY, &rtc->flags))
|
||||
return -EBUSY;
|
||||
|
||||
file->private_data = rtc;
|
||||
|
|
@ -43,8 +40,8 @@ static int rtc_dev_open(struct inode *inode, struct file *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* something has gone wrong, release the lock */
|
||||
mutex_unlock(&rtc->char_lock);
|
||||
/* something has gone wrong */
|
||||
clear_bit(RTC_DEV_BUSY, &rtc->flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -405,7 +402,7 @@ static int rtc_dev_release(struct inode *inode, struct file *file)
|
|||
if (rtc->ops->release)
|
||||
rtc->ops->release(rtc->dev.parent);
|
||||
|
||||
mutex_unlock(&rtc->char_lock);
|
||||
clear_bit(RTC_DEV_BUSY, &rtc->flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -440,7 +437,6 @@ void rtc_dev_prepare(struct rtc_device *rtc)
|
|||
|
||||
rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id);
|
||||
|
||||
mutex_init(&rtc->char_lock);
|
||||
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
|
||||
INIT_WORK(&rtc->uie_task, rtc_uie_task);
|
||||
setup_timer(&rtc->uie_timer, rtc_uie_timer, (unsigned long)rtc);
|
||||
|
|
|
|||
Loading…
Reference in a new issue