aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-04-12 17:49:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-04-12 17:49:50 -0400
commit5166701b368caea89d57b14bf41cf39e819dad51 (patch)
treec73b9d4860809e3afa9359be9d03ba2d8d98a18e /drivers/block
parent0a7418f5f569512e98789c439198eed4b507cce3 (diff)
parenta786c06d9f2719203c00b3d97b21f9a96980d0b5 (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/block')
-rw-r--r--drivers/block/drbd/drbd_receiver.c12
-rw-r--r--drivers/block/nbd.c48
2 files changed, 20 insertions, 40 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
470static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flags) 470static 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
492static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size) 482static 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);