public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
	akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
	FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>,
	Jens Axboe <jens.axboe@oracle.com>
Subject: [patch 32/71] block: fix sg SG_DXFER_TO_FROM_DEV regression
Date: Tue, 28 Jul 2009 16:41:01 -0700	[thread overview]
Message-ID: <20090728234156.091259838@mini.kroah.org> (raw)
In-Reply-To: <20090728234756.GA11917@kroah.com>

[-- Attachment #1: block-fix-sg-sg_dxfer_to_from_dev-regression.patch --]
[-- Type: text/plain, Size: 4504 bytes --]

2.6.30-stable review patch.  If anyone has any objections, please let us know.

------------------

From: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>

commit ecb554a846f8e9d2a58f6d6c118168a63ac065aa upstream.

I overlooked SG_DXFER_TO_FROM_DEV support when I converted sg to use
the block layer mapping API (2.6.28).

Douglas Gilbert explained SG_DXFER_TO_FROM_DEV:

http://www.spinics.net/lists/linux-scsi/msg37135.html

=
The semantics of SG_DXFER_TO_FROM_DEV were:
   - copy user space buffer to kernel (LLD) buffer
   - do SCSI command which is assumed to be of the DATA_IN
     (data from device) variety. This would overwrite
     some or all of the kernel buffer
   - copy kernel (LLD) buffer back to the user space.

The idea was to detect short reads by filling the original
user space buffer with some marker bytes ("0xec" it would
seem in this report). The "resid" value is a better way
of detecting short reads but that was only added this century
and requires co-operation from the LLD.
=

This patch changes the block layer mapping API to support this
semantics. This simply adds another field to struct rq_map_data and
enables __bio_copy_iov() to copy data from user space even with READ
requests.

It's better to add the flags field and kills null_mapped and the new
from_user fields in struct rq_map_data but that approach makes it
difficult to send this patch to stable trees because st and osst
drivers use struct rq_map_data (they were converted to use the block
layer in 2.6.29 and 2.6.30). Well, I should clean up the block layer
mapping API.

zhou sf reported this regiression and tested this patch:

http://www.spinics.net/lists/linux-scsi/msg37128.html
http://www.spinics.net/lists/linux-scsi/msg37168.html

Reported-by: zhou sf <sxzzsf@gmail.com>
Tested-by: zhou sf <sxzzsf@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/scsi/sg.c      |    4 ++++
 fs/bio.c               |   22 ++++++++++++----------
 include/linux/blkdev.h |    1 +
 3 files changed, 17 insertions(+), 10 deletions(-)

--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1656,6 +1656,10 @@ static int sg_start_req(Sg_request *srp,
 		md->nr_entries = req_schp->k_use_sg;
 		md->offset = 0;
 		md->null_mapped = hp->dxferp ? 0 : 1;
+		if (dxfer_dir == SG_DXFER_TO_FROM_DEV)
+			md->from_user = 1;
+		else
+			md->from_user = 0;
 	}
 
 	if (iov_count) {
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -706,14 +706,13 @@ static struct bio_map_data *bio_alloc_ma
 }
 
 static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs,
-			  struct sg_iovec *iov, int iov_count, int uncopy,
-			  int do_free_page)
+			  struct sg_iovec *iov, int iov_count,
+			  int to_user, int from_user, int do_free_page)
 {
 	int ret = 0, i;
 	struct bio_vec *bvec;
 	int iov_idx = 0;
 	unsigned int iov_off = 0;
-	int read = bio_data_dir(bio) == READ;
 
 	__bio_for_each_segment(bvec, bio, i, 0) {
 		char *bv_addr = page_address(bvec->bv_page);
@@ -728,13 +727,14 @@ static int __bio_copy_iov(struct bio *bi
 			iov_addr = iov[iov_idx].iov_base + iov_off;
 
 			if (!ret) {
-				if (!read && !uncopy)
-					ret = copy_from_user(bv_addr, iov_addr,
-							     bytes);
-				if (read && uncopy)
+				if (to_user)
 					ret = copy_to_user(iov_addr, bv_addr,
 							   bytes);
 
+				if (from_user)
+					ret = copy_from_user(bv_addr, iov_addr,
+							     bytes);
+
 				if (ret)
 					ret = -EFAULT;
 			}
@@ -771,7 +771,8 @@ int bio_uncopy_user(struct bio *bio)
 
 	if (!bio_flagged(bio, BIO_NULL_MAPPED))
 		ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs,
-				     bmd->nr_sgvecs, 1, bmd->is_our_pages);
+				     bmd->nr_sgvecs, bio_data_dir(bio) == READ,
+				     0, bmd->is_our_pages);
 	bio_free_map_data(bmd);
 	bio_put(bio);
 	return ret;
@@ -876,8 +877,9 @@ struct bio *bio_copy_user_iov(struct req
 	/*
 	 * success
 	 */
-	if (!write_to_vm && (!map_data || !map_data->null_mapped)) {
-		ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0, 0);
+	if ((!write_to_vm && (!map_data || !map_data->null_mapped)) ||
+	    (map_data && map_data->from_user)) {
+		ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0, 1, 0);
 		if (ret)
 			goto cleanup;
 	}
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -723,6 +723,7 @@ struct rq_map_data {
 	int nr_entries;
 	unsigned long offset;
 	int null_mapped;
+	int from_user;
 };
 
 struct req_iterator {



  parent reply	other threads:[~2009-07-28 23:50 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20090728234029.868717854@mini.kroah.org>
2009-07-28 23:47 ` [patch 00/71] [00/@num@] 2.6.30.4-stable review Greg KH
2009-07-28 23:40   ` [patch 01/71] SCSI: zalon: fix oops on attach failure Greg KH
2009-07-28 23:40   ` [patch 02/71] NFSD: Dont hold unrefcounted creds over call to nfsd_setuser() Greg KH
2009-07-28 23:40   ` [patch 03/71] sound: virtuoso: fix Xonar D1/DX silence after resume Greg KH
2009-07-28 23:40   ` [patch 04/71] sound: usb-audio: add workaround for Blue Microphones devices Greg KH
2009-07-28 23:40   ` [patch 05/71] fix RCU-callback-after-kmem_cache_destroy problem in sl[aou]b Greg KH
2009-07-28 23:40   ` [patch 06/71] dsa: fix 88e6xxx statistics counter snapshotting Greg KH
2009-07-28 23:40   ` [patch 07/71] gigaset: accept connection establishment messages in any order Greg KH
2009-07-28 23:40   ` [patch 08/71] cfg80211: fix refcount leak Greg KH
2009-07-28 23:40   ` [patch 09/71] Staging: prevent rtl8187se from crashing dev_ioctl() in SIOCGIWNAME Greg KH
2009-07-28 23:40   ` [patch 10/71] USB: handle zero-length usbfs submissions correctly Greg KH
2009-07-28 23:40   ` [patch 11/71] USB: ti_usb_3410_5052: fix duplicate device ids Greg KH
2009-07-28 23:40   ` [patch 12/71] USB: fix uninitialised variable in ti_do_download Greg KH
2009-07-28 23:40   ` [patch 13/71] USB: fix the clear_tt_buffer interface Greg KH
2009-07-28 23:40   ` [patch 14/71] USB: EHCI: use the new " Greg KH
2009-07-29 13:56     ` Alan Stern
2009-07-29 14:03       ` Greg KH
2009-07-29 14:24         ` Alan Stern
2009-07-29 14:44           ` Greg KH
2009-07-28 23:40   ` [patch 15/71] USB: fix memleak in usbfs Greg KH
2009-07-28 23:40   ` [patch 16/71] USB: RNDIS gadget, fix issues talking from PXA Greg KH
2009-07-28 23:40   ` [patch 17/71] USB: fix LANGID=0 regression Greg KH
2009-07-28 23:40   ` [patch 18/71] USB: EHCI: report actual_length for iso transfers Greg KH
2009-07-28 23:40   ` [patch 19/71] cifs: fix regression with O_EXCL creates and optimize away lookup Greg KH
2009-07-28 23:40   ` [patch 20/71] cifs: free nativeFileSystem field before allocating a new one Greg KH
2009-07-28 23:40   ` [patch 21/71] ALSA: ca0106 - Fix the max capture buffer size Greg KH
2009-07-28 23:40   ` [patch 22/71] ALSA: hda - Fix pin-setup for Sony VAIO with STAC9872 codecs Greg KH
2009-07-28 23:40   ` [patch 23/71] ALSA: hda - Add quirk for Gateway T6834c laptop Greg KH
2009-07-28 23:40   ` [patch 24/71] ALSA: hda - Fix mute control with some ALC262 models Greg KH
2009-07-28 23:40   ` [patch 25/71] HID: hiddev, fix lock imbalance Greg KH
2009-07-28 23:40   ` [patch 26/71] mvsdio: fix handling of partial word at the end of PIO transfer Greg KH
2009-07-28 23:40   ` [patch 27/71] ASoC: Fix register cache initialisation for WM8753 Greg KH
2009-07-28 23:40   ` [patch 28/71] partitions: fix broken uevent_suppress conversion Greg KH
2009-07-28 23:40   ` [patch 29/71] vc: create vcs(a) devices for consoles Greg KH
2009-07-28 23:40   ` [patch 30/71] x86: Fix fixmap ordering Greg KH
2009-07-28 23:41   ` [patch 31/71] x86: Fix fixmap page order for FIX_TEXT_POKE0,1 Greg KH
2009-07-28 23:41   ` Greg KH [this message]
2009-07-28 23:41   ` [patch 33/71] nilfs2: remove unlikely directive causing mis-conversion of error code Greg KH
2009-07-28 23:41   ` [patch 34/71] nilfs2: fix hang problem of log writer which occurs after write failures Greg KH
2009-07-28 23:41   ` [patch 35/71] nilfs2: fix incorrect KERN_CRIT messages in case of " Greg KH
2009-07-28 23:41   ` [patch 36/71] nilfs2: fix disorder in cp count on error during deleting checkpoints Greg KH
2009-07-28 23:41   ` [patch 37/71] sched_rt: Fix overload bug on rt group scheduling Greg KH
2009-07-28 23:41   ` [patch 38/71] tracing/function: Fix the return value of ftrace_trace_onoff_callback() Greg KH
2009-07-28 23:41   ` [patch 39/71] x86/pci: insert ioapic resource before assigning unassigned resources Greg KH
2009-07-28 23:41   ` [patch 40/71] sched: fix nr_uninterruptible accounting of frozen tasks really Greg KH
2009-07-28 23:41   ` [patch 41/71] dm raid1: wake kmirrord when requeueing delayed bios after remote recovery Greg KH
2009-07-28 23:41   ` [patch 42/71] x86: geode: Mark mfgpt irq IRQF_TIMER to prevent resume failure Greg KH
2009-07-28 23:41   ` [patch 43/71] x86: Fix movq immediate operand constraints in uaccess_64.h Greg KH
2009-07-28 23:41   ` [patch 44/71] x86: Fix movq immediate operand constraints in uaccess.h Greg KH
2009-07-28 23:41   ` [patch 45/71] x86: Add quirk for Intel DG45ID board to avoid low memory corruption Greg KH
2009-07-28 23:41   ` [patch 46/71] x86-64: Fix bad_srat() to clear all state Greg KH
2009-07-28 23:41   ` [patch 47/71] parisc: ensure broadcast tlb purge runs single threaded Greg KH
2009-07-28 23:41   ` [patch 48/71] parisc: fix ldcw inline assembler Greg KH
2009-07-28 23:41   ` [patch 49/71] x86, setup (2.6.30-stable) fix 80x34 and 80x60 console modes Greg KH
2009-07-28 23:41   ` [patch 50/71] Staging: rt2870: Add USB ID for Sitecom WL-608 Greg KH
2009-07-28 23:41   ` [patch 51/71] vmscan: do not unconditionally treat zones that fail zone_reclaim() as full Greg KH
2009-07-28 23:41   ` [patch 52/71] x86: dont use access_ok() as a range check in get_user_pages_fast() Greg KH
2009-07-28 23:41   ` [patch 53/71] mm: mark page accessed before we write_end() Greg KH
2009-07-28 23:41   ` [patch 54/71] elf: fix one check-after-use Greg KH
2009-07-28 23:41   ` [patch 55/71] hwmon: (max6650) Fix lock imbalance Greg KH
2009-07-28 23:41   ` [patch 56/71] powerpc/mpic: Fix mapping of "DCR" based MPIC variants Greg KH
2009-07-28 23:41   ` [patch 57/71] netfilter: nf_log: fix sleeping function called from invalid context Greg KH
2009-07-28 23:41   ` [patch 58/71] netfilter: nf_conntrack: fix confirmation race condition Greg KH
2009-07-28 23:41   ` [patch 59/71] netfilter: nf_conntrack: fix conntrack lookup race Greg KH
2009-07-28 23:41   ` [patch 60/71] netfilter: nf_log: fix direct userspace memory access in proc handler Greg KH
2009-07-28 23:41   ` [patch 61/71] netfilter: xt_quota: fix incomplete initialization Greg KH
2009-07-28 23:41   ` [patch 62/71] netfilter: xt_rateest: fix comparison with self Greg KH
2009-07-28 23:41   ` [patch 63/71] netfilter: tcp conntrack: fix unacknowledged data detection with NAT Greg KH
2009-07-28 23:41   ` [patch 64/71] nf_conntrack: nf_conntrack_alloc() fixes Greg KH
2009-07-28 23:41   ` [patch 65/71] netdev: restore MAC address set and validate operations Greg KH
2009-07-28 23:41   ` [patch 66/71] netdev: restore MTU change operation Greg KH
2009-07-28 23:41   ` [patch 67/71] Input: wistron_btns - recognize Maxdata Pro 7000 notebooks Greg KH
2009-07-28 23:41   ` [patch 68/71] libata: fix follow-up SRST failure path Greg KH
2009-07-28 23:41   ` [patch 69/71] nommu: Provide mmap_min_addr definition Greg KH
2009-07-28 23:41   ` [patch 70/71] eCryptfs: Check Tag 11 literal data buffer size (CVE-2009-2406) Greg KH
2009-07-28 23:41   ` [patch 71/71] eCryptfs: parse_tag_3_packet check tag 3 packet encrypted key size (CVE-2009-2407) Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090728234156.091259838@mini.kroah.org \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=fujita.tomonori@lab.ntt.co.jp \
    --cc=jens.axboe@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable-review@kernel.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox