Avoided one more open()-close() cycles during drive scan and grab on Linux

This commit is contained in:
Thomas Schmitt 2011-10-02 17:20:39 +00:00
parent 94188d1613
commit 48493e2a2f
2 changed files with 14 additions and 19 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2011.10.02.134037" #define Cdrskin_timestamP "2011.10.02.172004"

View File

@ -816,7 +816,7 @@ static int is_ata_drive(char *fname, int fd_in)
static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no, static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
int *channel_no, int *target_no, int *lun_no) int *channel_no, int *target_no, int *lun_no)
{ {
int fd, sid_ret = 0, ret; int fd = -1, sid_ret = 0, ret, fail_sev_sorry = 0;
struct sg_scsi_id sid; struct sg_scsi_id sid;
int *sibling_fds = NULL, sibling_count= 0; int *sibling_fds = NULL, sibling_count= 0;
typedef char burn_sg_sibling_fname[BURN_OS_SG_MAX_NAMELEN]; typedef char burn_sg_sibling_fname[BURN_OS_SG_MAX_NAMELEN];
@ -836,7 +836,6 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
errno, strerror(errno)); errno, strerror(errno));
{ret = 0; goto ex;} {ret = 0; goto ex;}
} }
sid_ret = ioctl(fd, SG_GET_SCSI_ID, &sid); sid_ret = ioctl(fd, SG_GET_SCSI_ID, &sid);
if (sid_ret == -1) { if (sid_ret == -1) {
sid.scsi_id = -1; /* mark SCSI address as invalid */ sid.scsi_id = -1; /* mark SCSI address as invalid */
@ -851,8 +850,6 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
"FATAL: sgio_test() failed: errno=%d '%s'", "FATAL: sgio_test() failed: errno=%d '%s'",
errno, strerror(errno)); errno, strerror(errno));
if (fd_in < 0)
sg_close_drive_fd(fname, -1, &fd, 0);
{ret = 0; goto ex;} {ret = 0; goto ex;}
} }
@ -878,19 +875,7 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
*bus_no = -1; *bus_no = -1;
#endif #endif
/* >>> SINGLE_OPEN : close in label ex. fail_sev_sorry = (sid.scsi_type == TYPE_ROM);
after re-using fd with sg_obtain_scsi_adr_fd() */
if (fd_in < 0) {
if (sg_close_drive_fd(fname, -1, &fd,
sid.scsi_type == TYPE_ROM ) <= 0) {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"cannot close properly, errno=%d '%s'\n",
errno, strerror(errno));
{ret = 0; goto ex;}
}
}
if ( (sid_ret == -1 || sid.scsi_type != TYPE_ROM) if ( (sid_ret == -1 || sid.scsi_type != TYPE_ROM)
&& !linux_sg_accept_any_type) { && !linux_sg_accept_any_type) {
if (linux_sg_enumerate_debug) if (linux_sg_enumerate_debug)
@ -901,7 +886,7 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
if (sid_ret == -1 || sid.scsi_id < 0) { if (sid_ret == -1 || sid.scsi_id < 0) {
/* ts A61211 : employ a more general ioctl */ /* ts A61211 : employ a more general ioctl */
/* ts B11001 : re-use fd if still open */ /* ts B11001 : re-use fd */
ret = sg_obtain_scsi_adr_fd(fname, fd, bus_no, host_no, ret = sg_obtain_scsi_adr_fd(fname, fd, bus_no, host_no,
channel_no, target_no, lun_no); channel_no, target_no, lun_no);
if (ret>0) { if (ret>0) {
@ -946,6 +931,16 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
*lun_no= sid.lun; *lun_no= sid.lun;
ret = 1; ret = 1;
ex:; ex:;
if (fd_in < 0 && fd >= 0) {
if (sg_close_drive_fd(fname, -1, &fd, fail_sev_sorry) <= 0) {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"cannot close properly, errno=%d '%s'\n",
errno, strerror(errno));
if (ret > 0)
ret = 0;
}
}
BURN_FREE_MEM(sibling_fds); BURN_FREE_MEM(sibling_fds);
BURN_FREE_MEM(sibling_fnames); BURN_FREE_MEM(sibling_fnames);
return ret; return ret;