mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	alarmtimer: Ensure RTC module is not unloaded
When registering the rtc device to be used to handle alarm timers, get_device is used to ensure the device doesn't go away but the module can still be unloaded. Call try_module_get to ensure the rtc driver will not go away. Reported-and-tested-by: Michal Simek <monstr@monstr.eu> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: John Stultz <john.stultz@linaro.org> Cc: Stephen Boyd <sboyd@codeaurora.org> Link: http://lkml.kernel.org/r/20170820220146.30969-1-alexandre.belloni@free-electrons.com
This commit is contained in:
		
							parent
							
								
									bc30658eff
								
							
						
					
					
						commit
						51218298a2
					
				
					 1 changed files with 6 additions and 0 deletions
				
			
		| 
						 | 
					@ -28,6 +28,7 @@
 | 
				
			||||||
#include <linux/workqueue.h>
 | 
					#include <linux/workqueue.h>
 | 
				
			||||||
#include <linux/freezer.h>
 | 
					#include <linux/freezer.h>
 | 
				
			||||||
#include <linux/compat.h>
 | 
					#include <linux/compat.h>
 | 
				
			||||||
 | 
					#include <linux/module.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "posix-timers.h"
 | 
					#include "posix-timers.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,6 +104,11 @@ static int alarmtimer_rtc_add_device(struct device *dev,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&rtcdev_lock, flags);
 | 
						spin_lock_irqsave(&rtcdev_lock, flags);
 | 
				
			||||||
	if (!rtcdev) {
 | 
						if (!rtcdev) {
 | 
				
			||||||
 | 
							if (!try_module_get(rtc->owner)) {
 | 
				
			||||||
 | 
								spin_unlock_irqrestore(&rtcdev_lock, flags);
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		rtcdev = rtc;
 | 
							rtcdev = rtc;
 | 
				
			||||||
		/* hold a reference so it doesn't go away */
 | 
							/* hold a reference so it doesn't go away */
 | 
				
			||||||
		get_device(dev);
 | 
							get_device(dev);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue