From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [mcgrof-next:20210817-add-disk-error-handling-next 2/89] drivers/scsi/st.c:3830:40: error: no member named 'disk' in 'struct scsi_tape'
Date: Thu, 19 Aug 2021 08:23:47 +0800 [thread overview]
Message-ID: <202108190825.aRG9qTxp-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 41797 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git 20210817-add-disk-error-handling-next
head: 3d00c210d7fd616243af9cf41829f4a56f116ba8
commit: 7692839b26192b737a64c87970b6589e6a909d38 [2/89] st: do not allocate a gendisk
config: i386-randconfig-a011-20210816 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project d2b574a4dea5b718e4386bf2e26af0126e5978ce)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git/commit/?id=7692839b26192b737a64c87970b6589e6a909d38
git remote add mcgrof-next https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git
git fetch --no-tags mcgrof-next 20210817-add-disk-error-handling-next
git checkout 7692839b26192b737a64c87970b6589e6a909d38
# save the attached .config to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross O=build_dir ARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/scsi/st.c:3830:40: error: no member named 'disk' in 'struct scsi_tape'
retval = scsi_ioctl(STp->device, STp->disk, file->f_mode, cmd_in, p);
~~~ ^
1 error generated.
vim +3830 drivers/scsi/st.c
8038e6456a3e6f Kai Makisara 2016-02-09 3348
8038e6456a3e6f Kai Makisara 2016-02-09 3349
^1da177e4c3f41 Linus Torvalds 2005-04-16 3350 /* Partition the tape into two partitions if size > 0 or one partition if
^1da177e4c3f41 Linus Torvalds 2005-04-16 3351 size == 0.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3352
^1da177e4c3f41 Linus Torvalds 2005-04-16 3353 The block descriptors are read and written because Sony SDT-7000 does not
^1da177e4c3f41 Linus Torvalds 2005-04-16 3354 work without this (suggestion from Michael Schaefer <Michael.Schaefer@dlr.de>).
^1da177e4c3f41 Linus Torvalds 2005-04-16 3355
^1da177e4c3f41 Linus Torvalds 2005-04-16 3356 My HP C1533A drive returns only one partition size field. This is used to
^1da177e4c3f41 Linus Torvalds 2005-04-16 3357 set the size of partition 1. There is no size field for the default partition.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3358 Michael Schaefer's Sony SDT-7000 returns two descriptors and the second is
^1da177e4c3f41 Linus Torvalds 2005-04-16 3359 used to set the size of partition 1 (this is what the SCSI-3 standard specifies).
^1da177e4c3f41 Linus Torvalds 2005-04-16 3360 The following algorithm is used to accommodate both drives: if the number of
^1da177e4c3f41 Linus Torvalds 2005-04-16 3361 partition size fields is greater than the maximum number of additional partitions
^1da177e4c3f41 Linus Torvalds 2005-04-16 3362 in the mode page, the second field is used. Otherwise the first field is used.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3363
^1da177e4c3f41 Linus Torvalds 2005-04-16 3364 For Seagate DDS drives the page length must be 8 when no partitions is defined
^1da177e4c3f41 Linus Torvalds 2005-04-16 3365 and 10 when 1 partition is defined (information from Eric Lee Green). This is
^1da177e4c3f41 Linus Torvalds 2005-04-16 3366 is acceptable also to some other old drives and enforced if the first partition
^1da177e4c3f41 Linus Torvalds 2005-04-16 3367 size field is used for the first additional partition size.
8038e6456a3e6f Kai Makisara 2016-02-09 3368
8038e6456a3e6f Kai Makisara 2016-02-09 3369 For drives that advertize SCSI-3 or newer, use the SSC-3 methods.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3370 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3371 static int partition_tape(struct scsi_tape *STp, int size)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3372 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3373 int result;
8038e6456a3e6f Kai Makisara 2016-02-09 3374 int target_partition;
8038e6456a3e6f Kai Makisara 2016-02-09 3375 bool scsi3 = STp->device->scsi_level >= SCSI_3, needs_format = false;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3376 int pgo, psd_cnt, psdo;
8038e6456a3e6f Kai Makisara 2016-02-09 3377 int psum = PP_MSK_PSUM_MB, units = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3378 unsigned char *bp;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3379
^1da177e4c3f41 Linus Torvalds 2005-04-16 3380 result = read_mode_page(STp, PART_PAGE, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3381 if (result) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3382 DEBC_printk(STp, "Can't read partition mode page.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3383 return result;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3384 }
8038e6456a3e6f Kai Makisara 2016-02-09 3385 target_partition = 1;
8038e6456a3e6f Kai Makisara 2016-02-09 3386 if (size < 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3387 target_partition = 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3388 size = -size;
8038e6456a3e6f Kai Makisara 2016-02-09 3389 }
8038e6456a3e6f Kai Makisara 2016-02-09 3390
^1da177e4c3f41 Linus Torvalds 2005-04-16 3391 /* The mode page is in the buffer. Let's modify it and write it. */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3392 bp = (STp->buffer)->b_data;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3393 pgo = MODE_HEADER_LENGTH + bp[MH_OFF_BDESCS_LENGTH];
b30d8bca5b525b Hannes Reinecke 2014-06-25 3394 DEBC_printk(STp, "Partition page length is %d bytes.\n",
b30d8bca5b525b Hannes Reinecke 2014-06-25 3395 bp[pgo + MP_OFF_PAGE_LENGTH] + 2);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3396
^1da177e4c3f41 Linus Torvalds 2005-04-16 3397 psd_cnt = (bp[pgo + MP_OFF_PAGE_LENGTH] + 2 - PART_PAGE_FIXED_LENGTH) / 2;
8038e6456a3e6f Kai Makisara 2016-02-09 3398
8038e6456a3e6f Kai Makisara 2016-02-09 3399 if (scsi3) {
8038e6456a3e6f Kai Makisara 2016-02-09 3400 needs_format = (bp[pgo + PP_OFF_FLAGS] & PP_MSK_POFM) != 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3401 if (needs_format && size == 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3402 /* No need to write the mode page when clearing
8038e6456a3e6f Kai Makisara 2016-02-09 3403 * partitioning
8038e6456a3e6f Kai Makisara 2016-02-09 3404 */
8038e6456a3e6f Kai Makisara 2016-02-09 3405 DEBC_printk(STp, "Formatting tape with one partition.\n");
8038e6456a3e6f Kai Makisara 2016-02-09 3406 result = format_medium(STp, 0);
8038e6456a3e6f Kai Makisara 2016-02-09 3407 goto out;
8038e6456a3e6f Kai Makisara 2016-02-09 3408 }
8038e6456a3e6f Kai Makisara 2016-02-09 3409 if (needs_format) /* Leave the old value for HP DATs claiming SCSI_3 */
8038e6456a3e6f Kai Makisara 2016-02-09 3410 psd_cnt = 2;
8038e6456a3e6f Kai Makisara 2016-02-09 3411 if ((bp[pgo + PP_OFF_FLAGS] & PP_MSK_PSUM_UNITS) == PP_MSK_PSUM_UNITS) {
8038e6456a3e6f Kai Makisara 2016-02-09 3412 /* Use units scaling for large partitions if the device
8038e6456a3e6f Kai Makisara 2016-02-09 3413 * suggests it and no precision lost. Required for IBM
8038e6456a3e6f Kai Makisara 2016-02-09 3414 * TS1140/50 drives that don't support MB units.
8038e6456a3e6f Kai Makisara 2016-02-09 3415 */
8038e6456a3e6f Kai Makisara 2016-02-09 3416 if (size >= 1000 && (size % 1000) == 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3417 size /= 1000;
8038e6456a3e6f Kai Makisara 2016-02-09 3418 psum = PP_MSK_PSUM_UNITS;
8038e6456a3e6f Kai Makisara 2016-02-09 3419 units = 9; /* GB */
8038e6456a3e6f Kai Makisara 2016-02-09 3420 }
8038e6456a3e6f Kai Makisara 2016-02-09 3421 }
8038e6456a3e6f Kai Makisara 2016-02-09 3422 /* Try it anyway if too large to specify in MB */
8038e6456a3e6f Kai Makisara 2016-02-09 3423 if (psum == PP_MSK_PSUM_MB && size >= 65534) {
8038e6456a3e6f Kai Makisara 2016-02-09 3424 size /= 1000;
8038e6456a3e6f Kai Makisara 2016-02-09 3425 psum = PP_MSK_PSUM_UNITS;
8038e6456a3e6f Kai Makisara 2016-02-09 3426 units = 9; /* GB */
8038e6456a3e6f Kai Makisara 2016-02-09 3427 }
8038e6456a3e6f Kai Makisara 2016-02-09 3428 }
8038e6456a3e6f Kai Makisara 2016-02-09 3429
8038e6456a3e6f Kai Makisara 2016-02-09 3430 if (size >= 65535 || /* Does not fit into two bytes */
8038e6456a3e6f Kai Makisara 2016-02-09 3431 (target_partition == 0 && psd_cnt < 2)) {
8038e6456a3e6f Kai Makisara 2016-02-09 3432 result = -EINVAL;
8038e6456a3e6f Kai Makisara 2016-02-09 3433 goto out;
8038e6456a3e6f Kai Makisara 2016-02-09 3434 }
8038e6456a3e6f Kai Makisara 2016-02-09 3435
^1da177e4c3f41 Linus Torvalds 2005-04-16 3436 psdo = pgo + PART_PAGE_FIXED_LENGTH;
8038e6456a3e6f Kai Makisara 2016-02-09 3437 /* The second condition is for HP DDS which use only one partition size
8038e6456a3e6f Kai Makisara 2016-02-09 3438 * descriptor
8038e6456a3e6f Kai Makisara 2016-02-09 3439 */
8038e6456a3e6f Kai Makisara 2016-02-09 3440 if (target_partition > 0 &&
8038e6456a3e6f Kai Makisara 2016-02-09 3441 (psd_cnt > bp[pgo + PP_OFF_MAX_ADD_PARTS] ||
8038e6456a3e6f Kai Makisara 2016-02-09 3442 bp[pgo + PP_OFF_MAX_ADD_PARTS] != 1)) {
8038e6456a3e6f Kai Makisara 2016-02-09 3443 bp[psdo] = bp[psdo + 1] = 0xff; /* Rest to partition 0 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3444 psdo += 2;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3445 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3446 memset(bp + psdo, 0, bp[pgo + PP_OFF_NBR_ADD_PARTS] * 2);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3447
b30d8bca5b525b Hannes Reinecke 2014-06-25 3448 DEBC_printk(STp, "psd_cnt %d, max.parts %d, nbr_parts %d\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 3449 psd_cnt, bp[pgo + PP_OFF_MAX_ADD_PARTS],
b30d8bca5b525b Hannes Reinecke 2014-06-25 3450 bp[pgo + PP_OFF_NBR_ADD_PARTS]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3451
8038e6456a3e6f Kai Makisara 2016-02-09 3452 if (size == 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3453 bp[pgo + PP_OFF_NBR_ADD_PARTS] = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3454 if (psd_cnt <= bp[pgo + PP_OFF_MAX_ADD_PARTS])
^1da177e4c3f41 Linus Torvalds 2005-04-16 3455 bp[pgo + MP_OFF_PAGE_LENGTH] = 6;
b30d8bca5b525b Hannes Reinecke 2014-06-25 3456 DEBC_printk(STp, "Formatting tape with one partition.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3457 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3458 bp[psdo] = (size >> 8) & 0xff;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3459 bp[psdo + 1] = size & 0xff;
8038e6456a3e6f Kai Makisara 2016-02-09 3460 if (target_partition == 0)
8038e6456a3e6f Kai Makisara 2016-02-09 3461 bp[psdo + 2] = bp[psdo + 3] = 0xff;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3462 bp[pgo + 3] = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3463 if (bp[pgo + MP_OFF_PAGE_LENGTH] < 8)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3464 bp[pgo + MP_OFF_PAGE_LENGTH] = 8;
8038e6456a3e6f Kai Makisara 2016-02-09 3465 DEBC_printk(STp,
8038e6456a3e6f Kai Makisara 2016-02-09 3466 "Formatting tape with two partitions (%i = %d MB).\n",
8038e6456a3e6f Kai Makisara 2016-02-09 3467 target_partition, units > 0 ? size * 1000 : size);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3468 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3469 bp[pgo + PP_OFF_PART_UNITS] = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3470 bp[pgo + PP_OFF_RESERVED] = 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3471 if (size != 1 || units != 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3472 bp[pgo + PP_OFF_FLAGS] = PP_BIT_IDP | psum |
8038e6456a3e6f Kai Makisara 2016-02-09 3473 (bp[pgo + PP_OFF_FLAGS] & 0x07);
8038e6456a3e6f Kai Makisara 2016-02-09 3474 bp[pgo + PP_OFF_PART_UNITS] = units;
8038e6456a3e6f Kai Makisara 2016-02-09 3475 } else
8038e6456a3e6f Kai Makisara 2016-02-09 3476 bp[pgo + PP_OFF_FLAGS] = PP_BIT_FDP |
8038e6456a3e6f Kai Makisara 2016-02-09 3477 (bp[pgo + PP_OFF_FLAGS] & 0x1f);
8038e6456a3e6f Kai Makisara 2016-02-09 3478 bp[pgo + MP_OFF_PAGE_LENGTH] = 6 + psd_cnt * 2;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3479
^1da177e4c3f41 Linus Torvalds 2005-04-16 3480 result = write_mode_page(STp, PART_PAGE, 1);
8038e6456a3e6f Kai Makisara 2016-02-09 3481
8038e6456a3e6f Kai Makisara 2016-02-09 3482 if (!result && needs_format)
8038e6456a3e6f Kai Makisara 2016-02-09 3483 result = format_medium(STp, 1);
8038e6456a3e6f Kai Makisara 2016-02-09 3484
^1da177e4c3f41 Linus Torvalds 2005-04-16 3485 if (result) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3486 st_printk(KERN_INFO, STp, "Partitioning of tape failed.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3487 result = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3488 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3489
8038e6456a3e6f Kai Makisara 2016-02-09 3490 out:
^1da177e4c3f41 Linus Torvalds 2005-04-16 3491 return result;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3492 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3493 \f
^1da177e4c3f41 Linus Torvalds 2005-04-16 3494
^1da177e4c3f41 Linus Torvalds 2005-04-16 3495
^1da177e4c3f41 Linus Torvalds 2005-04-16 3496 /* The ioctl command */
dba7688fc9037c Christoph Hellwig 2021-07-24 3497 static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3498 {
dba7688fc9037c Christoph Hellwig 2021-07-24 3499 void __user *p = (void __user *)arg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3500 int i, cmd_nr, cmd_type, bt;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3501 int retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3502 unsigned int blk;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3503 struct scsi_tape *STp = file->private_data;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3504 struct st_modedef *STm;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3505 struct st_partstat *STps;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3506
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3507 if (mutex_lock_interruptible(&STp->lock))
^1da177e4c3f41 Linus Torvalds 2005-04-16 3508 return -ERESTARTSYS;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3509
^1da177e4c3f41 Linus Torvalds 2005-04-16 3510 DEB(
^1da177e4c3f41 Linus Torvalds 2005-04-16 3511 if (debugging && !STp->in_use) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3512 st_printk(ST_DEB_MSG, STp, "Incorrect device.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3513 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3514 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3515 } ) /* end DEB */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3516
^1da177e4c3f41 Linus Torvalds 2005-04-16 3517 STm = &(STp->modes[STp->current_mode]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3518 STps = &(STp->ps[STp->partition]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3519
^1da177e4c3f41 Linus Torvalds 2005-04-16 3520 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 3521 * If we are in the middle of error recovery, don't let anyone
^1da177e4c3f41 Linus Torvalds 2005-04-16 3522 * else try and use this device. Also, if error recovery fails, it
^1da177e4c3f41 Linus Torvalds 2005-04-16 3523 * may try and take the device offline, in which case all further
^1da177e4c3f41 Linus Torvalds 2005-04-16 3524 * access to the device is prohibited.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3525 */
906d15fbd23c12 Christoph Hellwig 2014-10-11 3526 retval = scsi_ioctl_block_when_processing_errors(STp->device, cmd_in,
83ff6fe8580a7c Al Viro 2008-03-02 3527 file->f_flags & O_NDELAY);
906d15fbd23c12 Christoph Hellwig 2014-10-11 3528 if (retval)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3529 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3530
^1da177e4c3f41 Linus Torvalds 2005-04-16 3531 cmd_type = _IOC_TYPE(cmd_in);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3532 cmd_nr = _IOC_NR(cmd_in);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3533
^1da177e4c3f41 Linus Torvalds 2005-04-16 3534 if (cmd_type == _IOC_TYPE(MTIOCTOP) && cmd_nr == _IOC_NR(MTIOCTOP)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3535 struct mtop mtc;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3536
^1da177e4c3f41 Linus Torvalds 2005-04-16 3537 if (_IOC_SIZE(cmd_in) != sizeof(mtc)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3538 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3539 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3540 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3541
^1da177e4c3f41 Linus Torvalds 2005-04-16 3542 i = copy_from_user(&mtc, p, sizeof(struct mtop));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3543 if (i) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3544 retval = (-EFAULT);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3545 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3546 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3547
^1da177e4c3f41 Linus Torvalds 2005-04-16 3548 if (mtc.mt_op == MTSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3549 st_printk(KERN_WARNING, STp,
b30d8bca5b525b Hannes Reinecke 2014-06-25 3550 "MTSETDRVBUFFER only allowed for root.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3551 retval = (-EPERM);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3552 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3553 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3554 if (!STm->defined &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3555 (mtc.mt_op != MTSETDRVBUFFER &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3556 (mtc.mt_count & MT_ST_OPTIONS) == 0)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3557 retval = (-ENXIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3558 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3559 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3560
^1da177e4c3f41 Linus Torvalds 2005-04-16 3561 if (!STp->pos_unknown) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3562
^1da177e4c3f41 Linus Torvalds 2005-04-16 3563 if (STps->eof == ST_FM_HIT) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3564 if (mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3565 mtc.mt_op == MTEOM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3566 mtc.mt_count -= 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3567 if (STps->drv_file >= 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3568 STps->drv_file += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3569 } else if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3570 mtc.mt_count += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3571 if (STps->drv_file >= 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3572 STps->drv_file += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3573 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3574 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3575
^1da177e4c3f41 Linus Torvalds 2005-04-16 3576 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3577 /* Old position must be restored if partition will be
^1da177e4c3f41 Linus Torvalds 2005-04-16 3578 changed */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3579 i = !STp->can_partitions ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3580 (STp->new_partition != STp->partition);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3581 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3582 i = mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3583 mtc.mt_op == MTRETEN || mtc.mt_op == MTEOM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3584 mtc.mt_op == MTLOCK || mtc.mt_op == MTLOAD ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3585 mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3586 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3587 mtc.mt_op == MTCOMPRESSION;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3588 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3589 i = flush_buffer(STp, i);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3590 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3591 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3592 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3593 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3594 if (STps->rw == ST_WRITING &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3595 (mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3596 mtc.mt_op == MTSEEK ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3597 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3598 i = st_int_ioctl(STp, MTWEOF, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3599 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3600 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3601 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3602 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3603 if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3604 mtc.mt_count++;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3605 STps->rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3606 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3607
^1da177e4c3f41 Linus Torvalds 2005-04-16 3608 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3609 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 3610 * If there was a bus reset, block further access
^1da177e4c3f41 Linus Torvalds 2005-04-16 3611 * to this device. If the user wants to rewind the tape,
^1da177e4c3f41 Linus Torvalds 2005-04-16 3612 * then reset the flag and allow access again.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3613 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3614 if (mtc.mt_op != MTREW &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3615 mtc.mt_op != MTOFFL &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3616 mtc.mt_op != MTRETEN &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3617 mtc.mt_op != MTERASE &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3618 mtc.mt_op != MTSEEK &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3619 mtc.mt_op != MTEOM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3620 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3621 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3622 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3623 reset_state(STp);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3624 /* remove this when the midlevel properly clears was_reset */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3625 STp->device->was_reset = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3626 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3627
^1da177e4c3f41 Linus Torvalds 2005-04-16 3628 if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3629 mtc.mt_op != MTSETDENSITY && mtc.mt_op != MTWSM &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3630 mtc.mt_op != MTSETDRVBUFFER && mtc.mt_op != MTSETPART)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3631 STps->rw = ST_IDLE; /* Prevent automatic WEOF and fsf */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3632
^1da177e4c3f41 Linus Torvalds 2005-04-16 3633 if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3634 do_door_lock(STp, 0); /* Ignore result! */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3635
^1da177e4c3f41 Linus Torvalds 2005-04-16 3636 if (mtc.mt_op == MTSETDRVBUFFER &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3637 (mtc.mt_count & MT_ST_OPTIONS) != 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3638 retval = st_set_options(STp, mtc.mt_count);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3639 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3640 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3641
^1da177e4c3f41 Linus Torvalds 2005-04-16 3642 if (mtc.mt_op == MTSETPART) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3643 if (!STp->can_partitions ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3644 mtc.mt_count < 0 || mtc.mt_count >= ST_NBR_PARTITIONS) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3645 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3646 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3647 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3648 if (mtc.mt_count >= STp->nbr_partitions &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3649 (STp->nbr_partitions = nbr_partitions(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3650 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3651 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3652 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3653 if (mtc.mt_count >= STp->nbr_partitions) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3654 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3655 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3656 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3657 STp->new_partition = mtc.mt_count;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3658 retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3659 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3660 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3661
^1da177e4c3f41 Linus Torvalds 2005-04-16 3662 if (mtc.mt_op == MTMKPART) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3663 if (!STp->can_partitions) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3664 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3665 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3666 }
8038e6456a3e6f Kai Makisara 2016-02-09 3667 i = do_load_unload(STp, file, 1);
8038e6456a3e6f Kai Makisara 2016-02-09 3668 if (i < 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3669 retval = i;
8038e6456a3e6f Kai Makisara 2016-02-09 3670 goto out;
8038e6456a3e6f Kai Makisara 2016-02-09 3671 }
8038e6456a3e6f Kai Makisara 2016-02-09 3672 i = partition_tape(STp, mtc.mt_count);
8038e6456a3e6f Kai Makisara 2016-02-09 3673 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3674 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3675 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3676 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3677 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3678 STp->ps[i].rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3679 STp->ps[i].at_sm = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3680 STp->ps[i].last_block_valid = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3681 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3682 STp->partition = STp->new_partition = 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3683 STp->nbr_partitions = mtc.mt_count != 0 ? 2 : 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3684 STps->drv_block = STps->drv_file = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3685 retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3686 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3687 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3688
^1da177e4c3f41 Linus Torvalds 2005-04-16 3689 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3690 i = set_location(STp, mtc.mt_count, STp->new_partition, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3691 if (!STp->can_partitions)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3692 STp->ps[0].rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3693 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3694 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3695 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3696
^1da177e4c3f41 Linus Torvalds 2005-04-16 3697 if (mtc.mt_op == MTUNLOAD || mtc.mt_op == MTOFFL) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3698 retval = do_load_unload(STp, file, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3699 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3700 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3701
^1da177e4c3f41 Linus Torvalds 2005-04-16 3702 if (mtc.mt_op == MTLOAD) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3703 retval = do_load_unload(STp, file, max(1, mtc.mt_count));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3704 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3705 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3706
^1da177e4c3f41 Linus Torvalds 2005-04-16 3707 if (mtc.mt_op == MTLOCK || mtc.mt_op == MTUNLOCK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3708 retval = do_door_lock(STp, (mtc.mt_op == MTLOCK));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3709 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3710 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3711
^1da177e4c3f41 Linus Torvalds 2005-04-16 3712 if (STp->can_partitions && STp->ready == ST_READY &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3713 (i = switch_partition(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3714 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3715 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3716 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3717
^1da177e4c3f41 Linus Torvalds 2005-04-16 3718 if (mtc.mt_op == MTCOMPRESSION)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3719 retval = st_compression(STp, (mtc.mt_count & 1));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3720 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 3721 retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3722 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3723 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3724 if (!STm->defined) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3725 retval = (-ENXIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3726 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3727 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3728
^1da177e4c3f41 Linus Torvalds 2005-04-16 3729 if ((i = flush_buffer(STp, 0)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3730 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3731 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3732 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3733 if (STp->can_partitions &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3734 (i = switch_partition(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3735 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3736 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3737 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3738
^1da177e4c3f41 Linus Torvalds 2005-04-16 3739 if (cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3740 struct mtget mt_status;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3741
^1da177e4c3f41 Linus Torvalds 2005-04-16 3742 if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3743 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3744 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3745 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3746
^1da177e4c3f41 Linus Torvalds 2005-04-16 3747 mt_status.mt_type = STp->tape_type;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3748 mt_status.mt_dsreg =
^1da177e4c3f41 Linus Torvalds 2005-04-16 3749 ((STp->block_size << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK) |
^1da177e4c3f41 Linus Torvalds 2005-04-16 3750 ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3751 mt_status.mt_blkno = STps->drv_block;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3752 mt_status.mt_fileno = STps->drv_file;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3753 if (STp->block_size != 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3754 if (STps->rw == ST_WRITING)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3755 mt_status.mt_blkno +=
^1da177e4c3f41 Linus Torvalds 2005-04-16 3756 (STp->buffer)->buffer_bytes / STp->block_size;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3757 else if (STps->rw == ST_READING)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3758 mt_status.mt_blkno -=
^1da177e4c3f41 Linus Torvalds 2005-04-16 3759 ((STp->buffer)->buffer_bytes +
^1da177e4c3f41 Linus Torvalds 2005-04-16 3760 STp->block_size - 1) / STp->block_size;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3761 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3762
^1da177e4c3f41 Linus Torvalds 2005-04-16 3763 mt_status.mt_gstat = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3764 if (STp->drv_write_prot)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3765 mt_status.mt_gstat |= GMT_WR_PROT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3766 if (mt_status.mt_blkno == 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3767 if (mt_status.mt_fileno == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3768 mt_status.mt_gstat |= GMT_BOT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3769 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 3770 mt_status.mt_gstat |= GMT_EOF(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3771 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3772 mt_status.mt_erreg = (STp->recover_reg << MT_ST_SOFTERR_SHIFT);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3773 mt_status.mt_resid = STp->partition;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3774 if (STps->eof == ST_EOM_OK || STps->eof == ST_EOM_ERROR)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3775 mt_status.mt_gstat |= GMT_EOT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3776 else if (STps->eof >= ST_EOM_OK)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3777 mt_status.mt_gstat |= GMT_EOD(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3778 if (STp->density == 1)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3779 mt_status.mt_gstat |= GMT_D_800(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3780 else if (STp->density == 2)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3781 mt_status.mt_gstat |= GMT_D_1600(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3782 else if (STp->density == 3)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3783 mt_status.mt_gstat |= GMT_D_6250(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3784 if (STp->ready == ST_READY)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3785 mt_status.mt_gstat |= GMT_ONLINE(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3786 if (STp->ready == ST_NO_TAPE)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3787 mt_status.mt_gstat |= GMT_DR_OPEN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3788 if (STps->at_sm)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3789 mt_status.mt_gstat |= GMT_SM(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3790 if (STm->do_async_writes ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3791 (STm->do_buffer_writes && STp->block_size != 0) ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3792 STp->drv_buffer != 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3793 mt_status.mt_gstat |= GMT_IM_REP_EN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3794 if (STp->cleaning_req)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3795 mt_status.mt_gstat |= GMT_CLN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3796
1207045da5a7c9 Arnd Bergmann 2018-09-07 3797 retval = put_user_mtget(p, &mt_status);
1207045da5a7c9 Arnd Bergmann 2018-09-07 3798 if (retval)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3799 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3800
^1da177e4c3f41 Linus Torvalds 2005-04-16 3801 STp->recover_reg = 0; /* Clear after read */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3802 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3803 } /* End of MTIOCGET */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3804 if (cmd_type == _IOC_TYPE(MTIOCPOS) && cmd_nr == _IOC_NR(MTIOCPOS)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3805 struct mtpos mt_pos;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3806 if (_IOC_SIZE(cmd_in) != sizeof(struct mtpos)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3807 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3808 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3809 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3810 if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3811 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3812 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3813 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3814 mt_pos.mt_blkno = blk;
1207045da5a7c9 Arnd Bergmann 2018-09-07 3815 retval = put_user_mtpos(p, &mt_pos);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3816 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3817 }
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3818 mutex_unlock(&STp->lock);
d320a9551e394c Arnd Bergmann 2019-03-15 3819
dba7688fc9037c Christoph Hellwig 2021-07-24 3820 switch (cmd_in) {
dba7688fc9037c Christoph Hellwig 2021-07-24 3821 case SG_IO:
dba7688fc9037c Christoph Hellwig 2021-07-24 3822 case SCSI_IOCTL_SEND_COMMAND:
dba7688fc9037c Christoph Hellwig 2021-07-24 3823 case CDROM_SEND_PACKET:
dba7688fc9037c Christoph Hellwig 2021-07-24 3824 if (!capable(CAP_SYS_RAWIO))
dba7688fc9037c Christoph Hellwig 2021-07-24 3825 return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3826 default:
^1da177e4c3f41 Linus Torvalds 2005-04-16 3827 break;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3828 }
dba7688fc9037c Christoph Hellwig 2021-07-24 3829
2e27f576abc6f0 Christoph Hellwig 2021-07-24 @3830 retval = scsi_ioctl(STp->device, STp->disk, file->f_mode, cmd_in, p);
dba7688fc9037c Christoph Hellwig 2021-07-24 3831 if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) {
dba7688fc9037c Christoph Hellwig 2021-07-24 3832 /* unload */
dba7688fc9037c Christoph Hellwig 2021-07-24 3833 STp->rew_at_close = 0;
dba7688fc9037c Christoph Hellwig 2021-07-24 3834 STp->ready = ST_NO_TAPE;
dba7688fc9037c Christoph Hellwig 2021-07-24 3835 }
dba7688fc9037c Christoph Hellwig 2021-07-24 3836 return retval;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3837
^1da177e4c3f41 Linus Torvalds 2005-04-16 3838 out:
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3839 mutex_unlock(&STp->lock);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3840 return retval;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3841 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3842
:::::: The code at line 3830 was first introduced by commit
:::::: 2e27f576abc6f056e63ef207b9911b1a04d07020 scsi: scsi_ioctl: Call scsi_cmd_ioctl() from scsi_ioctl()
:::::: TO: Christoph Hellwig <hch@lst.de>
:::::: CC: Martin K. Petersen <martin.petersen@oracle.com>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 38571 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Christoph Hellwig <hch@lst.de>
Cc: clang-built-linux@googlegroups.com, kbuild-all@lists.01.org,
linux-kernel@vger.kernel.org,
Luis Chamberlain <mcgrof@kernel.org>
Subject: [mcgrof-next:20210817-add-disk-error-handling-next 2/89] drivers/scsi/st.c:3830:40: error: no member named 'disk' in 'struct scsi_tape'
Date: Thu, 19 Aug 2021 08:23:47 +0800 [thread overview]
Message-ID: <202108190825.aRG9qTxp-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 41261 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git 20210817-add-disk-error-handling-next
head: 3d00c210d7fd616243af9cf41829f4a56f116ba8
commit: 7692839b26192b737a64c87970b6589e6a909d38 [2/89] st: do not allocate a gendisk
config: i386-randconfig-a011-20210816 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project d2b574a4dea5b718e4386bf2e26af0126e5978ce)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git/commit/?id=7692839b26192b737a64c87970b6589e6a909d38
git remote add mcgrof-next https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git
git fetch --no-tags mcgrof-next 20210817-add-disk-error-handling-next
git checkout 7692839b26192b737a64c87970b6589e6a909d38
# save the attached .config to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross O=build_dir ARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/scsi/st.c:3830:40: error: no member named 'disk' in 'struct scsi_tape'
retval = scsi_ioctl(STp->device, STp->disk, file->f_mode, cmd_in, p);
~~~ ^
1 error generated.
vim +3830 drivers/scsi/st.c
8038e6456a3e6f Kai Makisara 2016-02-09 3348
8038e6456a3e6f Kai Makisara 2016-02-09 3349
^1da177e4c3f41 Linus Torvalds 2005-04-16 3350 /* Partition the tape into two partitions if size > 0 or one partition if
^1da177e4c3f41 Linus Torvalds 2005-04-16 3351 size == 0.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3352
^1da177e4c3f41 Linus Torvalds 2005-04-16 3353 The block descriptors are read and written because Sony SDT-7000 does not
^1da177e4c3f41 Linus Torvalds 2005-04-16 3354 work without this (suggestion from Michael Schaefer <Michael.Schaefer@dlr.de>).
^1da177e4c3f41 Linus Torvalds 2005-04-16 3355
^1da177e4c3f41 Linus Torvalds 2005-04-16 3356 My HP C1533A drive returns only one partition size field. This is used to
^1da177e4c3f41 Linus Torvalds 2005-04-16 3357 set the size of partition 1. There is no size field for the default partition.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3358 Michael Schaefer's Sony SDT-7000 returns two descriptors and the second is
^1da177e4c3f41 Linus Torvalds 2005-04-16 3359 used to set the size of partition 1 (this is what the SCSI-3 standard specifies).
^1da177e4c3f41 Linus Torvalds 2005-04-16 3360 The following algorithm is used to accommodate both drives: if the number of
^1da177e4c3f41 Linus Torvalds 2005-04-16 3361 partition size fields is greater than the maximum number of additional partitions
^1da177e4c3f41 Linus Torvalds 2005-04-16 3362 in the mode page, the second field is used. Otherwise the first field is used.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3363
^1da177e4c3f41 Linus Torvalds 2005-04-16 3364 For Seagate DDS drives the page length must be 8 when no partitions is defined
^1da177e4c3f41 Linus Torvalds 2005-04-16 3365 and 10 when 1 partition is defined (information from Eric Lee Green). This is
^1da177e4c3f41 Linus Torvalds 2005-04-16 3366 is acceptable also to some other old drives and enforced if the first partition
^1da177e4c3f41 Linus Torvalds 2005-04-16 3367 size field is used for the first additional partition size.
8038e6456a3e6f Kai Makisara 2016-02-09 3368
8038e6456a3e6f Kai Makisara 2016-02-09 3369 For drives that advertize SCSI-3 or newer, use the SSC-3 methods.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3370 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3371 static int partition_tape(struct scsi_tape *STp, int size)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3372 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3373 int result;
8038e6456a3e6f Kai Makisara 2016-02-09 3374 int target_partition;
8038e6456a3e6f Kai Makisara 2016-02-09 3375 bool scsi3 = STp->device->scsi_level >= SCSI_3, needs_format = false;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3376 int pgo, psd_cnt, psdo;
8038e6456a3e6f Kai Makisara 2016-02-09 3377 int psum = PP_MSK_PSUM_MB, units = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3378 unsigned char *bp;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3379
^1da177e4c3f41 Linus Torvalds 2005-04-16 3380 result = read_mode_page(STp, PART_PAGE, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3381 if (result) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3382 DEBC_printk(STp, "Can't read partition mode page.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3383 return result;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3384 }
8038e6456a3e6f Kai Makisara 2016-02-09 3385 target_partition = 1;
8038e6456a3e6f Kai Makisara 2016-02-09 3386 if (size < 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3387 target_partition = 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3388 size = -size;
8038e6456a3e6f Kai Makisara 2016-02-09 3389 }
8038e6456a3e6f Kai Makisara 2016-02-09 3390
^1da177e4c3f41 Linus Torvalds 2005-04-16 3391 /* The mode page is in the buffer. Let's modify it and write it. */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3392 bp = (STp->buffer)->b_data;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3393 pgo = MODE_HEADER_LENGTH + bp[MH_OFF_BDESCS_LENGTH];
b30d8bca5b525b Hannes Reinecke 2014-06-25 3394 DEBC_printk(STp, "Partition page length is %d bytes.\n",
b30d8bca5b525b Hannes Reinecke 2014-06-25 3395 bp[pgo + MP_OFF_PAGE_LENGTH] + 2);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3396
^1da177e4c3f41 Linus Torvalds 2005-04-16 3397 psd_cnt = (bp[pgo + MP_OFF_PAGE_LENGTH] + 2 - PART_PAGE_FIXED_LENGTH) / 2;
8038e6456a3e6f Kai Makisara 2016-02-09 3398
8038e6456a3e6f Kai Makisara 2016-02-09 3399 if (scsi3) {
8038e6456a3e6f Kai Makisara 2016-02-09 3400 needs_format = (bp[pgo + PP_OFF_FLAGS] & PP_MSK_POFM) != 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3401 if (needs_format && size == 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3402 /* No need to write the mode page when clearing
8038e6456a3e6f Kai Makisara 2016-02-09 3403 * partitioning
8038e6456a3e6f Kai Makisara 2016-02-09 3404 */
8038e6456a3e6f Kai Makisara 2016-02-09 3405 DEBC_printk(STp, "Formatting tape with one partition.\n");
8038e6456a3e6f Kai Makisara 2016-02-09 3406 result = format_medium(STp, 0);
8038e6456a3e6f Kai Makisara 2016-02-09 3407 goto out;
8038e6456a3e6f Kai Makisara 2016-02-09 3408 }
8038e6456a3e6f Kai Makisara 2016-02-09 3409 if (needs_format) /* Leave the old value for HP DATs claiming SCSI_3 */
8038e6456a3e6f Kai Makisara 2016-02-09 3410 psd_cnt = 2;
8038e6456a3e6f Kai Makisara 2016-02-09 3411 if ((bp[pgo + PP_OFF_FLAGS] & PP_MSK_PSUM_UNITS) == PP_MSK_PSUM_UNITS) {
8038e6456a3e6f Kai Makisara 2016-02-09 3412 /* Use units scaling for large partitions if the device
8038e6456a3e6f Kai Makisara 2016-02-09 3413 * suggests it and no precision lost. Required for IBM
8038e6456a3e6f Kai Makisara 2016-02-09 3414 * TS1140/50 drives that don't support MB units.
8038e6456a3e6f Kai Makisara 2016-02-09 3415 */
8038e6456a3e6f Kai Makisara 2016-02-09 3416 if (size >= 1000 && (size % 1000) == 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3417 size /= 1000;
8038e6456a3e6f Kai Makisara 2016-02-09 3418 psum = PP_MSK_PSUM_UNITS;
8038e6456a3e6f Kai Makisara 2016-02-09 3419 units = 9; /* GB */
8038e6456a3e6f Kai Makisara 2016-02-09 3420 }
8038e6456a3e6f Kai Makisara 2016-02-09 3421 }
8038e6456a3e6f Kai Makisara 2016-02-09 3422 /* Try it anyway if too large to specify in MB */
8038e6456a3e6f Kai Makisara 2016-02-09 3423 if (psum == PP_MSK_PSUM_MB && size >= 65534) {
8038e6456a3e6f Kai Makisara 2016-02-09 3424 size /= 1000;
8038e6456a3e6f Kai Makisara 2016-02-09 3425 psum = PP_MSK_PSUM_UNITS;
8038e6456a3e6f Kai Makisara 2016-02-09 3426 units = 9; /* GB */
8038e6456a3e6f Kai Makisara 2016-02-09 3427 }
8038e6456a3e6f Kai Makisara 2016-02-09 3428 }
8038e6456a3e6f Kai Makisara 2016-02-09 3429
8038e6456a3e6f Kai Makisara 2016-02-09 3430 if (size >= 65535 || /* Does not fit into two bytes */
8038e6456a3e6f Kai Makisara 2016-02-09 3431 (target_partition == 0 && psd_cnt < 2)) {
8038e6456a3e6f Kai Makisara 2016-02-09 3432 result = -EINVAL;
8038e6456a3e6f Kai Makisara 2016-02-09 3433 goto out;
8038e6456a3e6f Kai Makisara 2016-02-09 3434 }
8038e6456a3e6f Kai Makisara 2016-02-09 3435
^1da177e4c3f41 Linus Torvalds 2005-04-16 3436 psdo = pgo + PART_PAGE_FIXED_LENGTH;
8038e6456a3e6f Kai Makisara 2016-02-09 3437 /* The second condition is for HP DDS which use only one partition size
8038e6456a3e6f Kai Makisara 2016-02-09 3438 * descriptor
8038e6456a3e6f Kai Makisara 2016-02-09 3439 */
8038e6456a3e6f Kai Makisara 2016-02-09 3440 if (target_partition > 0 &&
8038e6456a3e6f Kai Makisara 2016-02-09 3441 (psd_cnt > bp[pgo + PP_OFF_MAX_ADD_PARTS] ||
8038e6456a3e6f Kai Makisara 2016-02-09 3442 bp[pgo + PP_OFF_MAX_ADD_PARTS] != 1)) {
8038e6456a3e6f Kai Makisara 2016-02-09 3443 bp[psdo] = bp[psdo + 1] = 0xff; /* Rest to partition 0 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3444 psdo += 2;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3445 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3446 memset(bp + psdo, 0, bp[pgo + PP_OFF_NBR_ADD_PARTS] * 2);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3447
b30d8bca5b525b Hannes Reinecke 2014-06-25 3448 DEBC_printk(STp, "psd_cnt %d, max.parts %d, nbr_parts %d\n",
^1da177e4c3f41 Linus Torvalds 2005-04-16 3449 psd_cnt, bp[pgo + PP_OFF_MAX_ADD_PARTS],
b30d8bca5b525b Hannes Reinecke 2014-06-25 3450 bp[pgo + PP_OFF_NBR_ADD_PARTS]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3451
8038e6456a3e6f Kai Makisara 2016-02-09 3452 if (size == 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3453 bp[pgo + PP_OFF_NBR_ADD_PARTS] = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3454 if (psd_cnt <= bp[pgo + PP_OFF_MAX_ADD_PARTS])
^1da177e4c3f41 Linus Torvalds 2005-04-16 3455 bp[pgo + MP_OFF_PAGE_LENGTH] = 6;
b30d8bca5b525b Hannes Reinecke 2014-06-25 3456 DEBC_printk(STp, "Formatting tape with one partition.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3457 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3458 bp[psdo] = (size >> 8) & 0xff;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3459 bp[psdo + 1] = size & 0xff;
8038e6456a3e6f Kai Makisara 2016-02-09 3460 if (target_partition == 0)
8038e6456a3e6f Kai Makisara 2016-02-09 3461 bp[psdo + 2] = bp[psdo + 3] = 0xff;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3462 bp[pgo + 3] = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3463 if (bp[pgo + MP_OFF_PAGE_LENGTH] < 8)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3464 bp[pgo + MP_OFF_PAGE_LENGTH] = 8;
8038e6456a3e6f Kai Makisara 2016-02-09 3465 DEBC_printk(STp,
8038e6456a3e6f Kai Makisara 2016-02-09 3466 "Formatting tape with two partitions (%i = %d MB).\n",
8038e6456a3e6f Kai Makisara 2016-02-09 3467 target_partition, units > 0 ? size * 1000 : size);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3468 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3469 bp[pgo + PP_OFF_PART_UNITS] = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3470 bp[pgo + PP_OFF_RESERVED] = 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3471 if (size != 1 || units != 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3472 bp[pgo + PP_OFF_FLAGS] = PP_BIT_IDP | psum |
8038e6456a3e6f Kai Makisara 2016-02-09 3473 (bp[pgo + PP_OFF_FLAGS] & 0x07);
8038e6456a3e6f Kai Makisara 2016-02-09 3474 bp[pgo + PP_OFF_PART_UNITS] = units;
8038e6456a3e6f Kai Makisara 2016-02-09 3475 } else
8038e6456a3e6f Kai Makisara 2016-02-09 3476 bp[pgo + PP_OFF_FLAGS] = PP_BIT_FDP |
8038e6456a3e6f Kai Makisara 2016-02-09 3477 (bp[pgo + PP_OFF_FLAGS] & 0x1f);
8038e6456a3e6f Kai Makisara 2016-02-09 3478 bp[pgo + MP_OFF_PAGE_LENGTH] = 6 + psd_cnt * 2;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3479
^1da177e4c3f41 Linus Torvalds 2005-04-16 3480 result = write_mode_page(STp, PART_PAGE, 1);
8038e6456a3e6f Kai Makisara 2016-02-09 3481
8038e6456a3e6f Kai Makisara 2016-02-09 3482 if (!result && needs_format)
8038e6456a3e6f Kai Makisara 2016-02-09 3483 result = format_medium(STp, 1);
8038e6456a3e6f Kai Makisara 2016-02-09 3484
^1da177e4c3f41 Linus Torvalds 2005-04-16 3485 if (result) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3486 st_printk(KERN_INFO, STp, "Partitioning of tape failed.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3487 result = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3488 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3489
8038e6456a3e6f Kai Makisara 2016-02-09 3490 out:
^1da177e4c3f41 Linus Torvalds 2005-04-16 3491 return result;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3492 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3493 \f
^1da177e4c3f41 Linus Torvalds 2005-04-16 3494
^1da177e4c3f41 Linus Torvalds 2005-04-16 3495
^1da177e4c3f41 Linus Torvalds 2005-04-16 3496 /* The ioctl command */
dba7688fc9037c Christoph Hellwig 2021-07-24 3497 static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3498 {
dba7688fc9037c Christoph Hellwig 2021-07-24 3499 void __user *p = (void __user *)arg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3500 int i, cmd_nr, cmd_type, bt;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3501 int retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3502 unsigned int blk;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3503 struct scsi_tape *STp = file->private_data;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3504 struct st_modedef *STm;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3505 struct st_partstat *STps;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3506
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3507 if (mutex_lock_interruptible(&STp->lock))
^1da177e4c3f41 Linus Torvalds 2005-04-16 3508 return -ERESTARTSYS;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3509
^1da177e4c3f41 Linus Torvalds 2005-04-16 3510 DEB(
^1da177e4c3f41 Linus Torvalds 2005-04-16 3511 if (debugging && !STp->in_use) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3512 st_printk(ST_DEB_MSG, STp, "Incorrect device.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3513 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3514 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3515 } ) /* end DEB */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3516
^1da177e4c3f41 Linus Torvalds 2005-04-16 3517 STm = &(STp->modes[STp->current_mode]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3518 STps = &(STp->ps[STp->partition]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3519
^1da177e4c3f41 Linus Torvalds 2005-04-16 3520 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 3521 * If we are in the middle of error recovery, don't let anyone
^1da177e4c3f41 Linus Torvalds 2005-04-16 3522 * else try and use this device. Also, if error recovery fails, it
^1da177e4c3f41 Linus Torvalds 2005-04-16 3523 * may try and take the device offline, in which case all further
^1da177e4c3f41 Linus Torvalds 2005-04-16 3524 * access to the device is prohibited.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3525 */
906d15fbd23c12 Christoph Hellwig 2014-10-11 3526 retval = scsi_ioctl_block_when_processing_errors(STp->device, cmd_in,
83ff6fe8580a7c Al Viro 2008-03-02 3527 file->f_flags & O_NDELAY);
906d15fbd23c12 Christoph Hellwig 2014-10-11 3528 if (retval)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3529 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3530
^1da177e4c3f41 Linus Torvalds 2005-04-16 3531 cmd_type = _IOC_TYPE(cmd_in);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3532 cmd_nr = _IOC_NR(cmd_in);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3533
^1da177e4c3f41 Linus Torvalds 2005-04-16 3534 if (cmd_type == _IOC_TYPE(MTIOCTOP) && cmd_nr == _IOC_NR(MTIOCTOP)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3535 struct mtop mtc;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3536
^1da177e4c3f41 Linus Torvalds 2005-04-16 3537 if (_IOC_SIZE(cmd_in) != sizeof(mtc)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3538 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3539 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3540 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3541
^1da177e4c3f41 Linus Torvalds 2005-04-16 3542 i = copy_from_user(&mtc, p, sizeof(struct mtop));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3543 if (i) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3544 retval = (-EFAULT);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3545 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3546 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3547
^1da177e4c3f41 Linus Torvalds 2005-04-16 3548 if (mtc.mt_op == MTSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3549 st_printk(KERN_WARNING, STp,
b30d8bca5b525b Hannes Reinecke 2014-06-25 3550 "MTSETDRVBUFFER only allowed for root.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3551 retval = (-EPERM);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3552 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3553 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3554 if (!STm->defined &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3555 (mtc.mt_op != MTSETDRVBUFFER &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3556 (mtc.mt_count & MT_ST_OPTIONS) == 0)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3557 retval = (-ENXIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3558 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3559 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3560
^1da177e4c3f41 Linus Torvalds 2005-04-16 3561 if (!STp->pos_unknown) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3562
^1da177e4c3f41 Linus Torvalds 2005-04-16 3563 if (STps->eof == ST_FM_HIT) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3564 if (mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3565 mtc.mt_op == MTEOM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3566 mtc.mt_count -= 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3567 if (STps->drv_file >= 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3568 STps->drv_file += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3569 } else if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3570 mtc.mt_count += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3571 if (STps->drv_file >= 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3572 STps->drv_file += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3573 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3574 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3575
^1da177e4c3f41 Linus Torvalds 2005-04-16 3576 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3577 /* Old position must be restored if partition will be
^1da177e4c3f41 Linus Torvalds 2005-04-16 3578 changed */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3579 i = !STp->can_partitions ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3580 (STp->new_partition != STp->partition);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3581 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3582 i = mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3583 mtc.mt_op == MTRETEN || mtc.mt_op == MTEOM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3584 mtc.mt_op == MTLOCK || mtc.mt_op == MTLOAD ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3585 mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3586 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3587 mtc.mt_op == MTCOMPRESSION;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3588 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3589 i = flush_buffer(STp, i);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3590 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3591 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3592 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3593 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3594 if (STps->rw == ST_WRITING &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3595 (mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3596 mtc.mt_op == MTSEEK ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3597 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3598 i = st_int_ioctl(STp, MTWEOF, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3599 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3600 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3601 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3602 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3603 if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3604 mtc.mt_count++;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3605 STps->rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3606 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3607
^1da177e4c3f41 Linus Torvalds 2005-04-16 3608 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3609 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 3610 * If there was a bus reset, block further access
^1da177e4c3f41 Linus Torvalds 2005-04-16 3611 * to this device. If the user wants to rewind the tape,
^1da177e4c3f41 Linus Torvalds 2005-04-16 3612 * then reset the flag and allow access again.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3613 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3614 if (mtc.mt_op != MTREW &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3615 mtc.mt_op != MTOFFL &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3616 mtc.mt_op != MTRETEN &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3617 mtc.mt_op != MTERASE &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3618 mtc.mt_op != MTSEEK &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3619 mtc.mt_op != MTEOM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3620 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3621 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3622 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3623 reset_state(STp);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3624 /* remove this when the midlevel properly clears was_reset */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3625 STp->device->was_reset = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3626 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3627
^1da177e4c3f41 Linus Torvalds 2005-04-16 3628 if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3629 mtc.mt_op != MTSETDENSITY && mtc.mt_op != MTWSM &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3630 mtc.mt_op != MTSETDRVBUFFER && mtc.mt_op != MTSETPART)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3631 STps->rw = ST_IDLE; /* Prevent automatic WEOF and fsf */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3632
^1da177e4c3f41 Linus Torvalds 2005-04-16 3633 if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3634 do_door_lock(STp, 0); /* Ignore result! */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3635
^1da177e4c3f41 Linus Torvalds 2005-04-16 3636 if (mtc.mt_op == MTSETDRVBUFFER &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3637 (mtc.mt_count & MT_ST_OPTIONS) != 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3638 retval = st_set_options(STp, mtc.mt_count);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3639 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3640 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3641
^1da177e4c3f41 Linus Torvalds 2005-04-16 3642 if (mtc.mt_op == MTSETPART) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3643 if (!STp->can_partitions ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3644 mtc.mt_count < 0 || mtc.mt_count >= ST_NBR_PARTITIONS) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3645 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3646 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3647 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3648 if (mtc.mt_count >= STp->nbr_partitions &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3649 (STp->nbr_partitions = nbr_partitions(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3650 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3651 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3652 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3653 if (mtc.mt_count >= STp->nbr_partitions) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3654 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3655 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3656 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3657 STp->new_partition = mtc.mt_count;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3658 retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3659 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3660 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3661
^1da177e4c3f41 Linus Torvalds 2005-04-16 3662 if (mtc.mt_op == MTMKPART) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3663 if (!STp->can_partitions) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3664 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3665 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3666 }
8038e6456a3e6f Kai Makisara 2016-02-09 3667 i = do_load_unload(STp, file, 1);
8038e6456a3e6f Kai Makisara 2016-02-09 3668 if (i < 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3669 retval = i;
8038e6456a3e6f Kai Makisara 2016-02-09 3670 goto out;
8038e6456a3e6f Kai Makisara 2016-02-09 3671 }
8038e6456a3e6f Kai Makisara 2016-02-09 3672 i = partition_tape(STp, mtc.mt_count);
8038e6456a3e6f Kai Makisara 2016-02-09 3673 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3674 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3675 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3676 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3677 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3678 STp->ps[i].rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3679 STp->ps[i].at_sm = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3680 STp->ps[i].last_block_valid = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3681 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3682 STp->partition = STp->new_partition = 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3683 STp->nbr_partitions = mtc.mt_count != 0 ? 2 : 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3684 STps->drv_block = STps->drv_file = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3685 retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3686 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3687 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3688
^1da177e4c3f41 Linus Torvalds 2005-04-16 3689 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3690 i = set_location(STp, mtc.mt_count, STp->new_partition, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3691 if (!STp->can_partitions)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3692 STp->ps[0].rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3693 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3694 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3695 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3696
^1da177e4c3f41 Linus Torvalds 2005-04-16 3697 if (mtc.mt_op == MTUNLOAD || mtc.mt_op == MTOFFL) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3698 retval = do_load_unload(STp, file, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3699 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3700 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3701
^1da177e4c3f41 Linus Torvalds 2005-04-16 3702 if (mtc.mt_op == MTLOAD) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3703 retval = do_load_unload(STp, file, max(1, mtc.mt_count));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3704 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3705 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3706
^1da177e4c3f41 Linus Torvalds 2005-04-16 3707 if (mtc.mt_op == MTLOCK || mtc.mt_op == MTUNLOCK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3708 retval = do_door_lock(STp, (mtc.mt_op == MTLOCK));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3709 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3710 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3711
^1da177e4c3f41 Linus Torvalds 2005-04-16 3712 if (STp->can_partitions && STp->ready == ST_READY &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3713 (i = switch_partition(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3714 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3715 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3716 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3717
^1da177e4c3f41 Linus Torvalds 2005-04-16 3718 if (mtc.mt_op == MTCOMPRESSION)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3719 retval = st_compression(STp, (mtc.mt_count & 1));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3720 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 3721 retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3722 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3723 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3724 if (!STm->defined) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3725 retval = (-ENXIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3726 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3727 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3728
^1da177e4c3f41 Linus Torvalds 2005-04-16 3729 if ((i = flush_buffer(STp, 0)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3730 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3731 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3732 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3733 if (STp->can_partitions &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3734 (i = switch_partition(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3735 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3736 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3737 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3738
^1da177e4c3f41 Linus Torvalds 2005-04-16 3739 if (cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3740 struct mtget mt_status;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3741
^1da177e4c3f41 Linus Torvalds 2005-04-16 3742 if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3743 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3744 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3745 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3746
^1da177e4c3f41 Linus Torvalds 2005-04-16 3747 mt_status.mt_type = STp->tape_type;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3748 mt_status.mt_dsreg =
^1da177e4c3f41 Linus Torvalds 2005-04-16 3749 ((STp->block_size << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK) |
^1da177e4c3f41 Linus Torvalds 2005-04-16 3750 ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3751 mt_status.mt_blkno = STps->drv_block;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3752 mt_status.mt_fileno = STps->drv_file;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3753 if (STp->block_size != 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3754 if (STps->rw == ST_WRITING)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3755 mt_status.mt_blkno +=
^1da177e4c3f41 Linus Torvalds 2005-04-16 3756 (STp->buffer)->buffer_bytes / STp->block_size;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3757 else if (STps->rw == ST_READING)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3758 mt_status.mt_blkno -=
^1da177e4c3f41 Linus Torvalds 2005-04-16 3759 ((STp->buffer)->buffer_bytes +
^1da177e4c3f41 Linus Torvalds 2005-04-16 3760 STp->block_size - 1) / STp->block_size;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3761 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3762
^1da177e4c3f41 Linus Torvalds 2005-04-16 3763 mt_status.mt_gstat = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3764 if (STp->drv_write_prot)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3765 mt_status.mt_gstat |= GMT_WR_PROT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3766 if (mt_status.mt_blkno == 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3767 if (mt_status.mt_fileno == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3768 mt_status.mt_gstat |= GMT_BOT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3769 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 3770 mt_status.mt_gstat |= GMT_EOF(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3771 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3772 mt_status.mt_erreg = (STp->recover_reg << MT_ST_SOFTERR_SHIFT);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3773 mt_status.mt_resid = STp->partition;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3774 if (STps->eof == ST_EOM_OK || STps->eof == ST_EOM_ERROR)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3775 mt_status.mt_gstat |= GMT_EOT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3776 else if (STps->eof >= ST_EOM_OK)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3777 mt_status.mt_gstat |= GMT_EOD(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3778 if (STp->density == 1)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3779 mt_status.mt_gstat |= GMT_D_800(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3780 else if (STp->density == 2)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3781 mt_status.mt_gstat |= GMT_D_1600(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3782 else if (STp->density == 3)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3783 mt_status.mt_gstat |= GMT_D_6250(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3784 if (STp->ready == ST_READY)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3785 mt_status.mt_gstat |= GMT_ONLINE(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3786 if (STp->ready == ST_NO_TAPE)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3787 mt_status.mt_gstat |= GMT_DR_OPEN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3788 if (STps->at_sm)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3789 mt_status.mt_gstat |= GMT_SM(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3790 if (STm->do_async_writes ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3791 (STm->do_buffer_writes && STp->block_size != 0) ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3792 STp->drv_buffer != 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3793 mt_status.mt_gstat |= GMT_IM_REP_EN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3794 if (STp->cleaning_req)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3795 mt_status.mt_gstat |= GMT_CLN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3796
1207045da5a7c9 Arnd Bergmann 2018-09-07 3797 retval = put_user_mtget(p, &mt_status);
1207045da5a7c9 Arnd Bergmann 2018-09-07 3798 if (retval)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3799 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3800
^1da177e4c3f41 Linus Torvalds 2005-04-16 3801 STp->recover_reg = 0; /* Clear after read */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3802 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3803 } /* End of MTIOCGET */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3804 if (cmd_type == _IOC_TYPE(MTIOCPOS) && cmd_nr == _IOC_NR(MTIOCPOS)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3805 struct mtpos mt_pos;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3806 if (_IOC_SIZE(cmd_in) != sizeof(struct mtpos)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3807 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3808 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3809 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3810 if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3811 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3812 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3813 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3814 mt_pos.mt_blkno = blk;
1207045da5a7c9 Arnd Bergmann 2018-09-07 3815 retval = put_user_mtpos(p, &mt_pos);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3816 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3817 }
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3818 mutex_unlock(&STp->lock);
d320a9551e394c Arnd Bergmann 2019-03-15 3819
dba7688fc9037c Christoph Hellwig 2021-07-24 3820 switch (cmd_in) {
dba7688fc9037c Christoph Hellwig 2021-07-24 3821 case SG_IO:
dba7688fc9037c Christoph Hellwig 2021-07-24 3822 case SCSI_IOCTL_SEND_COMMAND:
dba7688fc9037c Christoph Hellwig 2021-07-24 3823 case CDROM_SEND_PACKET:
dba7688fc9037c Christoph Hellwig 2021-07-24 3824 if (!capable(CAP_SYS_RAWIO))
dba7688fc9037c Christoph Hellwig 2021-07-24 3825 return -EPERM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3826 default:
^1da177e4c3f41 Linus Torvalds 2005-04-16 3827 break;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3828 }
dba7688fc9037c Christoph Hellwig 2021-07-24 3829
2e27f576abc6f0 Christoph Hellwig 2021-07-24 @3830 retval = scsi_ioctl(STp->device, STp->disk, file->f_mode, cmd_in, p);
dba7688fc9037c Christoph Hellwig 2021-07-24 3831 if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) {
dba7688fc9037c Christoph Hellwig 2021-07-24 3832 /* unload */
dba7688fc9037c Christoph Hellwig 2021-07-24 3833 STp->rew_at_close = 0;
dba7688fc9037c Christoph Hellwig 2021-07-24 3834 STp->ready = ST_NO_TAPE;
dba7688fc9037c Christoph Hellwig 2021-07-24 3835 }
dba7688fc9037c Christoph Hellwig 2021-07-24 3836 return retval;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3837
^1da177e4c3f41 Linus Torvalds 2005-04-16 3838 out:
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3839 mutex_unlock(&STp->lock);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3840 return retval;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3841 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3842
:::::: The code at line 3830 was first introduced by commit
:::::: 2e27f576abc6f056e63ef207b9911b1a04d07020 scsi: scsi_ioctl: Call scsi_cmd_ioctl() from scsi_ioctl()
:::::: TO: Christoph Hellwig <hch@lst.de>
:::::: CC: Martin K. Petersen <martin.petersen@oracle.com>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 38571 bytes --]
next reply other threads:[~2021-08-19 0:23 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-19 0:23 kernel test robot [this message]
2021-08-19 0:23 ` [mcgrof-next:20210817-add-disk-error-handling-next 2/89] drivers/scsi/st.c:3830:40: error: no member named 'disk' in 'struct scsi_tape' kernel test robot
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=202108190825.aRG9qTxp-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.