* drivers/scsi/st.c:3943 st_ioctl() warn: inconsistent returns '&STp->lock'.
@ 2026-04-16 7:27 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2026-04-16 7:27 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: David Jeffery <djeffery@redhat.com>
CC: "Martin K. Petersen" <martin.petersen@oracle.com>
CC: John Meneghini <jmeneghi@redhat.com>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 1d51b370a0f8f642f4fc84c795fbedac0fcdbbd2
commit: b37d70c0df85e217a868ecdf535500ff926427ae scsi: st: Separate st-unique ioctl handling from SCSI common ioctl handling
date: 5 months ago
:::::: branch date: 5 hours ago
:::::: commit date: 5 months ago
config: powerpc-randconfig-r071-20260416 (https://download.01.org/0day-ci/archive/20260416/202604161523.JFDbH5wq-lkp@intel.com/config)
compiler: powerpc-linux-gcc (GCC) 13.4.0
smatch: v0.5.0-9007-gcf3ea02b
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: b37d70c0df85 ("scsi: st: Separate st-unique ioctl handling from SCSI common ioctl handling")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202604161523.JFDbH5wq-lkp@intel.com/
smatch warnings:
drivers/scsi/st.c:3943 st_ioctl() warn: inconsistent returns '&STp->lock'.
vim +3943 drivers/scsi/st.c
^1da177e4c3f415 Linus Torvalds 2005-04-16 3583
^1da177e4c3f415 Linus Torvalds 2005-04-16 3584 /* The ioctl command */
dba7688fc9037c8 Christoph Hellwig 2021-07-24 3585 static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3586 {
dba7688fc9037c8 Christoph Hellwig 2021-07-24 3587 void __user *p = (void __user *)arg;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3588 int i, cmd_nr, cmd_type, bt;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3589 int retval = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3590 unsigned int blk;
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3591 bool cmd_mtiocget;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3592 struct scsi_tape *STp = file->private_data;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3593 struct st_modedef *STm;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3594 struct st_partstat *STps;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3595
28f85009e0cf6a5 Matthias Kaehlcke 2007-07-29 3596 if (mutex_lock_interruptible(&STp->lock))
^1da177e4c3f415 Linus Torvalds 2005-04-16 3597 return -ERESTARTSYS;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3598
^1da177e4c3f415 Linus Torvalds 2005-04-16 3599 DEB(
^1da177e4c3f415 Linus Torvalds 2005-04-16 3600 if (debugging && !STp->in_use) {
b30d8bca5b525ba Hannes Reinecke 2014-06-25 3601 st_printk(ST_DEB_MSG, STp, "Incorrect device.\n");
^1da177e4c3f415 Linus Torvalds 2005-04-16 3602 retval = (-EIO);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3603 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3604 } ) /* end DEB */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3605
^1da177e4c3f415 Linus Torvalds 2005-04-16 3606 STm = &(STp->modes[STp->current_mode]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3607 STps = &(STp->ps[STp->partition]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3608
^1da177e4c3f415 Linus Torvalds 2005-04-16 3609 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 3610 * If we are in the middle of error recovery, don't let anyone
^1da177e4c3f415 Linus Torvalds 2005-04-16 3611 * else try and use this device. Also, if error recovery fails, it
^1da177e4c3f415 Linus Torvalds 2005-04-16 3612 * may try and take the device offline, in which case all further
^1da177e4c3f415 Linus Torvalds 2005-04-16 3613 * access to the device is prohibited.
^1da177e4c3f415 Linus Torvalds 2005-04-16 3614 */
906d15fbd23c126 Christoph Hellwig 2014-10-11 3615 retval = scsi_ioctl_block_when_processing_errors(STp->device, cmd_in,
83ff6fe8580a7c8 Al Viro 2008-03-02 3616 file->f_flags & O_NDELAY);
906d15fbd23c126 Christoph Hellwig 2014-10-11 3617 if (retval)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3618 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3619
b37d70c0df85e21 David Jeffery 2025-11-04 3620 switch (cmd_in) {
b37d70c0df85e21 David Jeffery 2025-11-04 3621 case MTIOCPOS:
b37d70c0df85e21 David Jeffery 2025-11-04 3622 case MTIOCGET:
b37d70c0df85e21 David Jeffery 2025-11-04 3623 case MTIOCTOP:
b37d70c0df85e21 David Jeffery 2025-11-04 3624 break;
b37d70c0df85e21 David Jeffery 2025-11-04 3625 default:
b37d70c0df85e21 David Jeffery 2025-11-04 3626 return st_common_ioctl(STp, STm, file, cmd_in, arg);
b37d70c0df85e21 David Jeffery 2025-11-04 3627 }
b37d70c0df85e21 David Jeffery 2025-11-04 3628
^1da177e4c3f415 Linus Torvalds 2005-04-16 3629 cmd_type = _IOC_TYPE(cmd_in);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3630 cmd_nr = _IOC_NR(cmd_in);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3631
^1da177e4c3f415 Linus Torvalds 2005-04-16 3632 if (cmd_type == _IOC_TYPE(MTIOCTOP) && cmd_nr == _IOC_NR(MTIOCTOP)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3633 struct mtop mtc;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3634
^1da177e4c3f415 Linus Torvalds 2005-04-16 3635 if (_IOC_SIZE(cmd_in) != sizeof(mtc)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3636 retval = (-EINVAL);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3637 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3638 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3639
^1da177e4c3f415 Linus Torvalds 2005-04-16 3640 i = copy_from_user(&mtc, p, sizeof(struct mtop));
^1da177e4c3f415 Linus Torvalds 2005-04-16 3641 if (i) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3642 retval = (-EFAULT);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3643 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3644 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3645
^1da177e4c3f415 Linus Torvalds 2005-04-16 3646 if (mtc.mt_op == MTSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) {
b30d8bca5b525ba Hannes Reinecke 2014-06-25 3647 st_printk(KERN_WARNING, STp,
b30d8bca5b525ba Hannes Reinecke 2014-06-25 3648 "MTSETDRVBUFFER only allowed for root.\n");
^1da177e4c3f415 Linus Torvalds 2005-04-16 3649 retval = (-EPERM);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3650 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3651 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3652 if (!STm->defined &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3653 (mtc.mt_op != MTSETDRVBUFFER &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3654 (mtc.mt_count & MT_ST_OPTIONS) == 0)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3655 retval = (-ENXIO);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3656 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3657 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3658
^1da177e4c3f415 Linus Torvalds 2005-04-16 3659 if (!STp->pos_unknown) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3660
^1da177e4c3f415 Linus Torvalds 2005-04-16 3661 if (STps->eof == ST_FM_HIT) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3662 if (mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3663 mtc.mt_op == MTEOM) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3664 mtc.mt_count -= 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3665 if (STps->drv_file >= 0)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3666 STps->drv_file += 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3667 } else if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3668 mtc.mt_count += 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3669 if (STps->drv_file >= 0)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3670 STps->drv_file += 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3671 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3672 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3673
^1da177e4c3f415 Linus Torvalds 2005-04-16 3674 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3675 /* Old position must be restored if partition will be
^1da177e4c3f415 Linus Torvalds 2005-04-16 3676 changed */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3677 i = !STp->can_partitions ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3678 (STp->new_partition != STp->partition);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3679 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3680 i = mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3681 mtc.mt_op == MTRETEN || mtc.mt_op == MTEOM ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3682 mtc.mt_op == MTLOCK || mtc.mt_op == MTLOAD ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3683 mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3684 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3685 mtc.mt_op == MTCOMPRESSION;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3686 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3687 i = flush_buffer(STp, i);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3688 if (i < 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3689 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3690 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3691 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3692 if (STps->rw == ST_WRITING &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3693 (mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3694 mtc.mt_op == MTSEEK ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3695 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3696 i = st_int_ioctl(STp, MTWEOF, 1);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3697 if (i < 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3698 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3699 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3700 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3701 if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3702 mtc.mt_count++;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3703 STps->rw = ST_IDLE;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3704 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3705
^1da177e4c3f415 Linus Torvalds 2005-04-16 3706 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3707 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 3708 * If there was a bus reset, block further access
^1da177e4c3f415 Linus Torvalds 2005-04-16 3709 * to this device. If the user wants to rewind the tape,
^1da177e4c3f415 Linus Torvalds 2005-04-16 3710 * then reset the flag and allow access again.
^1da177e4c3f415 Linus Torvalds 2005-04-16 3711 */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3712 if (mtc.mt_op != MTREW &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3713 mtc.mt_op != MTOFFL &&
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3714 mtc.mt_op != MTLOAD &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3715 mtc.mt_op != MTRETEN &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3716 mtc.mt_op != MTERASE &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3717 mtc.mt_op != MTSEEK &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3718 mtc.mt_op != MTEOM) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3719 retval = (-EIO);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3720 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3721 }
7081dc75df79696 Kai Mäkisara 2025-01-20 3722 reset_state(STp); /* Clears pos_unknown */
7081dc75df79696 Kai Mäkisara 2025-01-20 3723
7081dc75df79696 Kai Mäkisara 2025-01-20 3724 /* Fix the device settings after reset, ignore errors */
7081dc75df79696 Kai Mäkisara 2025-01-20 3725 if (mtc.mt_op == MTREW || mtc.mt_op == MTSEEK ||
7081dc75df79696 Kai Mäkisara 2025-01-20 3726 mtc.mt_op == MTEOM) {
7081dc75df79696 Kai Mäkisara 2025-01-20 3727 if (STp->can_partitions) {
7081dc75df79696 Kai Mäkisara 2025-01-20 3728 /* STp->new_partition contains the
7081dc75df79696 Kai Mäkisara 2025-01-20 3729 * latest partition set
7081dc75df79696 Kai Mäkisara 2025-01-20 3730 */
7081dc75df79696 Kai Mäkisara 2025-01-20 3731 STp->partition = 0;
7081dc75df79696 Kai Mäkisara 2025-01-20 3732 switch_partition(STp);
7081dc75df79696 Kai Mäkisara 2025-01-20 3733 }
7081dc75df79696 Kai Mäkisara 2025-01-20 3734 if (STp->density_changed)
7081dc75df79696 Kai Mäkisara 2025-01-20 3735 st_int_ioctl(STp, MTSETDENSITY, STp->changed_density);
7081dc75df79696 Kai Mäkisara 2025-01-20 3736 if (STp->blksize_changed)
7081dc75df79696 Kai Mäkisara 2025-01-20 3737 st_int_ioctl(STp, MTSETBLK, STp->changed_blksize);
7081dc75df79696 Kai Mäkisara 2025-01-20 3738 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3739 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3740
^1da177e4c3f415 Linus Torvalds 2005-04-16 3741 if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3742 mtc.mt_op != MTSETDENSITY && mtc.mt_op != MTWSM &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3743 mtc.mt_op != MTSETDRVBUFFER && mtc.mt_op != MTSETPART)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3744 STps->rw = ST_IDLE; /* Prevent automatic WEOF and fsf */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3745
^1da177e4c3f415 Linus Torvalds 2005-04-16 3746 if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3747 do_door_lock(STp, 0); /* Ignore result! */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3748
^1da177e4c3f415 Linus Torvalds 2005-04-16 3749 if (mtc.mt_op == MTSETDRVBUFFER &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3750 (mtc.mt_count & MT_ST_OPTIONS) != 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3751 retval = st_set_options(STp, mtc.mt_count);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3752 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3753 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3754
^1da177e4c3f415 Linus Torvalds 2005-04-16 3755 if (mtc.mt_op == MTSETPART) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3756 if (!STp->can_partitions ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3757 mtc.mt_count < 0 || mtc.mt_count >= ST_NBR_PARTITIONS) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3758 retval = (-EINVAL);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3759 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3760 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3761 if (mtc.mt_count >= STp->nbr_partitions &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3762 (STp->nbr_partitions = nbr_partitions(STp)) < 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3763 retval = (-EIO);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3764 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3765 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3766 if (mtc.mt_count >= STp->nbr_partitions) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3767 retval = (-EINVAL);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3768 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3769 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3770 STp->new_partition = mtc.mt_count;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3771 retval = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3772 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3773 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3774
^1da177e4c3f415 Linus Torvalds 2005-04-16 3775 if (mtc.mt_op == MTMKPART) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3776 if (!STp->can_partitions) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3777 retval = (-EINVAL);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3778 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3779 }
8038e6456a3e6f5 Kai Makisara 2016-02-09 3780 i = do_load_unload(STp, file, 1);
8038e6456a3e6f5 Kai Makisara 2016-02-09 3781 if (i < 0) {
8038e6456a3e6f5 Kai Makisara 2016-02-09 3782 retval = i;
8038e6456a3e6f5 Kai Makisara 2016-02-09 3783 goto out;
8038e6456a3e6f5 Kai Makisara 2016-02-09 3784 }
8038e6456a3e6f5 Kai Makisara 2016-02-09 3785 i = partition_tape(STp, mtc.mt_count);
8038e6456a3e6f5 Kai Makisara 2016-02-09 3786 if (i < 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3787 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3788 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3789 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3790 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3791 STp->ps[i].rw = ST_IDLE;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3792 STp->ps[i].at_sm = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3793 STp->ps[i].last_block_valid = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3794 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3795 STp->partition = STp->new_partition = 0;
8038e6456a3e6f5 Kai Makisara 2016-02-09 3796 STp->nbr_partitions = mtc.mt_count != 0 ? 2 : 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3797 STps->drv_block = STps->drv_file = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3798 retval = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3799 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3800 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3801
^1da177e4c3f415 Linus Torvalds 2005-04-16 3802 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3803 i = set_location(STp, mtc.mt_count, STp->new_partition, 0);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3804 if (!STp->can_partitions)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3805 STp->ps[0].rw = ST_IDLE;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3806 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3807 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3808 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3809
^1da177e4c3f415 Linus Torvalds 2005-04-16 3810 if (mtc.mt_op == MTUNLOAD || mtc.mt_op == MTOFFL) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3811 retval = do_load_unload(STp, file, 0);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3812 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3813 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3814
^1da177e4c3f415 Linus Torvalds 2005-04-16 3815 if (mtc.mt_op == MTLOAD) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3816 retval = do_load_unload(STp, file, max(1, mtc.mt_count));
^1da177e4c3f415 Linus Torvalds 2005-04-16 3817 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3818 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3819
^1da177e4c3f415 Linus Torvalds 2005-04-16 3820 if (mtc.mt_op == MTLOCK || mtc.mt_op == MTUNLOCK) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3821 retval = do_door_lock(STp, (mtc.mt_op == MTLOCK));
^1da177e4c3f415 Linus Torvalds 2005-04-16 3822 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3823 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3824
^1da177e4c3f415 Linus Torvalds 2005-04-16 3825 if (STp->can_partitions && STp->ready == ST_READY &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 3826 (i = switch_partition(STp)) < 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3827 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3828 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3829 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3830
^1da177e4c3f415 Linus Torvalds 2005-04-16 3831 if (mtc.mt_op == MTCOMPRESSION)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3832 retval = st_compression(STp, (mtc.mt_count & 1));
^1da177e4c3f415 Linus Torvalds 2005-04-16 3833 else
^1da177e4c3f415 Linus Torvalds 2005-04-16 3834 retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3835 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3836 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3837 if (!STm->defined) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3838 retval = (-ENXIO);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3839 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3840 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3841
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3842 cmd_mtiocget = cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET);
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3843
^1da177e4c3f415 Linus Torvalds 2005-04-16 3844 if ((i = flush_buffer(STp, 0)) < 0) {
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3845 if (cmd_mtiocget && STp->pos_unknown) {
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3846 /* flush fails -> modify status accordingly */
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3847 reset_state(STp);
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3848 STp->pos_unknown = 1;
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3849 } else { /* return error */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3850 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3851 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3852 }
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3853 } else { /* flush_buffer succeeds */
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3854 if (STp->can_partitions) {
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3855 i = switch_partition(STp);
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3856 if (i < 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3857 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3858 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3859 }
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3860 }
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3861 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3862
0b120edb37dc9dd Kai Mäkisara 2024-11-06 3863 if (cmd_mtiocget) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3864 struct mtget mt_status;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3865
^1da177e4c3f415 Linus Torvalds 2005-04-16 3866 if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3867 retval = (-EINVAL);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3868 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3869 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3870
^1da177e4c3f415 Linus Torvalds 2005-04-16 3871 mt_status.mt_type = STp->tape_type;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3872 mt_status.mt_dsreg =
^1da177e4c3f415 Linus Torvalds 2005-04-16 3873 ((STp->block_size << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK) |
^1da177e4c3f415 Linus Torvalds 2005-04-16 3874 ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3875 mt_status.mt_blkno = STps->drv_block;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3876 mt_status.mt_fileno = STps->drv_file;
5bb2d6179d1a803 Kai Mäkisara 2024-11-06 3877 if (STp->block_size != 0 && mt_status.mt_blkno >= 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3878 if (STps->rw == ST_WRITING)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3879 mt_status.mt_blkno +=
^1da177e4c3f415 Linus Torvalds 2005-04-16 3880 (STp->buffer)->buffer_bytes / STp->block_size;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3881 else if (STps->rw == ST_READING)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3882 mt_status.mt_blkno -=
^1da177e4c3f415 Linus Torvalds 2005-04-16 3883 ((STp->buffer)->buffer_bytes +
^1da177e4c3f415 Linus Torvalds 2005-04-16 3884 STp->block_size - 1) / STp->block_size;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3885 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3886
^1da177e4c3f415 Linus Torvalds 2005-04-16 3887 mt_status.mt_gstat = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3888 if (STp->drv_write_prot)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3889 mt_status.mt_gstat |= GMT_WR_PROT(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3890 if (mt_status.mt_blkno == 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3891 if (mt_status.mt_fileno == 0)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3892 mt_status.mt_gstat |= GMT_BOT(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3893 else
^1da177e4c3f415 Linus Torvalds 2005-04-16 3894 mt_status.mt_gstat |= GMT_EOF(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3895 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3896 mt_status.mt_erreg = (STp->recover_reg << MT_ST_SOFTERR_SHIFT);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3897 mt_status.mt_resid = STp->partition;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3898 if (STps->eof == ST_EOM_OK || STps->eof == ST_EOM_ERROR)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3899 mt_status.mt_gstat |= GMT_EOT(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3900 else if (STps->eof >= ST_EOM_OK)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3901 mt_status.mt_gstat |= GMT_EOD(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3902 if (STp->density == 1)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3903 mt_status.mt_gstat |= GMT_D_800(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3904 else if (STp->density == 2)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3905 mt_status.mt_gstat |= GMT_D_1600(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3906 else if (STp->density == 3)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3907 mt_status.mt_gstat |= GMT_D_6250(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3908 if (STp->ready == ST_READY)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3909 mt_status.mt_gstat |= GMT_ONLINE(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3910 if (STp->ready == ST_NO_TAPE)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3911 mt_status.mt_gstat |= GMT_DR_OPEN(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3912 if (STps->at_sm)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3913 mt_status.mt_gstat |= GMT_SM(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3914 if (STm->do_async_writes ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3915 (STm->do_buffer_writes && STp->block_size != 0) ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 3916 STp->drv_buffer != 0)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3917 mt_status.mt_gstat |= GMT_IM_REP_EN(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3918 if (STp->cleaning_req)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3919 mt_status.mt_gstat |= GMT_CLN(0xffffffff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3920
1207045da5a7c94 Arnd Bergmann 2018-09-07 3921 retval = put_user_mtget(p, &mt_status);
1207045da5a7c94 Arnd Bergmann 2018-09-07 3922 if (retval)
^1da177e4c3f415 Linus Torvalds 2005-04-16 3923 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3924
^1da177e4c3f415 Linus Torvalds 2005-04-16 3925 STp->recover_reg = 0; /* Clear after read */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3926 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3927 } /* End of MTIOCGET */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3928 if (cmd_type == _IOC_TYPE(MTIOCPOS) && cmd_nr == _IOC_NR(MTIOCPOS)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3929 struct mtpos mt_pos;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3930 if (_IOC_SIZE(cmd_in) != sizeof(struct mtpos)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3931 retval = (-EINVAL);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3932 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3933 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3934 if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3935 retval = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3936 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3937 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3938 mt_pos.mt_blkno = blk;
1207045da5a7c94 Arnd Bergmann 2018-09-07 3939 retval = put_user_mtpos(p, &mt_pos);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3940 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3941 out:
28f85009e0cf6a5 Matthias Kaehlcke 2007-07-29 3942 mutex_unlock(&STp->lock);
^1da177e4c3f415 Linus Torvalds 2005-04-16 @3943 return retval;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3944 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3945
:::::: The code at line 3943 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
* drivers/scsi/st.c:3943 st_ioctl() warn: inconsistent returns '&STp->lock'.
@ 2026-07-30 15:48 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2026-07-30 15:48 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: David Jeffery <djeffery@redhat.com>
CC: "Martin K. Petersen" <martin.petersen@oracle.com>
CC: John Meneghini <jmeneghi@redhat.com>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 11028ab62899e4191e074ee364c712b77823a9c4
commit: b37d70c0df85e217a868ecdf535500ff926427ae scsi: st: Separate st-unique ioctl handling from SCSI common ioctl handling
date: 9 months ago
:::::: branch date: 16 hours ago
:::::: commit date: 9 months ago
config: x86_64-randconfig-161-20260730 (https://download.01.org/0day-ci/archive/20260730/202607302328.6Th0s3xj-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
smatch: v0.5.0-9187-g5189e3fb
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: b37d70c0df85 ("scsi: st: Separate st-unique ioctl handling from SCSI common ioctl handling")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202607302328.6Th0s3xj-lkp@intel.com/
smatch warnings:
drivers/scsi/st.c:3943 st_ioctl() warn: inconsistent returns '&STp->lock'.
vim +3943 drivers/scsi/st.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 3583
^1da177e4c3f41 Linus Torvalds 2005-04-16 3584 /* The ioctl command */
dba7688fc9037c Christoph Hellwig 2021-07-24 3585 static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3586 {
dba7688fc9037c Christoph Hellwig 2021-07-24 3587 void __user *p = (void __user *)arg;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3588 int i, cmd_nr, cmd_type, bt;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3589 int retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3590 unsigned int blk;
0b120edb37dc9d Kai Mäkisara 2024-11-06 3591 bool cmd_mtiocget;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3592 struct scsi_tape *STp = file->private_data;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3593 struct st_modedef *STm;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3594 struct st_partstat *STps;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3595
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3596 if (mutex_lock_interruptible(&STp->lock))
^1da177e4c3f41 Linus Torvalds 2005-04-16 3597 return -ERESTARTSYS;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3598
^1da177e4c3f41 Linus Torvalds 2005-04-16 3599 DEB(
^1da177e4c3f41 Linus Torvalds 2005-04-16 3600 if (debugging && !STp->in_use) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3601 st_printk(ST_DEB_MSG, STp, "Incorrect device.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3602 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3603 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3604 } ) /* end DEB */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3605
^1da177e4c3f41 Linus Torvalds 2005-04-16 3606 STm = &(STp->modes[STp->current_mode]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3607 STps = &(STp->ps[STp->partition]);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3608
^1da177e4c3f41 Linus Torvalds 2005-04-16 3609 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 3610 * If we are in the middle of error recovery, don't let anyone
^1da177e4c3f41 Linus Torvalds 2005-04-16 3611 * else try and use this device. Also, if error recovery fails, it
^1da177e4c3f41 Linus Torvalds 2005-04-16 3612 * may try and take the device offline, in which case all further
^1da177e4c3f41 Linus Torvalds 2005-04-16 3613 * access to the device is prohibited.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3614 */
906d15fbd23c12 Christoph Hellwig 2014-10-11 3615 retval = scsi_ioctl_block_when_processing_errors(STp->device, cmd_in,
83ff6fe8580a7c Al Viro 2008-03-02 3616 file->f_flags & O_NDELAY);
906d15fbd23c12 Christoph Hellwig 2014-10-11 3617 if (retval)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3618 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3619
b37d70c0df85e2 David Jeffery 2025-11-04 3620 switch (cmd_in) {
b37d70c0df85e2 David Jeffery 2025-11-04 3621 case MTIOCPOS:
b37d70c0df85e2 David Jeffery 2025-11-04 3622 case MTIOCGET:
b37d70c0df85e2 David Jeffery 2025-11-04 3623 case MTIOCTOP:
b37d70c0df85e2 David Jeffery 2025-11-04 3624 break;
b37d70c0df85e2 David Jeffery 2025-11-04 3625 default:
b37d70c0df85e2 David Jeffery 2025-11-04 3626 return st_common_ioctl(STp, STm, file, cmd_in, arg);
b37d70c0df85e2 David Jeffery 2025-11-04 3627 }
b37d70c0df85e2 David Jeffery 2025-11-04 3628
^1da177e4c3f41 Linus Torvalds 2005-04-16 3629 cmd_type = _IOC_TYPE(cmd_in);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3630 cmd_nr = _IOC_NR(cmd_in);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3631
^1da177e4c3f41 Linus Torvalds 2005-04-16 3632 if (cmd_type == _IOC_TYPE(MTIOCTOP) && cmd_nr == _IOC_NR(MTIOCTOP)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3633 struct mtop mtc;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3634
^1da177e4c3f41 Linus Torvalds 2005-04-16 3635 if (_IOC_SIZE(cmd_in) != sizeof(mtc)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3636 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3637 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3638 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3639
^1da177e4c3f41 Linus Torvalds 2005-04-16 3640 i = copy_from_user(&mtc, p, sizeof(struct mtop));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3641 if (i) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3642 retval = (-EFAULT);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3643 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3644 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3645
^1da177e4c3f41 Linus Torvalds 2005-04-16 3646 if (mtc.mt_op == MTSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) {
b30d8bca5b525b Hannes Reinecke 2014-06-25 3647 st_printk(KERN_WARNING, STp,
b30d8bca5b525b Hannes Reinecke 2014-06-25 3648 "MTSETDRVBUFFER only allowed for root.\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 3649 retval = (-EPERM);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3650 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3651 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3652 if (!STm->defined &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3653 (mtc.mt_op != MTSETDRVBUFFER &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3654 (mtc.mt_count & MT_ST_OPTIONS) == 0)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3655 retval = (-ENXIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3656 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3657 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3658
^1da177e4c3f41 Linus Torvalds 2005-04-16 3659 if (!STp->pos_unknown) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3660
^1da177e4c3f41 Linus Torvalds 2005-04-16 3661 if (STps->eof == ST_FM_HIT) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3662 if (mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3663 mtc.mt_op == MTEOM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3664 mtc.mt_count -= 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3665 if (STps->drv_file >= 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3666 STps->drv_file += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3667 } else if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3668 mtc.mt_count += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3669 if (STps->drv_file >= 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3670 STps->drv_file += 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3671 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3672 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3673
^1da177e4c3f41 Linus Torvalds 2005-04-16 3674 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3675 /* Old position must be restored if partition will be
^1da177e4c3f41 Linus Torvalds 2005-04-16 3676 changed */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3677 i = !STp->can_partitions ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3678 (STp->new_partition != STp->partition);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3679 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3680 i = mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3681 mtc.mt_op == MTRETEN || mtc.mt_op == MTEOM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3682 mtc.mt_op == MTLOCK || mtc.mt_op == MTLOAD ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3683 mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3684 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3685 mtc.mt_op == MTCOMPRESSION;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3686 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3687 i = flush_buffer(STp, i);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3688 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3689 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3690 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3691 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3692 if (STps->rw == ST_WRITING &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3693 (mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3694 mtc.mt_op == MTSEEK ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3695 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3696 i = st_int_ioctl(STp, MTWEOF, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3697 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3698 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3699 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3700 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3701 if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3702 mtc.mt_count++;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3703 STps->rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3704 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3705
^1da177e4c3f41 Linus Torvalds 2005-04-16 3706 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3707 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 3708 * If there was a bus reset, block further access
^1da177e4c3f41 Linus Torvalds 2005-04-16 3709 * to this device. If the user wants to rewind the tape,
^1da177e4c3f41 Linus Torvalds 2005-04-16 3710 * then reset the flag and allow access again.
^1da177e4c3f41 Linus Torvalds 2005-04-16 3711 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3712 if (mtc.mt_op != MTREW &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3713 mtc.mt_op != MTOFFL &&
0b120edb37dc9d Kai Mäkisara 2024-11-06 3714 mtc.mt_op != MTLOAD &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3715 mtc.mt_op != MTRETEN &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3716 mtc.mt_op != MTERASE &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3717 mtc.mt_op != MTSEEK &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3718 mtc.mt_op != MTEOM) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3719 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3720 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3721 }
7081dc75df7969 Kai Mäkisara 2025-01-20 3722 reset_state(STp); /* Clears pos_unknown */
7081dc75df7969 Kai Mäkisara 2025-01-20 3723
7081dc75df7969 Kai Mäkisara 2025-01-20 3724 /* Fix the device settings after reset, ignore errors */
7081dc75df7969 Kai Mäkisara 2025-01-20 3725 if (mtc.mt_op == MTREW || mtc.mt_op == MTSEEK ||
7081dc75df7969 Kai Mäkisara 2025-01-20 3726 mtc.mt_op == MTEOM) {
7081dc75df7969 Kai Mäkisara 2025-01-20 3727 if (STp->can_partitions) {
7081dc75df7969 Kai Mäkisara 2025-01-20 3728 /* STp->new_partition contains the
7081dc75df7969 Kai Mäkisara 2025-01-20 3729 * latest partition set
7081dc75df7969 Kai Mäkisara 2025-01-20 3730 */
7081dc75df7969 Kai Mäkisara 2025-01-20 3731 STp->partition = 0;
7081dc75df7969 Kai Mäkisara 2025-01-20 3732 switch_partition(STp);
7081dc75df7969 Kai Mäkisara 2025-01-20 3733 }
7081dc75df7969 Kai Mäkisara 2025-01-20 3734 if (STp->density_changed)
7081dc75df7969 Kai Mäkisara 2025-01-20 3735 st_int_ioctl(STp, MTSETDENSITY, STp->changed_density);
7081dc75df7969 Kai Mäkisara 2025-01-20 3736 if (STp->blksize_changed)
7081dc75df7969 Kai Mäkisara 2025-01-20 3737 st_int_ioctl(STp, MTSETBLK, STp->changed_blksize);
7081dc75df7969 Kai Mäkisara 2025-01-20 3738 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3739 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3740
^1da177e4c3f41 Linus Torvalds 2005-04-16 3741 if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3742 mtc.mt_op != MTSETDENSITY && mtc.mt_op != MTWSM &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3743 mtc.mt_op != MTSETDRVBUFFER && mtc.mt_op != MTSETPART)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3744 STps->rw = ST_IDLE; /* Prevent automatic WEOF and fsf */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3745
^1da177e4c3f41 Linus Torvalds 2005-04-16 3746 if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3747 do_door_lock(STp, 0); /* Ignore result! */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3748
^1da177e4c3f41 Linus Torvalds 2005-04-16 3749 if (mtc.mt_op == MTSETDRVBUFFER &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3750 (mtc.mt_count & MT_ST_OPTIONS) != 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3751 retval = st_set_options(STp, mtc.mt_count);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3752 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3753 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3754
^1da177e4c3f41 Linus Torvalds 2005-04-16 3755 if (mtc.mt_op == MTSETPART) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3756 if (!STp->can_partitions ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3757 mtc.mt_count < 0 || mtc.mt_count >= ST_NBR_PARTITIONS) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3758 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3759 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3760 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3761 if (mtc.mt_count >= STp->nbr_partitions &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3762 (STp->nbr_partitions = nbr_partitions(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3763 retval = (-EIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3764 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3765 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3766 if (mtc.mt_count >= STp->nbr_partitions) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3767 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3768 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3769 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3770 STp->new_partition = mtc.mt_count;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3771 retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3772 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3773 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3774
^1da177e4c3f41 Linus Torvalds 2005-04-16 3775 if (mtc.mt_op == MTMKPART) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3776 if (!STp->can_partitions) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3777 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3778 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3779 }
8038e6456a3e6f Kai Makisara 2016-02-09 3780 i = do_load_unload(STp, file, 1);
8038e6456a3e6f Kai Makisara 2016-02-09 3781 if (i < 0) {
8038e6456a3e6f Kai Makisara 2016-02-09 3782 retval = i;
8038e6456a3e6f Kai Makisara 2016-02-09 3783 goto out;
8038e6456a3e6f Kai Makisara 2016-02-09 3784 }
8038e6456a3e6f Kai Makisara 2016-02-09 3785 i = partition_tape(STp, mtc.mt_count);
8038e6456a3e6f Kai Makisara 2016-02-09 3786 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3787 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3788 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3789 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3790 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3791 STp->ps[i].rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3792 STp->ps[i].at_sm = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3793 STp->ps[i].last_block_valid = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3794 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3795 STp->partition = STp->new_partition = 0;
8038e6456a3e6f Kai Makisara 2016-02-09 3796 STp->nbr_partitions = mtc.mt_count != 0 ? 2 : 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3797 STps->drv_block = STps->drv_file = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3798 retval = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3799 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3800 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3801
^1da177e4c3f41 Linus Torvalds 2005-04-16 3802 if (mtc.mt_op == MTSEEK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3803 i = set_location(STp, mtc.mt_count, STp->new_partition, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3804 if (!STp->can_partitions)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3805 STp->ps[0].rw = ST_IDLE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3806 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3807 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3808 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3809
^1da177e4c3f41 Linus Torvalds 2005-04-16 3810 if (mtc.mt_op == MTUNLOAD || mtc.mt_op == MTOFFL) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3811 retval = do_load_unload(STp, file, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3812 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3813 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3814
^1da177e4c3f41 Linus Torvalds 2005-04-16 3815 if (mtc.mt_op == MTLOAD) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3816 retval = do_load_unload(STp, file, max(1, mtc.mt_count));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3817 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3818 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3819
^1da177e4c3f41 Linus Torvalds 2005-04-16 3820 if (mtc.mt_op == MTLOCK || mtc.mt_op == MTUNLOCK) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3821 retval = do_door_lock(STp, (mtc.mt_op == MTLOCK));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3822 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3823 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3824
^1da177e4c3f41 Linus Torvalds 2005-04-16 3825 if (STp->can_partitions && STp->ready == ST_READY &&
^1da177e4c3f41 Linus Torvalds 2005-04-16 3826 (i = switch_partition(STp)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3827 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3828 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3829 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3830
^1da177e4c3f41 Linus Torvalds 2005-04-16 3831 if (mtc.mt_op == MTCOMPRESSION)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3832 retval = st_compression(STp, (mtc.mt_count & 1));
^1da177e4c3f41 Linus Torvalds 2005-04-16 3833 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 3834 retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3835 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3836 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3837 if (!STm->defined) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3838 retval = (-ENXIO);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3839 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3840 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3841
0b120edb37dc9d Kai Mäkisara 2024-11-06 3842 cmd_mtiocget = cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET);
0b120edb37dc9d Kai Mäkisara 2024-11-06 3843
^1da177e4c3f41 Linus Torvalds 2005-04-16 3844 if ((i = flush_buffer(STp, 0)) < 0) {
0b120edb37dc9d Kai Mäkisara 2024-11-06 3845 if (cmd_mtiocget && STp->pos_unknown) {
0b120edb37dc9d Kai Mäkisara 2024-11-06 3846 /* flush fails -> modify status accordingly */
0b120edb37dc9d Kai Mäkisara 2024-11-06 3847 reset_state(STp);
0b120edb37dc9d Kai Mäkisara 2024-11-06 3848 STp->pos_unknown = 1;
0b120edb37dc9d Kai Mäkisara 2024-11-06 3849 } else { /* return error */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3850 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3851 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3852 }
0b120edb37dc9d Kai Mäkisara 2024-11-06 3853 } else { /* flush_buffer succeeds */
0b120edb37dc9d Kai Mäkisara 2024-11-06 3854 if (STp->can_partitions) {
0b120edb37dc9d Kai Mäkisara 2024-11-06 3855 i = switch_partition(STp);
0b120edb37dc9d Kai Mäkisara 2024-11-06 3856 if (i < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3857 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3858 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3859 }
0b120edb37dc9d Kai Mäkisara 2024-11-06 3860 }
0b120edb37dc9d Kai Mäkisara 2024-11-06 3861 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3862
0b120edb37dc9d Kai Mäkisara 2024-11-06 3863 if (cmd_mtiocget) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3864 struct mtget mt_status;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3865
^1da177e4c3f41 Linus Torvalds 2005-04-16 3866 if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3867 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3868 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3869 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3870
^1da177e4c3f41 Linus Torvalds 2005-04-16 3871 mt_status.mt_type = STp->tape_type;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3872 mt_status.mt_dsreg =
^1da177e4c3f41 Linus Torvalds 2005-04-16 3873 ((STp->block_size << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK) |
^1da177e4c3f41 Linus Torvalds 2005-04-16 3874 ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3875 mt_status.mt_blkno = STps->drv_block;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3876 mt_status.mt_fileno = STps->drv_file;
5bb2d6179d1a80 Kai Mäkisara 2024-11-06 3877 if (STp->block_size != 0 && mt_status.mt_blkno >= 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3878 if (STps->rw == ST_WRITING)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3879 mt_status.mt_blkno +=
^1da177e4c3f41 Linus Torvalds 2005-04-16 3880 (STp->buffer)->buffer_bytes / STp->block_size;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3881 else if (STps->rw == ST_READING)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3882 mt_status.mt_blkno -=
^1da177e4c3f41 Linus Torvalds 2005-04-16 3883 ((STp->buffer)->buffer_bytes +
^1da177e4c3f41 Linus Torvalds 2005-04-16 3884 STp->block_size - 1) / STp->block_size;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3885 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3886
^1da177e4c3f41 Linus Torvalds 2005-04-16 3887 mt_status.mt_gstat = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3888 if (STp->drv_write_prot)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3889 mt_status.mt_gstat |= GMT_WR_PROT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3890 if (mt_status.mt_blkno == 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3891 if (mt_status.mt_fileno == 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3892 mt_status.mt_gstat |= GMT_BOT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3893 else
^1da177e4c3f41 Linus Torvalds 2005-04-16 3894 mt_status.mt_gstat |= GMT_EOF(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3895 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3896 mt_status.mt_erreg = (STp->recover_reg << MT_ST_SOFTERR_SHIFT);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3897 mt_status.mt_resid = STp->partition;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3898 if (STps->eof == ST_EOM_OK || STps->eof == ST_EOM_ERROR)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3899 mt_status.mt_gstat |= GMT_EOT(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3900 else if (STps->eof >= ST_EOM_OK)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3901 mt_status.mt_gstat |= GMT_EOD(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3902 if (STp->density == 1)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3903 mt_status.mt_gstat |= GMT_D_800(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3904 else if (STp->density == 2)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3905 mt_status.mt_gstat |= GMT_D_1600(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3906 else if (STp->density == 3)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3907 mt_status.mt_gstat |= GMT_D_6250(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3908 if (STp->ready == ST_READY)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3909 mt_status.mt_gstat |= GMT_ONLINE(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3910 if (STp->ready == ST_NO_TAPE)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3911 mt_status.mt_gstat |= GMT_DR_OPEN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3912 if (STps->at_sm)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3913 mt_status.mt_gstat |= GMT_SM(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3914 if (STm->do_async_writes ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3915 (STm->do_buffer_writes && STp->block_size != 0) ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 3916 STp->drv_buffer != 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3917 mt_status.mt_gstat |= GMT_IM_REP_EN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3918 if (STp->cleaning_req)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3919 mt_status.mt_gstat |= GMT_CLN(0xffffffff);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3920
1207045da5a7c9 Arnd Bergmann 2018-09-07 3921 retval = put_user_mtget(p, &mt_status);
1207045da5a7c9 Arnd Bergmann 2018-09-07 3922 if (retval)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3923 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3924
^1da177e4c3f41 Linus Torvalds 2005-04-16 3925 STp->recover_reg = 0; /* Clear after read */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3926 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3927 } /* End of MTIOCGET */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3928 if (cmd_type == _IOC_TYPE(MTIOCPOS) && cmd_nr == _IOC_NR(MTIOCPOS)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3929 struct mtpos mt_pos;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3930 if (_IOC_SIZE(cmd_in) != sizeof(struct mtpos)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3931 retval = (-EINVAL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3932 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3933 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3934 if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3935 retval = i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3936 goto out;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3937 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3938 mt_pos.mt_blkno = blk;
1207045da5a7c9 Arnd Bergmann 2018-09-07 3939 retval = put_user_mtpos(p, &mt_pos);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3940 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3941 out:
28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3942 mutex_unlock(&STp->lock);
^1da177e4c3f41 Linus Torvalds 2005-04-16 @3943 return retval;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3944 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3945
:::::: The code at line 3943 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-30 15:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-30 15:48 drivers/scsi/st.c:3943 st_ioctl() warn: inconsistent returns '&STp->lock' kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2026-04-16 7:27 kernel test robot
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.