History

Merge branch 'timer-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'timer-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: RTC: rtc-omap: Fix a leak of the IRQ during init failure posix clocks: Replace mutex with reader/writer semaphore

Linus Torvalds committed 15 years ago

Commit 4ae0ff12 parents 96ad999 2dd93c43 files · +13 −18Browse files

Unified · Split

3 files
  1. drivers/rtc/rtc-omap.c +1 −1
  2. include/linux/posix-clock.h +3 −2
  3. kernel/time/posix-clock.c +9 −15
drivers/rtc/rtc-omap.c+1−1
@@ -394,7 +394,7 @@ static int __init omap_rtc_probe(struct platform_device *pdev) · 393 unmodified lines
394 return 0;394 return 0;
395 395
396fail2:396fail2:
397 free_irq(omap_rtc_timer, NULL);397 free_irq(omap_rtc_timer, rtc);
398fail1:398fail1:
399 rtc_device_unregister(rtc);399 rtc_device_unregister(rtc);
400fail0:400fail0:
include/linux/posix-clock.h+3−2
@@ -24,6 +24,7 @@ · 23 unmodified lines
24#include <linux/fs.h>24#include <linux/fs.h>
25#include <linux/poll.h>25#include <linux/poll.h>
26#include <linux/posix-timers.h>26#include <linux/posix-timers.h>
27#include <linux/rwsem.h>
27 28
28struct posix_clock;29struct posix_clock;
29 30
@@ -104,7 +105,7 @@ struct posix_clock_operations { · 74 unmodified lines
104 * @ops: Functional interface to the clock105 * @ops: Functional interface to the clock
105 * @cdev: Character device instance for this clock106 * @cdev: Character device instance for this clock
106 * @kref: Reference count.107 * @kref: Reference count.
107 * @mutex: Protects the 'zombie' field from concurrent access.108 * @rwsem: Protects the 'zombie' field from concurrent access.
108 * @zombie: If 'zombie' is true, then the hardware has disappeared.109 * @zombie: If 'zombie' is true, then the hardware has disappeared.
109 * @release: A function to free the structure when the reference count reaches110 * @release: A function to free the structure when the reference count reaches
110 * zero. May be NULL if structure is statically allocated.111 * zero. May be NULL if structure is statically allocated.
@@ -117,7 +118,7 @@ struct posix_clock { · 6 unmodified lines
117 struct posix_clock_operations ops;118 struct posix_clock_operations ops;
118 struct cdev cdev;119 struct cdev cdev;
119 struct kref kref;120 struct kref kref;
120 struct mutex mutex;121 struct rw_semaphore rwsem;
121 bool zombie;122 bool zombie;
122 void (*release)(struct posix_clock *clk);123 void (*release)(struct posix_clock *clk);
123};124};
kernel/time/posix-clock.c+9−15
@@ -19,7 +19,6 @@ · 18 unmodified lines
19 */19 */
20#include <linux/device.h>20#include <linux/device.h>
21#include <linux/file.h>21#include <linux/file.h>
22#include <linux/mutex.h>
23#include <linux/posix-clock.h>22#include <linux/posix-clock.h>
24#include <linux/slab.h>23#include <linux/slab.h>
25#include <linux/syscalls.h>24#include <linux/syscalls.h>
@@ -34,19 +33,19 @@ static struct posix_clock *get_posix_clock(struct file *fp) · 8 unmodified lines
34{33{
35 struct posix_clock *clk = fp->private_data;34 struct posix_clock *clk = fp->private_data;
36 35
37 mutex_lock(&clk->mutex);36 down_read(&clk->rwsem);
38 37
39 if (!clk->zombie)38 if (!clk->zombie)
40 return clk;39 return clk;
41 40
42 mutex_unlock(&clk->mutex);41 up_read(&clk->rwsem);
43 42
44 return NULL;43 return NULL;
45}44}
46 45
47static void put_posix_clock(struct posix_clock *clk)46static void put_posix_clock(struct posix_clock *clk)
48{47{
49 mutex_unlock(&clk->mutex);48 up_read(&clk->rwsem);
50}49}
51 50
52static ssize_t posix_clock_read(struct file *fp, char __user *buf,51static ssize_t posix_clock_read(struct file *fp, char __user *buf,
@@ -156,7 +155,7 @@ static int posix_clock_open(struct inode *inode, struct file *fp) · 103 unmodified lines
156 struct posix_clock *clk =155 struct posix_clock *clk =
157 container_of(inode->i_cdev, struct posix_clock, cdev);156 container_of(inode->i_cdev, struct posix_clock, cdev);
158 157
159 mutex_lock(&clk->mutex);158 down_read(&clk->rwsem);
160 159
161 if (clk->zombie) {160 if (clk->zombie) {
162 err = -ENODEV;161 err = -ENODEV;
@@ -172,7 +171,7 @@ static int posix_clock_open(struct inode *inode, struct file *fp) · 9 unmodified lines
172 fp->private_data = clk;171 fp->private_data = clk;
173 }172 }
174out:173out:
175 mutex_unlock(&clk->mutex);174 up_read(&clk->rwsem);
176 return err;175 return err;
177}176}
178 177
@@ -211,25 +210,20 @@ int posix_clock_register(struct posix_clock *clk, dev_t devid) · 32 unmodified lines
211 int err;210 int err;
212 211
213 kref_init(&clk->kref);212 kref_init(&clk->kref);
214 mutex_init(&clk->mutex);213 init_rwsem(&clk->rwsem);
215 214
216 cdev_init(&clk->cdev, &posix_clock_file_operations);215 cdev_init(&clk->cdev, &posix_clock_file_operations);
217 clk->cdev.owner = clk->ops.owner;216 clk->cdev.owner = clk->ops.owner;
218 err = cdev_add(&clk->cdev, devid, 1);217 err = cdev_add(&clk->cdev, devid, 1);
219 if (err)
220 goto no_cdev;
221 218
222 return err;219 return err;
223no_cdev:
224 mutex_destroy(&clk->mutex);
225 return err;
226}220}
227EXPORT_SYMBOL_GPL(posix_clock_register);221EXPORT_SYMBOL_GPL(posix_clock_register);
228 222
229static void delete_clock(struct kref *kref)223static void delete_clock(struct kref *kref)
230{224{
231 struct posix_clock *clk = container_of(kref, struct posix_clock, kref);225 struct posix_clock *clk = container_of(kref, struct posix_clock, kref);
232 mutex_destroy(&clk->mutex);226
233 if (clk->release)227 if (clk->release)
234 clk->release(clk);228 clk->release(clk);
235}229}
@@ -238,9 +232,9 @@ void posix_clock_unregister(struct posix_clock *clk) · 2 unmodified lines
238{232{
239 cdev_del(&clk->cdev);233 cdev_del(&clk->cdev);
240 234
241 mutex_lock(&clk->mutex);235 down_write(&clk->rwsem);
242 clk->zombie = true;236 clk->zombie = true;
243 mutex_unlock(&clk->mutex);237 up_write(&clk->rwsem);
244 238
245 kref_put(&clk->kref, delete_clock);239 kref_put(&clk->kref, delete_clock);
246}240}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t