ntfs_rl_pwrite: don't check buffer for sparse runs

master
szaka 2006-12-17 02:18:55 +00:00
parent 13da6e3415
commit be2dbbf92d
1 changed files with 5 additions and 29 deletions

View File

@ -1106,7 +1106,8 @@ rl_err_out:
*
* This function will write @count bytes from data buffer @b to the volume @vol
* scattering the data as specified by the runlist @rl. The write begins at
* offset @pos into the runlist @rl.
* offset @pos into the runlist @rl. If a run is sparse then the related buffer
* data is ignored which means that the caller must ensure they are consistent.
*
* On success, return the number of successfully written bytes. If this number
* is lower than @count this means that the write has been interrupted in
@ -1141,38 +1142,13 @@ s64 ntfs_rl_pwrite(const ntfs_volume *vol, const runlist_element *rl,
if (!rl->length)
goto rl_err_out;
if (rl->lcn < (LCN)0) {
s64 t;
int cnt;
if (rl->lcn != (LCN)LCN_HOLE)
goto rl_err_out;
/*
* It is a hole. Check if the buffer is zero in this
* region and if not abort with error.
*/
to_write = min(count, (rl->length <<
vol->cluster_size_bits) - ofs);
written = to_write / sizeof(unsigned long);
for (t = 0; t < written; t++) {
if (((unsigned long*)b)[t])
goto rl_err_out;
}
cnt = to_write & (sizeof(unsigned long) - 1);
if (cnt) {
int i;
u8 *b2;
b2 = (u8*)b + (to_write &
~(sizeof(unsigned long) - 1));
for (i = 0; i < cnt; i++) {
if (b2[i])
goto rl_err_out;
}
}
/*
* The buffer region is zero, update progress counters
* and proceed with next run.
*/
vol->cluster_size_bits) - ofs);
total += to_write;
count -= to_write;
b = (u8*)b + to_write;