This source file includes following definitions.
- spc_fill_alua_data
- spc_emulate_inquiry_std
- spc_emulate_evpd_80
- spc_parse_naa_6h_vendor_specific
- spc_emulate_evpd_83
- spc_emulate_evpd_86
- spc_emulate_evpd_b0
- spc_emulate_evpd_b1
- spc_emulate_evpd_b2
- spc_emulate_evpd_b3
- spc_emulate_evpd_00
- spc_emulate_inquiry
- spc_modesense_rwrecovery
- spc_modesense_control
- spc_modesense_caching
- spc_modesense_informational_exceptions
- spc_modesense_write_protect
- spc_modesense_dpofua
- spc_modesense_blockdesc
- spc_modesense_long_blockdesc
- spc_emulate_modesense
- spc_emulate_modeselect
- spc_emulate_request_sense
- spc_emulate_report_luns
- spc_emulate_testunitready
- spc_parse_cdb
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 #include <linux/kernel.h>
  11 #include <linux/module.h>
  12 #include <asm/unaligned.h>
  13 
  14 #include <scsi/scsi_proto.h>
  15 #include <scsi/scsi_common.h>
  16 #include <scsi/scsi_tcq.h>
  17 
  18 #include <target/target_core_base.h>
  19 #include <target/target_core_backend.h>
  20 #include <target/target_core_fabric.h>
  21 
  22 #include "target_core_internal.h"
  23 #include "target_core_alua.h"
  24 #include "target_core_pr.h"
  25 #include "target_core_ua.h"
  26 #include "target_core_xcopy.h"
  27 
  28 static void spc_fill_alua_data(struct se_lun *lun, unsigned char *buf)
  29 {
  30         struct t10_alua_tg_pt_gp *tg_pt_gp;
  31 
  32         
  33 
  34 
  35         buf[5]  = 0x80;
  36 
  37         
  38 
  39 
  40 
  41 
  42 
  43         spin_lock(&lun->lun_tg_pt_gp_lock);
  44         tg_pt_gp = lun->lun_tg_pt_gp;
  45         if (tg_pt_gp)
  46                 buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type;
  47         spin_unlock(&lun->lun_tg_pt_gp_lock);
  48 }
  49 
  50 sense_reason_t
  51 spc_emulate_inquiry_std(struct se_cmd *cmd, unsigned char *buf)
  52 {
  53         struct se_lun *lun = cmd->se_lun;
  54         struct se_device *dev = cmd->se_dev;
  55         struct se_session *sess = cmd->se_sess;
  56 
  57         
  58         if (dev->transport->get_device_type(dev) == TYPE_TAPE)
  59                 buf[1] = 0x80;
  60 
  61         buf[2] = 0x05; 
  62 
  63         
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73         buf[3] = 2;
  74 
  75         
  76 
  77 
  78         spc_fill_alua_data(lun, buf);
  79 
  80         
  81 
  82 
  83         if (dev->dev_attrib.emulate_3pc)
  84                 buf[5] |= 0x8;
  85         
  86 
  87 
  88 
  89 
  90 
  91         if (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) {
  92                 if (dev->dev_attrib.pi_prot_type || cmd->se_sess->sess_prot_type)
  93                         buf[5] |= 0x1;
  94         }
  95 
  96         buf[7] = 0x2; 
  97 
  98         
  99 
 100 
 101 
 102 
 103         memset(&buf[8], 0x20,
 104                INQUIRY_VENDOR_LEN + INQUIRY_MODEL_LEN + INQUIRY_REVISION_LEN);
 105         memcpy(&buf[8], dev->t10_wwn.vendor,
 106                strnlen(dev->t10_wwn.vendor, INQUIRY_VENDOR_LEN));
 107         memcpy(&buf[16], dev->t10_wwn.model,
 108                strnlen(dev->t10_wwn.model, INQUIRY_MODEL_LEN));
 109         memcpy(&buf[32], dev->t10_wwn.revision,
 110                strnlen(dev->t10_wwn.revision, INQUIRY_REVISION_LEN));
 111         buf[4] = 31; 
 112 
 113         return 0;
 114 }
 115 EXPORT_SYMBOL(spc_emulate_inquiry_std);
 116 
 117 
 118 static sense_reason_t
 119 spc_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf)
 120 {
 121         struct se_device *dev = cmd->se_dev;
 122         u16 len;
 123 
 124         if (dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
 125                 len = sprintf(&buf[4], "%s", dev->t10_wwn.unit_serial);
 126                 len++; 
 127                 buf[3] = len;
 128         }
 129         return 0;
 130 }
 131 
 132 void spc_parse_naa_6h_vendor_specific(struct se_device *dev,
 133                                       unsigned char *buf)
 134 {
 135         unsigned char *p = &dev->t10_wwn.unit_serial[0];
 136         int cnt;
 137         bool next = true;
 138 
 139         
 140 
 141 
 142 
 143 
 144 
 145 
 146 
 147         for (cnt = 0; *p && cnt < 13; p++) {
 148                 int val = hex_to_bin(*p);
 149 
 150                 if (val < 0)
 151                         continue;
 152 
 153                 if (next) {
 154                         next = false;
 155                         buf[cnt++] |= val;
 156                 } else {
 157                         next = true;
 158                         buf[cnt] = val << 4;
 159                 }
 160         }
 161 }
 162 
 163 
 164 
 165 
 166 
 167 sense_reason_t
 168 spc_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
 169 {
 170         struct se_device *dev = cmd->se_dev;
 171         struct se_lun *lun = cmd->se_lun;
 172         struct se_portal_group *tpg = NULL;
 173         struct t10_alua_lu_gp_member *lu_gp_mem;
 174         struct t10_alua_tg_pt_gp *tg_pt_gp;
 175         unsigned char *prod = &dev->t10_wwn.model[0];
 176         u32 prod_len;
 177         u32 unit_serial_len, off = 0;
 178         u16 len = 0, id_len;
 179 
 180         off = 4;
 181 
 182         
 183 
 184 
 185 
 186 
 187 
 188 
 189 
 190         if (!(dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL))
 191                 goto check_t10_vend_desc;
 192 
 193         
 194         buf[off++] = 0x1;
 195 
 196         
 197         buf[off] = 0x00;
 198 
 199         
 200         buf[off++] |= 0x3;
 201         off++;
 202 
 203         
 204         buf[off++] = 0x10;
 205 
 206         
 207 
 208 
 209         buf[off++] = (0x6 << 4);
 210 
 211         
 212 
 213 
 214         buf[off++] = 0x01;
 215         buf[off++] = 0x40;
 216         buf[off] = (0x5 << 4);
 217 
 218         
 219 
 220 
 221 
 222 
 223         spc_parse_naa_6h_vendor_specific(dev, &buf[off]);
 224 
 225         len = 20;
 226         off = (len + 4);
 227 
 228 check_t10_vend_desc:
 229         
 230 
 231 
 232         id_len = 8; 
 233         prod_len = 4; 
 234         prod_len += 8; 
 235         prod_len += strlen(prod);
 236         prod_len++; 
 237 
 238         if (dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
 239                 unit_serial_len = strlen(&dev->t10_wwn.unit_serial[0]);
 240                 unit_serial_len++; 
 241 
 242                 id_len += sprintf(&buf[off+12], "%s:%s", prod,
 243                                 &dev->t10_wwn.unit_serial[0]);
 244         }
 245         buf[off] = 0x2; 
 246         buf[off+1] = 0x1; 
 247         buf[off+2] = 0x0;
 248         
 249         memset(&buf[off+4], 0x20, INQUIRY_VENDOR_LEN);
 250         memcpy(&buf[off+4], dev->t10_wwn.vendor,
 251                strnlen(dev->t10_wwn.vendor, INQUIRY_VENDOR_LEN));
 252         
 253         id_len++;
 254         
 255         buf[off+3] = id_len;
 256         
 257         len += (id_len + 4);
 258         off += (id_len + 4);
 259 
 260         if (1) {
 261                 struct t10_alua_lu_gp *lu_gp;
 262                 u32 padding, scsi_name_len, scsi_target_len;
 263                 u16 lu_gp_id = 0;
 264                 u16 tg_pt_gp_id = 0;
 265                 u16 tpgt;
 266 
 267                 tpg = lun->lun_tpg;
 268                 
 269 
 270 
 271 
 272 
 273 
 274 
 275                 buf[off] = tpg->proto_id << 4;
 276                 buf[off++] |= 0x1; 
 277                 buf[off] = 0x80; 
 278                 
 279                 buf[off] |= 0x10;
 280                 
 281                 buf[off++] |= 0x4;
 282                 off++; 
 283                 buf[off++] = 4; 
 284                 
 285 
 286                 off += 2;
 287                 put_unaligned_be16(lun->lun_rtpi, &buf[off]);
 288                 off += 2;
 289                 len += 8; 
 290                 
 291 
 292 
 293 
 294 
 295 
 296 
 297                 spin_lock(&lun->lun_tg_pt_gp_lock);
 298                 tg_pt_gp = lun->lun_tg_pt_gp;
 299                 if (!tg_pt_gp) {
 300                         spin_unlock(&lun->lun_tg_pt_gp_lock);
 301                         goto check_lu_gp;
 302                 }
 303                 tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id;
 304                 spin_unlock(&lun->lun_tg_pt_gp_lock);
 305 
 306                 buf[off] = tpg->proto_id << 4;
 307                 buf[off++] |= 0x1; 
 308                 buf[off] = 0x80; 
 309                 
 310                 buf[off] |= 0x10;
 311                 
 312                 buf[off++] |= 0x5;
 313                 off++; 
 314                 buf[off++] = 4; 
 315                 off += 2; 
 316                 put_unaligned_be16(tg_pt_gp_id, &buf[off]);
 317                 off += 2;
 318                 len += 8; 
 319                 
 320 
 321 
 322 
 323 check_lu_gp:
 324                 lu_gp_mem = dev->dev_alua_lu_gp_mem;
 325                 if (!lu_gp_mem)
 326                         goto check_scsi_name;
 327 
 328                 spin_lock(&lu_gp_mem->lu_gp_mem_lock);
 329                 lu_gp = lu_gp_mem->lu_gp;
 330                 if (!lu_gp) {
 331                         spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
 332                         goto check_scsi_name;
 333                 }
 334                 lu_gp_id = lu_gp->lu_gp_id;
 335                 spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
 336 
 337                 buf[off++] |= 0x1; 
 338                 
 339                 buf[off++] |= 0x6;
 340                 off++; 
 341                 buf[off++] = 4; 
 342                 off += 2; 
 343                 put_unaligned_be16(lu_gp_id, &buf[off]);
 344                 off += 2;
 345                 len += 8; 
 346                 
 347 
 348 
 349 
 350 
 351 
 352 
 353 check_scsi_name:
 354                 buf[off] = tpg->proto_id << 4;
 355                 buf[off++] |= 0x3; 
 356                 buf[off] = 0x80; 
 357                 
 358                 buf[off] |= 0x10;
 359                 
 360                 buf[off++] |= 0x8;
 361                 off += 2; 
 362                 
 363 
 364 
 365 
 366 
 367 
 368                 tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg);
 369                 scsi_name_len = sprintf(&buf[off], "%s,t,0x%04x",
 370                                         tpg->se_tpg_tfo->tpg_get_wwn(tpg), tpgt);
 371                 scsi_name_len += 1 ;
 372                 
 373 
 374 
 375 
 376 
 377 
 378 
 379 
 380                 padding = ((-scsi_name_len) & 3);
 381                 if (padding)
 382                         scsi_name_len += padding;
 383                 if (scsi_name_len > 256)
 384                         scsi_name_len = 256;
 385 
 386                 buf[off-1] = scsi_name_len;
 387                 off += scsi_name_len;
 388                 
 389                 len += (scsi_name_len + 4);
 390 
 391                 
 392 
 393 
 394                 buf[off] = tpg->proto_id << 4;
 395                 buf[off++] |= 0x3; 
 396                 buf[off] = 0x80; 
 397                 
 398                 buf[off] |= 0x20;
 399                 
 400                 buf[off++] |= 0x8;
 401                 off += 2; 
 402                 
 403 
 404 
 405 
 406 
 407 
 408                 scsi_target_len = sprintf(&buf[off], "%s",
 409                                           tpg->se_tpg_tfo->tpg_get_wwn(tpg));
 410                 scsi_target_len += 1 ;
 411                 
 412 
 413 
 414 
 415 
 416 
 417 
 418 
 419                 padding = ((-scsi_target_len) & 3);
 420                 if (padding)
 421                         scsi_target_len += padding;
 422                 if (scsi_target_len > 256)
 423                         scsi_target_len = 256;
 424 
 425                 buf[off-1] = scsi_target_len;
 426                 off += scsi_target_len;
 427 
 428                 
 429                 len += (scsi_target_len + 4);
 430         }
 431         put_unaligned_be16(len, &buf[2]); 
 432         return 0;
 433 }
 434 EXPORT_SYMBOL(spc_emulate_evpd_83);
 435 
 436 
 437 static sense_reason_t
 438 spc_emulate_evpd_86(struct se_cmd *cmd, unsigned char *buf)
 439 {
 440         struct se_device *dev = cmd->se_dev;
 441         struct se_session *sess = cmd->se_sess;
 442 
 443         buf[3] = 0x3c;
 444         
 445 
 446 
 447 
 448         if (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) {
 449                 if (dev->dev_attrib.pi_prot_type == TARGET_DIF_TYPE1_PROT ||
 450                     cmd->se_sess->sess_prot_type == TARGET_DIF_TYPE1_PROT)
 451                         buf[4] = 0x5;
 452                 else if (dev->dev_attrib.pi_prot_type == TARGET_DIF_TYPE3_PROT ||
 453                          cmd->se_sess->sess_prot_type == TARGET_DIF_TYPE3_PROT)
 454                         buf[4] = 0x4;
 455         }
 456 
 457         
 458         if ((dev->transport->get_device_type(dev) == TYPE_DISK) &&
 459             (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) &&
 460             (dev->dev_attrib.pi_prot_type || cmd->se_sess->sess_prot_type)) {
 461                 buf[4] |= (0x3 << 3);
 462         }
 463 
 464         
 465         buf[5] = 0x07;
 466 
 467         
 468         if (target_check_wce(dev))
 469                 buf[6] = 0x01;
 470         
 471         spin_lock(&cmd->se_dev->t10_alua.lba_map_lock);
 472         if (!list_empty(&dev->t10_alua.lba_map_list))
 473                 buf[8] = 0x10;
 474         spin_unlock(&cmd->se_dev->t10_alua.lba_map_lock);
 475         return 0;
 476 }
 477 
 478 
 479 static sense_reason_t
 480 spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
 481 {
 482         struct se_device *dev = cmd->se_dev;
 483         u32 mtl = 0;
 484         int have_tp = 0, opt, min;
 485 
 486         
 487 
 488 
 489 
 490 
 491         if (dev->dev_attrib.emulate_tpu || dev->dev_attrib.emulate_tpws)
 492                 have_tp = 1;
 493 
 494         buf[0] = dev->transport->get_device_type(dev);
 495         buf[3] = have_tp ? 0x3c : 0x10;
 496 
 497         
 498         buf[4] = 0x01;
 499         
 500 
 501 
 502         if (dev->dev_attrib.emulate_caw)
 503                 buf[5] = 0x01;
 504 
 505         
 506 
 507 
 508         if (dev->transport->get_io_min && (min = dev->transport->get_io_min(dev)))
 509                 put_unaligned_be16(min / dev->dev_attrib.block_size, &buf[6]);
 510         else
 511                 put_unaligned_be16(1, &buf[6]);
 512 
 513         
 514 
 515 
 516 
 517 
 518 
 519         if (cmd->se_tfo->max_data_sg_nents) {
 520                 mtl = (cmd->se_tfo->max_data_sg_nents * PAGE_SIZE) /
 521                        dev->dev_attrib.block_size;
 522         }
 523         put_unaligned_be32(min_not_zero(mtl, dev->dev_attrib.hw_max_sectors), &buf[8]);
 524 
 525         
 526 
 527 
 528         if (dev->transport->get_io_opt && (opt = dev->transport->get_io_opt(dev)))
 529                 put_unaligned_be32(opt / dev->dev_attrib.block_size, &buf[12]);
 530         else
 531                 put_unaligned_be32(dev->dev_attrib.optimal_sectors, &buf[12]);
 532 
 533         
 534 
 535 
 536         if (!have_tp)
 537                 goto max_write_same;
 538 
 539         
 540 
 541 
 542         put_unaligned_be32(dev->dev_attrib.max_unmap_lba_count, &buf[20]);
 543 
 544         
 545 
 546 
 547         put_unaligned_be32(dev->dev_attrib.max_unmap_block_desc_count,
 548                            &buf[24]);
 549 
 550         
 551 
 552 
 553         put_unaligned_be32(dev->dev_attrib.unmap_granularity, &buf[28]);
 554 
 555         
 556 
 557 
 558         put_unaligned_be32(dev->dev_attrib.unmap_granularity_alignment,
 559                            &buf[32]);
 560         if (dev->dev_attrib.unmap_granularity_alignment != 0)
 561                 buf[32] |= 0x80; 
 562 
 563         
 564 
 565 
 566 max_write_same:
 567         put_unaligned_be64(dev->dev_attrib.max_write_same_len, &buf[36]);
 568 
 569         return 0;
 570 }
 571 
 572 
 573 static sense_reason_t
 574 spc_emulate_evpd_b1(struct se_cmd *cmd, unsigned char *buf)
 575 {
 576         struct se_device *dev = cmd->se_dev;
 577 
 578         buf[0] = dev->transport->get_device_type(dev);
 579         buf[3] = 0x3c;
 580         buf[5] = dev->dev_attrib.is_nonrot ? 1 : 0;
 581 
 582         return 0;
 583 }
 584 
 585 
 586 static sense_reason_t
 587 spc_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf)
 588 {
 589         struct se_device *dev = cmd->se_dev;
 590 
 591         
 592 
 593 
 594 
 595 
 596 
 597 
 598 
 599         buf[0] = dev->transport->get_device_type(dev);
 600 
 601         
 602 
 603 
 604         put_unaligned_be16(0x0004, &buf[2]);
 605 
 606         
 607 
 608 
 609 
 610 
 611 
 612 
 613 
 614 
 615         buf[4] = 0x00;
 616 
 617         
 618 
 619 
 620 
 621 
 622         if (dev->dev_attrib.emulate_tpu != 0)
 623                 buf[5] = 0x80;
 624 
 625         
 626 
 627 
 628 
 629 
 630 
 631         if (dev->dev_attrib.emulate_tpws != 0)
 632                 buf[5] |= 0x40 | 0x20;
 633 
 634         
 635 
 636 
 637 
 638 
 639 
 640 
 641         if (((dev->dev_attrib.emulate_tpu != 0) ||
 642              (dev->dev_attrib.emulate_tpws != 0)) &&
 643              (dev->dev_attrib.unmap_zeroes_data != 0))
 644                 buf[5] |= 0x04;
 645 
 646         return 0;
 647 }
 648 
 649 
 650 static sense_reason_t
 651 spc_emulate_evpd_b3(struct se_cmd *cmd, unsigned char *buf)
 652 {
 653         struct se_device *dev = cmd->se_dev;
 654 
 655         buf[0] = dev->transport->get_device_type(dev);
 656         buf[3] = 0x0c;
 657         put_unaligned_be32(dev->t10_alua.lba_map_segment_size, &buf[8]);
 658         put_unaligned_be32(dev->t10_alua.lba_map_segment_multiplier, &buf[12]);
 659 
 660         return 0;
 661 }
 662 
 663 static sense_reason_t
 664 spc_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf);
 665 
 666 static struct {
 667         uint8_t         page;
 668         sense_reason_t  (*emulate)(struct se_cmd *, unsigned char *);
 669 } evpd_handlers[] = {
 670         { .page = 0x00, .emulate = spc_emulate_evpd_00 },
 671         { .page = 0x80, .emulate = spc_emulate_evpd_80 },
 672         { .page = 0x83, .emulate = spc_emulate_evpd_83 },
 673         { .page = 0x86, .emulate = spc_emulate_evpd_86 },
 674         { .page = 0xb0, .emulate = spc_emulate_evpd_b0 },
 675         { .page = 0xb1, .emulate = spc_emulate_evpd_b1 },
 676         { .page = 0xb2, .emulate = spc_emulate_evpd_b2 },
 677         { .page = 0xb3, .emulate = spc_emulate_evpd_b3 },
 678 };
 679 
 680 
 681 static sense_reason_t
 682 spc_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf)
 683 {
 684         int p;
 685 
 686         
 687 
 688 
 689 
 690 
 691         if (cmd->se_dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
 692                 buf[3] = ARRAY_SIZE(evpd_handlers);
 693                 for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p)
 694                         buf[p + 4] = evpd_handlers[p].page;
 695         }
 696 
 697         return 0;
 698 }
 699 
 700 static sense_reason_t
 701 spc_emulate_inquiry(struct se_cmd *cmd)
 702 {
 703         struct se_device *dev = cmd->se_dev;
 704         struct se_portal_group *tpg = cmd->se_lun->lun_tpg;
 705         unsigned char *rbuf;
 706         unsigned char *cdb = cmd->t_task_cdb;
 707         unsigned char *buf;
 708         sense_reason_t ret;
 709         int p;
 710         int len = 0;
 711 
 712         buf = kzalloc(SE_INQUIRY_BUF, GFP_KERNEL);
 713         if (!buf) {
 714                 pr_err("Unable to allocate response buffer for INQUIRY\n");
 715                 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
 716         }
 717 
 718         if (dev == rcu_access_pointer(tpg->tpg_virt_lun0->lun_se_dev))
 719                 buf[0] = 0x3f; 
 720         else
 721                 buf[0] = dev->transport->get_device_type(dev);
 722 
 723         if (!(cdb[1] & 0x1)) {
 724                 if (cdb[2]) {
 725                         pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n",
 726                                cdb[2]);
 727                         ret = TCM_INVALID_CDB_FIELD;
 728                         goto out;
 729                 }
 730 
 731                 ret = spc_emulate_inquiry_std(cmd, buf);
 732                 len = buf[4] + 5;
 733                 goto out;
 734         }
 735 
 736         for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) {
 737                 if (cdb[2] == evpd_handlers[p].page) {
 738                         buf[1] = cdb[2];
 739                         ret = evpd_handlers[p].emulate(cmd, buf);
 740                         len = get_unaligned_be16(&buf[2]) + 4;
 741                         goto out;
 742                 }
 743         }
 744 
 745         pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]);
 746         ret = TCM_INVALID_CDB_FIELD;
 747 
 748 out:
 749         rbuf = transport_kmap_data_sg(cmd);
 750         if (rbuf) {
 751                 memcpy(rbuf, buf, min_t(u32, SE_INQUIRY_BUF, cmd->data_length));
 752                 transport_kunmap_data_sg(cmd);
 753         }
 754         kfree(buf);
 755 
 756         if (!ret)
 757                 target_complete_cmd_with_length(cmd, GOOD, len);
 758         return ret;
 759 }
 760 
 761 static int spc_modesense_rwrecovery(struct se_cmd *cmd, u8 pc, u8 *p)
 762 {
 763         p[0] = 0x01;
 764         p[1] = 0x0a;
 765 
 766         
 767         if (pc == 1)
 768                 goto out;
 769 
 770 out:
 771         return 12;
 772 }
 773 
 774 static int spc_modesense_control(struct se_cmd *cmd, u8 pc, u8 *p)
 775 {
 776         struct se_device *dev = cmd->se_dev;
 777         struct se_session *sess = cmd->se_sess;
 778 
 779         p[0] = 0x0a;
 780         p[1] = 0x0a;
 781 
 782         
 783         if (pc == 1)
 784                 goto out;
 785 
 786         
 787         p[2] = (1 << 1);
 788         if (target_sense_desc_format(dev))
 789                 
 790                 p[2] |= (1 << 2);
 791 
 792         
 793 
 794 
 795 
 796 
 797 
 798 
 799 
 800 
 801 
 802 
 803 
 804 
 805 
 806 
 807 
 808 
 809 
 810 
 811 
 812 
 813 
 814 
 815 
 816 
 817 
 818 
 819 
 820         p[3] = (dev->dev_attrib.emulate_rest_reord == 1) ? 0x00 : 0x10;
 821         
 822 
 823 
 824 
 825 
 826 
 827 
 828 
 829 
 830 
 831 
 832 
 833 
 834 
 835 
 836 
 837 
 838 
 839 
 840 
 841 
 842 
 843 
 844 
 845 
 846 
 847 
 848 
 849 
 850         p[4] = (dev->dev_attrib.emulate_ua_intlck_ctrl == 2) ? 0x30 :
 851                (dev->dev_attrib.emulate_ua_intlck_ctrl == 1) ? 0x20 : 0x00;
 852         
 853 
 854 
 855 
 856 
 857 
 858 
 859 
 860 
 861 
 862 
 863 
 864         p[5] = (dev->dev_attrib.emulate_tas) ? 0x40 : 0x00;
 865         
 866 
 867 
 868 
 869 
 870 
 871 
 872 
 873 
 874 
 875         if (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) {
 876                 if (dev->dev_attrib.pi_prot_type || sess->sess_prot_type)
 877                         p[5] |= 0x80;
 878         }
 879 
 880         p[8] = 0xff;
 881         p[9] = 0xff;
 882         p[11] = 30;
 883 
 884 out:
 885         return 12;
 886 }
 887 
 888 static int spc_modesense_caching(struct se_cmd *cmd, u8 pc, u8 *p)
 889 {
 890         struct se_device *dev = cmd->se_dev;
 891 
 892         p[0] = 0x08;
 893         p[1] = 0x12;
 894 
 895         
 896         if (pc == 1)
 897                 goto out;
 898 
 899         if (target_check_wce(dev))
 900                 p[2] = 0x04; 
 901         p[12] = 0x20; 
 902 
 903 out:
 904         return 20;
 905 }
 906 
 907 static int spc_modesense_informational_exceptions(struct se_cmd *cmd, u8 pc, unsigned char *p)
 908 {
 909         p[0] = 0x1c;
 910         p[1] = 0x0a;
 911 
 912         
 913         if (pc == 1)
 914                 goto out;
 915 
 916 out:
 917         return 12;
 918 }
 919 
 920 static struct {
 921         uint8_t         page;
 922         uint8_t         subpage;
 923         int             (*emulate)(struct se_cmd *, u8, unsigned char *);
 924 } modesense_handlers[] = {
 925         { .page = 0x01, .subpage = 0x00, .emulate = spc_modesense_rwrecovery },
 926         { .page = 0x08, .subpage = 0x00, .emulate = spc_modesense_caching },
 927         { .page = 0x0a, .subpage = 0x00, .emulate = spc_modesense_control },
 928         { .page = 0x1c, .subpage = 0x00, .emulate = spc_modesense_informational_exceptions },
 929 };
 930 
 931 static void spc_modesense_write_protect(unsigned char *buf, int type)
 932 {
 933         
 934 
 935 
 936 
 937         switch (type) {
 938         case TYPE_DISK:
 939         case TYPE_TAPE:
 940         default:
 941                 buf[0] |= 0x80; 
 942                 break;
 943         }
 944 }
 945 
 946 static void spc_modesense_dpofua(unsigned char *buf, int type)
 947 {
 948         switch (type) {
 949         case TYPE_DISK:
 950                 buf[0] |= 0x10; 
 951                 break;
 952         default:
 953                 break;
 954         }
 955 }
 956 
 957 static int spc_modesense_blockdesc(unsigned char *buf, u64 blocks, u32 block_size)
 958 {
 959         *buf++ = 8;
 960         put_unaligned_be32(min(blocks, 0xffffffffull), buf);
 961         buf += 4;
 962         put_unaligned_be32(block_size, buf);
 963         return 9;
 964 }
 965 
 966 static int spc_modesense_long_blockdesc(unsigned char *buf, u64 blocks, u32 block_size)
 967 {
 968         if (blocks <= 0xffffffff)
 969                 return spc_modesense_blockdesc(buf + 3, blocks, block_size) + 3;
 970 
 971         *buf++ = 1;             
 972         buf += 2;
 973         *buf++ = 16;
 974         put_unaligned_be64(blocks, buf);
 975         buf += 12;
 976         put_unaligned_be32(block_size, buf);
 977 
 978         return 17;
 979 }
 980 
 981 static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd)
 982 {
 983         struct se_device *dev = cmd->se_dev;
 984         char *cdb = cmd->t_task_cdb;
 985         unsigned char buf[SE_MODE_PAGE_BUF], *rbuf;
 986         int type = dev->transport->get_device_type(dev);
 987         int ten = (cmd->t_task_cdb[0] == MODE_SENSE_10);
 988         bool dbd = !!(cdb[1] & 0x08);
 989         bool llba = ten ? !!(cdb[1] & 0x10) : false;
 990         u8 pc = cdb[2] >> 6;
 991         u8 page = cdb[2] & 0x3f;
 992         u8 subpage = cdb[3];
 993         int length = 0;
 994         int ret;
 995         int i;
 996 
 997         memset(buf, 0, SE_MODE_PAGE_BUF);
 998 
 999         
1000 
1001 
1002 
1003         length = ten ? 3 : 2;
1004 
1005         
1006         if (cmd->se_lun->lun_access_ro || target_lun_is_rdonly(cmd))
1007                 spc_modesense_write_protect(&buf[length], type);
1008 
1009         
1010 
1011 
1012 
1013 
1014         if (target_check_fua(dev))
1015                 spc_modesense_dpofua(&buf[length], type);
1016 
1017         ++length;
1018 
1019         
1020 
1021         
1022 
1023 
1024 
1025         if (!dbd && type == TYPE_DISK) {
1026                 u64 blocks = dev->transport->get_blocks(dev);
1027                 u32 block_size = dev->dev_attrib.block_size;
1028 
1029                 if (ten) {
1030                         if (llba) {
1031                                 length += spc_modesense_long_blockdesc(&buf[length],
1032                                                                        blocks, block_size);
1033                         } else {
1034                                 length += 3;
1035                                 length += spc_modesense_blockdesc(&buf[length],
1036                                                                   blocks, block_size);
1037                         }
1038                 } else {
1039                         length += spc_modesense_blockdesc(&buf[length], blocks,
1040                                                           block_size);
1041                 }
1042         } else {
1043                 if (ten)
1044                         length += 4;
1045                 else
1046                         length += 1;
1047         }
1048 
1049         if (page == 0x3f) {
1050                 if (subpage != 0x00 && subpage != 0xff) {
1051                         pr_warn("MODE_SENSE: Invalid subpage code: 0x%02x\n", subpage);
1052                         return TCM_INVALID_CDB_FIELD;
1053                 }
1054 
1055                 for (i = 0; i < ARRAY_SIZE(modesense_handlers); ++i) {
1056                         
1057 
1058 
1059 
1060 
1061 
1062                         if ((modesense_handlers[i].subpage & ~subpage) == 0) {
1063                                 ret = modesense_handlers[i].emulate(cmd, pc, &buf[length]);
1064                                 if (!ten && length + ret >= 255)
1065                                         break;
1066                                 length += ret;
1067                         }
1068                 }
1069 
1070                 goto set_length;
1071         }
1072 
1073         for (i = 0; i < ARRAY_SIZE(modesense_handlers); ++i)
1074                 if (modesense_handlers[i].page == page &&
1075                     modesense_handlers[i].subpage == subpage) {
1076                         length += modesense_handlers[i].emulate(cmd, pc, &buf[length]);
1077                         goto set_length;
1078                 }
1079 
1080         
1081 
1082 
1083 
1084         if (page != 0x03)
1085                 pr_err("MODE SENSE: unimplemented page/subpage: 0x%02x/0x%02x\n",
1086                        page, subpage);
1087 
1088         return TCM_UNKNOWN_MODE_PAGE;
1089 
1090 set_length:
1091         if (ten)
1092                 put_unaligned_be16(length - 2, buf);
1093         else
1094                 buf[0] = length - 1;
1095 
1096         rbuf = transport_kmap_data_sg(cmd);
1097         if (rbuf) {
1098                 memcpy(rbuf, buf, min_t(u32, SE_MODE_PAGE_BUF, cmd->data_length));
1099                 transport_kunmap_data_sg(cmd);
1100         }
1101 
1102         target_complete_cmd_with_length(cmd, GOOD, length);
1103         return 0;
1104 }
1105 
1106 static sense_reason_t spc_emulate_modeselect(struct se_cmd *cmd)
1107 {
1108         char *cdb = cmd->t_task_cdb;
1109         bool ten = cdb[0] == MODE_SELECT_10;
1110         int off = ten ? 8 : 4;
1111         bool pf = !!(cdb[1] & 0x10);
1112         u8 page, subpage;
1113         unsigned char *buf;
1114         unsigned char tbuf[SE_MODE_PAGE_BUF];
1115         int length;
1116         sense_reason_t ret = 0;
1117         int i;
1118 
1119         if (!cmd->data_length) {
1120                 target_complete_cmd(cmd, GOOD);
1121                 return 0;
1122         }
1123 
1124         if (cmd->data_length < off + 2)
1125                 return TCM_PARAMETER_LIST_LENGTH_ERROR;
1126 
1127         buf = transport_kmap_data_sg(cmd);
1128         if (!buf)
1129                 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1130 
1131         if (!pf) {
1132                 ret = TCM_INVALID_CDB_FIELD;
1133                 goto out;
1134         }
1135 
1136         page = buf[off] & 0x3f;
1137         subpage = buf[off] & 0x40 ? buf[off + 1] : 0;
1138 
1139         for (i = 0; i < ARRAY_SIZE(modesense_handlers); ++i)
1140                 if (modesense_handlers[i].page == page &&
1141                     modesense_handlers[i].subpage == subpage) {
1142                         memset(tbuf, 0, SE_MODE_PAGE_BUF);
1143                         length = modesense_handlers[i].emulate(cmd, 0, tbuf);
1144                         goto check_contents;
1145                 }
1146 
1147         ret = TCM_UNKNOWN_MODE_PAGE;
1148         goto out;
1149 
1150 check_contents:
1151         if (cmd->data_length < off + length) {
1152                 ret = TCM_PARAMETER_LIST_LENGTH_ERROR;
1153                 goto out;
1154         }
1155 
1156         if (memcmp(buf + off, tbuf, length))
1157                 ret = TCM_INVALID_PARAMETER_LIST;
1158 
1159 out:
1160         transport_kunmap_data_sg(cmd);
1161 
1162         if (!ret)
1163                 target_complete_cmd(cmd, GOOD);
1164         return ret;
1165 }
1166 
1167 static sense_reason_t spc_emulate_request_sense(struct se_cmd *cmd)
1168 {
1169         unsigned char *cdb = cmd->t_task_cdb;
1170         unsigned char *rbuf;
1171         u8 ua_asc = 0, ua_ascq = 0;
1172         unsigned char buf[SE_SENSE_BUF];
1173         bool desc_format = target_sense_desc_format(cmd->se_dev);
1174 
1175         memset(buf, 0, SE_SENSE_BUF);
1176 
1177         if (cdb[1] & 0x01) {
1178                 pr_err("REQUEST_SENSE description emulation not"
1179                         " supported\n");
1180                 return TCM_INVALID_CDB_FIELD;
1181         }
1182 
1183         rbuf = transport_kmap_data_sg(cmd);
1184         if (!rbuf)
1185                 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1186 
1187         if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq))
1188                 scsi_build_sense_buffer(desc_format, buf, UNIT_ATTENTION,
1189                                         ua_asc, ua_ascq);
1190         else
1191                 scsi_build_sense_buffer(desc_format, buf, NO_SENSE, 0x0, 0x0);
1192 
1193         memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
1194         transport_kunmap_data_sg(cmd);
1195 
1196         target_complete_cmd(cmd, GOOD);
1197         return 0;
1198 }
1199 
1200 sense_reason_t spc_emulate_report_luns(struct se_cmd *cmd)
1201 {
1202         struct se_dev_entry *deve;
1203         struct se_session *sess = cmd->se_sess;
1204         struct se_node_acl *nacl;
1205         struct scsi_lun slun;
1206         unsigned char *buf;
1207         u32 lun_count = 0, offset = 8;
1208         __be32 len;
1209 
1210         buf = transport_kmap_data_sg(cmd);
1211         if (cmd->data_length && !buf)
1212                 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1213 
1214         
1215 
1216 
1217 
1218 
1219         if (!sess)
1220                 goto done;
1221 
1222         nacl = sess->se_node_acl;
1223 
1224         rcu_read_lock();
1225         hlist_for_each_entry_rcu(deve, &nacl->lun_entry_hlist, link) {
1226                 
1227 
1228 
1229 
1230 
1231                 lun_count++;
1232                 if (offset >= cmd->data_length)
1233                         continue;
1234 
1235                 int_to_scsilun(deve->mapped_lun, &slun);
1236                 memcpy(buf + offset, &slun,
1237                        min(8u, cmd->data_length - offset));
1238                 offset += 8;
1239         }
1240         rcu_read_unlock();
1241 
1242         
1243 
1244 
1245 done:
1246         
1247 
1248 
1249         if (lun_count == 0) {
1250                 int_to_scsilun(0, &slun);
1251                 if (cmd->data_length > 8)
1252                         memcpy(buf + offset, &slun,
1253                                min(8u, cmd->data_length - offset));
1254                 lun_count = 1;
1255         }
1256 
1257         if (buf) {
1258                 len = cpu_to_be32(lun_count * 8);
1259                 memcpy(buf, &len, min_t(int, sizeof len, cmd->data_length));
1260                 transport_kunmap_data_sg(cmd);
1261         }
1262 
1263         target_complete_cmd_with_length(cmd, GOOD, 8 + lun_count * 8);
1264         return 0;
1265 }
1266 EXPORT_SYMBOL(spc_emulate_report_luns);
1267 
1268 static sense_reason_t
1269 spc_emulate_testunitready(struct se_cmd *cmd)
1270 {
1271         target_complete_cmd(cmd, GOOD);
1272         return 0;
1273 }
1274 
1275 sense_reason_t
1276 spc_parse_cdb(struct se_cmd *cmd, unsigned int *size)
1277 {
1278         struct se_device *dev = cmd->se_dev;
1279         unsigned char *cdb = cmd->t_task_cdb;
1280 
1281         if (!dev->dev_attrib.emulate_pr &&
1282             ((cdb[0] == PERSISTENT_RESERVE_IN) ||
1283              (cdb[0] == PERSISTENT_RESERVE_OUT) ||
1284              (cdb[0] == RELEASE || cdb[0] == RELEASE_10) ||
1285              (cdb[0] == RESERVE || cdb[0] == RESERVE_10))) {
1286                 return TCM_UNSUPPORTED_SCSI_OPCODE;
1287         }
1288 
1289         switch (cdb[0]) {
1290         case MODE_SELECT:
1291                 *size = cdb[4];
1292                 cmd->execute_cmd = spc_emulate_modeselect;
1293                 break;
1294         case MODE_SELECT_10:
1295                 *size = get_unaligned_be16(&cdb[7]);
1296                 cmd->execute_cmd = spc_emulate_modeselect;
1297                 break;
1298         case MODE_SENSE:
1299                 *size = cdb[4];
1300                 cmd->execute_cmd = spc_emulate_modesense;
1301                 break;
1302         case MODE_SENSE_10:
1303                 *size = get_unaligned_be16(&cdb[7]);
1304                 cmd->execute_cmd = spc_emulate_modesense;
1305                 break;
1306         case LOG_SELECT:
1307         case LOG_SENSE:
1308                 *size = get_unaligned_be16(&cdb[7]);
1309                 break;
1310         case PERSISTENT_RESERVE_IN:
1311                 *size = get_unaligned_be16(&cdb[7]);
1312                 cmd->execute_cmd = target_scsi3_emulate_pr_in;
1313                 break;
1314         case PERSISTENT_RESERVE_OUT:
1315                 *size = get_unaligned_be32(&cdb[5]);
1316                 cmd->execute_cmd = target_scsi3_emulate_pr_out;
1317                 break;
1318         case RELEASE:
1319         case RELEASE_10:
1320                 if (cdb[0] == RELEASE_10)
1321                         *size = get_unaligned_be16(&cdb[7]);
1322                 else
1323                         *size = cmd->data_length;
1324 
1325                 cmd->execute_cmd = target_scsi2_reservation_release;
1326                 break;
1327         case RESERVE:
1328         case RESERVE_10:
1329                 
1330 
1331 
1332 
1333                 if (cdb[0] == RESERVE_10)
1334                         *size = get_unaligned_be16(&cdb[7]);
1335                 else
1336                         *size = cmd->data_length;
1337 
1338                 cmd->execute_cmd = target_scsi2_reservation_reserve;
1339                 break;
1340         case REQUEST_SENSE:
1341                 *size = cdb[4];
1342                 cmd->execute_cmd = spc_emulate_request_sense;
1343                 break;
1344         case INQUIRY:
1345                 *size = get_unaligned_be16(&cdb[3]);
1346 
1347                 
1348 
1349 
1350 
1351                 cmd->sam_task_attr = TCM_HEAD_TAG;
1352                 cmd->execute_cmd = spc_emulate_inquiry;
1353                 break;
1354         case SECURITY_PROTOCOL_IN:
1355         case SECURITY_PROTOCOL_OUT:
1356                 *size = get_unaligned_be32(&cdb[6]);
1357                 break;
1358         case EXTENDED_COPY:
1359                 *size = get_unaligned_be32(&cdb[10]);
1360                 cmd->execute_cmd = target_do_xcopy;
1361                 break;
1362         case RECEIVE_COPY_RESULTS:
1363                 *size = get_unaligned_be32(&cdb[10]);
1364                 cmd->execute_cmd = target_do_receive_copy_results;
1365                 break;
1366         case READ_ATTRIBUTE:
1367         case WRITE_ATTRIBUTE:
1368                 *size = get_unaligned_be32(&cdb[10]);
1369                 break;
1370         case RECEIVE_DIAGNOSTIC:
1371         case SEND_DIAGNOSTIC:
1372                 *size = get_unaligned_be16(&cdb[3]);
1373                 break;
1374         case WRITE_BUFFER:
1375                 *size = get_unaligned_be24(&cdb[6]);
1376                 break;
1377         case REPORT_LUNS:
1378                 cmd->execute_cmd = spc_emulate_report_luns;
1379                 *size = get_unaligned_be32(&cdb[6]);
1380                 
1381 
1382 
1383 
1384                 cmd->sam_task_attr = TCM_HEAD_TAG;
1385                 break;
1386         case TEST_UNIT_READY:
1387                 cmd->execute_cmd = spc_emulate_testunitready;
1388                 *size = 0;
1389                 break;
1390         case MAINTENANCE_IN:
1391                 if (dev->transport->get_device_type(dev) != TYPE_ROM) {
1392                         
1393 
1394 
1395 
1396                         if ((cdb[1] & 0x1f) == MI_REPORT_TARGET_PGS) {
1397                                 cmd->execute_cmd =
1398                                         target_emulate_report_target_port_groups;
1399                         }
1400                         *size = get_unaligned_be32(&cdb[6]);
1401                 } else {
1402                         
1403 
1404 
1405                         *size = get_unaligned_be16(&cdb[8]);
1406                 }
1407                 break;
1408         case MAINTENANCE_OUT:
1409                 if (dev->transport->get_device_type(dev) != TYPE_ROM) {
1410                         
1411 
1412 
1413 
1414                         if (cdb[1] == MO_SET_TARGET_PGS) {
1415                                 cmd->execute_cmd =
1416                                         target_emulate_set_target_port_groups;
1417                         }
1418                         *size = get_unaligned_be32(&cdb[6]);
1419                 } else {
1420                         
1421 
1422 
1423                         *size = get_unaligned_be16(&cdb[8]);
1424                 }
1425                 break;
1426         default:
1427                 return TCM_UNSUPPORTED_SCSI_OPCODE;
1428         }
1429 
1430         return 0;
1431 }
1432 EXPORT_SYMBOL(spc_parse_cdb);