ntfs_attr_pwrite: write zeros between initializes_size and @pos if needed.
(Logical change 1.625)edge.strict_endians
							parent
							
								
									77dcf60585
								
							
						
					
					
						commit
						8073aaff7d
					
				| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue