From owner-freebsd-bugs@FreeBSD.ORG Tue Jan 6 07:40:28 2004 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 4E89B16A4CE for ; Tue, 6 Jan 2004 07:40:28 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 257F443D5A for ; Tue, 6 Jan 2004 07:40:14 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) i06FeEFR094491 for ; Tue, 6 Jan 2004 07:40:14 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.10/8.12.10/Submit) id i06FeD1V094490; Tue, 6 Jan 2004 07:40:13 -0800 (PST) (envelope-from gnats) Resent-Date: Tue, 6 Jan 2004 07:40:13 -0800 (PST) Resent-Message-Id: <200401061540.i06FeD1V094490@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Issei Numata Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 835E016A4CE for ; Tue, 6 Jan 2004 07:33:32 -0800 (PST) Received: from www.freebsd.org (www.freebsd.org [216.136.204.117]) by mx1.FreeBSD.org (Postfix) with ESMTP id 161B343D4C for ; Tue, 6 Jan 2004 07:33:30 -0800 (PST) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.12.10/8.12.10) with ESMTP id i06FXTdL088149 for ; Tue, 6 Jan 2004 07:33:29 -0800 (PST) (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.12.10/8.12.10/Submit) id i06FXT8m088148; Tue, 6 Jan 2004 07:33:29 -0800 (PST) (envelope-from nobody) Message-Id: <200401061533.i06FXT8m088148@www.freebsd.org> Date: Tue, 6 Jan 2004 07:33:29 -0800 (PST) From: Issei Numata To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-2.0 Subject: kern/60981: cannot obtain error(sense key, APC,..) while using ATAPICMD with /dev/ata X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Jan 2004 15:40:28 -0000 >Number: 60981 >Category: kern >Synopsis: cannot obtain error(sense key, APC,..) while using ATAPICMD with /dev/ata >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Jan 06 07:40:13 PST 2004 >Closed-Date: >Last-Modified: >Originator: Issei Numata >Release: 4.9-STABLE >Organization: Heart Solutions JP >Environment: FreeBSD puchiko.private 4.9-STABLE FreeBSD 4.9-STABLE #0: Tue Jan 6 15:18:32 JST 2004 issei@puchiko.private:/usr/src/sys/compile/GENERIC i386 >Description: I found Stable BSD cannot obtain error information while using ATAPICMD with /dev/ata >How-To-Repeat: Here is a simple program. please run it under the CD tray opened. This conditon cause error, but contents of sense_data is not a valid data. This is because bopy's first argument is incorrect(see patch) #include #include #include #include #include #include #include int main() { struct ata_cmd cmd; int fd; int ret; int i; char buf[256] = {0}; fd = open("/dev/ata", O_RDWR); fprintf(stderr, "fd=%d\n", fd); memset(&cmd, 0, sizeof(cmd)); memset(buf, 0, sizeof(buf)); cmd.channel = 0; cmd.device = 1; cmd.cmd = ATAPICMD; cmd.u.atapi.ccb[0] = 0x25; cmd.u.atapi.flags = ATAPI_CMD_READ; cmd.u.atapi.data = buf; cmd.u.atapi.count = 256; cmd.u.atapi.timeout = 30; ret = ioctl(fd, IOCATA, &cmd); fprintf(stderr, "ioctl=%d\n", ret); fprintf(stderr, "errno=%d\n", errno); fprintf(stderr, "error=%d\n", cmd.u.atapi.error); for(i=0 ; i<32 ; ++i){ fprintf(stderr, "%02x ", buf[i] & 0xff); } fprintf(stderr, "\n\n"); for(i=0 ; i<17 ; ++i){ fprintf(stderr, "%02x ", cmd.u.atapi.sense_data[i] & 0xff); } fprintf(stderr, "\n"); sleep(1); close(fd); return 0; } >Fix: diff -c /sys/dev/ata/ata-all.c.orig /sys/dev/ata/ata-all.c *** /sys/dev/ata/ata-all.c.orig Tue Jan 6 15:33:49 2004 --- /sys/dev/ata/ata-all.c Tue Jan 6 15:33:54 2004 *************** *** 447,453 **** iocmd->u.atapi.timeout, NULL, NULL); if (error) { iocmd->u.atapi.error = error; ! bcopy(&atadev->result, iocmd->u.atapi.sense_data, sizeof(struct atapi_reqsense)); error = 0; } --- 447,453 ---- iocmd->u.atapi.timeout, NULL, NULL); if (error) { iocmd->u.atapi.error = error; ! bcopy(atadev->result, iocmd->u.atapi.sense_data, sizeof(struct atapi_reqsense)); error = 0; } >Release-Note: >Audit-Trail: >Unformatted: