ntfs_attr_pwrite: write zeros between initializes_size and @pos if needed.

(Logical change 1.625)
edge.strict_endians
(none)!yura 2004-11-05 13:54:34 +00:00
parent 77dcf60585
commit 8073aaff7d
1 changed files with 31 additions and 9 deletions

View File

@ -977,6 +977,8 @@ s64 ntfs_attr_pwrite(ntfs_attr *na, const s64 pos, s64 count, void *b)
}
/* Handle writes beyond initialized_size. */
if (pos + count > na->initialized_size) {
if (ntfs_attr_map_whole_runlist(na))
goto err_out;
/* Set initialized_size to @pos + @count. */
ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
if (!ctx)
@ -986,15 +988,35 @@ s64 ntfs_attr_pwrite(ntfs_attr *na, const s64 pos, s64 count, void *b)
goto err_out;
/* If write starts beyond initialized_size, zero the gap. */
if (pos > na->initialized_size) {
// TODO: Need to write zeroes in the region from
// na->initialized_size to @pos, then update the
// initialized size to equal @pos. If any sparse runs
// are encountered while filling the gap, need to
// honour them, i.e. do not instantiate them. Then can
// continue as if pos <= na->initialized_size, i.e. can
// just fall through and continue. (AIA)
errno = ENOTSUP;
goto err_out;
char *buf;
int err;
buf = malloc(NTFS_BUF_SIZE);
if (!buf) {
err = errno;
Dprintf("%s(): Not enough memory.\n",
__FUNCTION__);
errno = err;
goto err_out;
}
memset(buf, 0, NTFS_BUF_SIZE);
ofs = na->initialized_size;
while (ofs < pos) {
to_write = min(pos - ofs, NTFS_BUF_SIZE);
written = ntfs_rl_pwrite(vol, na->rl, ofs,
to_write, buf);
if (written <= 0) {
err = errno;
Dprintf("%s(): Failed to zero space "
"between initialized size and "
"@pos.\n", __FUNCTION__);
free(buf);
errno = err;
goto err_out;
}
ofs += written;
}
free(buf);
}
ctx->attr->initialized_size = cpu_to_sle64(pos + count);
if (ntfs_mft_record_write(vol, ctx->ntfs_ino->mft_no,