Merge branch '3.4-urgent' of git://git.kernel.org/pub/scm/linux/kernel/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

+19 -6
+16 -6
drivers/target/target_core_file.c
··· 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. ··· 184 183 * one (1) logical sector from underlying struct block_device 185 184 */ 186 185 fd_dev->fd_block_size = bdev_logical_block_size(inode->i_bdev); 187 - fd_dev->fd_dev_size = (i_size_read(file->f_mapping->host) - 186 + dev_size = (i_size_read(file->f_mapping->host) - 188 187 fd_dev->fd_block_size); 189 188 190 189 pr_debug("FILEIO: Using size: %llu bytes from struct" 191 190 " block_device blocks: %llu logical_block_size: %d\n", 192 - fd_dev->fd_dev_size, 193 - div_u64(fd_dev->fd_dev_size, fd_dev->fd_block_size), 191 + dev_size, div_u64(dev_size, fd_dev->fd_block_size), 194 192 fd_dev->fd_block_size); 195 193 } else { 196 194 if (!(fd_dev->fbd_flags & FBDF_HAS_SIZE)) { ··· 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 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) {