@ -216,6 +216,20 @@ typedef struct RawPosixAIOData {
static int cdrom_reopen ( BlockDriverState * bs ) ;
static int cdrom_reopen ( BlockDriverState * bs ) ;
# endif
# endif
/*
* Elide EAGAIN and EACCES details when failing to lock , as this
* indicates that the specified file region is already locked by
* another process , which is considered a common scenario .
*/
# define raw_lock_error_setg_errno(errp, err, fmt, ...) \
do { \
if ( ( err ) = = EAGAIN | | ( err ) = = EACCES ) { \
error_setg ( ( errp ) , ( fmt ) , # # __VA_ARGS__ ) ; \
} else { \
error_setg_errno ( ( errp ) , ( err ) , ( fmt ) , # # __VA_ARGS__ ) ; \
} \
} while ( 0 )
# if defined(__NetBSD__)
# if defined(__NetBSD__)
static int raw_normalize_devicepath ( const char * * filename , Error * * errp )
static int raw_normalize_devicepath ( const char * * filename , Error * * errp )
{
{
@ -836,7 +850,8 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
if ( ( perm_lock_bits & bit ) & & ! ( locked_perm & bit ) ) {
if ( ( perm_lock_bits & bit ) & & ! ( locked_perm & bit ) ) {
ret = qemu_lock_fd ( fd , off , 1 , false ) ;
ret = qemu_lock_fd ( fd , off , 1 , false ) ;
if ( ret ) {
if ( ret ) {
error_setg ( errp , " Failed to lock byte %d " , off ) ;
raw_lock_error_setg_errno ( errp , - ret , " Failed to lock byte %d " ,
off ) ;
return ret ;
return ret ;
} else if ( s ) {
} else if ( s ) {
s - > locked_perm | = bit ;
s - > locked_perm | = bit ;
@ -844,7 +859,7 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
} else if ( unlock & & ( locked_perm & bit ) & & ! ( perm_lock_bits & bit ) ) {
} else if ( unlock & & ( locked_perm & bit ) & & ! ( perm_lock_bits & bit ) ) {
ret = qemu_unlock_fd ( fd , off , 1 ) ;
ret = qemu_unlock_fd ( fd , off , 1 ) ;
if ( ret ) {
if ( ret ) {
error_setg ( errp , " Failed to unlock byte %d " , off ) ;
error_setg_errno ( errp , - ret , " Failed to unlock byte %d " , off ) ;
return ret ;
return ret ;
} else if ( s ) {
} else if ( s ) {
s - > locked_perm & = ~ bit ;
s - > locked_perm & = ~ bit ;
@ -857,7 +872,8 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
if ( ( shared_perm_lock_bits & bit ) & & ! ( locked_shared_perm & bit ) ) {
if ( ( shared_perm_lock_bits & bit ) & & ! ( locked_shared_perm & bit ) ) {
ret = qemu_lock_fd ( fd , off , 1 , false ) ;
ret = qemu_lock_fd ( fd , off , 1 , false ) ;
if ( ret ) {
if ( ret ) {
error_setg ( errp , " Failed to lock byte %d " , off ) ;
raw_lock_error_setg_errno ( errp , - ret , " Failed to lock byte %d " ,
off ) ;
return ret ;
return ret ;
} else if ( s ) {
} else if ( s ) {
s - > locked_shared_perm | = bit ;
s - > locked_shared_perm | = bit ;
@ -866,7 +882,7 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
! ( shared_perm_lock_bits & bit ) ) {
! ( shared_perm_lock_bits & bit ) ) {
ret = qemu_unlock_fd ( fd , off , 1 ) ;
ret = qemu_unlock_fd ( fd , off , 1 ) ;
if ( ret ) {
if ( ret ) {
error_setg ( errp , " Failed to unlock byte %d " , off ) ;
error_setg_errno ( errp , - ret , " Failed to unlock byte %d " , off ) ;
return ret ;
return ret ;
} else if ( s ) {
} else if ( s ) {
s - > locked_shared_perm & = ~ bit ;
s - > locked_shared_perm & = ~ bit ;
@ -890,9 +906,10 @@ static int raw_check_lock_bytes(int fd, uint64_t perm, uint64_t shared_perm,
ret = qemu_lock_fd_test ( fd , off , 1 , true ) ;
ret = qemu_lock_fd_test ( fd , off , 1 , true ) ;
if ( ret ) {
if ( ret ) {
char * perm_name = bdrv_perm_names ( p ) ;
char * perm_name = bdrv_perm_names ( p ) ;
error_setg ( errp ,
" Failed to get \" %s \" lock " ,
raw_lock_error_setg_errno ( errp , - ret ,
perm_name ) ;
" Failed to get \" %s \" lock " ,
perm_name ) ;
g_free ( perm_name ) ;
g_free ( perm_name ) ;
return ret ;
return ret ;
}
}
@ -905,9 +922,10 @@ static int raw_check_lock_bytes(int fd, uint64_t perm, uint64_t shared_perm,
ret = qemu_lock_fd_test ( fd , off , 1 , true ) ;
ret = qemu_lock_fd_test ( fd , off , 1 , true ) ;
if ( ret ) {
if ( ret ) {
char * perm_name = bdrv_perm_names ( p ) ;
char * perm_name = bdrv_perm_names ( p ) ;
error_setg ( errp ,
" Failed to get shared \" %s \" lock " ,
raw_lock_error_setg_errno ( errp , - ret ,
perm_name ) ;
" Failed to get shared \" %s \" lock " ,
perm_name ) ;
g_free ( perm_name ) ;
g_free ( perm_name ) ;
return ret ;
return ret ;
}
}