diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2010-10-04 15:18:23 -0400 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2010-10-19 05:29:59 -0400 |
| commit | a6f8dbc654c3dddc5ac98cf59a88447a90e99ece (patch) | |
| tree | ef4244528cd4a975bca2d00ac1b5e5430a1eac45 | |
| parent | 1fa4f3b57cf0c525027ea61011312de139b04f9b (diff) | |
sunrpc: remove the big kernel lock
The sunrpc cache_ioctl function does not need the big kernel lock
because it uses its own queue_lock already.
rpc_pipe_ioctl apparently should be using i_lock like the other
operations on the pipe file descriptor do.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
| -rw-r--r-- | net/sunrpc/cache.c | 15 | ||||
| -rw-r--r-- | net/sunrpc/rpc_pipe.c | 26 |
2 files changed, 11 insertions, 30 deletions
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 2b06410e584e..29b11e065015 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <linux/workqueue.h> | 28 | #include <linux/workqueue.h> |
| 29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
| 30 | #include <linux/pagemap.h> | 30 | #include <linux/pagemap.h> |
| 31 | #include <linux/smp_lock.h> | ||
| 32 | #include <asm/ioctls.h> | 31 | #include <asm/ioctls.h> |
| 33 | #include <linux/sunrpc/types.h> | 32 | #include <linux/sunrpc/types.h> |
| 34 | #include <linux/sunrpc/cache.h> | 33 | #include <linux/sunrpc/cache.h> |
| @@ -1348,15 +1347,10 @@ static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait) | |||
| 1348 | static long cache_ioctl_procfs(struct file *filp, | 1347 | static long cache_ioctl_procfs(struct file *filp, |
| 1349 | unsigned int cmd, unsigned long arg) | 1348 | unsigned int cmd, unsigned long arg) |
| 1350 | { | 1349 | { |
| 1351 | long ret; | ||
| 1352 | struct inode *inode = filp->f_path.dentry->d_inode; | 1350 | struct inode *inode = filp->f_path.dentry->d_inode; |
| 1353 | struct cache_detail *cd = PDE(inode)->data; | 1351 | struct cache_detail *cd = PDE(inode)->data; |
| 1354 | 1352 | ||
| 1355 | lock_kernel(); | 1353 | return cache_ioctl(inode, filp, cmd, arg, cd); |
| 1356 | ret = cache_ioctl(inode, filp, cmd, arg, cd); | ||
| 1357 | unlock_kernel(); | ||
| 1358 | |||
| 1359 | return ret; | ||
| 1360 | } | 1354 | } |
| 1361 | 1355 | ||
| 1362 | static int cache_open_procfs(struct inode *inode, struct file *filp) | 1356 | static int cache_open_procfs(struct inode *inode, struct file *filp) |
| @@ -1555,13 +1549,8 @@ static long cache_ioctl_pipefs(struct file *filp, | |||
| 1555 | { | 1549 | { |
| 1556 | struct inode *inode = filp->f_dentry->d_inode; | 1550 | struct inode *inode = filp->f_dentry->d_inode; |
| 1557 | struct cache_detail *cd = RPC_I(inode)->private; | 1551 | struct cache_detail *cd = RPC_I(inode)->private; |
| 1558 | long ret; | ||
| 1559 | 1552 | ||
| 1560 | lock_kernel(); | 1553 | return cache_ioctl(inode, filp, cmd, arg, cd); |
| 1561 | ret = cache_ioctl(inode, filp, cmd, arg, cd); | ||
| 1562 | unlock_kernel(); | ||
| 1563 | |||
| 1564 | return ret; | ||
| 1565 | } | 1554 | } |
| 1566 | 1555 | ||
| 1567 | static int cache_open_pipefs(struct inode *inode, struct file *filp) | 1556 | static int cache_open_pipefs(struct inode *inode, struct file *filp) |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 95ccbcf45d3e..1e97d8610291 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
| @@ -27,7 +27,6 @@ | |||
| 27 | #include <linux/workqueue.h> | 27 | #include <linux/workqueue.h> |
| 28 | #include <linux/sunrpc/rpc_pipe_fs.h> | 28 | #include <linux/sunrpc/rpc_pipe_fs.h> |
| 29 | #include <linux/sunrpc/cache.h> | 29 | #include <linux/sunrpc/cache.h> |
| 30 | #include <linux/smp_lock.h> | ||
| 31 | 30 | ||
| 32 | static struct vfsmount *rpc_mount __read_mostly; | 31 | static struct vfsmount *rpc_mount __read_mostly; |
| 33 | static int rpc_mount_count; | 32 | static int rpc_mount_count; |
| @@ -309,40 +308,33 @@ rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait) | |||
| 309 | return mask; | 308 | return mask; |
| 310 | } | 309 | } |
| 311 | 310 | ||
| 312 | static int | 311 | static long |
| 313 | rpc_pipe_ioctl_unlocked(struct file *filp, unsigned int cmd, unsigned long arg) | 312 | rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
| 314 | { | 313 | { |
| 315 | struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode); | 314 | struct inode *inode = filp->f_path.dentry->d_inode; |
| 315 | struct rpc_inode *rpci = RPC_I(inode); | ||
| 316 | int len; | 316 | int len; |
| 317 | 317 | ||
| 318 | switch (cmd) { | 318 | switch (cmd) { |
| 319 | case FIONREAD: | 319 | case FIONREAD: |
| 320 | if (rpci->ops == NULL) | 320 | spin_lock(&inode->i_lock); |
| 321 | if (rpci->ops == NULL) { | ||
| 322 | spin_unlock(&inode->i_lock); | ||
| 321 | return -EPIPE; | 323 | return -EPIPE; |
| 324 | } | ||
| 322 | len = rpci->pipelen; | 325 | len = rpci->pipelen; |
| 323 | if (filp->private_data) { | 326 | if (filp->private_data) { |
| 324 | struct rpc_pipe_msg *msg; | 327 | struct rpc_pipe_msg *msg; |
| 325 | msg = (struct rpc_pipe_msg *)filp->private_data; | 328 | msg = (struct rpc_pipe_msg *)filp->private_data; |
| 326 | len += msg->len - msg->copied; | 329 | len += msg->len - msg->copied; |
| 327 | } | 330 | } |
| 331 | spin_unlock(&inode->i_lock); | ||
| 328 | return put_user(len, (int __user *)arg); | 332 | return put_user(len, (int __user *)arg); |
| 329 | default: | 333 | default: |
| 330 | return -EINVAL; | 334 | return -EINVAL; |
| 331 | } | 335 | } |
| 332 | } | 336 | } |
| 333 | 337 | ||
| 334 | static long | ||
| 335 | rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
| 336 | { | ||
| 337 | long ret; | ||
| 338 | |||
| 339 | lock_kernel(); | ||
| 340 | ret = rpc_pipe_ioctl_unlocked(filp, cmd, arg); | ||
| 341 | unlock_kernel(); | ||
| 342 | |||
| 343 | return ret; | ||
| 344 | } | ||
| 345 | |||
| 346 | static const struct file_operations rpc_pipe_fops = { | 338 | static const struct file_operations rpc_pipe_fops = { |
| 347 | .owner = THIS_MODULE, | 339 | .owner = THIS_MODULE, |
| 348 | .llseek = no_llseek, | 340 | .llseek = no_llseek, |
