New -zisofs parameter bpt_free_ratio=

This commit is contained in:
2020-10-22 13:42:51 +02:00
parent 5a6aa8a71e
commit c4d66ecb19
10 changed files with 152 additions and 78 deletions

View File

@ -2263,8 +2263,8 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
{
int was_level, was_blocksize, was_v2_enabled, was_blocksize_v2;
uint64_t was_max_total_blocks, was_max_file_blocks, was_block_number_target;
int ret, l, i;
double num;
int ret, l, i, sticky;
double num, was_bpt_discard_free_ratio;
char *cpt, *npt, text[16];
was_level= xorriso->zlib_level;
@ -2274,6 +2274,7 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
was_max_file_blocks= xorriso->zisofs_max_file_blocks;
was_blocksize_v2= xorriso->zisofs_v2_block_size;
was_block_number_target= xorriso->zisofs_block_number_target;
was_bpt_discard_free_ratio= xorriso->zisofs_bpt_discard_free_ratio;
npt= cpt= mode;
for(cpt= mode; npt!=NULL; cpt= npt+1) {
npt= strchr(cpt,':');
@ -2298,6 +2299,7 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
strncmp(cpt, "osiz_used=", 10) == 0 ||
strncmp(cpt, "gzip_used=", 10) == 0 ||
strncmp(cpt, "gunzip_used=", 12) == 0 ||
strncmp(cpt, "bpt_ratio_used=", 15) == 0 ||
strncmp(cpt, "bpt_used=", 9) == 0) {
/* (ignored info from -status) */;
@ -2341,8 +2343,12 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
"-zisofs: Unsupported block pointer pool size (allowed: 1k to 128g)");
goto sorry_ex;
}
sticky= 0;
if(xorriso->zisofs_max_total_blocks == xorriso->zisofs_max_file_blocks)
sticky= 1;
xorriso->zisofs_max_total_blocks= num / 8.0;
if(xorriso->zisofs_max_total_blocks < xorriso->zisofs_max_file_blocks)
if(xorriso->zisofs_max_total_blocks < xorriso->zisofs_max_file_blocks ||
sticky)
xorriso->zisofs_max_file_blocks= xorriso->zisofs_max_total_blocks;
} else if(strncmp(cpt, "max_bpt_f=", 10) == 0) {
@ -2372,6 +2378,18 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
parse_zisofs_param(cpt, 11, l, &num);
xorriso->zisofs_block_number_target= num;
} else if(strncmp(cpt, "bpt_free_ratio=", 15) == 0) {
parse_zisofs_param(cpt, 15, l, &num);
/* 0 means to libisofs "do not change" */
if(num == 0.0)
num= -1.0;
if(num != -1.0 && (num <= 0.0 || num > 1.0)) {
sprintf(xorriso->info_text,
"-zisofs: Unsupported free blockpointer ratio (allowed -1 or 0.0 to 1.0)");
goto sorry_ex;
}
xorriso->zisofs_bpt_discard_free_ratio = num;
} else if(strncmp(cpt, "default", l)==0) {
xorriso->zlib_level= xorriso->zlib_level_default;
xorriso->zisofs_block_size= xorriso->zisofs_block_size_default;
@ -2381,6 +2399,8 @@ int Xorriso_option_zisofs(struct XorrisO *xorriso, char *mode, int flag)
xorriso->zisofs_max_file_blocks= xorriso->zisofs_max_file_blocks_default;
xorriso->zisofs_v2_block_size= xorriso->zisofs_v2_block_size_default;
xorriso->zisofs_block_number_target= -1;
xorriso->zisofs_bpt_discard_free_ratio=
xorriso->zisofs_bpt_discard_free_ratio_default;
} else {
unknown_mode:;
@ -2397,6 +2417,7 @@ sorry_ex:
xorriso->zisofs_max_file_blocks= was_max_file_blocks;
xorriso->zisofs_v2_block_size= was_blocksize_v2;
xorriso->zisofs_block_number_target= was_block_number_target;
xorriso->zisofs_bpt_discard_free_ratio= was_bpt_discard_free_ratio;
return(0);
}
}