Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
  • 3 commits
  • 2 files changed
  • 0 comments
  • 3 contributors
May 14, 2012
Bernhard Kohl target: Fix SPC-2 RELEASE bug for multi-session iSCSI client setups
This patch addresses a bug in a special case for target core SPC-2 RELEASE
logic where the same physical client (eg: iSCSI InitiatorName) with
differing iSCSI session identifiers (ISID) is allowed to incorrectly release
the same client's SPC-2 reservation from the non reservation holding path.

Note this bug is specific to iscsi-target w/ SPC-2 reservations, and
with the default enforce_pr_isids=1 device attr setting in target-core
controls if a InitiatorName + different ISID reservations are handled
the same as a single iSCSI client entity.

Signed-off-by: Bernhard Kohl <bernhard.kohl@gmx.net>
Cc: <stable@vger.kernel.org>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
edc318d
May 17, 2012
Nicholas Bellinger target: Fix bug in handling of FILEIO + block_device resize ops
This patch fixes a bug in the handling of FILEIO w/ underlying block_device
resize operations where the original fd_dev->fd_dev_size was incorrectly being
used in fd_get_blocks() for READ_CAPACITY response payloads.

This patch avoids using fd_dev->fd_dev_size for FILEIO devices with
an underlying block_device, and instead changes fd_get_blocks() to
get the sector count directly from i_size_read() as recommended by hch.

Reported-by: Christoph Hellwig <hch@lst.de>
Cc: <stable@vger.kernel.org>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
cd9323f
Linus Torvalds Merge branch '3.4-urgent' of git://git.kernel.org/pub/scm/linux/kerne…
…l/git/nab/target-pending

Pull two more target-core updates from Nicholas Bellinger:
 "The first patch addresses a SPC-2 reservations RELEASE bug in a
  special (iscsi specific) multi-ISID setup case that was allowing the
  same initiator to be able to incorrect release it's own reservation on
  a different SCSI path with enforce_pr_isid=1 operation.  This bug was
  caught by Bernhard Kohl.

  The second patch is to address a bug with FILEIO backends where the
  incorrect number of blocks for READ_CAPACITY was being reported after
  an underlying device-mapper block_device size change.  This patch uses
  now i_size_read() in fd_get_blocks() for FILEIO backends with an
  underlying block_device, instead of trying to determine this value at
  setup time during fd_create_virtdevice().  (hch CC'ed)

  Both are CC'ed to stable."

* '3.4-urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
  target: Fix bug in handling of FILEIO + block_device resize ops
  target: Fix SPC-2 RELEASE bug for multi-session iSCSI client setups
eea0364
22 drivers/target/target_core_file.c
@@ -169,6 +169,7 @@ static struct se_device *fd_create_virtdevice(
169 169 inode = file->f_mapping->host;
170 170 if (S_ISBLK(inode->i_mode)) {
171 171 struct request_queue *q;
  172 + unsigned long long dev_size;
172 173 /*
173 174 * Setup the local scope queue_limits from struct request_queue->limits
174 175 * to pass into transport_add_device_to_core_hba() as struct se_dev_limits.
@@ -183,13 +184,12 @@ static struct se_device *fd_create_virtdevice(
183 184 * one (1) logical sector from underlying struct block_device
184 185 */
185 186 fd_dev->fd_block_size = bdev_logical_block_size(inode->i_bdev);
186   - fd_dev->fd_dev_size = (i_size_read(file->f_mapping->host) -
  187 + dev_size = (i_size_read(file->f_mapping->host) -
187 188 fd_dev->fd_block_size);
188 189
189 190 pr_debug("FILEIO: Using size: %llu bytes from struct"
190 191 " block_device blocks: %llu logical_block_size: %d\n",
191   - fd_dev->fd_dev_size,
192   - div_u64(fd_dev->fd_dev_size, fd_dev->fd_block_size),
  192 + dev_size, div_u64(dev_size, fd_dev->fd_block_size),
193 193 fd_dev->fd_block_size);
194 194 } else {
195 195 if (!(fd_dev->fbd_flags & FBDF_HAS_SIZE)) {
@@ -605,10 +605,20 @@ static u32 fd_get_device_type(struct se_device *dev)
605 605 static sector_t fd_get_blocks(struct se_device *dev)
606 606 {
607 607 struct fd_dev *fd_dev = dev->dev_ptr;
608   - unsigned long long blocks_long = div_u64(fd_dev->fd_dev_size,
609   - dev->se_sub_dev->se_dev_attrib.block_size);
  608 + struct file *f = fd_dev->fd_file;
  609 + struct inode *i = f->f_mapping->host;
  610 + unsigned long long dev_size;
  611 + /*
  612 + * When using a file that references an underlying struct block_device,
  613 + * ensure dev_size is always based on the current inode size in order
  614 + * to handle underlying block_device resize operations.
  615 + */
  616 + if (S_ISBLK(i->i_mode))
  617 + dev_size = (i_size_read(i) - fd_dev->fd_block_size);
  618 + else
  619 + dev_size = fd_dev->fd_dev_size;
610 620
611   - return blocks_long;
  621 + return div_u64(dev_size, dev->se_sub_dev->se_dev_attrib.block_size);
612 622 }
613 623
614 624 static struct se_subsystem_api fileio_template = {
3  drivers/target/target_core_pr.c
@@ -220,6 +220,9 @@ int target_scsi2_reservation_release(struct se_task *task)
220 220 if (dev->dev_reserved_node_acl != sess->se_node_acl)
221 221 goto out_unlock;
222 222
  223 + if (dev->dev_res_bin_isid != sess->sess_bin_isid)
  224 + goto out_unlock;
  225 +
223 226 dev->dev_reserved_node_acl = NULL;
224 227 dev->dev_flags &= ~DF_SPC2_RESERVATIONS;
225 228 if (dev->dev_flags & DF_SPC2_RESERVATIONS_WITH_ISID) {

No commit comments for this range

Something went wrong with that request. Please try again.