Preallocate files during creation/extraction when sensible#26
Preallocate files during creation/extraction when sensible#26WulfyStylez wants to merge 1 commit into
Conversation
| if ( ! err && lseek( in_xiso, (xoff_t) in_file->start_sector * XISO_SECTOR_SIZE + s_xbox_disc_lseek, SEEK_SET ) == -1 ) seek_err(); | ||
|
|
||
| // preallocate this file if it's not tiny | ||
| if(in_file->file_size >= (READWRITE_BUFFER_SIZE * 2)) |
There was a problem hiding this comment.
It should happen before the seek in the XISO, so we can possibly group it into a open_preallocated(in_file->filename, WRITEFLAGS, 0644, in_file->file_size)
Edit: I see this won't be possible due to the use in write_file - should still be moved upwards in my opinion.
| if ( lseek( out, (xoff_t) in_file->file_size-1, SEEK_SET ) == -1 ) seek_err(); | ||
| if ( write( out, "\0", 1 ) != (int) 1 ) write_err(); | ||
| if ( lseek( out, (xoff_t) 0, SEEK_SET ) == -1 ) seek_err(); | ||
| } |
There was a problem hiding this comment.
All of this scope will depend on !err for open.
| { | ||
| if ( lseek( in_context->xiso, (xoff_t) (in_avl->start_sector * XISO_SECTOR_SIZE) + in_avl->file_size - 1, SEEK_SET ) == -1 ) seek_err(); | ||
| if ( write( in_context->xiso, "\0", 1 ) != (int) 1 ) write_err(); | ||
| } |
There was a problem hiding this comment.
Should be moved into a function like preallocate_file or something.
Edit: This will unfortunately include the dangerous case where it's used to overwrite existing data with a zero-byte; maybe https://linux.die.net/man/3/posix_fallocate ?
I'm surprised by this. What OS, what filesystem and what's the maximum write speed? Note: we will obviously support any ordinary harddisk (like Xbox 360 harddisks); but I'd imagine that we will probably focus on original Xbox and stop supporting Xbox 360 DVDs in the future (see #28 ).
However, I'm open to accepting this as-is (including what I mentioned in review comments) because the old code-quality is horrible anyway (so my expectations aren't too high either). |
| if(in_file->file_size >= (READWRITE_BUFFER_SIZE * 2)) | ||
| { | ||
| if ( lseek( out, (xoff_t) in_file->file_size-1, SEEK_SET ) == -1 ) seek_err(); | ||
| if ( write( out, "\0", 1 ) != (int) 1 ) write_err(); |
There was a problem hiding this comment.
nit: "\x00"
(Personal preference)
|
Hey @WulfyStylez, any status on this or abandoned? |
Using writes to successively allocate files thrashes disks in a lot of situations. This is due to filesystem meta being updated each time a write is issued, incurring extra seeks.
This alleviates the issue without adding extra overhead for smaller files which wouldn't benefit from preallocation.
Extraction tests on a 5400RPM 360 disk saw speeds increase from ~11MiB/s to the max write speed of the disk. This should make nearly every use case for both creation and extraction faster, however.