| @@ -19,7 +19,6 @@ · 18 unmodified lines |
| 19 | 19 | */ |
| 20 | 20 | #include <linux/device.h> |
| 21 | 21 | #include <linux/file.h> |
| 22 | | −#include <linux/mutex.h> |
| 23 | 22 | #include <linux/posix-clock.h> |
| 24 | 23 | #include <linux/slab.h> |
| 25 | 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 | 34 | struct posix_clock *clk = fp->private_data; |
| 36 | 35 | |
| 37 | | − mutex_lock(&clk->mutex); |
| 36 | + down_read(&clk->rwsem); |
| 38 | 37 | |
| 39 | 38 | if (!clk->zombie) |
| 40 | 39 | return clk; |
| 41 | 40 | |
| 42 | | − mutex_unlock(&clk->mutex); |
| 41 | + up_read(&clk->rwsem); |
| 43 | 42 | |
| 44 | 43 | return NULL; |
| 45 | 44 | } |
| 46 | 45 | |
| 47 | 46 | static void put_posix_clock(struct posix_clock *clk) |
| 48 | 47 | { |
| 49 | | − mutex_unlock(&clk->mutex); |
| 48 | + up_read(&clk->rwsem); |
| 50 | 49 | } |
| 51 | 50 | |
| 52 | 51 | static 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 | 155 | struct posix_clock *clk = |
| 157 | 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 | 160 | if (clk->zombie) { |
| 162 | 161 | err = -ENODEV; |
| @@ -172,7 +171,7 @@ static int posix_clock_open(struct inode *inode, struct file *fp) · 9 unmodified lines |
| 172 | 171 | fp->private_data = clk; |
| 173 | 172 | } |
| 174 | 173 | out: |
| 175 | | − mutex_unlock(&clk->mutex); |
| 174 | + up_read(&clk->rwsem); |
| 176 | 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 | 210 | int err; |
| 212 | 211 | |
| 213 | 212 | kref_init(&clk->kref); |
| 214 | | − mutex_init(&clk->mutex); |
| 213 | + init_rwsem(&clk->rwsem); |
| 215 | 214 | |
| 216 | 215 | cdev_init(&clk->cdev, &posix_clock_file_operations); |
| 217 | 216 | clk->cdev.owner = clk->ops.owner; |
| 218 | 217 | err = cdev_add(&clk->cdev, devid, 1); |
| 219 | | − if (err) |
| 220 | | − goto no_cdev; |
| 221 | 218 | |
| 222 | 219 | return err; |
| 223 | | −no_cdev: |
| 224 | | − mutex_destroy(&clk->mutex); |
| 225 | | − return err; |
| 226 | 220 | } |
| 227 | 221 | EXPORT_SYMBOL_GPL(posix_clock_register); |
| 228 | 222 | |
| 229 | 223 | static void delete_clock(struct kref *kref) |
| 230 | 224 | { |
| 231 | 225 | struct posix_clock *clk = container_of(kref, struct posix_clock, kref); |
| 232 | | − mutex_destroy(&clk->mutex); |
| 226 | + |
| 233 | 227 | if (clk->release) |
| 234 | 228 | clk->release(clk); |
| 235 | 229 | } |
| @@ -238,9 +232,9 @@ void posix_clock_unregister(struct posix_clock *clk) · 2 unmodified lines |
| 238 | 232 | { |
| 239 | 233 | cdev_del(&clk->cdev); |
| 240 | 234 | |
| 241 | | − mutex_lock(&clk->mutex); |
| 235 | + down_write(&clk->rwsem); |
| 242 | 236 | clk->zombie = true; |
| 243 | | − mutex_unlock(&clk->mutex); |
| 237 | + up_write(&clk->rwsem); |
| 244 | 238 | |
| 245 | 239 | kref_put(&clk->kref, delete_clock); |
| 246 | 240 | } |