drivers/scsi/st.c:3943 st_ioctl() warn: inconsistent returns '&STp->lock'.
kernel test robot <[email protected]> Thu, 30 Jul 2026 23:48:43 +0800
| Newsgroups | dev.linux.lists.oe-kbuild |
|---|---|
| Message-ID | <[email protected]> |
BCC: [email protected] CC: [email protected] CC: [email protected] TO: David Jeffery <[email protected]> CC: "Martin K. Petersen" <[email protected]> CC: John Meneghini <[email protected]> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git = master head: 11028ab62899e4191e074ee364c712b77823a9c4 commit: b37d70c0df85e217a868ecdf535500ff926427ae scsi: st: Separate st-uniq= ue 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/arc= hive/20260730/[email protected]/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 versio= n of the same patch/commit), kindly add following tags | Fixes: b37d70c0df85 ("scsi: st: Separate st-unique ioctl handling from SC= SI common ioctl handling") | Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/ 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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3584 /* The ioctl command */ dba7688fc9037c Christoph Hellwig 2021-07-24 3585 static long st_ioctl(str= uct 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 =3D (voi= d __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 =3D 0; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3590 unsigned int blk; 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3591 bool cmd_mtiocget; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3592 struct scsi_tape *STp = =3D file->private_data; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3593 struct st_modedef *STm; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3594 struct st_partstat *STp= s; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3595 =20 28f85009e0cf6a Matthias Kaehlcke 2007-07-29 3596 if (mutex_lock_interrup= tible(&STp->lock)) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3597 return -ERESTARTSYS; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3598 =20 ^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 =3D (-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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3606 STm =3D &(STp->modes[ST= p->current_mode]); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3607 STps =3D &(STp->ps[STp-= >partition]); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3608 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3609 /* ^1da177e4c3f41 Linus Torvalds 2005-04-16 3610 * If we are in the mid= dle of error recovery, don't let anyone ^1da177e4c3f41 Linus Torvalds 2005-04-16 3611 * else try and use thi= s 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 =3D scsi_ioctl_b= lock_when_processing_errors(STp->device, cmd_in, 83ff6fe8580a7c Al Viro 2008-03-02 3616 file->f_flags & O_NDE= LAY); 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 =20 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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3629 cmd_type =3D _IOC_TYPE(= cmd_in); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3630 cmd_nr =3D _IOC_NR(cmd_= in); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3631 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3632 if (cmd_type =3D=3D _IO= C_TYPE(MTIOCTOP) && cmd_nr =3D=3D _IOC_NR(MTIOCTOP)) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3633 struct mtop mtc; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3634 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3635 if (_IOC_SIZE(cmd_in) = !=3D sizeof(mtc)) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3636 retval =3D (-EINVAL); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3637 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3638 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3639 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3640 i =3D 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 =3D (-EFAULT); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3643 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3644 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3645 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3646 if (mtc.mt_op =3D=3D M= TSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) { b30d8bca5b525b Hannes Reinecke 2014-06-25 3647 st_printk(KERN_WARNIN= G, STp, b30d8bca5b525b Hannes Reinecke 2014-06-25 3648 "MTSETDRVBUFFER on= ly allowed for root.\n"); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3649 retval =3D (-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 !=3D MT= SETDRVBUFFER && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3654 (mtc.mt_count & M= T_ST_OPTIONS) =3D=3D 0)) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3655 retval =3D (-ENXIO); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3656 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3657 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3658 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3659 if (!STp->pos_unknown)= { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3660 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3661 if (STps->eof =3D=3D = ST_FM_HIT) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3662 if (mtc.mt_op =3D=3D = MTFSF || mtc.mt_op =3D=3D MTFSFM || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3663 = mtc.mt_op =3D=3D MTEOM) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3664 mtc.mt_count -=3D 1; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3665 if (STps->drv_file = >=3D 0) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3666 STps->drv_file += =3D 1; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3667 } else if (mtc.mt_op= =3D=3D MTBSF || mtc.mt_op =3D=3D MTBSFM) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3668 mtc.mt_count +=3D 1; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3669 if (STps->drv_file = >=3D 0) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3670 STps->drv_file += =3D 1; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3671 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3672 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3673 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3674 if (mtc.mt_op =3D=3D = 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 =3D !STp->can_part= itions || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3678 (STp->new_partit= ion !=3D STp->partition); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3679 } else { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3680 i =3D mtc.mt_op =3D= =3D MTREW || mtc.mt_op =3D=3D MTOFFL || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3681 mtc.mt_op =3D=3D = MTRETEN || mtc.mt_op =3D=3D MTEOM || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3682 mtc.mt_op =3D=3D = MTLOCK || mtc.mt_op =3D=3D MTLOAD || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3683 mtc.mt_op =3D=3D = MTFSF || mtc.mt_op =3D=3D MTFSFM || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3684 mtc.mt_op =3D=3D = MTBSF || mtc.mt_op =3D=3D MTBSFM || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3685 mtc.mt_op =3D=3D = MTCOMPRESSION; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3686 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3687 i =3D flush_buffer(ST= p, i); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3688 if (i < 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3689 retval =3D 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 =3D=3D S= T_WRITING && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3693 (mtc.mt_op =3D=3D = MTREW || mtc.mt_op =3D=3D MTOFFL || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3694 mtc.mt_op =3D=3D = MTSEEK || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3695 mtc.mt_op =3D=3D = MTBSF || mtc.mt_op =3D=3D MTBSFM)) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3696 i =3D st_int_ioctl(S= Tp, MTWEOF, 1); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3697 if (i < 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3698 retval =3D 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 =3D=3D = MTBSF || mtc.mt_op =3D=3D MTBSFM) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3702 mtc.mt_count++; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3703 STps->rw =3D ST_IDLE; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3704 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3705 =20 ^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. I= f the user wants to rewind the tape, ^1da177e4c3f41 Linus Torvalds 2005-04-16 3710 * then reset the fla= g and allow access again. ^1da177e4c3f41 Linus Torvalds 2005-04-16 3711 */ ^1da177e4c3f41 Linus Torvalds 2005-04-16 3712 if (mtc.mt_op !=3D MT= REW && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3713 mtc.mt_op !=3D MT= OFFL && 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3714 mtc.mt_op != =3D MTLOAD && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3715 mtc.mt_op !=3D MT= RETEN && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3716 mtc.mt_op !=3D MT= ERASE && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3717 mtc.mt_op !=3D MT= SEEK && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3718 mtc.mt_op !=3D MT= EOM) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3719 retval =3D (-EIO); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3720 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3721 } 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3722 reset_state(STp)= ; /* Clears pos_unknown */ 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3723 =20 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3724 /* Fix the devic= e settings after reset, ignore errors */ 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3725 if (mtc.mt_op = =3D=3D MTREW || mtc.mt_op =3D=3D MTSEEK || 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3726 mtc.mt_op =3D= =3D MTEOM) { 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3727 if (STp->can_pa= rtitions) { 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3728 /* STp->new_pa= rtition contains the 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3729 * latest par= tition set 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3730 */ 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3731 STp->partition= =3D 0; 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3732 switch_partiti= on(STp); 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3733 } 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3734 if (STp->densit= y_changed) 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3735 st_int_ioctl(S= Tp, MTSETDENSITY, STp->changed_density); 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3736 if (STp->blksiz= e_changed) 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3737 st_int_ioctl(S= Tp, MTSETBLK, STp->changed_blksize); 7081dc75df7969 Kai M=C3=A4kisara 2025-01-20 3738 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3739 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3740 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3741 if (mtc.mt_op !=3D MTN= OP && mtc.mt_op !=3D MTSETBLK && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3742 mtc.mt_op !=3D MTS= ETDENSITY && mtc.mt_op !=3D MTWSM && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3743 mtc.mt_op !=3D MTS= ETDRVBUFFER && mtc.mt_op !=3D MTSETPART) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3744 STps->rw =3D ST_IDLE;= /* Prevent automatic WEOF and fsf */ ^1da177e4c3f41 Linus Torvalds 2005-04-16 3745 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3746 if (mtc.mt_op =3D=3D M= TOFFL && STp->door_locked !=3D ST_UNLOCKED) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3747 do_door_lock(STp, 0);= /* Ignore result! */ ^1da177e4c3f41 Linus Torvalds 2005-04-16 3748 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3749 if (mtc.mt_op =3D=3D M= TSETDRVBUFFER && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3750 (mtc.mt_count & MT= _ST_OPTIONS) !=3D 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3751 retval =3D st_set_opt= ions(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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3755 if (mtc.mt_op =3D=3D M= TSETPART) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3756 if (!STp->can_partiti= ons || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3757 mtc.mt_count < 0 = || mtc.mt_count >=3D ST_NBR_PARTITIONS) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3758 retval =3D (-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 >=3D = STp->nbr_partitions && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3762 (STp->nbr_partiti= ons =3D nbr_partitions(STp)) < 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3763 retval =3D (-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 >=3D = STp->nbr_partitions) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3767 retval =3D (-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 = =3D mtc.mt_count; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3771 retval =3D 0; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3772 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3773 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3774 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3775 if (mtc.mt_op =3D=3D M= TMKPART) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3776 if (!STp->can_partiti= ons) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3777 retval =3D (-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 =3D do_load_unload(= STp, file, 1); 8038e6456a3e6f Kai Makisara 2016-02-09 3781 if (i < 0) { 8038e6456a3e6f Kai Makisara 2016-02-09 3782 retval =3D 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 =3D partition_tape(= STp, mtc.mt_count); 8038e6456a3e6f Kai Makisara 2016-02-09 3786 if (i < 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3787 retval =3D 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 =3D 0; i < ST_= NBR_PARTITIONS; i++) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3791 STp->ps[i].rw =3D ST= _IDLE; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3792 STp->ps[i].at_sm =3D = 0; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3793 STp->ps[i].last_bloc= k_valid =3D 0; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3794 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3795 STp->partition =3D ST= p->new_partition =3D 0; 8038e6456a3e6f Kai Makisara 2016-02-09 3796 STp->nbr_partitions = =3D mtc.mt_count !=3D 0 ? 2 : 1; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3797 STps->drv_block =3D S= Tps->drv_file =3D 0; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3798 retval =3D 0; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3799 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3800 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3801 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3802 if (mtc.mt_op =3D=3D M= TSEEK) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3803 i =3D set_location(ST= p, mtc.mt_count, STp->new_partition, 0); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3804 if (!STp->can_partiti= ons) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3805 STp->ps[0].rw =3D ST= _IDLE; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3806 retval =3D i; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3807 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3808 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3809 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3810 if (mtc.mt_op =3D=3D M= TUNLOAD || mtc.mt_op =3D=3D MTOFFL) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3811 retval =3D do_load_un= load(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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3815 if (mtc.mt_op =3D=3D M= TLOAD) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3816 retval =3D do_load_un= load(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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3820 if (mtc.mt_op =3D=3D M= TLOCK || mtc.mt_op =3D=3D MTUNLOCK) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3821 retval =3D do_door_lo= ck(STp, (mtc.mt_op =3D=3D MTLOCK)); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3822 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3823 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3824 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3825 if (STp->can_partition= s && STp->ready =3D=3D ST_READY && ^1da177e4c3f41 Linus Torvalds 2005-04-16 3826 (i =3D switch_part= ition(STp)) < 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3827 retval =3D i; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3828 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3829 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3830 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3831 if (mtc.mt_op =3D=3D M= TCOMPRESSION) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3832 retval =3D st_compres= sion(STp, (mtc.mt_count & 1)); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3833 else ^1da177e4c3f41 Linus Torvalds 2005-04-16 3834 retval =3D st_int_ioc= tl(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 =3D (-ENXIO); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3839 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3840 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3841 =20 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3842 cmd_mtiocget =3D c= md_type =3D=3D _IOC_TYPE(MTIOCGET) && cmd_nr =3D=3D _IOC_NR(MTIOCGET); 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3843 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3844 if ((i =3D flush_buffer= (STp, 0)) < 0) { 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3845 if (cmd_mtiocget = && STp->pos_unknown) { 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3846 /* flush fails -= > modify status accordingly */ 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3847 reset_state(STp); 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3848 STp->pos_unknown= =3D 1; 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3849 } else { /* retur= n error */ ^1da177e4c3f41 Linus Torvalds 2005-04-16 3850 retval =3D i; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3851 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3852 } 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3853 } else { /* flush_= buffer succeeds */ 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3854 if (STp->can_part= itions) { 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3855 i =3D switch_par= tition(STp); 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3856 if (i < 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3857 retval =3D i; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3858 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3859 } 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3860 } 0b120edb37dc9d Kai M=C3=A4kisara 2024-11-06 3861 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3862 =20 0b120edb37dc9d Kai M=C3=A4kisara 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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3866 if (_IOC_SIZE(cmd_in) = !=3D sizeof(struct mtget)) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3867 retval =3D (-EINVAL); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3868 goto out; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3869 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3870 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3871 mt_status.mt_type =3D = STp->tape_type; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3872 mt_status.mt_dsreg =3D ^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 =3D = STps->drv_block; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3876 mt_status.mt_fileno = =3D STps->drv_file; 5bb2d6179d1a80 Kai M=C3=A4kisara 2024-11-06 3877 if (STp->block_si= ze !=3D 0 && mt_status.mt_blkno >=3D 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3878 if (STps->rw =3D=3D S= T_WRITING) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3879 mt_status.mt_blkno += =3D ^1da177e4c3f41 Linus Torvalds 2005-04-16 3880 (STp->buffer)->b= uffer_bytes / STp->block_size; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3881 else if (STps->rw =3D= =3D ST_READING) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3882 mt_status.mt_blkno -= =3D ^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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3887 mt_status.mt_gstat =3D = 0; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3888 if (STp->drv_write_pro= t) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3889 mt_status.mt_gstat |= =3D GMT_WR_PROT(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3890 if (mt_status.mt_blkno= =3D=3D 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3891 if (mt_status.mt_file= no =3D=3D 0) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3892 mt_status.mt_gstat |= =3D GMT_BOT(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3893 else ^1da177e4c3f41 Linus Torvalds 2005-04-16 3894 mt_status.mt_gstat |= =3D GMT_EOF(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3895 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 3896 mt_status.mt_erreg =3D = (STp->recover_reg << MT_ST_SOFTERR_SHIFT); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3897 mt_status.mt_resid =3D = STp->partition; ^1da177e4c3f41 Linus Torvalds 2005-04-16 3898 if (STps->eof =3D=3D S= T_EOM_OK || STps->eof =3D=3D ST_EOM_ERROR) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3899 mt_status.mt_gstat |= =3D GMT_EOT(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3900 else if (STps->eof >= =3D ST_EOM_OK) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3901 mt_status.mt_gstat |= =3D GMT_EOD(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3902 if (STp->density =3D= =3D 1) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3903 mt_status.mt_gstat |= =3D GMT_D_800(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3904 else if (STp->density = =3D=3D 2) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3905 mt_status.mt_gstat |= =3D GMT_D_1600(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3906 else if (STp->density = =3D=3D 3) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3907 mt_status.mt_gstat |= =3D GMT_D_6250(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3908 if (STp->ready =3D=3D = ST_READY) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3909 mt_status.mt_gstat |= =3D GMT_ONLINE(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3910 if (STp->ready =3D=3D = ST_NO_TAPE) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3911 mt_status.mt_gstat |= =3D 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 |= =3D GMT_SM(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3914 if (STm->do_async_writ= es || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3915 (STm= ->do_buffer_writes && STp->block_size !=3D 0) || ^1da177e4c3f41 Linus Torvalds 2005-04-16 3916 STp->drv_buffer != =3D 0) ^1da177e4c3f41 Linus Torvalds 2005-04-16 3917 mt_status.mt_gstat |= =3D 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 |= =3D GMT_CLN(0xffffffff); ^1da177e4c3f41 Linus Torvalds 2005-04-16 3920 =20 1207045da5a7c9 Arnd Bergmann 2018-09-07 3921 retval =3D put_user_mt= get(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 =20 ^1da177e4c3f41 Linus Torvalds 2005-04-16 3925 STp->recover_reg =3D 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 =3D=3D _IO= C_TYPE(MTIOCPOS) && cmd_nr =3D=3D _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) = !=3D sizeof(struct mtpos)) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3931 retval =3D (-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 =3D get_locatio= n(STp, &blk, &bt, 0)) < 0) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 3935 retval =3D 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 =3D bl= k; 1207045da5a7c9 Arnd Bergmann 2018-09-07 3939 retval =3D put_user_mt= pos(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 =20 :::::: The code at line 3943 was first introduced by commit :::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2 :::::: TO: Linus Torvalds <[email protected]> :::::: CC: Linus Torvalds <[email protected]> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki