New cdrskin options --drive_not_f_setlk and --drive_not_o_excl

This commit is contained in:
Thomas Schmitt 2007-04-04 18:43:23 +00:00
parent 4c85686aad
commit 76a9fa4fa2
6 changed files with 48 additions and 20 deletions

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "March 30, 2007" .TH CDRSKIN 1 "April 03, 2007"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -732,6 +732,13 @@ Linux specific: Try to wait for a busy drive to become free.
This is not guaranteed to work with all drivers. Some need nonblocking i/o. This is not guaranteed to work with all drivers. Some need nonblocking i/o.
.TP .TP
.BI \--drive_not_exclusive .BI \--drive_not_exclusive
Linux specific: Combine --drive_not_f_setlk and --drive_not_o_excl.
.TP
.BI \--drive_not_f_setlk
Linux specific: Do not try to get exclusive lock on drive device file via
fcntl(2).
.TP
.BI \--drive_not_o_excl
Linux specific: Do not ask the operating system to prevent opening busy drives. Linux specific: Do not ask the operating system to prevent opening busy drives.
Wether this leads to senseful behavior depends on operating system and kernel. Wether this leads to senseful behavior depends on operating system and kernel.
.TP .TP

View File

@ -1565,6 +1565,9 @@ struct CdrpreskiN {
/** Linux specific : Wether to try to avoid collisions when opening drives */ /** Linux specific : Wether to try to avoid collisions when opening drives */
int drive_exclusive; int drive_exclusive;
/** Linux specific : Wether to obtain an exclusive drive lock via fcntl() */
int drive_fcntl_f_setlk;
/** Linux specific : Device file address family to use : /** Linux specific : Device file address family to use :
0=default , 1=sr , 2=scd , 4=sg */ 0=default , 1=sr , 2=scd , 4=sg */
int drive_scsi_dev_family; int drive_scsi_dev_family;
@ -1630,6 +1633,7 @@ int Cdrpreskin_new(struct CdrpreskiN **preskin, int flag)
o->scan_demands_drive= 0; o->scan_demands_drive= 0;
o->abort_on_busy_drive= 0; o->abort_on_busy_drive= 0;
o->drive_exclusive= 1; o->drive_exclusive= 1;
o->drive_fcntl_f_setlk= 1;
o->drive_scsi_dev_family= 0; o->drive_scsi_dev_family= 0;
o->drive_blocking= 0; o->drive_blocking= 0;
strcpy(o->write_mode_name,"DEFAULT"); strcpy(o->write_mode_name,"DEFAULT");
@ -2099,6 +2103,13 @@ set_dev:;
} else if(strcmp(argv[i],"--drive_not_exclusive")==0) { } else if(strcmp(argv[i],"--drive_not_exclusive")==0) {
o->drive_exclusive= 0; o->drive_exclusive= 0;
o->drive_fcntl_f_setlk= 0;
} else if(strcmp(argv[i],"--drive_not_f_setlk")==0) {
o->drive_fcntl_f_setlk= 0;
} else if(strcmp(argv[i],"--drive_not_o_excl")==0) {
o->drive_exclusive= 0;
} else if(strncmp(argv[i],"drive_scsi_dev_family=",22)==0) { } else if(strncmp(argv[i],"drive_scsi_dev_family=",22)==0) {
value_pt= argv[i]+22; value_pt= argv[i]+22;
@ -2161,7 +2172,9 @@ set_dev:;
printf(" (might be triggered by a busy hard disk)\n"); printf(" (might be triggered by a busy hard disk)\n");
printf(" --drive_blocking try to wait for busy drive to become free\n"); printf(" --drive_blocking try to wait for busy drive to become free\n");
printf(" (might be stalled by a busy hard disk)\n"); printf(" (might be stalled by a busy hard disk)\n");
printf(" --drive_not_exclusive do not ask kernel to prevent opening\n"); printf(" --drive_not_exclusive combined not_o_excl and not_f_setlk.\n");
printf(" --drive_not_f_setlk do not obtain exclusive lock via fcntl.\n");
printf(" --drive_not_o_excl do not ask kernel to prevent opening\n");
printf(" busy drives. Effect is kernel dependend.\n"); printf(" busy drives. Effect is kernel dependend.\n");
printf( printf(
" drive_scsi_dev_family=<sr|scd|sg|default> select Linux device\n"); " drive_scsi_dev_family=<sr|scd|sg|default> select Linux device\n");
@ -2400,6 +2413,7 @@ final_checks:;
burn_preset_device_open(o->drive_exclusive burn_preset_device_open(o->drive_exclusive
#ifdef Cdrskin_libburn_preset_device_familY #ifdef Cdrskin_libburn_preset_device_familY
| (o->drive_scsi_dev_family<<2) | (o->drive_scsi_dev_family<<2)
| ((!!o->drive_fcntl_f_setlk)<<5)
#endif #endif
, ,
o->drive_blocking, o->drive_blocking,
@ -5908,7 +5922,9 @@ set_blank:;
} else if(strcmp(argv[i],"--drive_blocking")==0) { } else if(strcmp(argv[i],"--drive_blocking")==0) {
/* is handled in Cdrpreskin_setup() */; /* is handled in Cdrpreskin_setup() */;
} else if(strcmp(argv[i],"--drive_not_exclusive")==0) { } else if(strcmp(argv[i],"--drive_not_exclusive")==0 ||
strcmp(argv[i],"--drive_not_f_setlk")==0 ||
strcmp(argv[i],"--drive_not_o_excl")==0) {
/* is handled in Cdrpreskin_setup() */; /* is handled in Cdrpreskin_setup() */;
} else if(strncmp(argv[i],"drive_scsi_dev_family=",22)==0) { } else if(strncmp(argv[i],"drive_scsi_dev_family=",22)==0) {

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2007.04.03.145806" #define Cdrskin_timestamP "2007.04.04.184341"

View File

@ -26,9 +26,13 @@ struct libdax_msgs *libdax_messenger= NULL;
int burn_running = 0; int burn_running = 0;
/* ts A60813 : Linux: wether to use O_EXCL and/or O_NONBLOCK in libburn/sg.c */ /* ts A60813 : Linux: wether to use O_EXCL on open() of device files */
int burn_sg_open_o_excl = 1; int burn_sg_open_o_excl = 1;
/* ts A70403 : Linux: wether to use fcntl(,F_SETLK,)
after open() of device files */
int burn_sg_fcntl_f_setlk = 1;
/* ts A70314 : Linux: what device family to use : /* ts A70314 : Linux: what device family to use :
0= default family 0= default family
1= sr 1= sr
@ -128,11 +132,11 @@ void burn_preset_device_open(int exclusive, int blocking, int abort_on_busy)
/* a ssert(burn_running); */ /* a ssert(burn_running); */
if (!burn_running) if (!burn_running)
return; return;
burn_sg_open_o_excl = exclusive & 3;
burn_sg_open_o_excl= exclusive & 3; burn_sg_fcntl_f_setlk = !!(exclusive & 32);
burn_sg_use_family= (exclusive >> 2) & 15; burn_sg_use_family = (exclusive >> 2) & 15;
burn_sg_open_o_nonblock= !blocking; burn_sg_open_o_nonblock = !blocking;
burn_sg_open_abort_busy= !!abort_on_busy; burn_sg_open_abort_busy = !!abort_on_busy;
} }

View File

@ -586,6 +586,8 @@ void burn_set_verbosity(int level);
8 = /dev/scd%d 8 = /dev/scd%d
16 = /dev/sg%d 16 = /dev/sg%d
Do not use other values ! Do not use other values !
Add 32 to demand an exclusive lock by fcntl(,F_SETLK,)
after open() has succeeded.
@param blocking Try to wait for drives which do not open immediately but @param blocking Try to wait for drives which do not open immediately but
also do not return an error as well. (O_NONBLOCK) also do not return an error as well. (O_NONBLOCK)
This might stall indefinitely with /dev/hdX hard disks. This might stall indefinitely with /dev/hdX hard disks.
@ -772,8 +774,8 @@ int burn_drive_grab(struct burn_drive *drive, int load);
/** Release a drive. This should not be done until the drive is no longer /** Release a drive. This should not be done until the drive is no longer
busy (see burn_drive_get_status). The drive is (O_EXCL) unlocked busy (see burn_drive_get_status).
afterwards. Linux: The drive is unlocked afterwards. (O_EXCL , F_SETLK).
@param drive The drive to release. @param drive The drive to release.
@param eject Nonzero to make the drive eject the disc in it. @param eject Nonzero to make the drive eject the disc in it.
*/ */

View File

@ -171,11 +171,13 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
/* >>> ts A61115 : this needs mending. A Linux aspect shows up in cdrskin. */ /* >>> ts A61115 : this needs mending. A Linux aspect shows up in cdrskin. */
/* ts A60813 : storage objects are in libburn/init.c /* ts A60813 : storage objects are in libburn/init.c
wether to use O_EXCL wether to use O_EXCL with open(2) of devices
wether to use fcntl(,F_SETLK,) after open(2) of devices
what device family to use : 0=default, 1=sr, 2=scd, (3=st), 4=sg what device family to use : 0=default, 1=sr, 2=scd, (3=st), 4=sg
wether to use O_NOBLOCK with open(2) on devices wether to use O_NOBLOCK with open(2) on devices
wether to take O_EXCL rejection as fatal error */ wether to take O_EXCL rejection as fatal error */
extern int burn_sg_open_o_excl; extern int burn_sg_open_o_excl;
extern int burn_sg_fcntl_f_setlk;
extern int burn_sg_use_family; extern int burn_sg_use_family;
extern int burn_sg_open_o_nonblock; extern int burn_sg_open_o_nonblock;
extern int burn_sg_open_abort_busy; extern int burn_sg_open_abort_busy;
@ -304,14 +306,13 @@ static int sg_close_drive_fd(char *fname, int driveno, int *fd, int sorry)
*/ */
int sg_fcntl_lock(int *fd, char *fd_name) int sg_fcntl_lock(int *fd, char *fd_name)
{ {
#define Libburn_sg_with_fcntl_locK 1
#ifdef Libburn_sg_with_fcntl_locK
struct flock lockthing; struct flock lockthing;
char msg[81]; char msg[81];
int ret; int ret;
if (!burn_sg_fcntl_f_setlk)
return 1;
memset(&lockthing, 0, sizeof(lockthing)); memset(&lockthing, 0, sizeof(lockthing));
lockthing.l_type = F_WRLCK; lockthing.l_type = F_WRLCK;
lockthing.l_whence = SEEK_SET; lockthing.l_whence = SEEK_SET;
@ -330,9 +331,7 @@ int sg_fcntl_lock(int *fd, char *fd_name)
*fd = -1; *fd = -1;
return(0); return(0);
} }
return 1;
#endif /* Libburn_sg_with_fcntl_locK */
return(1);
} }