diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-12 17:49:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-12 17:49:50 -0400 |
commit | 5166701b368caea89d57b14bf41cf39e819dad51 (patch) | |
tree | c73b9d4860809e3afa9359be9d03ba2d8d98a18e /drivers | |
parent | 0a7418f5f569512e98789c439198eed4b507cce3 (diff) | |
parent | a786c06d9f2719203c00b3d97b21f9a96980d0b5 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs updates from Al Viro:
"The first vfs pile, with deep apologies for being very late in this
window.
Assorted cleanups and fixes, plus a large preparatory part of iov_iter
work. There's a lot more of that, but it'll probably go into the next
merge window - it *does* shape up nicely, removes a lot of
boilerplate, gets rid of locking inconsistencie between aio_write and
splice_write and I hope to get Kent's direct-io rewrite merged into
the same queue, but some of the stuff after this point is having
(mostly trivial) conflicts with the things already merged into
mainline and with some I want more testing.
This one passes LTP and xfstests without regressions, in addition to
usual beating. BTW, readahead02 in ltp syscalls testsuite has started
giving failures since "mm/readahead.c: fix readahead failure for
memoryless NUMA nodes and limit readahead pages" - might be a false
positive, might be a real regression..."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits)
missing bits of "splice: fix racy pipe->buffers uses"
cifs: fix the race in cifs_writev()
ceph_sync_{,direct_}write: fix an oops on ceph_osdc_new_request() failure
kill generic_file_buffered_write()
ocfs2_file_aio_write(): switch to generic_perform_write()
ceph_aio_write(): switch to generic_perform_write()
xfs_file_buffered_aio_write(): switch to generic_perform_write()
export generic_perform_write(), start getting rid of generic_file_buffer_write()
generic_file_direct_write(): get rid of ppos argument
btrfs_file_aio_write(): get rid of ppos
kill the 5th argument of generic_file_buffered_write()
kill the 4th argument of __generic_file_aio_write()
lustre: don't open-code kernel_recvmsg()
ocfs2: don't open-code kernel_recvmsg()
drbd: don't open-code kernel_recvmsg()
constify blk_rq_map_user_iov() and friends
lustre: switch to kernel_sendmsg()
ocfs2: don't open-code kernel_sendmsg()
take iov_iter stuff to mm/iov_iter.c
process_vm_access: tidy up a bit
...
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 12 | ||||
-rw-r--r-- | drivers/block/nbd.c | 48 | ||||
-rw-r--r-- | drivers/char/virtio_console.c | 4 | ||||
-rw-r--r-- | drivers/staging/lustre/lnet/klnds/socklnd/socklnd_lib-linux.c | 60 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c | 24 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/symlink.c | 23 | ||||
-rw-r--r-- | drivers/staging/usbip/stub_dev.c | 8 | ||||
-rw-r--r-- | drivers/staging/usbip/usbip_common.c | 25 | ||||
-rw-r--r-- | drivers/staging/usbip/usbip_common.h | 1 | ||||
-rw-r--r-- | drivers/staging/usbip/vhci_hcd.c | 4 | ||||
-rw-r--r-- | drivers/staging/usbip/vhci_sysfs.c | 6 | ||||
-rw-r--r-- | drivers/vhost/net.c | 14 |
12 files changed, 54 insertions, 175 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 18c76e84d540..68e3992e8838 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -469,24 +469,14 @@ static void drbd_wait_ee_list_empty(struct drbd_device *device, | |||
469 | 469 | ||
470 | static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flags) | 470 | static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flags) |
471 | { | 471 | { |
472 | mm_segment_t oldfs; | ||
473 | struct kvec iov = { | 472 | struct kvec iov = { |
474 | .iov_base = buf, | 473 | .iov_base = buf, |
475 | .iov_len = size, | 474 | .iov_len = size, |
476 | }; | 475 | }; |
477 | struct msghdr msg = { | 476 | struct msghdr msg = { |
478 | .msg_iovlen = 1, | ||
479 | .msg_iov = (struct iovec *)&iov, | ||
480 | .msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL) | 477 | .msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL) |
481 | }; | 478 | }; |
482 | int rv; | 479 | return kernel_recvmsg(sock, &msg, &iov, 1, size, msg.msg_flags); |
483 | |||
484 | oldfs = get_fs(); | ||
485 | set_fs(KERNEL_DS); | ||
486 | rv = sock_recvmsg(sock, &msg, size, msg.msg_flags); | ||
487 | set_fs(oldfs); | ||
488 | |||
489 | return rv; | ||
490 | } | 480 | } |
491 | 481 | ||
492 | static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size) | 482 | static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size) |
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 55298db36b2d..3a70ea2f7cd6 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -630,37 +630,29 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | |||
630 | } | 630 | } |
631 | 631 | ||
632 | case NBD_CLEAR_SOCK: { | 632 | case NBD_CLEAR_SOCK: { |
633 | struct file *file; | 633 | struct socket *sock = nbd->sock; |
634 | |||
635 | nbd->sock = NULL; | 634 | nbd->sock = NULL; |
636 | file = nbd->file; | ||
637 | nbd->file = NULL; | ||
638 | nbd_clear_que(nbd); | 635 | nbd_clear_que(nbd); |
639 | BUG_ON(!list_empty(&nbd->queue_head)); | 636 | BUG_ON(!list_empty(&nbd->queue_head)); |
640 | BUG_ON(!list_empty(&nbd->waiting_queue)); | 637 | BUG_ON(!list_empty(&nbd->waiting_queue)); |
641 | kill_bdev(bdev); | 638 | kill_bdev(bdev); |
642 | if (file) | 639 | if (sock) |
643 | fput(file); | 640 | sockfd_put(sock); |
644 | return 0; | 641 | return 0; |
645 | } | 642 | } |
646 | 643 | ||
647 | case NBD_SET_SOCK: { | 644 | case NBD_SET_SOCK: { |
648 | struct file *file; | 645 | struct socket *sock; |
649 | if (nbd->file) | 646 | int err; |
647 | if (nbd->sock) | ||
650 | return -EBUSY; | 648 | return -EBUSY; |
651 | file = fget(arg); | 649 | sock = sockfd_lookup(arg, &err); |
652 | if (file) { | 650 | if (sock) { |
653 | struct inode *inode = file_inode(file); | 651 | nbd->sock = sock; |
654 | if (S_ISSOCK(inode->i_mode)) { | 652 | if (max_part > 0) |
655 | nbd->file = file; | 653 | bdev->bd_invalidated = 1; |
656 | nbd->sock = SOCKET_I(inode); | 654 | nbd->disconnect = 0; /* we're connected now */ |
657 | if (max_part > 0) | 655 | return 0; |
658 | bdev->bd_invalidated = 1; | ||
659 | nbd->disconnect = 0; /* we're connected now */ | ||
660 | return 0; | ||
661 | } else { | ||
662 | fput(file); | ||
663 | } | ||
664 | } | 656 | } |
665 | return -EINVAL; | 657 | return -EINVAL; |
666 | } | 658 | } |
@@ -697,12 +689,12 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | |||
697 | 689 | ||
698 | case NBD_DO_IT: { | 690 | case NBD_DO_IT: { |
699 | struct task_struct *thread; | 691 | struct task_struct *thread; |
700 | struct file *file; | 692 | struct socket *sock; |
701 | int error; | 693 | int error; |
702 | 694 | ||
703 | if (nbd->pid) | 695 | if (nbd->pid) |
704 | return -EBUSY; | 696 | return -EBUSY; |
705 | if (!nbd->file) | 697 | if (!nbd->sock) |
706 | return -EINVAL; | 698 | return -EINVAL; |
707 | 699 | ||
708 | mutex_unlock(&nbd->tx_lock); | 700 | mutex_unlock(&nbd->tx_lock); |
@@ -731,15 +723,15 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | |||
731 | if (error) | 723 | if (error) |
732 | return error; | 724 | return error; |
733 | sock_shutdown(nbd, 0); | 725 | sock_shutdown(nbd, 0); |
734 | file = nbd->file; | 726 | sock = nbd->sock; |
735 | nbd->file = NULL; | 727 | nbd->sock = NULL; |
736 | nbd_clear_que(nbd); | 728 | nbd_clear_que(nbd); |
737 | dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); | 729 | dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); |
738 | kill_bdev(bdev); | 730 | kill_bdev(bdev); |
739 | queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue); | 731 | queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue); |
740 | set_device_ro(bdev, false); | 732 | set_device_ro(bdev, false); |
741 | if (file) | 733 | if (sock) |
742 | fput(file); | 734 | sockfd_put(sock); |
743 | nbd->flags = 0; | 735 | nbd->flags = 0; |
744 | nbd->bytesize = 0; | 736 | nbd->bytesize = 0; |
745 | bdev->bd_inode->i_size = 0; | 737 | bdev->bd_inode->i_size = 0; |
@@ -875,9 +867,7 @@ static int __init nbd_init(void) | |||
875 | 867 | ||
876 | for (i = 0; i < nbds_max; i++) { | 868 | for (i = 0; i < nbds_max; i++) { |
877 | struct gendisk *disk = nbd_dev[i].disk; | 869 | struct gendisk *disk = nbd_dev[i].disk; |
878 | nbd_dev[i].file = NULL; | ||
879 | nbd_dev[i].magic = NBD_MAGIC; | 870 | nbd_dev[i].magic = NBD_MAGIC; |
880 | nbd_dev[i].flags = 0; | ||
881 | INIT_LIST_HEAD(&nbd_dev[i].waiting_queue); | 871 | INIT_LIST_HEAD(&nbd_dev[i].waiting_queue); |
882 | spin_lock_init(&nbd_dev[i].queue_lock); | 872 | spin_lock_init(&nbd_dev[i].queue_lock); |
883 | INIT_LIST_HEAD(&nbd_dev[i].queue_head); | 873 | INIT_LIST_HEAD(&nbd_dev[i].queue_head); |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 6928d094451d..60aafb8a1f2e 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
@@ -901,9 +901,9 @@ static int pipe_to_sg(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
901 | if (len + offset > PAGE_SIZE) | 901 | if (len + offset > PAGE_SIZE) |
902 | len = PAGE_SIZE - offset; | 902 | len = PAGE_SIZE - offset; |
903 | 903 | ||
904 | src = buf->ops->map(pipe, buf, 1); | 904 | src = kmap_atomic(buf->page); |
905 | memcpy(page_address(page) + offset, src + buf->offset, len); | 905 | memcpy(page_address(page) + offset, src + buf->offset, len); |
906 | buf->ops->unmap(pipe, buf, src); | 906 | kunmap_atomic(src); |
907 | 907 | ||
908 | sg_set_page(&(sgl->sg[sgl->n]), page, len, offset); | 908 | sg_set_page(&(sgl->sg[sgl->n]), page, len, offset); |
909 | } | 909 | } |
diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_lib-linux.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_lib-linux.c index a54b506ba7ca..b87b246111c0 100644 --- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_lib-linux.c +++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_lib-linux.c | |||
@@ -99,16 +99,7 @@ ksocknal_lib_send_iov (ksock_conn_t *conn, ksock_tx_t *tx) | |||
99 | struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov; | 99 | struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov; |
100 | unsigned int niov = tx->tx_niov; | 100 | unsigned int niov = tx->tx_niov; |
101 | #endif | 101 | #endif |
102 | struct msghdr msg = { | 102 | struct msghdr msg = {.msg_flags = MSG_DONTWAIT}; |
103 | .msg_name = NULL, | ||
104 | .msg_namelen = 0, | ||
105 | .msg_iov = scratchiov, | ||
106 | .msg_iovlen = niov, | ||
107 | .msg_control = NULL, | ||
108 | .msg_controllen = 0, | ||
109 | .msg_flags = MSG_DONTWAIT | ||
110 | }; | ||
111 | mm_segment_t oldmm = get_fs(); | ||
112 | int i; | 103 | int i; |
113 | 104 | ||
114 | for (nob = i = 0; i < niov; i++) { | 105 | for (nob = i = 0; i < niov; i++) { |
@@ -120,9 +111,7 @@ ksocknal_lib_send_iov (ksock_conn_t *conn, ksock_tx_t *tx) | |||
120 | nob < tx->tx_resid) | 111 | nob < tx->tx_resid) |
121 | msg.msg_flags |= MSG_MORE; | 112 | msg.msg_flags |= MSG_MORE; |
122 | 113 | ||
123 | set_fs (KERNEL_DS); | 114 | rc = kernel_sendmsg(sock, &msg, (struct kvec *)scratchiov, niov, nob); |
124 | rc = sock_sendmsg(sock, &msg, nob); | ||
125 | set_fs (oldmm); | ||
126 | } | 115 | } |
127 | return rc; | 116 | return rc; |
128 | } | 117 | } |
@@ -174,16 +163,7 @@ ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx) | |||
174 | struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov; | 163 | struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov; |
175 | unsigned int niov = tx->tx_nkiov; | 164 | unsigned int niov = tx->tx_nkiov; |
176 | #endif | 165 | #endif |
177 | struct msghdr msg = { | 166 | struct msghdr msg = {.msg_flags = MSG_DONTWAIT}; |
178 | .msg_name = NULL, | ||
179 | .msg_namelen = 0, | ||
180 | .msg_iov = scratchiov, | ||
181 | .msg_iovlen = niov, | ||
182 | .msg_control = NULL, | ||
183 | .msg_controllen = 0, | ||
184 | .msg_flags = MSG_DONTWAIT | ||
185 | }; | ||
186 | mm_segment_t oldmm = get_fs(); | ||
187 | int i; | 167 | int i; |
188 | 168 | ||
189 | for (nob = i = 0; i < niov; i++) { | 169 | for (nob = i = 0; i < niov; i++) { |
@@ -196,9 +176,7 @@ ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx) | |||
196 | nob < tx->tx_resid) | 176 | nob < tx->tx_resid) |
197 | msg.msg_flags |= MSG_MORE; | 177 | msg.msg_flags |= MSG_MORE; |
198 | 178 | ||
199 | set_fs (KERNEL_DS); | 179 | rc = kernel_sendmsg(sock, &msg, (struct kvec *)scratchiov, niov, nob); |
200 | rc = sock_sendmsg(sock, &msg, nob); | ||
201 | set_fs (oldmm); | ||
202 | 180 | ||
203 | for (i = 0; i < niov; i++) | 181 | for (i = 0; i < niov; i++) |
204 | kunmap(kiov[i].kiov_page); | 182 | kunmap(kiov[i].kiov_page); |
@@ -237,15 +215,8 @@ ksocknal_lib_recv_iov (ksock_conn_t *conn) | |||
237 | #endif | 215 | #endif |
238 | struct iovec *iov = conn->ksnc_rx_iov; | 216 | struct iovec *iov = conn->ksnc_rx_iov; |
239 | struct msghdr msg = { | 217 | struct msghdr msg = { |
240 | .msg_name = NULL, | ||
241 | .msg_namelen = 0, | ||
242 | .msg_iov = scratchiov, | ||
243 | .msg_iovlen = niov, | ||
244 | .msg_control = NULL, | ||
245 | .msg_controllen = 0, | ||
246 | .msg_flags = 0 | 218 | .msg_flags = 0 |
247 | }; | 219 | }; |
248 | mm_segment_t oldmm = get_fs(); | ||
249 | int nob; | 220 | int nob; |
250 | int i; | 221 | int i; |
251 | int rc; | 222 | int rc; |
@@ -263,10 +234,8 @@ ksocknal_lib_recv_iov (ksock_conn_t *conn) | |||
263 | } | 234 | } |
264 | LASSERT (nob <= conn->ksnc_rx_nob_wanted); | 235 | LASSERT (nob <= conn->ksnc_rx_nob_wanted); |
265 | 236 | ||
266 | set_fs (KERNEL_DS); | 237 | rc = kernel_recvmsg(conn->ksnc_sock, &msg, |
267 | rc = sock_recvmsg (conn->ksnc_sock, &msg, nob, MSG_DONTWAIT); | 238 | (struct kvec *)scratchiov, niov, nob, MSG_DONTWAIT); |
268 | /* NB this is just a boolean..........................^ */ | ||
269 | set_fs (oldmm); | ||
270 | 239 | ||
271 | saved_csum = 0; | 240 | saved_csum = 0; |
272 | if (conn->ksnc_proto == &ksocknal_protocol_v2x) { | 241 | if (conn->ksnc_proto == &ksocknal_protocol_v2x) { |
@@ -355,14 +324,8 @@ ksocknal_lib_recv_kiov (ksock_conn_t *conn) | |||
355 | #endif | 324 | #endif |
356 | lnet_kiov_t *kiov = conn->ksnc_rx_kiov; | 325 | lnet_kiov_t *kiov = conn->ksnc_rx_kiov; |
357 | struct msghdr msg = { | 326 | struct msghdr msg = { |
358 | .msg_name = NULL, | ||
359 | .msg_namelen = 0, | ||
360 | .msg_iov = scratchiov, | ||
361 | .msg_control = NULL, | ||
362 | .msg_controllen = 0, | ||
363 | .msg_flags = 0 | 327 | .msg_flags = 0 |
364 | }; | 328 | }; |
365 | mm_segment_t oldmm = get_fs(); | ||
366 | int nob; | 329 | int nob; |
367 | int i; | 330 | int i; |
368 | int rc; | 331 | int rc; |
@@ -370,13 +333,14 @@ ksocknal_lib_recv_kiov (ksock_conn_t *conn) | |||
370 | void *addr; | 333 | void *addr; |
371 | int sum; | 334 | int sum; |
372 | int fragnob; | 335 | int fragnob; |
336 | int n; | ||
373 | 337 | ||
374 | /* NB we can't trust socket ops to either consume our iovs | 338 | /* NB we can't trust socket ops to either consume our iovs |
375 | * or leave them alone. */ | 339 | * or leave them alone. */ |
376 | addr = ksocknal_lib_kiov_vmap(kiov, niov, scratchiov, pages); | 340 | addr = ksocknal_lib_kiov_vmap(kiov, niov, scratchiov, pages); |
377 | if (addr != NULL) { | 341 | if (addr != NULL) { |
378 | nob = scratchiov[0].iov_len; | 342 | nob = scratchiov[0].iov_len; |
379 | msg.msg_iovlen = 1; | 343 | n = 1; |
380 | 344 | ||
381 | } else { | 345 | } else { |
382 | for (nob = i = 0; i < niov; i++) { | 346 | for (nob = i = 0; i < niov; i++) { |
@@ -384,15 +348,13 @@ ksocknal_lib_recv_kiov (ksock_conn_t *conn) | |||
384 | scratchiov[i].iov_base = kmap(kiov[i].kiov_page) + | 348 | scratchiov[i].iov_base = kmap(kiov[i].kiov_page) + |
385 | kiov[i].kiov_offset; | 349 | kiov[i].kiov_offset; |
386 | } | 350 | } |
387 | msg.msg_iovlen = niov; | 351 | n = niov; |
388 | } | 352 | } |
389 | 353 | ||
390 | LASSERT (nob <= conn->ksnc_rx_nob_wanted); | 354 | LASSERT (nob <= conn->ksnc_rx_nob_wanted); |
391 | 355 | ||
392 | set_fs (KERNEL_DS); | 356 | rc = kernel_recvmsg(conn->ksnc_sock, &msg, |
393 | rc = sock_recvmsg (conn->ksnc_sock, &msg, nob, MSG_DONTWAIT); | 357 | (struct kvec *)scratchiov, n, nob, MSG_DONTWAIT); |
394 | /* NB this is just a boolean.......................^ */ | ||
395 | set_fs (oldmm); | ||
396 | 358 | ||
397 | if (conn->ksnc_msg.ksm_csum != 0) { | 359 | if (conn->ksnc_msg.ksm_csum != 0) { |
398 | for (i = 0, sum = rc; sum > 0; i++, sum -= fragnob) { | 360 | for (i = 0, sum = rc; sum > 0; i++, sum -= fragnob) { |
diff --git a/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c b/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c index e6069d78af6b..7539fe16d76f 100644 --- a/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c +++ b/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c | |||
@@ -265,17 +265,11 @@ libcfs_sock_write (struct socket *sock, void *buffer, int nob, int timeout) | |||
265 | * empty enough to take the whole message immediately */ | 265 | * empty enough to take the whole message immediately */ |
266 | 266 | ||
267 | for (;;) { | 267 | for (;;) { |
268 | struct iovec iov = { | 268 | struct kvec iov = { |
269 | .iov_base = buffer, | 269 | .iov_base = buffer, |
270 | .iov_len = nob | 270 | .iov_len = nob |
271 | }; | 271 | }; |
272 | struct msghdr msg = { | 272 | struct msghdr msg = { |
273 | .msg_name = NULL, | ||
274 | .msg_namelen = 0, | ||
275 | .msg_iov = &iov, | ||
276 | .msg_iovlen = 1, | ||
277 | .msg_control = NULL, | ||
278 | .msg_controllen = 0, | ||
279 | .msg_flags = (timeout == 0) ? MSG_DONTWAIT : 0 | 273 | .msg_flags = (timeout == 0) ? MSG_DONTWAIT : 0 |
280 | }; | 274 | }; |
281 | 275 | ||
@@ -297,11 +291,9 @@ libcfs_sock_write (struct socket *sock, void *buffer, int nob, int timeout) | |||
297 | } | 291 | } |
298 | } | 292 | } |
299 | 293 | ||
300 | set_fs (KERNEL_DS); | ||
301 | then = jiffies; | 294 | then = jiffies; |
302 | rc = sock_sendmsg (sock, &msg, iov.iov_len); | 295 | rc = kernel_sendmsg(sock, &msg, &iov, 1, nob); |
303 | ticks -= jiffies - then; | 296 | ticks -= jiffies - then; |
304 | set_fs (oldmm); | ||
305 | 297 | ||
306 | if (rc == nob) | 298 | if (rc == nob) |
307 | return 0; | 299 | return 0; |
@@ -338,17 +330,11 @@ libcfs_sock_read (struct socket *sock, void *buffer, int nob, int timeout) | |||
338 | LASSERT (ticks > 0); | 330 | LASSERT (ticks > 0); |
339 | 331 | ||
340 | for (;;) { | 332 | for (;;) { |
341 | struct iovec iov = { | 333 | struct kvec iov = { |
342 | .iov_base = buffer, | 334 | .iov_base = buffer, |
343 | .iov_len = nob | 335 | .iov_len = nob |
344 | }; | 336 | }; |
345 | struct msghdr msg = { | 337 | struct msghdr msg = { |
346 | .msg_name = NULL, | ||
347 | .msg_namelen = 0, | ||
348 | .msg_iov = &iov, | ||
349 | .msg_iovlen = 1, | ||
350 | .msg_control = NULL, | ||
351 | .msg_controllen = 0, | ||
352 | .msg_flags = 0 | 338 | .msg_flags = 0 |
353 | }; | 339 | }; |
354 | 340 | ||
@@ -367,11 +353,9 @@ libcfs_sock_read (struct socket *sock, void *buffer, int nob, int timeout) | |||
367 | return rc; | 353 | return rc; |
368 | } | 354 | } |
369 | 355 | ||
370 | set_fs(KERNEL_DS); | ||
371 | then = jiffies; | 356 | then = jiffies; |
372 | rc = sock_recvmsg(sock, &msg, iov.iov_len, 0); | 357 | rc = kernel_recvmsg(sock, &msg, &iov, 1, nob, 0); |
373 | ticks -= jiffies - then; | 358 | ticks -= jiffies - then; |
374 | set_fs(oldmm); | ||
375 | 359 | ||
376 | if (rc < 0) | 360 | if (rc < 0) |
377 | return rc; | 361 | return rc; |
diff --git a/drivers/staging/lustre/lustre/llite/symlink.c b/drivers/staging/lustre/lustre/llite/symlink.c index ab06891f7fc7..80d48b5ae247 100644 --- a/drivers/staging/lustre/lustre/llite/symlink.c +++ b/drivers/staging/lustre/lustre/llite/symlink.c | |||
@@ -115,27 +115,6 @@ failed: | |||
115 | return rc; | 115 | return rc; |
116 | } | 116 | } |
117 | 117 | ||
118 | static int ll_readlink(struct dentry *dentry, char *buffer, int buflen) | ||
119 | { | ||
120 | struct inode *inode = dentry->d_inode; | ||
121 | struct ptlrpc_request *request; | ||
122 | char *symname; | ||
123 | int rc; | ||
124 | |||
125 | CDEBUG(D_VFSTRACE, "VFS Op\n"); | ||
126 | |||
127 | ll_inode_size_lock(inode); | ||
128 | rc = ll_readlink_internal(inode, &request, &symname); | ||
129 | if (rc) | ||
130 | GOTO(out, rc); | ||
131 | |||
132 | rc = vfs_readlink(dentry, buffer, buflen, symname); | ||
133 | out: | ||
134 | ptlrpc_req_finished(request); | ||
135 | ll_inode_size_unlock(inode); | ||
136 | return rc; | ||
137 | } | ||
138 | |||
139 | static void *ll_follow_link(struct dentry *dentry, struct nameidata *nd) | 118 | static void *ll_follow_link(struct dentry *dentry, struct nameidata *nd) |
140 | { | 119 | { |
141 | struct inode *inode = dentry->d_inode; | 120 | struct inode *inode = dentry->d_inode; |
@@ -175,7 +154,7 @@ static void ll_put_link(struct dentry *dentry, struct nameidata *nd, void *cooki | |||
175 | } | 154 | } |
176 | 155 | ||
177 | struct inode_operations ll_fast_symlink_inode_operations = { | 156 | struct inode_operations ll_fast_symlink_inode_operations = { |
178 | .readlink = ll_readlink, | 157 | .readlink = generic_readlink, |
179 | .setattr = ll_setattr, | 158 | .setattr = ll_setattr, |
180 | .follow_link = ll_follow_link, | 159 | .follow_link = ll_follow_link, |
181 | .put_link = ll_put_link, | 160 | .put_link = ll_put_link, |
diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/staging/usbip/stub_dev.c index 773d8ca07a00..de692d7011a5 100644 --- a/drivers/staging/usbip/stub_dev.c +++ b/drivers/staging/usbip/stub_dev.c | |||
@@ -86,7 +86,6 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | |||
86 | struct stub_device *sdev = dev_get_drvdata(dev); | 86 | struct stub_device *sdev = dev_get_drvdata(dev); |
87 | int sockfd = 0; | 87 | int sockfd = 0; |
88 | struct socket *socket; | 88 | struct socket *socket; |
89 | ssize_t err = -EINVAL; | ||
90 | int rv; | 89 | int rv; |
91 | 90 | ||
92 | if (!sdev) { | 91 | if (!sdev) { |
@@ -99,6 +98,7 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | |||
99 | return -EINVAL; | 98 | return -EINVAL; |
100 | 99 | ||
101 | if (sockfd != -1) { | 100 | if (sockfd != -1) { |
101 | int err; | ||
102 | dev_info(dev, "stub up\n"); | 102 | dev_info(dev, "stub up\n"); |
103 | 103 | ||
104 | spin_lock_irq(&sdev->ud.lock); | 104 | spin_lock_irq(&sdev->ud.lock); |
@@ -108,7 +108,7 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | |||
108 | goto err; | 108 | goto err; |
109 | } | 109 | } |
110 | 110 | ||
111 | socket = sockfd_to_socket(sockfd); | 111 | socket = sockfd_lookup(sockfd, &err); |
112 | if (!socket) | 112 | if (!socket) |
113 | goto err; | 113 | goto err; |
114 | 114 | ||
@@ -141,7 +141,7 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | |||
141 | 141 | ||
142 | err: | 142 | err: |
143 | spin_unlock_irq(&sdev->ud.lock); | 143 | spin_unlock_irq(&sdev->ud.lock); |
144 | return err; | 144 | return -EINVAL; |
145 | } | 145 | } |
146 | static DEVICE_ATTR(usbip_sockfd, S_IWUSR, NULL, store_sockfd); | 146 | static DEVICE_ATTR(usbip_sockfd, S_IWUSR, NULL, store_sockfd); |
147 | 147 | ||
@@ -211,7 +211,7 @@ static void stub_shutdown_connection(struct usbip_device *ud) | |||
211 | * not touch NULL socket. | 211 | * not touch NULL socket. |
212 | */ | 212 | */ |
213 | if (ud->tcp_socket) { | 213 | if (ud->tcp_socket) { |
214 | fput(ud->tcp_socket->file); | 214 | sockfd_put(ud->tcp_socket); |
215 | ud->tcp_socket = NULL; | 215 | ud->tcp_socket = NULL; |
216 | } | 216 | } |
217 | 217 | ||
diff --git a/drivers/staging/usbip/usbip_common.c b/drivers/staging/usbip/usbip_common.c index 184fa70365db..facaaf003f19 100644 --- a/drivers/staging/usbip/usbip_common.c +++ b/drivers/staging/usbip/usbip_common.c | |||
@@ -382,31 +382,6 @@ err: | |||
382 | } | 382 | } |
383 | EXPORT_SYMBOL_GPL(usbip_recv); | 383 | EXPORT_SYMBOL_GPL(usbip_recv); |
384 | 384 | ||
385 | struct socket *sockfd_to_socket(unsigned int sockfd) | ||
386 | { | ||
387 | struct socket *socket; | ||
388 | struct file *file; | ||
389 | struct inode *inode; | ||
390 | |||
391 | file = fget(sockfd); | ||
392 | if (!file) { | ||
393 | pr_err("invalid sockfd\n"); | ||
394 | return NULL; | ||
395 | } | ||
396 | |||
397 | inode = file_inode(file); | ||
398 | |||
399 | if (!inode || !S_ISSOCK(inode->i_mode)) { | ||
400 | fput(file); | ||
401 | return NULL; | ||
402 | } | ||
403 | |||
404 | socket = SOCKET_I(inode); | ||
405 | |||
406 | return socket; | ||
407 | } | ||
408 | EXPORT_SYMBOL_GPL(sockfd_to_socket); | ||
409 | |||
410 | /* there may be more cases to tweak the flags. */ | 385 | /* there may be more cases to tweak the flags. */ |
411 | static unsigned int tweak_transfer_flags(unsigned int flags) | 386 | static unsigned int tweak_transfer_flags(unsigned int flags) |
412 | { | 387 | { |
diff --git a/drivers/staging/usbip/usbip_common.h b/drivers/staging/usbip/usbip_common.h index 732fb636a1e5..f555d834f134 100644 --- a/drivers/staging/usbip/usbip_common.h +++ b/drivers/staging/usbip/usbip_common.h | |||
@@ -299,7 +299,6 @@ void usbip_dump_urb(struct urb *purb); | |||
299 | void usbip_dump_header(struct usbip_header *pdu); | 299 | void usbip_dump_header(struct usbip_header *pdu); |
300 | 300 | ||
301 | int usbip_recv(struct socket *sock, void *buf, int size); | 301 | int usbip_recv(struct socket *sock, void *buf, int size); |
302 | struct socket *sockfd_to_socket(unsigned int sockfd); | ||
303 | 302 | ||
304 | void usbip_pack_pdu(struct usbip_header *pdu, struct urb *urb, int cmd, | 303 | void usbip_pack_pdu(struct usbip_header *pdu, struct urb *urb, int cmd, |
305 | int pack); | 304 | int pack); |
diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c index 1e84577230ef..70e17551943d 100644 --- a/drivers/staging/usbip/vhci_hcd.c +++ b/drivers/staging/usbip/vhci_hcd.c | |||
@@ -788,7 +788,7 @@ static void vhci_shutdown_connection(struct usbip_device *ud) | |||
788 | 788 | ||
789 | /* active connection is closed */ | 789 | /* active connection is closed */ |
790 | if (vdev->ud.tcp_socket) { | 790 | if (vdev->ud.tcp_socket) { |
791 | fput(vdev->ud.tcp_socket->file); | 791 | sockfd_put(vdev->ud.tcp_socket); |
792 | vdev->ud.tcp_socket = NULL; | 792 | vdev->ud.tcp_socket = NULL; |
793 | } | 793 | } |
794 | pr_info("release socket\n"); | 794 | pr_info("release socket\n"); |
@@ -835,7 +835,7 @@ static void vhci_device_reset(struct usbip_device *ud) | |||
835 | vdev->udev = NULL; | 835 | vdev->udev = NULL; |
836 | 836 | ||
837 | if (ud->tcp_socket) { | 837 | if (ud->tcp_socket) { |
838 | fput(ud->tcp_socket->file); | 838 | sockfd_put(ud->tcp_socket); |
839 | ud->tcp_socket = NULL; | 839 | ud->tcp_socket = NULL; |
840 | } | 840 | } |
841 | ud->status = VDEV_ST_NULL; | 841 | ud->status = VDEV_ST_NULL; |
diff --git a/drivers/staging/usbip/vhci_sysfs.c b/drivers/staging/usbip/vhci_sysfs.c index e0980324fb03..47bddcdde0a6 100644 --- a/drivers/staging/usbip/vhci_sysfs.c +++ b/drivers/staging/usbip/vhci_sysfs.c | |||
@@ -176,6 +176,7 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, | |||
176 | struct socket *socket; | 176 | struct socket *socket; |
177 | int sockfd = 0; | 177 | int sockfd = 0; |
178 | __u32 rhport = 0, devid = 0, speed = 0; | 178 | __u32 rhport = 0, devid = 0, speed = 0; |
179 | int err; | ||
179 | 180 | ||
180 | /* | 181 | /* |
181 | * @rhport: port number of vhci_hcd | 182 | * @rhport: port number of vhci_hcd |
@@ -194,8 +195,7 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, | |||
194 | return -EINVAL; | 195 | return -EINVAL; |
195 | 196 | ||
196 | /* Extract socket from fd. */ | 197 | /* Extract socket from fd. */ |
197 | /* The correct way to clean this up is to fput(socket->file). */ | 198 | socket = sockfd_lookup(sockfd, &err); |
198 | socket = sockfd_to_socket(sockfd); | ||
199 | if (!socket) | 199 | if (!socket) |
200 | return -EINVAL; | 200 | return -EINVAL; |
201 | 201 | ||
@@ -211,7 +211,7 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, | |||
211 | spin_unlock(&vdev->ud.lock); | 211 | spin_unlock(&vdev->ud.lock); |
212 | spin_unlock(&the_controller->lock); | 212 | spin_unlock(&the_controller->lock); |
213 | 213 | ||
214 | fput(socket->file); | 214 | sockfd_put(socket); |
215 | 215 | ||
216 | dev_err(dev, "port %d already used\n", rhport); | 216 | dev_err(dev, "port %d already used\n", rhport); |
217 | return -EINVAL; | 217 | return -EINVAL; |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index e1e22e0f01e8..be414d2b2b22 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -818,9 +818,9 @@ static int vhost_net_release(struct inode *inode, struct file *f) | |||
818 | vhost_dev_cleanup(&n->dev, false); | 818 | vhost_dev_cleanup(&n->dev, false); |
819 | vhost_net_vq_reset(n); | 819 | vhost_net_vq_reset(n); |
820 | if (tx_sock) | 820 | if (tx_sock) |
821 | fput(tx_sock->file); | 821 | sockfd_put(tx_sock); |
822 | if (rx_sock) | 822 | if (rx_sock) |
823 | fput(rx_sock->file); | 823 | sockfd_put(rx_sock); |
824 | /* Make sure no callbacks are outstanding */ | 824 | /* Make sure no callbacks are outstanding */ |
825 | synchronize_rcu_bh(); | 825 | synchronize_rcu_bh(); |
826 | /* We do an extra flush before freeing memory, | 826 | /* We do an extra flush before freeing memory, |
@@ -860,7 +860,7 @@ static struct socket *get_raw_socket(int fd) | |||
860 | } | 860 | } |
861 | return sock; | 861 | return sock; |
862 | err: | 862 | err: |
863 | fput(sock->file); | 863 | sockfd_put(sock); |
864 | return ERR_PTR(r); | 864 | return ERR_PTR(r); |
865 | } | 865 | } |
866 | 866 | ||
@@ -966,7 +966,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) | |||
966 | 966 | ||
967 | if (oldsock) { | 967 | if (oldsock) { |
968 | vhost_net_flush_vq(n, index); | 968 | vhost_net_flush_vq(n, index); |
969 | fput(oldsock->file); | 969 | sockfd_put(oldsock); |
970 | } | 970 | } |
971 | 971 | ||
972 | mutex_unlock(&n->dev.mutex); | 972 | mutex_unlock(&n->dev.mutex); |
@@ -978,7 +978,7 @@ err_used: | |||
978 | if (ubufs) | 978 | if (ubufs) |
979 | vhost_net_ubuf_put_wait_and_free(ubufs); | 979 | vhost_net_ubuf_put_wait_and_free(ubufs); |
980 | err_ubufs: | 980 | err_ubufs: |
981 | fput(sock->file); | 981 | sockfd_put(sock); |
982 | err_vq: | 982 | err_vq: |
983 | mutex_unlock(&vq->mutex); | 983 | mutex_unlock(&vq->mutex); |
984 | err: | 984 | err: |
@@ -1009,9 +1009,9 @@ static long vhost_net_reset_owner(struct vhost_net *n) | |||
1009 | done: | 1009 | done: |
1010 | mutex_unlock(&n->dev.mutex); | 1010 | mutex_unlock(&n->dev.mutex); |
1011 | if (tx_sock) | 1011 | if (tx_sock) |
1012 | fput(tx_sock->file); | 1012 | sockfd_put(tx_sock); |
1013 | if (rx_sock) | 1013 | if (rx_sock) |
1014 | fput(rx_sock->file); | 1014 | sockfd_put(rx_sock); |
1015 | return err; | 1015 | return err; |
1016 | } | 1016 | } |
1017 | 1017 | ||