|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Sergey Vlasov 2:5020/400 25 Nov 2006 17:47:37 To : Aleksey Barabanov Subject : Re: usb disk отправить в сон -------------------------------------------------------------------------------- On Sat, 25 Nov 2006 11:34:59 +0000 (UTC) Aleksey Barabanov wrote: > Sergey Vlasov wrote: > > On Sat, 25 Nov 2006 10:20:02 +0000 (UTC) Aleksey Barabanov wrote: > >> Есть ли возможность отправить в сон диск, подключенный через usb. > > В имеющихся у меня коробках на чипе PL2507 диск вырубается при выполнении > > eject (на уровне SCSI это START_STOP_UNIT (0x1b) с флагами 0x02 в байте > > 4). [...] > eject: SCSI eject failed > eject: unable to eject, last error: Success > > Может что в 2.6 изменилось. Мне бы хотелось это делать под 2.4 и в OpenWRT. Это я немного наврал - команду я смотрел внутри ядра (причём, естественно, 2.6), а на самом деле надо было вызывать просто eject без опции -s: # eject -v /dev/sdb eject: device name is `/dev/sdb' eject: expanded name is `/dev/sdb' eject: `/dev/sdb' is not mounted eject: `/dev/sdb' is not a mount point eject: `/dev/sdb' is a multipartition device eject: trying to eject `/dev/sdb' using CD-ROM eject command eject: CD-ROM eject command succeeded По ioctl(fd, CDROMEJECT) 2.6 делает то, что нужно в данном случае. С опцией -s не работает и на 2.6: # eject -sv /dev/sdb eject: device name is `/dev/sdb' eject: expanded name is `/dev/sdb' eject: `/dev/sdb' is not mounted eject: `/dev/sdb' is not a mount point eject: `/dev/sdb' is a multipartition device eject: trying to eject `/dev/sdb' using SCSI commands eject: SCSI eject failed eject: unable to eject, last error: No such file or directory Проблема в том, что eject -s делает слишком много лишнего: /* * Eject using SCSI commands. Return 1 if successful, 0 otherwise. */ static int EjectScsi(int fd) { int status; struct sdata { int inlen; int outlen; char cmd[256]; } scsi_cmd; scsi_cmd.inlen = 0; scsi_cmd.outlen = 0; scsi_cmd.cmd[0] = ALLOW_MEDIUM_REMOVAL; scsi_cmd.cmd[1] = 0; scsi_cmd.cmd[2] = 0; scsi_cmd.cmd[3] = 0; scsi_cmd.cmd[4] = 0; scsi_cmd.cmd[5] = 0; status = ioctl(fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd); if (status != 0) return 0; scsi_cmd.inlen = 0; scsi_cmd.outlen = 0; scsi_cmd.cmd[0] = START_STOP; scsi_cmd.cmd[1] = 0; scsi_cmd.cmd[2] = 0; scsi_cmd.cmd[3] = 0; scsi_cmd.cmd[4] = 1; scsi_cmd.cmd[5] = 0; status = ioctl(fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd); if (status != 0) return 0; scsi_cmd.inlen = 0; scsi_cmd.outlen = 0; scsi_cmd.cmd[0] = START_STOP; scsi_cmd.cmd[1] = 0; scsi_cmd.cmd[2] = 0; scsi_cmd.cmd[3] = 0; scsi_cmd.cmd[4] = 2; scsi_cmd.cmd[5] = 0; status = ioctl(fd, SCSI_IOCTL_SEND_COMMAND, (void *)&scsi_cmd); if (status != 0) return 0; /* force kernel to reread partition table when new disc inserted */ status = ioctl(fd, BLKRRPART); return (status == 0); } В случае PL2507 не проходит команда ALLOW_MEDIUM_REMOVAL, после чего всё и обваливается. Первый START_STOP тоже лишний (хотя и проходит); BLKRRPART тоже мешает, поскольку запускает диск. -- Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5.3 * Origin: Talk.Mail.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/36727f7d40d3.html, оценка из 5, голосов 10
|