Revision 6e9ea0c0 blockvpc.c
b/blockvpc.c  

433  433 
* 
434  434 
* Note that the geometry doesn't always exactly match total_sectors but 
435  435 
* may round it down. 
436 
* 

437 
* Returns 0 on success, EFBIG if the size is larger than 127 GB 

436  438 
*/ 
437 
static void calculate_geometry(int64_t total_sectors, uint16_t* cyls,


439 
static int calculate_geometry(int64_t total_sectors, uint16_t* cyls,


438  440 
uint8_t* heads, uint8_t* secs_per_cyl) 
439  441 
{ 
440  442 
uint32_t cyls_times_heads; 
441  443  
442  444 
if (total_sectors > 65535 * 16 * 255) 
443 
total_sectors = 65535 * 16 * 255;


445 
return EFBIG;


444  446  
445  447 
if (total_sectors > 65535 * 16 * 63) { 
446  448 
*secs_per_cyl = 255; 
...  ...  
470  472 
// Note: Rounding up deviates from the Virtual PC behaviour 
471  473 
// However, we need this to avoid truncating images in qemuimg convert 
472  474 
*cyls = (cyls_times_heads + *heads  1) / *heads; 
475  
476 
return 0; 

473  477 
} 
474  478  
475  479 
static int vpc_create(const char *filename, int64_t total_sectors, 
...  ...  
493  497 
return EIO; 
494  498  
495  499 
// Calculate matching total_size and geometry 
496 
calculate_geometry(total_sectors, &cyls, &heads, &secs_per_cyl); 

500 
if (calculate_geometry(total_sectors, &cyls, &heads, &secs_per_cyl)) 

501 
return EFBIG; 

497  502 
total_sectors = (int64_t) cyls * heads * secs_per_cyl; 
498  503  
499  504 
// Prepare the Hard Disk Footer 
Also available in: Unified diff