xref: /haiku/src/add-ons/kernel/file_systems/ntfs/libntfs/attrib.c (revision 49d7857e32a5c34fe63a11e46a41a774aa1b2728)
1 /**
2  * attrib.c - Attribute handling code. Originated from the Linux-NTFS project.
3  *
4  * Copyright (c) 2000-2010 Anton Altaparmakov
5  * Copyright (c) 2002-2005 Richard Russon
6  * Copyright (c) 2002-2008 Szabolcs Szakacsits
7  * Copyright (c) 2004-2007 Yura Pakhuchiy
8  * Copyright (c) 2007-2011 Jean-Pierre Andre
9  * Copyright (c) 2010      Erik Larsson
10  *
11  * This program/include file is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as published
13  * by the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program/include file is distributed in the hope that it will be
17  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
18  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program (in the main directory of the NTFS-3G
23  * distribution in the file COPYING); if not, write to the Free Software
24  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25  */
26 
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif
30 
31 #ifdef HAVE_STDIO_H
32 #include <stdio.h>
33 #endif
34 #ifdef HAVE_STRING_H
35 #include <string.h>
36 #endif
37 #ifdef HAVE_STDLIB_H
38 #include <stdlib.h>
39 #endif
40 #ifdef HAVE_ERRNO_H
41 #include <errno.h>
42 #endif
43 #ifdef HAVE_LIMITS_H
44 #include <limits.h>
45 #endif
46 
47 #include "param.h"
48 #include "compat.h"
49 #include "attrib.h"
50 #include "attrlist.h"
51 #include "device.h"
52 #include "mft.h"
53 #include "debug.h"
54 #include "mst.h"
55 #include "volume.h"
56 #include "types.h"
57 #include "layout.h"
58 #include "inode.h"
59 #include "runlist.h"
60 #include "lcnalloc.h"
61 #include "dir.h"
62 #include "compress.h"
63 #include "bitmap.h"
64 #include "logging.h"
65 #include "misc.h"
66 #include "efs.h"
67 
68 ntfschar AT_UNNAMED[] = { const_cpu_to_le16('\0') };
69 ntfschar STREAM_SDS[] = { const_cpu_to_le16('$'),
70 			const_cpu_to_le16('S'),
71 			const_cpu_to_le16('D'),
72 			const_cpu_to_le16('S'),
73 			const_cpu_to_le16('\0') };
74 
75 ntfschar TXF_DATA[] = { const_cpu_to_le16('$'),
76 			const_cpu_to_le16('T'),
77 			const_cpu_to_le16('X'),
78 			const_cpu_to_le16('F'),
79 			const_cpu_to_le16('_'),
80 			const_cpu_to_le16('D'),
81 			const_cpu_to_le16('A'),
82 			const_cpu_to_le16('T'),
83 			const_cpu_to_le16('A'),
84 			const_cpu_to_le16('\0') };
85 
86 static int NAttrFlag(ntfs_attr *na, FILE_ATTR_FLAGS flag)
87 {
88 	if (na->type == AT_DATA && na->name == AT_UNNAMED)
89 		return (na->ni->flags & flag);
90 	return 0;
91 }
92 
93 static void NAttrSetFlag(ntfs_attr *na, FILE_ATTR_FLAGS flag)
94 {
95 	if (na->type == AT_DATA && na->name == AT_UNNAMED)
96 		na->ni->flags |= flag;
97 	else
98 		ntfs_log_trace("Denied setting flag %d for not unnamed data "
99 			       "attribute\n", flag);
100 }
101 
102 static void NAttrClearFlag(ntfs_attr *na, FILE_ATTR_FLAGS flag)
103 {
104 	if (na->type == AT_DATA && na->name == AT_UNNAMED)
105 		na->ni->flags &= ~flag;
106 }
107 
108 #define GenNAttrIno(func_name, flag)					\
109 int NAttr##func_name(ntfs_attr *na) { return NAttrFlag   (na, flag); } 	\
110 void NAttrSet##func_name(ntfs_attr *na)	 { NAttrSetFlag  (na, flag); }	\
111 void NAttrClear##func_name(ntfs_attr *na){ NAttrClearFlag(na, flag); }
112 
113 GenNAttrIno(Compressed, FILE_ATTR_COMPRESSED)
114 GenNAttrIno(Encrypted, 	FILE_ATTR_ENCRYPTED)
115 GenNAttrIno(Sparse, 	FILE_ATTR_SPARSE_FILE)
116 
117 /**
118  * ntfs_get_attribute_value_length - Find the length of an attribute
119  * @a:
120  *
121  * Description...
122  *
123  * Returns:
124  */
125 s64 ntfs_get_attribute_value_length(const ATTR_RECORD *a)
126 {
127 	if (!a) {
128 		errno = EINVAL;
129 		return 0;
130 	}
131 	errno = 0;
132 	if (a->non_resident)
133 		return sle64_to_cpu(a->data_size);
134 
135 	return (s64)le32_to_cpu(a->value_length);
136 }
137 
138 /**
139  * ntfs_get_attribute_value - Get a copy of an attribute
140  * @vol:
141  * @a:
142  * @b:
143  *
144  * Description...
145  *
146  * Returns:
147  */
148 s64 ntfs_get_attribute_value(const ntfs_volume *vol,
149 		const ATTR_RECORD *a, u8 *b)
150 {
151 	runlist *rl;
152 	s64 total, r;
153 	int i;
154 
155 	/* Sanity checks. */
156 	if (!vol || !a || !b) {
157 		errno = EINVAL;
158 		return 0;
159 	}
160 	/* Complex attribute? */
161 	/*
162 	 * Ignore the flags in case they are not zero for an attribute list
163 	 * attribute.  Windows does not complain about invalid flags and chkdsk
164 	 * does not detect or fix them so we need to cope with it, too.
165 	 */
166 	if (a->type != AT_ATTRIBUTE_LIST && a->flags) {
167 		ntfs_log_error("Non-zero (%04x) attribute flags. Cannot handle "
168 			       "this yet.\n", le16_to_cpu(a->flags));
169 		errno = EOPNOTSUPP;
170 		return 0;
171 	}
172 	if (!a->non_resident) {
173 		/* Attribute is resident. */
174 
175 		/* Sanity check. */
176 		if (le32_to_cpu(a->value_length) + le16_to_cpu(a->value_offset)
177 				> le32_to_cpu(a->length)) {
178 			return 0;
179 		}
180 
181 		memcpy(b, (const char*)a + le16_to_cpu(a->value_offset),
182 				le32_to_cpu(a->value_length));
183 		errno = 0;
184 		return (s64)le32_to_cpu(a->value_length);
185 	}
186 
187 	/* Attribute is not resident. */
188 
189 	/* If no data, return 0. */
190 	if (!(a->data_size)) {
191 		errno = 0;
192 		return 0;
193 	}
194 	/*
195 	 * FIXME: What about attribute lists?!? (AIA)
196 	 */
197 	/* Decompress the mapping pairs array into a runlist. */
198 	rl = ntfs_mapping_pairs_decompress(vol, a, NULL);
199 	if (!rl) {
200 		errno = EINVAL;
201 		return 0;
202 	}
203 	/*
204 	 * FIXED: We were overflowing here in a nasty fashion when we
205 	 * reach the last cluster in the runlist as the buffer will
206 	 * only be big enough to hold data_size bytes while we are
207 	 * reading in allocated_size bytes which is usually larger
208 	 * than data_size, since the actual data is unlikely to have a
209 	 * size equal to a multiple of the cluster size!
210 	 * FIXED2:  We were also overflowing here in the same fashion
211 	 * when the data_size was more than one run smaller than the
212 	 * allocated size which happens with Windows XP sometimes.
213 	 */
214 	/* Now load all clusters in the runlist into b. */
215 	for (i = 0, total = 0; rl[i].length; i++) {
216 		if (total + (rl[i].length << vol->cluster_size_bits) >=
217 				sle64_to_cpu(a->data_size)) {
218 			unsigned char *intbuf = NULL;
219 			/*
220 			 * We have reached the last run so we were going to
221 			 * overflow when executing the ntfs_pread() which is
222 			 * BAAAAAAAD!
223 			 * Temporary fix:
224 			 *	Allocate a new buffer with size:
225 			 *	rl[i].length << vol->cluster_size_bits, do the
226 			 *	read into our buffer, then memcpy the correct
227 			 *	amount of data into the caller supplied buffer,
228 			 *	free our buffer, and continue.
229 			 * We have reached the end of data size so we were
230 			 * going to overflow in the same fashion.
231 			 * Temporary fix:  same as above.
232 			 */
233 			intbuf = ntfs_malloc(rl[i].length << vol->cluster_size_bits);
234 			if (!intbuf) {
235 				free(rl);
236 				return 0;
237 			}
238 			/*
239 			 * FIXME: If compressed file: Only read if lcn != -1.
240 			 * Otherwise, we are dealing with a sparse run and we
241 			 * just memset the user buffer to 0 for the length of
242 			 * the run, which should be 16 (= compression unit
243 			 * size).
244 			 * FIXME: Really only when file is compressed, or can
245 			 * we have sparse runs in uncompressed files as well?
246 			 * - Yes we can, in sparse files! But not necessarily
247 			 * size of 16, just run length.
248 			 */
249 			r = ntfs_pread(vol->dev, rl[i].lcn <<
250 					vol->cluster_size_bits, rl[i].length <<
251 					vol->cluster_size_bits, intbuf);
252 			if (r != rl[i].length << vol->cluster_size_bits) {
253 #define ESTR "Error reading attribute value"
254 				if (r == -1)
255 					ntfs_log_perror(ESTR);
256 				else if (r < rl[i].length <<
257 						vol->cluster_size_bits) {
258 					ntfs_log_debug(ESTR ": Ran out of input data.\n");
259 					errno = EIO;
260 				} else {
261 					ntfs_log_debug(ESTR ": unknown error\n");
262 					errno = EIO;
263 				}
264 #undef ESTR
265 				free(rl);
266 				free(intbuf);
267 				return 0;
268 			}
269 			memcpy(b + total, intbuf, sle64_to_cpu(a->data_size) -
270 					total);
271 			free(intbuf);
272 			total = sle64_to_cpu(a->data_size);
273 			break;
274 		}
275 		/*
276 		 * FIXME: If compressed file: Only read if lcn != -1.
277 		 * Otherwise, we are dealing with a sparse run and we just
278 		 * memset the user buffer to 0 for the length of the run, which
279 		 * should be 16 (= compression unit size).
280 		 * FIXME: Really only when file is compressed, or can
281 		 * we have sparse runs in uncompressed files as well?
282 		 * - Yes we can, in sparse files! But not necessarily size of
283 		 * 16, just run length.
284 		 */
285 		r = ntfs_pread(vol->dev, rl[i].lcn << vol->cluster_size_bits,
286 				rl[i].length << vol->cluster_size_bits,
287 				b + total);
288 		if (r != rl[i].length << vol->cluster_size_bits) {
289 #define ESTR "Error reading attribute value"
290 			if (r == -1)
291 				ntfs_log_perror(ESTR);
292 			else if (r < rl[i].length << vol->cluster_size_bits) {
293 				ntfs_log_debug(ESTR ": Ran out of input data.\n");
294 				errno = EIO;
295 			} else {
296 				ntfs_log_debug(ESTR ": unknown error\n");
297 				errno = EIO;
298 			}
299 #undef ESTR
300 			free(rl);
301 			return 0;
302 		}
303 		total += r;
304 	}
305 	free(rl);
306 	return total;
307 }
308 
309 /* Already cleaned up code below, but still look for FIXME:... */
310 
311 /**
312  * __ntfs_attr_init - primary initialization of an ntfs attribute structure
313  * @na:		ntfs attribute to initialize
314  * @ni:		ntfs inode with which to initialize the ntfs attribute
315  * @type:	attribute type
316  * @name:	attribute name in little endian Unicode or NULL
317  * @name_len:	length of attribute @name in Unicode characters (if @name given)
318  *
319  * Initialize the ntfs attribute @na with @ni, @type, @name, and @name_len.
320  */
321 static void __ntfs_attr_init(ntfs_attr *na, ntfs_inode *ni,
322 		const ATTR_TYPES type, ntfschar *name, const u32 name_len)
323 {
324 	na->rl = NULL;
325 	na->ni = ni;
326 	na->type = type;
327 	na->name = name;
328 	if (name)
329 		na->name_len = name_len;
330 	else
331 		na->name_len = 0;
332 }
333 
334 /**
335  * ntfs_attr_init - initialize an ntfs_attr with data sizes and status
336  * @na:
337  * @non_resident:
338  * @compressed:
339  * @encrypted:
340  * @sparse:
341  * @allocated_size:
342  * @data_size:
343  * @initialized_size:
344  * @compressed_size:
345  * @compression_unit:
346  *
347  * Final initialization for an ntfs attribute.
348  */
349 void ntfs_attr_init(ntfs_attr *na, const BOOL non_resident,
350 		const ATTR_FLAGS data_flags,
351 		const BOOL encrypted, const BOOL sparse,
352 		const s64 allocated_size, const s64 data_size,
353 		const s64 initialized_size, const s64 compressed_size,
354 		const u8 compression_unit)
355 {
356 	if (!NAttrInitialized(na)) {
357 		na->data_flags = data_flags;
358 		if (non_resident)
359 			NAttrSetNonResident(na);
360 		if (data_flags & ATTR_COMPRESSION_MASK)
361 			NAttrSetCompressed(na);
362 		if (encrypted)
363 			NAttrSetEncrypted(na);
364 		if (sparse)
365 			NAttrSetSparse(na);
366 		na->allocated_size = allocated_size;
367 		na->data_size = data_size;
368 		na->initialized_size = initialized_size;
369 		if ((data_flags & ATTR_COMPRESSION_MASK) || sparse) {
370 			ntfs_volume *vol = na->ni->vol;
371 
372 			na->compressed_size = compressed_size;
373 			na->compression_block_clusters = 1 << compression_unit;
374 			na->compression_block_size = 1 << (compression_unit +
375 					vol->cluster_size_bits);
376 			na->compression_block_size_bits = ffs(
377 					na->compression_block_size) - 1;
378 		}
379 		NAttrSetInitialized(na);
380 	}
381 }
382 
383 /**
384  * ntfs_attr_open - open an ntfs attribute for access
385  * @ni:		open ntfs inode in which the ntfs attribute resides
386  * @type:	attribute type
387  * @name:	attribute name in little endian Unicode or AT_UNNAMED or NULL
388  * @name_len:	length of attribute @name in Unicode characters (if @name given)
389  *
390  * Allocate a new ntfs attribute structure, initialize it with @ni, @type,
391  * @name, and @name_len, then return it. Return NULL on error with
392  * errno set to the error code.
393  *
394  * If @name is AT_UNNAMED look specifically for an unnamed attribute.  If you
395  * do not care whether the attribute is named or not set @name to NULL.  In
396  * both those cases @name_len is not used at all.
397  */
398 ntfs_attr *ntfs_attr_open(ntfs_inode *ni, const ATTR_TYPES type,
399 		ntfschar *name, u32 name_len)
400 {
401 	ntfs_attr_search_ctx *ctx;
402 	ntfs_attr *na = NULL;
403 	ntfschar *newname = NULL;
404 	ATTR_RECORD *a;
405 	le16 cs;
406 
407 	ntfs_log_enter("Entering for inode %lld, attr 0x%x.\n",
408 		       (unsigned long long)ni->mft_no, type);
409 
410 	if (!ni || !ni->vol || !ni->mrec) {
411 		errno = EINVAL;
412 		goto out;
413 	}
414 	na = ntfs_calloc(sizeof(ntfs_attr));
415 	if (!na)
416 		goto out;
417 	if (name && name != AT_UNNAMED && name != NTFS_INDEX_I30) {
418 		name = ntfs_ucsndup(name, name_len);
419 		if (!name)
420 			goto err_out;
421 		newname = name;
422 	}
423 
424 	ctx = ntfs_attr_get_search_ctx(ni, NULL);
425 	if (!ctx)
426 		goto err_out;
427 
428 	if (ntfs_attr_lookup(type, name, name_len, 0, 0, NULL, 0, ctx))
429 		goto put_err_out;
430 
431 	a = ctx->attr;
432 
433 	if (!name) {
434 		if (a->name_length) {
435 			name = ntfs_ucsndup((ntfschar*)((u8*)a + le16_to_cpu(
436 					a->name_offset)), a->name_length);
437 			if (!name)
438 				goto put_err_out;
439 			newname = name;
440 			name_len = a->name_length;
441 		} else {
442 			name = AT_UNNAMED;
443 			name_len = 0;
444 		}
445 	}
446 
447 	__ntfs_attr_init(na, ni, type, name, name_len);
448 
449 	/*
450 	 * Wipe the flags in case they are not zero for an attribute list
451 	 * attribute.  Windows does not complain about invalid flags and chkdsk
452 	 * does not detect or fix them so we need to cope with it, too.
453 	 */
454 	if (type == AT_ATTRIBUTE_LIST)
455 		a->flags = 0;
456 
457 	if ((type == AT_DATA) && !a->initialized_size) {
458 		/*
459 		 * Define/redefine the compression state if stream is
460 		 * empty, based on the compression mark on parent
461 		 * directory (for unnamed data streams) or on current
462 		 * inode (for named data streams). The compression mark
463 		 * may change any time, the compression state can only
464 		 * change when stream is wiped out.
465 		 *
466 		 * Also prevent compression on NTFS version < 3.0
467 		 * or cluster size > 4K or compression is disabled
468 		 */
469 		a->flags &= ~ATTR_COMPRESSION_MASK;
470 		if ((ni->flags & FILE_ATTR_COMPRESSED)
471 		    && (ni->vol->major_ver >= 3)
472 		    && NVolCompression(ni->vol)
473 		    && (ni->vol->cluster_size <= MAX_COMPRESSION_CLUSTER_SIZE))
474 			a->flags |= ATTR_IS_COMPRESSED;
475 	}
476 
477 	cs = a->flags & (ATTR_IS_COMPRESSED | ATTR_IS_SPARSE);
478 
479 	/* a file may be sparse though its unnamed data is not (cf $UsnJrnl) */
480 	if (na->type == AT_DATA && na->name == AT_UNNAMED &&
481 	    (((a->flags & ATTR_IS_SPARSE)     && !NAttrSparse(na)) ||
482 	     (!(a->flags & ATTR_IS_ENCRYPTED)  != !NAttrEncrypted(na)))) {
483 		errno = EIO;
484 		ntfs_log_perror("Inode %lld has corrupt attribute flags "
485 				"(0x%x <> 0x%x)",(unsigned long long)ni->mft_no,
486 				a->flags, na->ni->flags);
487 		goto put_err_out;
488 	}
489 
490 	if (a->non_resident) {
491 		if ((a->flags & ATTR_COMPRESSION_MASK)
492 				 && !a->compression_unit) {
493 			errno = EIO;
494 			ntfs_log_perror("Compressed inode %lld attr 0x%x has "
495 					"no compression unit",
496 					(unsigned long long)ni->mft_no, type);
497 			goto put_err_out;
498 		}
499 		ntfs_attr_init(na, TRUE, a->flags,
500 				a->flags & ATTR_IS_ENCRYPTED,
501 				a->flags & ATTR_IS_SPARSE,
502 				sle64_to_cpu(a->allocated_size),
503 				sle64_to_cpu(a->data_size),
504 				sle64_to_cpu(a->initialized_size),
505 				cs ? sle64_to_cpu(a->compressed_size) : 0,
506 				cs ? a->compression_unit : 0);
507 	} else {
508 		s64 l = le32_to_cpu(a->value_length);
509 		ntfs_attr_init(na, FALSE, a->flags,
510 				a->flags & ATTR_IS_ENCRYPTED,
511 				a->flags & ATTR_IS_SPARSE, (l + 7) & ~7, l, l,
512 				cs ? (l + 7) & ~7 : 0, 0);
513 	}
514 	ntfs_attr_put_search_ctx(ctx);
515 out:
516 	ntfs_log_leave("\n");
517 	return na;
518 
519 put_err_out:
520 	ntfs_attr_put_search_ctx(ctx);
521 err_out:
522 	free(newname);
523 	free(na);
524 	na = NULL;
525 	goto out;
526 }
527 
528 /**
529  * ntfs_attr_close - free an ntfs attribute structure
530  * @na:		ntfs attribute structure to free
531  *
532  * Release all memory associated with the ntfs attribute @na and then release
533  * @na itself.
534  */
535 void ntfs_attr_close(ntfs_attr *na)
536 {
537 	if (!na)
538 		return;
539 	if (NAttrNonResident(na) && na->rl)
540 		free(na->rl);
541 	/* Don't release if using an internal constant. */
542 	if (na->name != AT_UNNAMED && na->name != NTFS_INDEX_I30
543 				&& na->name != STREAM_SDS)
544 		free(na->name);
545 	free(na);
546 }
547 
548 /**
549  * ntfs_attr_map_runlist - map (a part of) a runlist of an ntfs attribute
550  * @na:		ntfs attribute for which to map (part of) a runlist
551  * @vcn:	map runlist part containing this vcn
552  *
553  * Map the part of a runlist containing the @vcn of the ntfs attribute @na.
554  *
555  * Return 0 on success and -1 on error with errno set to the error code.
556  */
557 int ntfs_attr_map_runlist(ntfs_attr *na, VCN vcn)
558 {
559 	LCN lcn;
560 	ntfs_attr_search_ctx *ctx;
561 
562 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x, vcn 0x%llx.\n",
563 		(unsigned long long)na->ni->mft_no, na->type, (long long)vcn);
564 
565 	lcn = ntfs_rl_vcn_to_lcn(na->rl, vcn);
566 	if (lcn >= 0 || lcn == LCN_HOLE || lcn == LCN_ENOENT)
567 		return 0;
568 
569 	ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
570 	if (!ctx)
571 		return -1;
572 
573 	/* Find the attribute in the mft record. */
574 	if (!ntfs_attr_lookup(na->type, na->name, na->name_len, CASE_SENSITIVE,
575 			vcn, NULL, 0, ctx)) {
576 		runlist_element *rl;
577 
578 		/* Decode the runlist. */
579 		rl = ntfs_mapping_pairs_decompress(na->ni->vol, ctx->attr,
580 				na->rl);
581 		if (rl) {
582 			na->rl = rl;
583 			ntfs_attr_put_search_ctx(ctx);
584 			return 0;
585 		}
586 	}
587 
588 	ntfs_attr_put_search_ctx(ctx);
589 	return -1;
590 }
591 
592 #if PARTIAL_RUNLIST_UPDATING
593 
594 /*
595  *		Map the runlist of an attribute from some point to the end
596  *
597  *	Returns 0 if success,
598  *		-1 if it failed (errno telling why)
599  */
600 
601 static int ntfs_attr_map_partial_runlist(ntfs_attr *na, VCN vcn)
602 {
603 	LCN lcn;
604 	VCN last_vcn;
605 	VCN highest_vcn;
606 	VCN needed;
607 	VCN existing_vcn;
608 	runlist_element *rl;
609 	ATTR_RECORD *a;
610 	BOOL startseen;
611 	ntfs_attr_search_ctx *ctx;
612 
613 	lcn = ntfs_rl_vcn_to_lcn(na->rl, vcn);
614 	if (lcn >= 0 || lcn == LCN_HOLE || lcn == LCN_ENOENT)
615 		return 0;
616 
617 	existing_vcn = (na->rl ? na->rl->vcn : -1);
618 
619 	ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
620 	if (!ctx)
621 		return -1;
622 
623 	/* Get the last vcn in the attribute. */
624 	last_vcn = na->allocated_size >> na->ni->vol->cluster_size_bits;
625 
626 	needed = vcn;
627 	highest_vcn = 0;
628 	startseen = FALSE;
629 	do {
630 		/* Find the attribute in the mft record. */
631 		if (!ntfs_attr_lookup(na->type, na->name, na->name_len, CASE_SENSITIVE,
632 				needed, NULL, 0, ctx)) {
633 
634 			a = ctx->attr;
635 			/* Decode and merge the runlist. */
636 			rl = ntfs_mapping_pairs_decompress(na->ni->vol, a,
637 					na->rl);
638 			if (rl) {
639 				na->rl = rl;
640 				highest_vcn = le64_to_cpu(a->highest_vcn);
641 				/* corruption detection */
642 				if (((highest_vcn + 1) < last_vcn)
643 				    && ((highest_vcn + 1) <= needed)) {
644 					ntfs_log_error("Corrupt attribute list\n");
645 					rl = (runlist_element*)NULL;
646 				}
647 				needed = highest_vcn + 1;
648 				if (!a->lowest_vcn)
649 					startseen = TRUE;
650 				/* reaching a previously allocated part ? */
651 				if ((existing_vcn >= 0)
652 				    && (needed >= existing_vcn)) {
653 					needed = last_vcn;
654 				}
655 			}
656 		} else
657 			rl = (runlist_element*)NULL;
658 	} while (rl && (needed < last_vcn));
659 	ntfs_attr_put_search_ctx(ctx);
660 		/* mark fully mapped if we did so */
661 	if (rl && startseen)
662 		NAttrSetFullyMapped(na);
663 	return (rl ? 0 : -1);
664 }
665 
666 #endif
667 
668 /**
669  * ntfs_attr_map_whole_runlist - map the whole runlist of an ntfs attribute
670  * @na:		ntfs attribute for which to map the runlist
671  *
672  * Map the whole runlist of the ntfs attribute @na.  For an attribute made up
673  * of only one attribute extent this is the same as calling
674  * ntfs_attr_map_runlist(na, 0) but for an attribute with multiple extents this
675  * will map the runlist fragments from each of the extents thus giving access
676  * to the entirety of the disk allocation of an attribute.
677  *
678  * Return 0 on success and -1 on error with errno set to the error code.
679  */
680 int ntfs_attr_map_whole_runlist(ntfs_attr *na)
681 {
682 	VCN next_vcn, last_vcn, highest_vcn;
683 	ntfs_attr_search_ctx *ctx;
684 	ntfs_volume *vol = na->ni->vol;
685 	ATTR_RECORD *a;
686 	int ret = -1;
687 
688 	ntfs_log_enter("Entering for inode %llu, attr 0x%x.\n",
689 		       (unsigned long long)na->ni->mft_no, na->type);
690 
691 		/* avoid multiple full runlist mappings */
692 	if (NAttrFullyMapped(na)) {
693 		ret = 0;
694 		goto out;
695 	}
696 	ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
697 	if (!ctx)
698 		goto out;
699 
700 	/* Map all attribute extents one by one. */
701 	next_vcn = last_vcn = highest_vcn = 0;
702 	a = NULL;
703 	while (1) {
704 		runlist_element *rl;
705 
706 		int not_mapped = 0;
707 		if (ntfs_rl_vcn_to_lcn(na->rl, next_vcn) == LCN_RL_NOT_MAPPED)
708 			not_mapped = 1;
709 
710 		if (ntfs_attr_lookup(na->type, na->name, na->name_len,
711 				CASE_SENSITIVE, next_vcn, NULL, 0, ctx))
712 			break;
713 
714 		a = ctx->attr;
715 
716 		if (not_mapped) {
717 			/* Decode the runlist. */
718 			rl = ntfs_mapping_pairs_decompress(na->ni->vol,
719 								a, na->rl);
720 			if (!rl)
721 				goto err_out;
722 			na->rl = rl;
723 		}
724 
725 		/* Are we in the first extent? */
726 		if (!next_vcn) {
727 			 if (a->lowest_vcn) {
728 				 errno = EIO;
729 				 ntfs_log_perror("First extent of inode %llu "
730 					"attribute has non-zero lowest_vcn",
731 					(unsigned long long)na->ni->mft_no);
732 				 goto err_out;
733 			}
734 			/* Get the last vcn in the attribute. */
735 			last_vcn = sle64_to_cpu(a->allocated_size) >>
736 					vol->cluster_size_bits;
737 		}
738 
739 		/* Get the lowest vcn for the next extent. */
740 		highest_vcn = sle64_to_cpu(a->highest_vcn);
741 		next_vcn = highest_vcn + 1;
742 
743 		/* Only one extent or error, which we catch below. */
744 		if (next_vcn <= 0) {
745 			errno = ENOENT;
746 			break;
747 		}
748 
749 		/* Avoid endless loops due to corruption. */
750 		if (next_vcn < sle64_to_cpu(a->lowest_vcn)) {
751 			errno = EIO;
752 			ntfs_log_perror("Inode %llu has corrupt attribute list",
753 					(unsigned long long)na->ni->mft_no);
754 			goto err_out;
755 		}
756 	}
757 	if (!a) {
758 		ntfs_log_perror("Couldn't find attribute for runlist mapping");
759 		goto err_out;
760 	}
761 	if (highest_vcn && highest_vcn != last_vcn - 1) {
762 		errno = EIO;
763 		ntfs_log_perror("Failed to load full runlist: inode: %llu "
764 				"highest_vcn: 0x%llx last_vcn: 0x%llx",
765 				(unsigned long long)na->ni->mft_no,
766 				(long long)highest_vcn, (long long)last_vcn);
767 		goto err_out;
768 	}
769 	if (errno == ENOENT) {
770 		NAttrSetFullyMapped(na);
771 		ret = 0;
772 	}
773 err_out:
774 	ntfs_attr_put_search_ctx(ctx);
775 out:
776 	ntfs_log_leave("\n");
777 	return ret;
778 }
779 
780 /**
781  * ntfs_attr_vcn_to_lcn - convert a vcn into a lcn given an ntfs attribute
782  * @na:		ntfs attribute whose runlist to use for conversion
783  * @vcn:	vcn to convert
784  *
785  * Convert the virtual cluster number @vcn of an attribute into a logical
786  * cluster number (lcn) of a device using the runlist @na->rl to map vcns to
787  * their corresponding lcns.
788  *
789  * If the @vcn is not mapped yet, attempt to map the attribute extent
790  * containing the @vcn and retry the vcn to lcn conversion.
791  *
792  * Since lcns must be >= 0, we use negative return values with special meaning:
793  *
794  * Return value		Meaning / Description
795  * ==========================================
796  *  -1 = LCN_HOLE	Hole / not allocated on disk.
797  *  -3 = LCN_ENOENT	There is no such vcn in the attribute.
798  *  -4 = LCN_EINVAL	Input parameter error.
799  *  -5 = LCN_EIO	Corrupt fs, disk i/o error, or not enough memory.
800  */
801 LCN ntfs_attr_vcn_to_lcn(ntfs_attr *na, const VCN vcn)
802 {
803 	LCN lcn;
804 	BOOL is_retry = FALSE;
805 
806 	if (!na || !NAttrNonResident(na) || vcn < 0)
807 		return (LCN)LCN_EINVAL;
808 
809 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x.\n", (unsigned long
810 			long)na->ni->mft_no, na->type);
811 retry:
812 	/* Convert vcn to lcn. If that fails map the runlist and retry once. */
813 	lcn = ntfs_rl_vcn_to_lcn(na->rl, vcn);
814 	if (lcn >= 0)
815 		return lcn;
816 	if (!is_retry && !ntfs_attr_map_runlist(na, vcn)) {
817 		is_retry = TRUE;
818 		goto retry;
819 	}
820 	/*
821 	 * If the attempt to map the runlist failed, or we are getting
822 	 * LCN_RL_NOT_MAPPED despite having mapped the attribute extent
823 	 * successfully, something is really badly wrong...
824 	 */
825 	if (!is_retry || lcn == (LCN)LCN_RL_NOT_MAPPED)
826 		return (LCN)LCN_EIO;
827 	/* lcn contains the appropriate error code. */
828 	return lcn;
829 }
830 
831 /**
832  * ntfs_attr_find_vcn - find a vcn in the runlist of an ntfs attribute
833  * @na:		ntfs attribute whose runlist to search
834  * @vcn:	vcn to find
835  *
836  * Find the virtual cluster number @vcn in the runlist of the ntfs attribute
837  * @na and return the the address of the runlist element containing the @vcn.
838  *
839  * Note you need to distinguish between the lcn of the returned runlist
840  * element being >= 0 and LCN_HOLE. In the later case you have to return zeroes
841  * on read and allocate clusters on write. You need to update the runlist, the
842  * attribute itself as well as write the modified mft record to disk.
843  *
844  * If there is an error return NULL with errno set to the error code. The
845  * following error codes are defined:
846  *	EINVAL		Input parameter error.
847  *	ENOENT		There is no such vcn in the runlist.
848  *	ENOMEM		Not enough memory.
849  *	EIO		I/O error or corrupt metadata.
850  */
851 runlist_element *ntfs_attr_find_vcn(ntfs_attr *na, const VCN vcn)
852 {
853 	runlist_element *rl;
854 	BOOL is_retry = FALSE;
855 
856 	if (!na || !NAttrNonResident(na) || vcn < 0) {
857 		errno = EINVAL;
858 		return NULL;
859 	}
860 
861 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x, vcn %llx\n",
862 		       (unsigned long long)na->ni->mft_no, na->type,
863 		       (long long)vcn);
864 retry:
865 	rl = na->rl;
866 	if (!rl)
867 		goto map_rl;
868 	if (vcn < rl[0].vcn)
869 		goto map_rl;
870 	while (rl->length) {
871 		if (vcn < rl[1].vcn) {
872 			if (rl->lcn >= (LCN)LCN_HOLE)
873 				return rl;
874 			break;
875 		}
876 		rl++;
877 	}
878 	switch (rl->lcn) {
879 	case (LCN)LCN_RL_NOT_MAPPED:
880 		goto map_rl;
881 	case (LCN)LCN_ENOENT:
882 		errno = ENOENT;
883 		break;
884 	case (LCN)LCN_EINVAL:
885 		errno = EINVAL;
886 		break;
887 	default:
888 		errno = EIO;
889 		break;
890 	}
891 	return NULL;
892 map_rl:
893 	/* The @vcn is in an unmapped region, map the runlist and retry. */
894 	if (!is_retry && !ntfs_attr_map_runlist(na, vcn)) {
895 		is_retry = TRUE;
896 		goto retry;
897 	}
898 	/*
899 	 * If we already retried or the mapping attempt failed something has
900 	 * gone badly wrong. EINVAL and ENOENT coming from a failed mapping
901 	 * attempt are equivalent to errors for us as they should not happen
902 	 * in our code paths.
903 	 */
904 	if (is_retry || errno == EINVAL || errno == ENOENT)
905 		errno = EIO;
906 	return NULL;
907 }
908 
909 /**
910  * ntfs_attr_pread_i - see description at ntfs_attr_pread()
911  */
912 static s64 ntfs_attr_pread_i(ntfs_attr *na, const s64 pos, s64 count, void *b)
913 {
914 	s64 br, to_read, ofs, total, total2, max_read, max_init;
915 	ntfs_volume *vol;
916 	runlist_element *rl;
917 	u16 efs_padding_length;
918 
919 	/* Sanity checking arguments is done in ntfs_attr_pread(). */
920 
921 	if ((na->data_flags & ATTR_COMPRESSION_MASK) && NAttrNonResident(na)) {
922 		if ((na->data_flags & ATTR_COMPRESSION_MASK)
923 		    == ATTR_IS_COMPRESSED)
924 			return ntfs_compressed_attr_pread(na, pos, count, b);
925 		else {
926 				/* compression mode not supported */
927 			errno = EOPNOTSUPP;
928 			return -1;
929 		}
930 	}
931 	/*
932 	 * Encrypted non-resident attributes are not supported.  We return
933 	 * access denied, which is what Windows NT4 does, too.
934 	 * However, allow if mounted with efs_raw option
935 	 */
936 	vol = na->ni->vol;
937 	if (!vol->efs_raw && NAttrEncrypted(na) && NAttrNonResident(na)) {
938 		errno = EACCES;
939 		return -1;
940 	}
941 
942 	if (!count)
943 		return 0;
944 		/*
945 		 * Truncate reads beyond end of attribute,
946 		 * but round to next 512 byte boundary for encrypted
947 		 * attributes with efs_raw mount option
948 		 */
949 	max_read = na->data_size;
950 	max_init = na->initialized_size;
951 	if (na->ni->vol->efs_raw
952 	    && (na->data_flags & ATTR_IS_ENCRYPTED)
953 	    && NAttrNonResident(na)) {
954 		if (na->data_size != na->initialized_size) {
955 			ntfs_log_error("uninitialized encrypted file not supported\n");
956 			errno = EINVAL;
957 			return -1;
958 		}
959 		max_init = max_read = ((na->data_size + 511) & ~511) + 2;
960 	}
961 	if (pos + count > max_read) {
962 		if (pos >= max_read)
963 			return 0;
964 		count = max_read - pos;
965 	}
966 	/* If it is a resident attribute, get the value from the mft record. */
967 	if (!NAttrNonResident(na)) {
968 		ntfs_attr_search_ctx *ctx;
969 		char *val;
970 
971 		ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
972 		if (!ctx)
973 			return -1;
974 		if (ntfs_attr_lookup(na->type, na->name, na->name_len, 0,
975 				0, NULL, 0, ctx)) {
976 res_err_out:
977 			ntfs_attr_put_search_ctx(ctx);
978 			return -1;
979 		}
980 		val = (char*)ctx->attr + le16_to_cpu(ctx->attr->value_offset);
981 		if (val < (char*)ctx->attr || val +
982 				le32_to_cpu(ctx->attr->value_length) >
983 				(char*)ctx->mrec + vol->mft_record_size) {
984 			errno = EIO;
985 			ntfs_log_perror("%s: Sanity check failed", __FUNCTION__);
986 			goto res_err_out;
987 		}
988 		memcpy(b, val + pos, count);
989 		ntfs_attr_put_search_ctx(ctx);
990 		return count;
991 	}
992 	total = total2 = 0;
993 	/* Zero out reads beyond initialized size. */
994 	if (pos + count > max_init) {
995 		if (pos >= max_init) {
996 			memset(b, 0, count);
997 			return count;
998 		}
999 		total2 = pos + count - max_init;
1000 		count -= total2;
1001 		memset((u8*)b + count, 0, total2);
1002 	}
1003 		/*
1004 		 * for encrypted non-resident attributes with efs_raw set
1005 		 * the last two bytes aren't read from disk but contain
1006 		 * the number of padding bytes so original size can be
1007 		 * restored
1008 		 */
1009 	if (na->ni->vol->efs_raw &&
1010 			(na->data_flags & ATTR_IS_ENCRYPTED) &&
1011 			((pos + count) > max_init-2)) {
1012 		efs_padding_length = 511 - ((na->data_size - 1) & 511);
1013 		if (pos+count == max_init) {
1014 			if (count == 1) {
1015 				*((u8*)b+count-1) = (u8)(efs_padding_length >> 8);
1016 				count--;
1017 				total2++;
1018 			} else {
1019 				*(u16*)((u8*)b+count-2) = cpu_to_le16(efs_padding_length);
1020 				count -= 2;
1021 				total2 +=2;
1022 			}
1023 		} else {
1024 			*((u8*)b+count-1) = (u8)(efs_padding_length & 0xff);
1025 			count--;
1026 			total2++;
1027 		}
1028 	}
1029 
1030 	/* Find the runlist element containing the vcn. */
1031 	rl = ntfs_attr_find_vcn(na, pos >> vol->cluster_size_bits);
1032 	if (!rl) {
1033 		/*
1034 		 * If the vcn is not present it is an out of bounds read.
1035 		 * However, we already truncated the read to the data_size,
1036 		 * so getting this here is an error.
1037 		 */
1038 		if (errno == ENOENT) {
1039 			errno = EIO;
1040 			ntfs_log_perror("%s: Failed to find VCN #1", __FUNCTION__);
1041 		}
1042 		return -1;
1043 	}
1044 	/*
1045 	 * Gather the requested data into the linear destination buffer. Note,
1046 	 * a partial final vcn is taken care of by the @count capping of read
1047 	 * length.
1048 	 */
1049 	ofs = pos - (rl->vcn << vol->cluster_size_bits);
1050 	for (; count; rl++, ofs = 0) {
1051 		if (rl->lcn == LCN_RL_NOT_MAPPED) {
1052 			rl = ntfs_attr_find_vcn(na, rl->vcn);
1053 			if (!rl) {
1054 				if (errno == ENOENT) {
1055 					errno = EIO;
1056 					ntfs_log_perror("%s: Failed to find VCN #2",
1057 							__FUNCTION__);
1058 				}
1059 				goto rl_err_out;
1060 			}
1061 			/* Needed for case when runs merged. */
1062 			ofs = pos + total - (rl->vcn << vol->cluster_size_bits);
1063 		}
1064 		if (!rl->length) {
1065 			errno = EIO;
1066 			ntfs_log_perror("%s: Zero run length", __FUNCTION__);
1067 			goto rl_err_out;
1068 		}
1069 		if (rl->lcn < (LCN)0) {
1070 			if (rl->lcn != (LCN)LCN_HOLE) {
1071 				ntfs_log_perror("%s: Bad run (%lld)",
1072 						__FUNCTION__,
1073 						(long long)rl->lcn);
1074 				goto rl_err_out;
1075 			}
1076 			/* It is a hole, just zero the matching @b range. */
1077 			to_read = min(count, (rl->length <<
1078 					vol->cluster_size_bits) - ofs);
1079 			memset(b, 0, to_read);
1080 			/* Update progress counters. */
1081 			total += to_read;
1082 			count -= to_read;
1083 			b = (u8*)b + to_read;
1084 			continue;
1085 		}
1086 		/* It is a real lcn, read it into @dst. */
1087 		to_read = min(count, (rl->length << vol->cluster_size_bits) -
1088 				ofs);
1089 retry:
1090 		ntfs_log_trace("Reading %lld bytes from vcn %lld, lcn %lld, ofs"
1091 				" %lld.\n", (long long)to_read, (long long)rl->vcn,
1092 			       (long long )rl->lcn, (long long)ofs);
1093 		br = ntfs_pread(vol->dev, (rl->lcn << vol->cluster_size_bits) +
1094 				ofs, to_read, b);
1095 		/* If everything ok, update progress counters and continue. */
1096 		if (br > 0) {
1097 			total += br;
1098 			count -= br;
1099 			b = (u8*)b + br;
1100 		}
1101 		if (br == to_read)
1102 			continue;
1103 		/* If the syscall was interrupted, try again. */
1104 		if (br == (s64)-1 && errno == EINTR)
1105 			goto retry;
1106 		if (total)
1107 			return total;
1108 		if (!br)
1109 			errno = EIO;
1110 		ntfs_log_perror("%s: ntfs_pread failed", __FUNCTION__);
1111 		return -1;
1112 	}
1113 	/* Finally, return the number of bytes read. */
1114 	return total + total2;
1115 rl_err_out:
1116 	if (total)
1117 		return total;
1118 	errno = EIO;
1119 	return -1;
1120 }
1121 
1122 /**
1123  * ntfs_attr_pread - read from an attribute specified by an ntfs_attr structure
1124  * @na:		ntfs attribute to read from
1125  * @pos:	byte position in the attribute to begin reading from
1126  * @count:	number of bytes to read
1127  * @b:		output data buffer
1128  *
1129  * This function will read @count bytes starting at offset @pos from the ntfs
1130  * attribute @na into the data buffer @b.
1131  *
1132  * On success, return the number of successfully read bytes. If this number is
1133  * lower than @count this means that the read reached end of file or that an
1134  * error was encountered during the read so that the read is partial. 0 means
1135  * end of file or nothing was read (also return 0 when @count is 0).
1136  *
1137  * On error and nothing has been read, return -1 with errno set appropriately
1138  * to the return code of ntfs_pread(), or to EINVAL in case of invalid
1139  * arguments.
1140  */
1141 s64 ntfs_attr_pread(ntfs_attr *na, const s64 pos, s64 count, void *b)
1142 {
1143 	s64 ret;
1144 
1145 	if (!na || !na->ni || !na->ni->vol || !b || pos < 0 || count < 0) {
1146 		errno = EINVAL;
1147 		ntfs_log_perror("%s: na=%p  b=%p  pos=%lld  count=%lld",
1148 				__FUNCTION__, na, b, (long long)pos,
1149 				(long long)count);
1150 		return -1;
1151 	}
1152 
1153 	ntfs_log_enter("Entering for inode %lld attr 0x%x pos %lld count "
1154 		       "%lld\n", (unsigned long long)na->ni->mft_no,
1155 		       na->type, (long long)pos, (long long)count);
1156 
1157 	ret = ntfs_attr_pread_i(na, pos, count, b);
1158 
1159 	ntfs_log_leave("\n");
1160 	return ret;
1161 }
1162 
1163 static int ntfs_attr_fill_zero(ntfs_attr *na, s64 pos, s64 count)
1164 {
1165 	char *buf;
1166 	s64 written, size, end = pos + count;
1167 	s64 ofsi;
1168 	const runlist_element *rli;
1169 	ntfs_volume *vol;
1170 	int ret = -1;
1171 
1172 	ntfs_log_trace("pos %lld, count %lld\n", (long long)pos,
1173 		       (long long)count);
1174 
1175 	if (!na || pos < 0 || count < 0) {
1176 		errno = EINVAL;
1177 		goto err_out;
1178 	}
1179 
1180 	buf = ntfs_calloc(NTFS_BUF_SIZE);
1181 	if (!buf)
1182 		goto err_out;
1183 
1184 	rli = na->rl;
1185 	ofsi = 0;
1186 	vol = na->ni->vol;
1187 	while (pos < end) {
1188 		while (rli->length && (ofsi + (rli->length <<
1189 	                        vol->cluster_size_bits) <= pos)) {
1190 	                ofsi += (rli->length << vol->cluster_size_bits);
1191 			rli++;
1192 		}
1193 		size = min(end - pos, NTFS_BUF_SIZE);
1194 			/*
1195 			 * If the zeroed block is fully within a hole,
1196 			 * we need not write anything, so advance as far
1197 			 * as possible within the hole.
1198 			 */
1199 		if ((rli->lcn == (LCN)LCN_HOLE)
1200 		    && (ofsi <= pos)
1201 		    && (ofsi + (rli->length << vol->cluster_size_bits)
1202 				>= (pos + size))) {
1203 			size = min(end - pos, ofsi - pos
1204 				+ (rli->length << vol->cluster_size_bits));
1205 			pos += size;
1206 		} else {
1207 			written = ntfs_rl_pwrite(vol, rli, ofsi, pos,
1208 							size, buf);
1209 			if (written <= 0) {
1210 				ntfs_log_perror("Failed to zero space");
1211 				goto err_free;
1212 			}
1213 			pos += written;
1214 		}
1215 	}
1216 
1217 	ret = 0;
1218 err_free:
1219 	free(buf);
1220 err_out:
1221 	return ret;
1222 }
1223 
1224 static int ntfs_attr_fill_hole(ntfs_attr *na, s64 count, s64 *ofs,
1225 			       runlist_element **rl, VCN *update_from)
1226 {
1227 	s64 to_write;
1228 	s64 need;
1229 	ntfs_volume *vol = na->ni->vol;
1230 	int eo, ret = -1;
1231 	runlist *rlc;
1232 	LCN lcn_seek_from = -1;
1233 	VCN cur_vcn, from_vcn;
1234 
1235 	to_write = min(count, ((*rl)->length << vol->cluster_size_bits) - *ofs);
1236 
1237 	cur_vcn = (*rl)->vcn;
1238 	from_vcn = (*rl)->vcn + (*ofs >> vol->cluster_size_bits);
1239 
1240 	ntfs_log_trace("count: %lld, cur_vcn: %lld, from: %lld, to: %lld, ofs: "
1241 		       "%lld\n", (long long)count, (long long)cur_vcn,
1242 		       (long long)from_vcn, (long long)to_write, (long long)*ofs);
1243 
1244 	/* Map the runlist to be able to update mapping pairs later. */
1245 #if PARTIAL_RUNLIST_UPDATING
1246 	if ((!na->rl
1247 	    || !NAttrDataAppending(na))) {
1248 		if (ntfs_attr_map_whole_runlist(na))
1249 			goto err_out;
1250 	} else {
1251 		/* make sure the previous non-hole is mapped */
1252 		rlc = *rl;
1253 		rlc--;
1254 		if (((*rl)->lcn == LCN_HOLE)
1255 		    && cur_vcn
1256 		    && (rlc->vcn < 0)) {
1257 			if (ntfs_attr_map_partial_runlist(na, cur_vcn - 1))
1258 				goto err_out;
1259 		}
1260 	}
1261 #else
1262 	if (ntfs_attr_map_whole_runlist(na))
1263 		goto err_out;
1264 #endif
1265 
1266 	/* Restore @*rl, it probably get lost during runlist mapping. */
1267 	*rl = ntfs_attr_find_vcn(na, cur_vcn);
1268 	if (!*rl) {
1269 		ntfs_log_error("Failed to find run after mapping runlist. "
1270 			       "Please report to %s.\n", NTFS_DEV_LIST);
1271 		errno = EIO;
1272 		goto err_out;
1273 	}
1274 
1275 	/* Search backwards to find the best lcn to start seek from. */
1276 	rlc = *rl;
1277 	while (rlc->vcn) {
1278 		rlc--;
1279 		if (rlc->lcn >= 0) {
1280 				/*
1281 				 * avoid fragmenting a compressed file
1282 				 * Windows does not do that, and that may
1283 				 * not be desirable for files which can
1284 				 * be updated
1285 				 */
1286 			if (na->data_flags & ATTR_COMPRESSION_MASK)
1287 				lcn_seek_from = rlc->lcn + rlc->length;
1288 			else
1289 				lcn_seek_from = rlc->lcn + (from_vcn - rlc->vcn);
1290 			break;
1291 		}
1292 	}
1293 	if (lcn_seek_from == -1) {
1294 		/* Backwards search failed, search forwards. */
1295 		rlc = *rl;
1296 		while (rlc->length) {
1297 			rlc++;
1298 			if (rlc->lcn >= 0) {
1299 				lcn_seek_from = rlc->lcn - (rlc->vcn - from_vcn);
1300 				if (lcn_seek_from < -1)
1301 					lcn_seek_from = -1;
1302 				break;
1303 			}
1304 		}
1305 	}
1306 
1307 	need = ((*ofs + to_write - 1) >> vol->cluster_size_bits)
1308 			 + 1 + (*rl)->vcn - from_vcn;
1309 	if ((na->data_flags & ATTR_COMPRESSION_MASK)
1310 	    && (need < na->compression_block_clusters)) {
1311 		/*
1312 		 * for a compressed file, be sure to allocate the full
1313 		 * compression block, as we may need space to decompress
1314 		 * existing compressed data.
1315 		 * So allocate the space common to compression block
1316 		 * and existing hole.
1317 		 */
1318 		VCN alloc_vcn;
1319 
1320 		if ((from_vcn & -na->compression_block_clusters) <= (*rl)->vcn)
1321 			alloc_vcn = (*rl)->vcn;
1322 		else
1323 			alloc_vcn = from_vcn & -na->compression_block_clusters;
1324 		need = (alloc_vcn | (na->compression_block_clusters - 1))
1325 			+ 1 - alloc_vcn;
1326 		if (need > (*rl)->length) {
1327 			ntfs_log_error("Cannot allocate %lld clusters"
1328 					" within a hole of %lld\n",
1329 					(long long)need,
1330 					(long long)(*rl)->length);
1331 			errno = EIO;
1332 			goto err_out;
1333 		}
1334 		rlc = ntfs_cluster_alloc(vol, alloc_vcn, need,
1335 				 lcn_seek_from, DATA_ZONE);
1336 	} else
1337 		rlc = ntfs_cluster_alloc(vol, from_vcn, need,
1338 				 lcn_seek_from, DATA_ZONE);
1339 	if (!rlc)
1340 		goto err_out;
1341 	if (na->data_flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE))
1342 		na->compressed_size += need << vol->cluster_size_bits;
1343 
1344 	*rl = ntfs_runlists_merge(na->rl, rlc);
1345 		/*
1346 		 * For a compressed attribute, we must be sure there are two
1347 		 * available entries, so reserve them before it gets too late.
1348 		 */
1349 	if (*rl && (na->data_flags & ATTR_COMPRESSION_MASK)) {
1350 		runlist_element *oldrl = na->rl;
1351 		na->rl = *rl;
1352 		*rl = ntfs_rl_extend(na,*rl,2);
1353 		if (!*rl) na->rl = oldrl; /* restore to original if failed */
1354 	}
1355 	if (!*rl) {
1356 		eo = errno;
1357 		ntfs_log_perror("Failed to merge runlists");
1358 		if (ntfs_cluster_free_from_rl(vol, rlc)) {
1359 			ntfs_log_perror("Failed to free hot clusters. "
1360 					"Please run chkdsk /f");
1361 		}
1362 		errno = eo;
1363 		goto err_out;
1364 	}
1365 	na->unused_runs = 2;
1366 	na->rl = *rl;
1367 	if ((*update_from == -1) || (from_vcn < *update_from))
1368 		*update_from = from_vcn;
1369 	*rl = ntfs_attr_find_vcn(na, cur_vcn);
1370 	if (!*rl) {
1371 		/*
1372 		 * It's definitely a BUG, if we failed to find @cur_vcn, because
1373 		 * we missed it during instantiating of the hole.
1374 		 */
1375 		ntfs_log_error("Failed to find run after hole instantiation. "
1376 			       "Please report to %s.\n", NTFS_DEV_LIST);
1377 		errno = EIO;
1378 		goto err_out;
1379 	}
1380 	/* If leaved part of the hole go to the next run. */
1381 	if ((*rl)->lcn < 0)
1382 		(*rl)++;
1383 	/* Now LCN shoudn't be less than 0. */
1384 	if ((*rl)->lcn < 0) {
1385 		ntfs_log_error("BUG! LCN is lesser than 0. "
1386 			       "Please report to the %s.\n", NTFS_DEV_LIST);
1387 		errno = EIO;
1388 		goto err_out;
1389 	}
1390 	if (*ofs) {
1391 		/* Clear non-sparse region from @cur_vcn to @*ofs. */
1392 		if (ntfs_attr_fill_zero(na, cur_vcn << vol->cluster_size_bits,
1393 					*ofs))
1394 			goto err_out;
1395 	}
1396 	if ((*rl)->vcn < cur_vcn) {
1397 		/*
1398 		 * Clusters that replaced hole are merged with
1399 		 * previous run, so we need to update offset.
1400 		 */
1401 		*ofs += (cur_vcn - (*rl)->vcn) << vol->cluster_size_bits;
1402 	}
1403 	if ((*rl)->vcn > cur_vcn) {
1404 		/*
1405 		 * We left part of the hole, so we need to update offset
1406 		 */
1407 		*ofs -= ((*rl)->vcn - cur_vcn) << vol->cluster_size_bits;
1408 	}
1409 
1410 	ret = 0;
1411 err_out:
1412 	return ret;
1413 }
1414 
1415 static int stuff_hole(ntfs_attr *na, const s64 pos);
1416 
1417 /*
1418  *		Split an existing hole for overwriting with data
1419  *	The hole may have to be split into two or three parts, so
1420  *	that the overwritten part fits within a single compression block
1421  *
1422  *	No cluster allocation is needed, this will be done later in
1423  *	standard hole filling, hence no need to reserve runs for
1424  *	future needs.
1425  *
1426  *	Returns the number of clusters with existing compressed data
1427  *		in the compression block to be written to
1428  *		(or the full block, if it was a full hole)
1429  *		-1 if there were an error
1430  */
1431 
1432 static int split_compressed_hole(ntfs_attr *na, runlist_element **prl,
1433     		s64 pos, s64 count, VCN *update_from)
1434 {
1435 	int compressed_part;
1436 	int cluster_size_bits = na->ni->vol->cluster_size_bits;
1437 	runlist_element *rl = *prl;
1438 
1439 	compressed_part
1440 		= na->compression_block_clusters;
1441 		/* reserve entries in runlist if we have to split */
1442 	if (rl->length > na->compression_block_clusters) {
1443 		*prl = ntfs_rl_extend(na,*prl,2);
1444 		if (!*prl) {
1445 			compressed_part = -1;
1446 		} else {
1447 			rl = *prl;
1448 			na->unused_runs = 2;
1449 		}
1450 	}
1451 	if (*prl && (rl->length > na->compression_block_clusters)) {
1452 		/*
1453 		 * Locate the update part relative to beginning of
1454 		 * current run
1455 		 */
1456 		int beginwrite = (pos >> cluster_size_bits) - rl->vcn;
1457 		s32 endblock = (((pos + count - 1) >> cluster_size_bits)
1458 			| (na->compression_block_clusters - 1)) + 1 - rl->vcn;
1459 
1460 		compressed_part = na->compression_block_clusters
1461 			- (rl->length & (na->compression_block_clusters - 1));
1462 		if ((beginwrite + compressed_part) >= na->compression_block_clusters)
1463 			compressed_part = na->compression_block_clusters;
1464 			/*
1465 			 * if the run ends beyond end of needed block
1466 			 * we have to split the run
1467 			 */
1468 		if (endblock < rl[0].length) {
1469 			runlist_element *xrl;
1470 			int n;
1471 
1472 			/*
1473 			 * we have to split into three parts if the run
1474 			 * does not end within the first compression block.
1475 			 * This means the hole begins before the
1476 			 * compression block.
1477 			 */
1478 			if (endblock > na->compression_block_clusters) {
1479 				if (na->unused_runs < 2) {
1480 ntfs_log_error("No free run, case 1\n");
1481 				}
1482 				na->unused_runs -= 2;
1483 				xrl = rl;
1484 				n = 0;
1485 				while (xrl->length) {
1486 					xrl++;
1487 					n++;
1488 				}
1489 				do {
1490 					xrl[2] = *xrl;
1491 					xrl--;
1492 				} while (xrl != rl);
1493 				rl[1].length = na->compression_block_clusters;
1494 				rl[2].length = rl[0].length - endblock;
1495 				rl[0].length = endblock
1496 					- na->compression_block_clusters;
1497 				rl[1].lcn = LCN_HOLE;
1498 				rl[2].lcn = LCN_HOLE;
1499 				rl[1].vcn = rl[0].vcn + rl[0].length;
1500 				rl[2].vcn = rl[1].vcn
1501 					+ na->compression_block_clusters;
1502 				rl = ++(*prl);
1503 			} else {
1504 				/*
1505 				 * split into two parts and use the
1506 				 * first one
1507 				 */
1508 				if (!na->unused_runs) {
1509 ntfs_log_error("No free run, case 2\n");
1510 				}
1511 				na->unused_runs--;
1512 				xrl = rl;
1513 				n = 0;
1514 				while (xrl->length) {
1515 					xrl++;
1516 					n++;
1517 				}
1518 				do {
1519 					xrl[1] = *xrl;
1520 					xrl--;
1521 				} while (xrl != rl);
1522 				if (beginwrite < endblock) {
1523 					/* we will write into the first part of hole */
1524 					rl[1].length = rl[0].length - endblock;
1525 					rl[0].length = endblock;
1526 					rl[1].vcn = rl[0].vcn + rl[0].length;
1527 					rl[1].lcn = LCN_HOLE;
1528 				} else {
1529 					/* we will write into the second part of hole */
1530 // impossible ?
1531 					rl[1].length = rl[0].length - endblock;
1532 					rl[0].length = endblock;
1533 					rl[1].vcn = rl[0].vcn + rl[0].length;
1534 					rl[1].lcn = LCN_HOLE;
1535 					rl = ++(*prl);
1536 				}
1537 			}
1538 		} else {
1539 			if (rl[1].length) {
1540 				runlist_element *xrl;
1541 				int n;
1542 
1543 				/*
1544 				 * split into two parts and use the
1545 				 * last one
1546 				 */
1547 				if (!na->unused_runs) {
1548 ntfs_log_error("No free run, case 4\n");
1549 				}
1550 				na->unused_runs--;
1551 				xrl = rl;
1552 				n = 0;
1553 				while (xrl->length) {
1554 					xrl++;
1555 					n++;
1556 				}
1557 				do {
1558 					xrl[1] = *xrl;
1559 					xrl--;
1560 				} while (xrl != rl);
1561 			} else {
1562 				rl[2].lcn = rl[1].lcn;
1563 				rl[2].vcn = rl[1].vcn;
1564 				rl[2].length = rl[1].length;
1565 			}
1566 			rl[1].vcn -= na->compression_block_clusters;
1567 			rl[1].lcn = LCN_HOLE;
1568 			rl[1].length = na->compression_block_clusters;
1569 			rl[0].length -= na->compression_block_clusters;
1570 			if (pos >= (rl[1].vcn << cluster_size_bits)) {
1571 				rl = ++(*prl);
1572 			}
1573 		}
1574 	if ((*update_from == -1) || ((*prl)->vcn < *update_from))
1575 		*update_from = (*prl)->vcn;
1576 	}
1577 	return (compressed_part);
1578 }
1579 
1580 /*
1581  *		Borrow space from adjacent hole for appending data
1582  *	The hole may have to be split so that the end of hole is not
1583  *	affected by cluster allocation and overwriting
1584  *	Cluster allocation is needed for the overwritten compression block
1585  *
1586  *	Must always leave two unused entries in the runlist
1587  *
1588  *	Returns the number of clusters with existing compressed data
1589  *		in the compression block to be written to
1590  *		-1 if there were an error
1591  */
1592 
1593 static int borrow_from_hole(ntfs_attr *na, runlist_element **prl,
1594     		s64 pos, s64 count, VCN *update_from, BOOL wasnonresident)
1595 {
1596 	int compressed_part = 0;
1597 	int cluster_size_bits = na->ni->vol->cluster_size_bits;
1598 	runlist_element *rl = *prl;
1599 	s32 endblock;
1600 	long long allocated;
1601 	runlist_element *zrl;
1602 	int irl;
1603 	BOOL undecided;
1604 	BOOL nothole;
1605 
1606 		/* check whether the compression block is fully allocated */
1607 	endblock = (((pos + count - 1) >> cluster_size_bits) | (na->compression_block_clusters - 1)) + 1 - rl->vcn;
1608 	allocated = 0;
1609 	zrl = rl;
1610 	irl = 0;
1611 	while (zrl->length && (zrl->lcn >= 0) && (allocated < endblock)) {
1612 		allocated += zrl->length;
1613 		zrl++;
1614 		irl++;
1615 	}
1616 
1617 	undecided = (allocated < endblock) && (zrl->lcn == LCN_RL_NOT_MAPPED);
1618 	nothole = (allocated >= endblock) || (zrl->lcn != LCN_HOLE);
1619 
1620 	if (undecided || nothole) {
1621 		runlist_element *orl = na->rl;
1622 		s64 olcn = (*prl)->lcn;
1623 #if PARTIAL_RUNLIST_UPDATING
1624 		VCN prevblock;
1625 #endif
1626 			/*
1627 			 * Map the runlist, unless it has not been created.
1628 			 * If appending data, a partial mapping from the
1629 			 * end of previous block will do.
1630 			 */
1631 		irl = *prl - na->rl;
1632 #if PARTIAL_RUNLIST_UPDATING
1633 		prevblock = pos >> cluster_size_bits;
1634 		if (prevblock)
1635 			prevblock--;
1636 		if (!NAttrBeingNonResident(na)
1637 		    && (NAttrDataAppending(na)
1638 			? ntfs_attr_map_partial_runlist(na,prevblock)
1639 			: ntfs_attr_map_whole_runlist(na))) {
1640 #else
1641 		if (!NAttrBeingNonResident(na)
1642 			&& ntfs_attr_map_whole_runlist(na)) {
1643 #endif
1644 			rl = (runlist_element*)NULL;
1645 		} else {
1646 			/*
1647 			 * Mapping the runlist may cause its relocation,
1648 			 * and relocation may be at the same place with
1649 			 * relocated contents.
1650 			 * Have to find the current run again when this
1651 			 * happens.
1652 			 */
1653 			if ((na->rl != orl) || ((*prl)->lcn != olcn)) {
1654 				zrl = &na->rl[irl];
1655 				while (zrl->length && (zrl->lcn != olcn))
1656 					zrl++;
1657 				*prl = zrl;
1658 			}
1659 			if (!(*prl)->length) {
1660 				 ntfs_log_error("Mapped run not found,"
1661 					" inode %lld lcn 0x%llx\n",
1662 					(long long)na->ni->mft_no,
1663 					(long long)olcn);
1664 				rl = (runlist_element*)NULL;
1665 			} else {
1666 				rl = ntfs_rl_extend(na,*prl,2);
1667 				na->unused_runs = 2;
1668 			}
1669 		}
1670 		*prl = rl;
1671 		if (rl && undecided) {
1672 			allocated = 0;
1673 			zrl = rl;
1674 			irl = 0;
1675 			while (zrl->length && (zrl->lcn >= 0)
1676 			    && (allocated < endblock)) {
1677 				allocated += zrl->length;
1678 				zrl++;
1679 				irl++;
1680 			}
1681 		}
1682 	}
1683 		/*
1684 		 * compression block not fully allocated and followed
1685 		 * by a hole : we must allocate in the hole.
1686 		 */
1687 	if (rl && (allocated < endblock) && (zrl->lcn == LCN_HOLE)) {
1688 		s64 xofs;
1689 
1690 			/*
1691 			 * split the hole if not fully needed
1692 			 */
1693 		if ((allocated + zrl->length) > endblock) {
1694 			runlist_element *xrl;
1695 
1696 			*prl = ntfs_rl_extend(na,*prl,1);
1697 			if (*prl) {
1698 					/* beware : rl was reallocated */
1699 				rl = *prl;
1700 				zrl = &rl[irl];
1701 				na->unused_runs = 0;
1702 				xrl = zrl;
1703 				while (xrl->length) xrl++;
1704 				do {
1705 					xrl[1] = *xrl;
1706 				} while (xrl-- != zrl);
1707 				zrl->length = endblock - allocated;
1708 				zrl[1].length -= zrl->length;
1709 				zrl[1].vcn = zrl->vcn + zrl->length;
1710 			}
1711 		}
1712 		if (*prl) {
1713 			if (wasnonresident)
1714 				compressed_part = na->compression_block_clusters
1715 				   - zrl->length;
1716 			xofs = 0;
1717 			if (ntfs_attr_fill_hole(na,
1718 				    zrl->length << cluster_size_bits,
1719 				    &xofs, &zrl, update_from))
1720 					compressed_part = -1;
1721 			else {
1722 			/* go back to initial cluster, now reallocated */
1723 				while (zrl->vcn > (pos >> cluster_size_bits))
1724 					zrl--;
1725 				*prl = zrl;
1726 			}
1727 		}
1728 	}
1729 	if (!*prl) {
1730 		ntfs_log_error("No elements to borrow from a hole\n");
1731 		compressed_part = -1;
1732 	} else
1733 		if ((*update_from == -1) || ((*prl)->vcn < *update_from))
1734 			*update_from = (*prl)->vcn;
1735 	return (compressed_part);
1736 }
1737 
1738 static int ntfs_attr_truncate_i(ntfs_attr *na, const s64 newsize,
1739 				hole_type holes);
1740 
1741 /**
1742  * ntfs_attr_pwrite - positioned write to an ntfs attribute
1743  * @na:		ntfs attribute to write to
1744  * @pos:	position in the attribute to write to
1745  * @count:	number of bytes to write
1746  * @b:		data buffer to write to disk
1747  *
1748  * This function will write @count bytes from data buffer @b to ntfs attribute
1749  * @na at position @pos.
1750  *
1751  * On success, return the number of successfully written bytes. If this number
1752  * is lower than @count this means that an error was encountered during the
1753  * write so that the write is partial. 0 means nothing was written (also return
1754  * 0 when @count is 0).
1755  *
1756  * On error and nothing has been written, return -1 with errno set
1757  * appropriately to the return code of ntfs_pwrite(), or to EINVAL in case of
1758  * invalid arguments.
1759  */
1760 s64 ntfs_attr_pwrite(ntfs_attr *na, const s64 pos, s64 count, const void *b)
1761 {
1762 	s64 written, to_write, ofs, old_initialized_size, old_data_size;
1763 	s64 total = 0;
1764 	VCN update_from = -1;
1765 	ntfs_volume *vol;
1766 	s64 fullcount;
1767 	ntfs_attr_search_ctx *ctx = NULL;
1768 	runlist_element *rl;
1769 	s64 hole_end;
1770 	int eo;
1771 	int compressed_part;
1772 	struct {
1773 		unsigned int undo_initialized_size	: 1;
1774 		unsigned int undo_data_size		: 1;
1775 	} need_to = { 0, 0 };
1776 	BOOL wasnonresident = FALSE;
1777 	BOOL compressed;
1778 	BOOL updatemap;
1779 
1780 	ntfs_log_enter("Entering for inode %lld, attr 0x%x, pos 0x%llx, count "
1781 		       "0x%llx.\n", (long long)na->ni->mft_no, na->type,
1782 		       (long long)pos, (long long)count);
1783 
1784 	if (!na || !na->ni || !na->ni->vol || !b || pos < 0 || count < 0) {
1785 		errno = EINVAL;
1786 		ntfs_log_perror("%s", __FUNCTION__);
1787 		goto errno_set;
1788 	}
1789 	vol = na->ni->vol;
1790 	compressed = (na->data_flags & ATTR_COMPRESSION_MASK)
1791 			 != const_cpu_to_le16(0);
1792 	na->unused_runs = 0; /* prepare overflow checks */
1793 	/*
1794 	 * Encrypted attributes are only supported in raw mode.  We return
1795 	 * access denied, which is what Windows NT4 does, too.
1796 	 * Moreover a file cannot be both encrypted and compressed.
1797 	 */
1798 	if ((na->data_flags & ATTR_IS_ENCRYPTED)
1799 	   && (compressed || !vol->efs_raw)) {
1800 		errno = EACCES;
1801 		goto errno_set;
1802 	}
1803 		/*
1804 		 * Fill the gap, when writing beyond the end of a compressed
1805 		 * file. This will make recursive calls
1806 		 */
1807 	if (compressed
1808 	    && (na->type == AT_DATA)
1809 	    && (pos > na->initialized_size)
1810 	    && stuff_hole(na,pos))
1811 		goto errno_set;
1812 	/* If this is a compressed attribute it needs special treatment. */
1813 	wasnonresident = NAttrNonResident(na) != 0;
1814 		/*
1815 		 * Compression is restricted to data streams and
1816 		 * only ATTR_IS_COMPRESSED compression mode is supported.
1817                  */
1818 	if (compressed
1819 	    && ((na->type != AT_DATA)
1820 		|| ((na->data_flags & ATTR_COMPRESSION_MASK)
1821 			 != ATTR_IS_COMPRESSED))) {
1822 		errno = EOPNOTSUPP;
1823 		goto errno_set;
1824 	}
1825 
1826 	if (!count)
1827 		goto out;
1828 	/* for a compressed file, get prepared to reserve a full block */
1829 	fullcount = count;
1830 	/* If the write reaches beyond the end, extend the attribute. */
1831 	old_data_size = na->data_size;
1832 	/* identify whether this is appending to a non resident data attribute */
1833 	if ((na->type == AT_DATA) && (pos >= old_data_size)
1834 	    && NAttrNonResident(na))
1835 		NAttrSetDataAppending(na);
1836 	if (pos + count > na->data_size) {
1837 #if PARTIAL_RUNLIST_UPDATING
1838 		/*
1839 		 * When appending data, the attribute is first extended
1840 		 * before being filled with data. This may cause the
1841 		 * attribute to be made temporarily sparse, which
1842 		 * implies reformating the inode and reorganizing the
1843 		 * full runlist. To avoid unnecessary reorganization,
1844 		 * we avoid sparse testing until the data is filled in.
1845 		 */
1846 		if (ntfs_attr_truncate_i(na, pos + count,
1847 					(NAttrDataAppending(na) ?
1848 						HOLES_DELAY : HOLES_OK))) {
1849 			ntfs_log_perror("Failed to enlarge attribute");
1850 			goto errno_set;
1851 		}
1852 #else
1853 		if (ntfs_attr_truncate_i(na, pos + count, HOLES_OK)) {
1854 			ntfs_log_perror("Failed to enlarge attribute");
1855 			goto errno_set;
1856 		}
1857 #endif
1858 			/* resizing may change the compression mode */
1859 		compressed = (na->data_flags & ATTR_COMPRESSION_MASK)
1860 				!= const_cpu_to_le16(0);
1861 		need_to.undo_data_size = 1;
1862 	}
1863 		/*
1864 		 * For compressed data, a single full block was allocated
1865 		 * to deal with compression, possibly in a previous call.
1866 		 * We are not able to process several blocks because
1867 		 * some clusters are freed after compression and
1868 		 * new allocations have to be done before proceeding,
1869 		 * so truncate the requested count if needed (big buffers).
1870 		 */
1871 	if (compressed) {
1872 		fullcount = (pos | (na->compression_block_size - 1)) + 1 - pos;
1873 		if (count > fullcount)
1874 			count = fullcount;
1875 	}
1876 	old_initialized_size = na->initialized_size;
1877 	/* If it is a resident attribute, write the data to the mft record. */
1878 	if (!NAttrNonResident(na)) {
1879 		char *val;
1880 
1881 		ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
1882 		if (!ctx)
1883 			goto err_out;
1884 		if (ntfs_attr_lookup(na->type, na->name, na->name_len, 0,
1885 				0, NULL, 0, ctx)) {
1886 			ntfs_log_perror("%s: lookup failed", __FUNCTION__);
1887 			goto err_out;
1888 		}
1889 		val = (char*)ctx->attr + le16_to_cpu(ctx->attr->value_offset);
1890 		if (val < (char*)ctx->attr || val +
1891 				le32_to_cpu(ctx->attr->value_length) >
1892 				(char*)ctx->mrec + vol->mft_record_size) {
1893 			errno = EIO;
1894 			ntfs_log_perror("%s: Sanity check failed", __FUNCTION__);
1895 			goto err_out;
1896 		}
1897 		memcpy(val + pos, b, count);
1898 		if (ntfs_mft_record_write(vol, ctx->ntfs_ino->mft_no,
1899 				ctx->mrec)) {
1900 			/*
1901 			 * NOTE: We are in a bad state at this moment. We have
1902 			 * dirtied the mft record but we failed to commit it to
1903 			 * disk. Since we have read the mft record ok before,
1904 			 * it is unlikely to fail writing it, so is ok to just
1905 			 * return error here... (AIA)
1906 			 */
1907 			ntfs_log_perror("%s: failed to write mft record", __FUNCTION__);
1908 			goto err_out;
1909 		}
1910 		ntfs_attr_put_search_ctx(ctx);
1911 		total = count;
1912 		goto out;
1913 	}
1914 
1915 	/* Handle writes beyond initialized_size. */
1916 
1917 	if (pos + count > na->initialized_size) {
1918 #if PARTIAL_RUNLIST_UPDATING
1919 		/*
1920 		 * When appending, we only need to map the end of the runlist,
1921 		 * starting at the last previously allocated run, so that
1922 		 * we are able a new one to it.
1923 		 * However, for compressed file, we need the full compression
1924 		 * block, which may be split in several extents.
1925 		 */
1926 		if (NAttrDataAppending(na)) {
1927 			VCN block_begin = pos >> vol->cluster_size_bits;
1928 
1929 			if (compressed)
1930 				block_begin &= -na->compression_block_clusters;
1931 			if (block_begin)
1932 				block_begin--;
1933 			if (ntfs_attr_map_partial_runlist(na, block_begin))
1934 				goto err_out;
1935 			if ((update_from == -1) || (block_begin < update_from))
1936 				update_from = block_begin;
1937 		} else
1938 #endif
1939 			if (ntfs_attr_map_whole_runlist(na))
1940 				goto err_out;
1941 		/*
1942 		 * For a compressed attribute, we must be sure there is an
1943 		 * available entry, and, when reopening a compressed file,
1944 		 * we may need to split a hole. So reserve the entries
1945 		 * before it gets too late.
1946 		 */
1947 		if (compressed) {
1948 			na->rl = ntfs_rl_extend(na,na->rl,2);
1949 			if (!na->rl)
1950 				goto err_out;
1951 			na->unused_runs = 2;
1952 		}
1953 		/* Set initialized_size to @pos + @count. */
1954 		ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
1955 		if (!ctx)
1956 			goto err_out;
1957 		if (ntfs_attr_lookup(na->type, na->name, na->name_len, 0,
1958 				0, NULL, 0, ctx))
1959 			goto err_out;
1960 
1961 		/* If write starts beyond initialized_size, zero the gap. */
1962 		if (pos > na->initialized_size)
1963 			if (ntfs_attr_fill_zero(na, na->initialized_size,
1964 						pos - na->initialized_size))
1965 				goto err_out;
1966 
1967 		ctx->attr->initialized_size = cpu_to_sle64(pos + count);
1968 		/* fix data_size for compressed files */
1969 		if (compressed) {
1970 			na->data_size = pos + count;
1971 			ctx->attr->data_size = ctx->attr->initialized_size;
1972 		}
1973 		if (ntfs_mft_record_write(vol, ctx->ntfs_ino->mft_no,
1974 				ctx->mrec)) {
1975 			/*
1976 			 * Undo the change in the in-memory copy and send it
1977 			 * back for writing.
1978 			 */
1979 			ctx->attr->initialized_size =
1980 					cpu_to_sle64(old_initialized_size);
1981 			ntfs_mft_record_write(vol, ctx->ntfs_ino->mft_no,
1982 					ctx->mrec);
1983 			goto err_out;
1984 		}
1985 		na->initialized_size = pos + count;
1986 #if CACHE_NIDATA_SIZE
1987 		if (na->ni->mrec->flags & MFT_RECORD_IS_DIRECTORY
1988 		    ? na->type == AT_INDEX_ROOT && na->name == NTFS_INDEX_I30
1989 		    : na->type == AT_DATA && na->name == AT_UNNAMED) {
1990 			na->ni->data_size = na->data_size;
1991 			if ((compressed || NAttrSparse(na))
1992 					&& NAttrNonResident(na))
1993 				na->ni->allocated_size = na->compressed_size;
1994 			else
1995 				na->ni->allocated_size = na->allocated_size;
1996 			set_nino_flag(na->ni,KnownSize);
1997 		}
1998 #endif
1999 		ntfs_attr_put_search_ctx(ctx);
2000 		ctx = NULL;
2001 		/*
2002 		 * NOTE: At this point the initialized_size in the mft record
2003 		 * has been updated BUT there is random data on disk thus if
2004 		 * we decide to abort, we MUST change the initialized_size
2005 		 * again.
2006 		 */
2007 		need_to.undo_initialized_size = 1;
2008 	}
2009 	/* Find the runlist element containing the vcn. */
2010 	rl = ntfs_attr_find_vcn(na, pos >> vol->cluster_size_bits);
2011 	if (!rl) {
2012 		/*
2013 		 * If the vcn is not present it is an out of bounds write.
2014 		 * However, we already extended the size of the attribute,
2015 		 * so getting this here must be an error of some kind.
2016 		 */
2017 		if (errno == ENOENT) {
2018 			errno = EIO;
2019 			ntfs_log_perror("%s: Failed to find VCN #3", __FUNCTION__);
2020 		}
2021 		goto err_out;
2022 	}
2023 		/*
2024 		 * Determine if there is compressed data in the current
2025 		 * compression block (when appending to an existing file).
2026 		 * If so, decompression will be needed, and the full block
2027 		 * must be allocated to be identified as uncompressed.
2028 		 * This comes in two variants, depending on whether
2029 		 * compression has saved at least one cluster.
2030 		 * The compressed size can never be over full size by
2031 		 * more than 485 (maximum for 15 compression blocks
2032 		 * compressed to 4098 and the last 3640 bytes compressed
2033 		 * to 3640 + 3640/8 = 4095, with 15*2 + 4095 - 3640 = 485)
2034 		 * This is less than the smallest cluster, so the hole is
2035 		 * is never beyond the cluster next to the position of
2036 		 * the first uncompressed byte to write.
2037 		 */
2038 	compressed_part = 0;
2039 	if (compressed) {
2040 		if ((rl->lcn == (LCN)LCN_HOLE)
2041 		    && wasnonresident) {
2042 			if (rl->length < na->compression_block_clusters)
2043 				/*
2044 				 * the needed block is in a hole smaller
2045 				 * than the compression block : we can use
2046 				 * it fully
2047 				 */
2048 				compressed_part
2049 					= na->compression_block_clusters
2050 					   - rl->length;
2051 			else {
2052 				/*
2053 				 * the needed block is in a hole bigger
2054 				 * than the compression block : we must
2055 				 * split the hole and use it partially
2056 				 */
2057 				compressed_part = split_compressed_hole(na,
2058 					&rl, pos, count, &update_from);
2059 			}
2060 		} else {
2061 			if (rl->lcn >= 0) {
2062 				/*
2063 				 * the needed block contains data, make
2064 				 * sure the full compression block is
2065 				 * allocated. Borrow from hole if needed
2066 				 */
2067 				compressed_part = borrow_from_hole(na,
2068 					&rl, pos, count, &update_from,
2069 					wasnonresident);
2070 			}
2071 		}
2072 
2073 		if (compressed_part < 0)
2074 			goto err_out;
2075 
2076 			/* just making non-resident, so not yet compressed */
2077 		if (NAttrBeingNonResident(na)
2078 		    && (compressed_part < na->compression_block_clusters))
2079 			compressed_part = 0;
2080 	}
2081 	ofs = pos - (rl->vcn << vol->cluster_size_bits);
2082 	/*
2083 	 * Scatter the data from the linear data buffer to the volume. Note, a
2084 	 * partial final vcn is taken care of by the @count capping of write
2085 	 * length.
2086 	 */
2087 	for (hole_end = 0; count; rl++, ofs = 0) {
2088 		if (rl->lcn == LCN_RL_NOT_MAPPED) {
2089 			rl = ntfs_attr_find_vcn(na, rl->vcn);
2090 			if (!rl) {
2091 				if (errno == ENOENT) {
2092 					errno = EIO;
2093 					ntfs_log_perror("%s: Failed to find VCN"
2094 							" #4", __FUNCTION__);
2095 				}
2096 				goto rl_err_out;
2097 			}
2098 			/* Needed for case when runs merged. */
2099 			ofs = pos + total - (rl->vcn << vol->cluster_size_bits);
2100 		}
2101 		if (!rl->length) {
2102 			errno = EIO;
2103 			ntfs_log_perror("%s: Zero run length", __FUNCTION__);
2104 			goto rl_err_out;
2105 		}
2106 		if (rl->lcn < (LCN)0) {
2107 			hole_end = rl->vcn + rl->length;
2108 
2109 			if (rl->lcn != (LCN)LCN_HOLE) {
2110 				errno = EIO;
2111 				ntfs_log_perror("%s: Unexpected LCN (%lld)",
2112 						__FUNCTION__,
2113 						(long long)rl->lcn);
2114 				goto rl_err_out;
2115 			}
2116 			if (ntfs_attr_fill_hole(na, fullcount, &ofs, &rl,
2117 					 &update_from))
2118 				goto err_out;
2119 		}
2120 		if (compressed) {
2121 			while (rl->length
2122 			    && (ofs >= (rl->length << vol->cluster_size_bits))) {
2123 				ofs -= rl->length << vol->cluster_size_bits;
2124 				rl++;
2125 			}
2126 		}
2127 
2128 		/* It is a real lcn, write it to the volume. */
2129 		to_write = min(count, (rl->length << vol->cluster_size_bits) - ofs);
2130 retry:
2131 		ntfs_log_trace("Writing %lld bytes to vcn %lld, lcn %lld, ofs "
2132 			       "%lld.\n", (long long)to_write, (long long)rl->vcn,
2133 			       (long long)rl->lcn, (long long)ofs);
2134 		if (!NVolReadOnly(vol)) {
2135 
2136 			s64 wpos = (rl->lcn << vol->cluster_size_bits) + ofs;
2137 			s64 wend = (rl->vcn << vol->cluster_size_bits) + ofs + to_write;
2138 			u32 bsize = vol->cluster_size;
2139 			/* Byte size needed to zero fill a cluster */
2140 			s64 rounding = ((wend + bsize - 1) & ~(s64)(bsize - 1)) - wend;
2141 			/**
2142 			 * Zero fill to cluster boundary if we're writing at the
2143 			 * end of the attribute or into an ex-sparse cluster.
2144 			 * This will cause the kernel not to seek and read disk
2145 			 * blocks during write(2) to fill the end of the buffer
2146 			 * which increases write speed by 2-10 fold typically.
2147 			 *
2148 			 * This is done even for compressed files, because
2149 			 * data is generally first written uncompressed.
2150 			 */
2151 			if (rounding && ((wend == na->initialized_size) ||
2152 				(wend < (hole_end << vol->cluster_size_bits)))){
2153 
2154 				char *cb;
2155 
2156 				rounding += to_write;
2157 
2158 				cb = ntfs_malloc(rounding);
2159 				if (!cb)
2160 					goto err_out;
2161 
2162 				memcpy(cb, b, to_write);
2163 				memset(cb + to_write, 0, rounding - to_write);
2164 
2165 				if (compressed) {
2166 					written = ntfs_compressed_pwrite(na,
2167 						rl, wpos, ofs, to_write,
2168 						rounding, cb, compressed_part,
2169 						&update_from);
2170 				} else {
2171 					written = ntfs_pwrite(vol->dev, wpos,
2172 						rounding, cb);
2173 					if (written == rounding)
2174 						written = to_write;
2175 				}
2176 
2177 				free(cb);
2178 			} else {
2179 				if (compressed) {
2180 					written = ntfs_compressed_pwrite(na,
2181 						rl, wpos, ofs, to_write,
2182 						to_write, b, compressed_part,
2183 						&update_from);
2184 				} else
2185 					written = ntfs_pwrite(vol->dev, wpos,
2186 						to_write, b);
2187 				}
2188 		} else
2189 			written = to_write;
2190 		/* If everything ok, update progress counters and continue. */
2191 		if (written > 0) {
2192 			total += written;
2193 			count -= written;
2194 			fullcount -= written;
2195 			b = (const u8*)b + written;
2196 		}
2197 		if (written != to_write) {
2198 			/* Partial write cannot be dealt with, stop there */
2199 			/* If the syscall was interrupted, try again. */
2200 			if (written == (s64)-1 && errno == EINTR)
2201 				goto retry;
2202 			if (!written)
2203 				errno = EIO;
2204 			goto rl_err_out;
2205 		}
2206 		compressed_part = 0;
2207 	}
2208 done:
2209 	if (ctx)
2210 		ntfs_attr_put_search_ctx(ctx);
2211 		/*
2212 		 *	 Update mapping pairs if needed.
2213 		 * For a compressed file, we try to make a partial update
2214 		 * of the mapping list. This makes a difference only if
2215 		 * inode extents were needed.
2216 		 */
2217 #if PARTIAL_RUNLIST_UPDATING
2218 	updatemap = NAttrFullyMapped(na) || NAttrDataAppending(na);
2219 #else
2220 	updatemap = (compressed
2221 			? NAttrFullyMapped(na) != 0 : update_from != -1);
2222 #endif
2223 	if (updatemap) {
2224 		if (ntfs_attr_update_mapping_pairs(na,
2225 				(update_from < 0 ? 0 : update_from))) {
2226 			/*
2227 			 * FIXME: trying to recover by goto rl_err_out;
2228 			 * could cause driver hang by infinite looping.
2229 			 */
2230 			total = -1;
2231 			goto out;
2232 		}
2233 		if (!wasnonresident)
2234 			NAttrClearBeingNonResident(na);
2235 		NAttrClearDataAppending(na);
2236 	}
2237 out:
2238 	ntfs_log_leave("\n");
2239 	return total;
2240 rl_err_out:
2241 	eo = errno;
2242 	if (total) {
2243 		if (need_to.undo_initialized_size) {
2244 			if (pos + total > na->initialized_size)
2245 				goto done;
2246 			/*
2247 			 * TODO: Need to try to change initialized_size. If it
2248 			 * succeeds goto done, otherwise goto err_out. (AIA)
2249 			 */
2250 			goto err_out;
2251 		}
2252 		goto done;
2253 	}
2254 	errno = eo;
2255 err_out:
2256 	eo = errno;
2257 	if (need_to.undo_initialized_size) {
2258 		int err;
2259 
2260 		err = 0;
2261 		if (!ctx) {
2262 			ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
2263 			if (!ctx)
2264 				err = 1;
2265 		} else
2266 			ntfs_attr_reinit_search_ctx(ctx);
2267 		if (!err) {
2268 			err = ntfs_attr_lookup(na->type, na->name,
2269 					na->name_len, 0, 0, NULL, 0, ctx);
2270 			if (!err) {
2271 				na->initialized_size = old_initialized_size;
2272 				ctx->attr->initialized_size = cpu_to_sle64(
2273 						old_initialized_size);
2274 				err = ntfs_mft_record_write(vol,
2275 						ctx->ntfs_ino->mft_no,
2276 						ctx->mrec);
2277 			}
2278 		}
2279 		if (err) {
2280 			/*
2281 			 * FIXME: At this stage could try to recover by filling
2282 			 * old_initialized_size -> new_initialized_size with
2283 			 * data or at least zeroes. (AIA)
2284 			 */
2285 			ntfs_log_error("Eeek! Failed to recover from error. "
2286 					"Leaving metadata in inconsistent "
2287 					"state! Run chkdsk!\n");
2288 		}
2289 	}
2290 	if (ctx)
2291 		ntfs_attr_put_search_ctx(ctx);
2292 	/* Update mapping pairs if needed. */
2293 	updatemap = (compressed
2294 			? NAttrFullyMapped(na) != 0 : update_from != -1);
2295 	if (updatemap)
2296 		ntfs_attr_update_mapping_pairs(na, 0);
2297 	/* Restore original data_size if needed. */
2298 	if (need_to.undo_data_size
2299 			&& ntfs_attr_truncate_i(na, old_data_size, HOLES_OK))
2300 		ntfs_log_perror("Failed to restore data_size");
2301 	errno = eo;
2302 errno_set:
2303 	total = -1;
2304 	goto out;
2305 }
2306 
2307 int ntfs_attr_pclose(ntfs_attr *na)
2308 {
2309 	s64 ofs;
2310 	int failed;
2311 	BOOL ok = TRUE;
2312 	VCN update_from = -1;
2313 	ntfs_volume *vol;
2314 	ntfs_attr_search_ctx *ctx = NULL;
2315 	runlist_element *rl;
2316 	int eo;
2317 	int compressed_part;
2318 	BOOL compressed;
2319 
2320 	ntfs_log_enter("Entering for inode 0x%llx, attr 0x%x.\n",
2321 			na->ni->mft_no, na->type);
2322 
2323 	if (!na || !na->ni || !na->ni->vol) {
2324 		errno = EINVAL;
2325 		ntfs_log_perror("%s", __FUNCTION__);
2326 		goto errno_set;
2327 	}
2328 	vol = na->ni->vol;
2329 	na->unused_runs = 0;
2330 	compressed = (na->data_flags & ATTR_COMPRESSION_MASK)
2331 			 != const_cpu_to_le16(0);
2332 	/*
2333 	 * Encrypted non-resident attributes are not supported.  We return
2334 	 * access denied, which is what Windows NT4 does, too.
2335 	 */
2336 	if (NAttrEncrypted(na) && NAttrNonResident(na)) {
2337 		errno = EACCES;
2338 		goto errno_set;
2339 	}
2340 	/* If this is not a compressed attribute get out */
2341 	/* same if it is resident */
2342 	if (!compressed || !NAttrNonResident(na))
2343 		goto out;
2344 
2345 		/* safety check : no recursion on close */
2346 	if (NAttrComprClosing(na)) {
2347 		errno = EIO;
2348 		ntfs_log_error("Bad ntfs_attr_pclose"
2349 				" recursion on inode %lld\n",
2350 				(long long)na->ni->mft_no);
2351 		goto out;
2352 	}
2353 	NAttrSetComprClosing(na);
2354 		/*
2355 		 * For a compressed attribute, we must be sure there are two
2356 		 * available entries, so reserve them before it gets too late.
2357 		 */
2358 	if (ntfs_attr_map_whole_runlist(na))
2359 		goto err_out;
2360 	na->rl = ntfs_rl_extend(na,na->rl,2);
2361 	if (!na->rl)
2362 		goto err_out;
2363 	na->unused_runs = 2;
2364 	/* Find the runlist element containing the terminal vcn. */
2365 	rl = ntfs_attr_find_vcn(na, (na->initialized_size - 1) >> vol->cluster_size_bits);
2366 	if (!rl) {
2367 		/*
2368 		 * If the vcn is not present it is an out of bounds write.
2369 		 * However, we have already written the last byte uncompressed,
2370 		 * so getting this here must be an error of some kind.
2371 		 */
2372 		if (errno == ENOENT) {
2373 			errno = EIO;
2374 			ntfs_log_perror("%s: Failed to find VCN #5", __FUNCTION__);
2375 		}
2376 		goto err_out;
2377 	}
2378 	/*
2379 	 * Scatter the data from the linear data buffer to the volume. Note, a
2380 	 * partial final vcn is taken care of by the @count capping of write
2381 	 * length.
2382 	 */
2383 	compressed_part = 0;
2384  	if (rl->lcn >= 0) {
2385 		runlist_element *xrl;
2386 
2387 		xrl = rl;
2388 		do {
2389 			xrl++;
2390 		} while (xrl->lcn >= 0);
2391 		compressed_part = (-xrl->length)
2392 					& (na->compression_block_clusters - 1);
2393 	} else
2394 		if (rl->lcn == (LCN)LCN_HOLE) {
2395 			if (rl->length < na->compression_block_clusters)
2396 				compressed_part
2397         	                        = na->compression_block_clusters
2398                 	                           - rl->length;
2399 			else
2400 				compressed_part
2401 					= na->compression_block_clusters;
2402 		}
2403 		/* done, if the last block set was compressed */
2404 	if (compressed_part)
2405 		goto out;
2406 
2407 	ofs = na->initialized_size - (rl->vcn << vol->cluster_size_bits);
2408 
2409 	if (rl->lcn == LCN_RL_NOT_MAPPED) {
2410 		rl = ntfs_attr_find_vcn(na, rl->vcn);
2411 		if (!rl) {
2412 			if (errno == ENOENT) {
2413 				errno = EIO;
2414 				ntfs_log_perror("%s: Failed to find VCN"
2415 						" #6", __FUNCTION__);
2416 			}
2417 			goto rl_err_out;
2418 		}
2419 			/* Needed for case when runs merged. */
2420 		ofs = na->initialized_size - (rl->vcn << vol->cluster_size_bits);
2421 	}
2422 	if (!rl->length) {
2423 		errno = EIO;
2424 		ntfs_log_perror("%s: Zero run length", __FUNCTION__);
2425 		goto rl_err_out;
2426 	}
2427 	if (rl->lcn < (LCN)0) {
2428 		if (rl->lcn != (LCN)LCN_HOLE) {
2429 			errno = EIO;
2430 			ntfs_log_perror("%s: Unexpected LCN (%lld)",
2431 					__FUNCTION__,
2432 					(long long)rl->lcn);
2433 			goto rl_err_out;
2434 		}
2435 
2436 		if (ntfs_attr_fill_hole(na, (s64)0, &ofs, &rl, &update_from))
2437 			goto err_out;
2438 	}
2439 	while (rl->length
2440 	    && (ofs >= (rl->length << vol->cluster_size_bits))) {
2441 		ofs -= rl->length << vol->cluster_size_bits;
2442 		rl++;
2443 	}
2444 
2445 retry:
2446 	failed = 0;
2447 	if (update_from < 0) update_from = 0;
2448 	if (!NVolReadOnly(vol)) {
2449 		failed = ntfs_compressed_close(na, rl, ofs, &update_from);
2450 #if CACHE_NIDATA_SIZE
2451 		if (na->ni->mrec->flags & MFT_RECORD_IS_DIRECTORY
2452 		    ? na->type == AT_INDEX_ROOT && na->name == NTFS_INDEX_I30
2453 		    : na->type == AT_DATA && na->name == AT_UNNAMED) {
2454 			na->ni->data_size = na->data_size;
2455 			na->ni->allocated_size = na->compressed_size;
2456 			set_nino_flag(na->ni,KnownSize);
2457 		}
2458 #endif
2459 	}
2460 	if (failed) {
2461 		/* If the syscall was interrupted, try again. */
2462 		if (errno == EINTR)
2463 			goto retry;
2464 		else
2465 			goto rl_err_out;
2466 	}
2467 	if (ctx)
2468 		ntfs_attr_put_search_ctx(ctx);
2469 	/* Update mapping pairs if needed. */
2470 	if (NAttrFullyMapped(na))
2471 		if (ntfs_attr_update_mapping_pairs(na, update_from)) {
2472 			/*
2473 			 * FIXME: trying to recover by goto rl_err_out;
2474 			 * could cause driver hang by infinite looping.
2475 			 */
2476 			ok = FALSE;
2477 			goto out;
2478 	}
2479 out:
2480 	NAttrClearComprClosing(na);
2481 	ntfs_log_leave("\n");
2482 	return (!ok);
2483 rl_err_out:
2484 		/*
2485 		 * need not restore old sizes, only compressed_size
2486 		 * can have changed. It has been set according to
2487 		 * the current runlist while updating the mapping pairs,
2488 		 * and must be kept consistent with the runlists.
2489 		 */
2490 err_out:
2491 	eo = errno;
2492 	if (ctx)
2493 		ntfs_attr_put_search_ctx(ctx);
2494 	/* Update mapping pairs if needed. */
2495 	if (NAttrFullyMapped(na))
2496 		ntfs_attr_update_mapping_pairs(na, 0);
2497 	errno = eo;
2498 errno_set:
2499 	ok = FALSE;
2500 	goto out;
2501 }
2502 
2503 /**
2504  * ntfs_attr_mst_pread - multi sector transfer protected ntfs attribute read
2505  * @na:		multi sector transfer protected ntfs attribute to read from
2506  * @pos:	byte position in the attribute to begin reading from
2507  * @bk_cnt:	number of mst protected blocks to read
2508  * @bk_size:	size of each mst protected block in bytes
2509  * @dst:	output data buffer
2510  *
2511  * This function will read @bk_cnt blocks of size @bk_size bytes each starting
2512  * at offset @pos from the ntfs attribute @na into the data buffer @b.
2513  *
2514  * On success, the multi sector transfer fixups are applied and the number of
2515  * read blocks is returned. If this number is lower than @bk_cnt this means
2516  * that the read has either reached end of attribute or that an error was
2517  * encountered during the read so that the read is partial. 0 means end of
2518  * attribute or nothing to read (also return 0 when @bk_cnt or @bk_size are 0).
2519  *
2520  * On error and nothing has been read, return -1 with errno set appropriately
2521  * to the return code of ntfs_attr_pread() or to EINVAL in case of invalid
2522  * arguments.
2523  *
2524  * NOTE: If an incomplete multi sector transfer is detected the magic is
2525  * changed to BAAD but no error is returned, i.e. it is possible that any of
2526  * the returned blocks have multi sector transfer errors. This should be
2527  * detected by the caller by checking each block with is_baad_recordp(&block).
2528  * The reasoning is that we want to fixup as many blocks as possible and we
2529  * want to return even bad ones to the caller so, e.g. in case of ntfsck, the
2530  * errors can be repaired.
2531  */
2532 s64 ntfs_attr_mst_pread(ntfs_attr *na, const s64 pos, const s64 bk_cnt,
2533 		const u32 bk_size, void *dst)
2534 {
2535 	s64 br;
2536 	u8 *end;
2537 	BOOL warn;
2538 
2539 	ntfs_log_trace("Entering for inode 0x%llx, attr type 0x%x, pos 0x%llx.\n",
2540 			(unsigned long long)na->ni->mft_no, na->type,
2541 			(long long)pos);
2542 	if (bk_cnt < 0 || bk_size % NTFS_BLOCK_SIZE) {
2543 		errno = EINVAL;
2544 		ntfs_log_perror("%s", __FUNCTION__);
2545 		return -1;
2546 	}
2547 	br = ntfs_attr_pread(na, pos, bk_cnt * bk_size, dst);
2548 	if (br <= 0)
2549 		return br;
2550 	br /= bk_size;
2551 		/* log errors unless silenced */
2552 	warn = !na->ni || !na->ni->vol || !NVolNoFixupWarn(na->ni->vol);
2553 	for (end = (u8*)dst + br * bk_size; (u8*)dst < end; dst = (u8*)dst +
2554 			bk_size)
2555 		ntfs_mst_post_read_fixup_warn((NTFS_RECORD*)dst, bk_size, warn);
2556 	/* Finally, return the number of blocks read. */
2557 	return br;
2558 }
2559 
2560 /**
2561  * ntfs_attr_mst_pwrite - multi sector transfer protected ntfs attribute write
2562  * @na:		multi sector transfer protected ntfs attribute to write to
2563  * @pos:	position in the attribute to write to
2564  * @bk_cnt:	number of mst protected blocks to write
2565  * @bk_size:	size of each mst protected block in bytes
2566  * @src:	data buffer to write to disk
2567  *
2568  * This function will write @bk_cnt blocks of size @bk_size bytes each from
2569  * data buffer @b to multi sector transfer (mst) protected ntfs attribute @na
2570  * at position @pos.
2571  *
2572  * On success, return the number of successfully written blocks. If this number
2573  * is lower than @bk_cnt this means that an error was encountered during the
2574  * write so that the write is partial. 0 means nothing was written (also
2575  * return 0 when @bk_cnt or @bk_size are 0).
2576  *
2577  * On error and nothing has been written, return -1 with errno set
2578  * appropriately to the return code of ntfs_attr_pwrite(), or to EINVAL in case
2579  * of invalid arguments.
2580  *
2581  * NOTE: We mst protect the data, write it, then mst deprotect it using a quick
2582  * deprotect algorithm (no checking). This saves us from making a copy before
2583  * the write and at the same time causes the usn to be incremented in the
2584  * buffer. This conceptually fits in better with the idea that cached data is
2585  * always deprotected and protection is performed when the data is actually
2586  * going to hit the disk and the cache is immediately deprotected again
2587  * simulating an mst read on the written data. This way cache coherency is
2588  * achieved.
2589  */
2590 s64 ntfs_attr_mst_pwrite(ntfs_attr *na, const s64 pos, s64 bk_cnt,
2591 		const u32 bk_size, void *src)
2592 {
2593 	s64 written, i;
2594 
2595 	ntfs_log_trace("Entering for inode 0x%llx, attr type 0x%x, pos 0x%llx.\n",
2596 			(unsigned long long)na->ni->mft_no, na->type,
2597 			(long long)pos);
2598 	if (bk_cnt < 0 || bk_size % NTFS_BLOCK_SIZE) {
2599 		errno = EINVAL;
2600 		return -1;
2601 	}
2602 	if (!bk_cnt)
2603 		return 0;
2604 	/* Prepare data for writing. */
2605 	for (i = 0; i < bk_cnt; ++i) {
2606 		int err;
2607 
2608 		err = ntfs_mst_pre_write_fixup((NTFS_RECORD*)
2609 				((u8*)src + i * bk_size), bk_size);
2610 		if (err < 0) {
2611 			/* Abort write at this position. */
2612 			ntfs_log_perror("%s #1", __FUNCTION__);
2613 			if (!i)
2614 				return err;
2615 			bk_cnt = i;
2616 			break;
2617 		}
2618 	}
2619 	/* Write the prepared data. */
2620 	written = ntfs_attr_pwrite(na, pos, bk_cnt * bk_size, src);
2621 	if (written <= 0) {
2622 		ntfs_log_perror("%s: written=%lld", __FUNCTION__,
2623 				(long long)written);
2624 	}
2625 	/* Quickly deprotect the data again. */
2626 	for (i = 0; i < bk_cnt; ++i)
2627 		ntfs_mst_post_write_fixup((NTFS_RECORD*)((u8*)src + i *
2628 				bk_size));
2629 	if (written <= 0)
2630 		return written;
2631 	/* Finally, return the number of complete blocks written. */
2632 	return written / bk_size;
2633 }
2634 
2635 /**
2636  * ntfs_attr_find - find (next) attribute in mft record
2637  * @type:	attribute type to find
2638  * @name:	attribute name to find (optional, i.e. NULL means don't care)
2639  * @name_len:	attribute name length (only needed if @name present)
2640  * @ic:		IGNORE_CASE or CASE_SENSITIVE (ignored if @name not present)
2641  * @val:	attribute value to find (optional, resident attributes only)
2642  * @val_len:	attribute value length
2643  * @ctx:	search context with mft record and attribute to search from
2644  *
2645  * You shouldn't need to call this function directly. Use lookup_attr() instead.
2646  *
2647  * ntfs_attr_find() takes a search context @ctx as parameter and searches the
2648  * mft record specified by @ctx->mrec, beginning at @ctx->attr, for an
2649  * attribute of @type, optionally @name and @val. If found, ntfs_attr_find()
2650  * returns 0 and @ctx->attr will point to the found attribute.
2651  *
2652  * If not found, ntfs_attr_find() returns -1, with errno set to ENOENT and
2653  * @ctx->attr will point to the attribute before which the attribute being
2654  * searched for would need to be inserted if such an action were to be desired.
2655  *
2656  * On actual error, ntfs_attr_find() returns -1 with errno set to the error
2657  * code but not to ENOENT.  In this case @ctx->attr is undefined and in
2658  * particular do not rely on it not changing.
2659  *
2660  * If @ctx->is_first is TRUE, the search begins with @ctx->attr itself. If it
2661  * is FALSE, the search begins after @ctx->attr.
2662  *
2663  * If @type is AT_UNUSED, return the first found attribute, i.e. one can
2664  * enumerate all attributes by setting @type to AT_UNUSED and then calling
2665  * ntfs_attr_find() repeatedly until it returns -1 with errno set to ENOENT to
2666  * indicate that there are no more entries. During the enumeration, each
2667  * successful call of ntfs_attr_find() will return the next attribute in the
2668  * mft record @ctx->mrec.
2669  *
2670  * If @type is AT_END, seek to the end and return -1 with errno set to ENOENT.
2671  * AT_END is not a valid attribute, its length is zero for example, thus it is
2672  * safer to return error instead of success in this case. This also allows us
2673  * to interoperate cleanly with ntfs_external_attr_find().
2674  *
2675  * If @name is AT_UNNAMED search for an unnamed attribute. If @name is present
2676  * but not AT_UNNAMED search for a named attribute matching @name. Otherwise,
2677  * match both named and unnamed attributes.
2678  *
2679  * If @ic is IGNORE_CASE, the @name comparison is not case sensitive and
2680  * @ctx->ntfs_ino must be set to the ntfs inode to which the mft record
2681  * @ctx->mrec belongs. This is so we can get at the ntfs volume and hence at
2682  * the upcase table. If @ic is CASE_SENSITIVE, the comparison is case
2683  * sensitive. When @name is present, @name_len is the @name length in Unicode
2684  * characters.
2685  *
2686  * If @name is not present (NULL), we assume that the unnamed attribute is
2687  * being searched for.
2688  *
2689  * Finally, the resident attribute value @val is looked for, if present.
2690  * If @val is not present (NULL), @val_len is ignored.
2691  *
2692  * ntfs_attr_find() only searches the specified mft record and it ignores the
2693  * presence of an attribute list attribute (unless it is the one being searched
2694  * for, obviously). If you need to take attribute lists into consideration, use
2695  * ntfs_attr_lookup() instead (see below). This also means that you cannot use
2696  * ntfs_attr_find() to search for extent records of non-resident attributes, as
2697  * extents with lowest_vcn != 0 are usually described by the attribute list
2698  * attribute only. - Note that it is possible that the first extent is only in
2699  * the attribute list while the last extent is in the base mft record, so don't
2700  * rely on being able to find the first extent in the base mft record.
2701  *
2702  * Warning: Never use @val when looking for attribute types which can be
2703  *	    non-resident as this most likely will result in a crash!
2704  */
2705 static int ntfs_attr_find(const ATTR_TYPES type, const ntfschar *name,
2706 		const u32 name_len, const IGNORE_CASE_BOOL ic,
2707 		const u8 *val, const u32 val_len, ntfs_attr_search_ctx *ctx)
2708 {
2709 	ATTR_RECORD *a;
2710 	ntfs_volume *vol;
2711 	ntfschar *upcase;
2712 	u32 upcase_len;
2713 
2714 	ntfs_log_trace("attribute type 0x%x.\n", type);
2715 
2716 	if (ctx->ntfs_ino) {
2717 		vol = ctx->ntfs_ino->vol;
2718 		upcase = vol->upcase;
2719 		upcase_len = vol->upcase_len;
2720 	} else {
2721 		if (name && name != AT_UNNAMED) {
2722 			errno = EINVAL;
2723 			ntfs_log_perror("%s", __FUNCTION__);
2724 			return -1;
2725 		}
2726 		vol = NULL;
2727 		upcase = NULL;
2728 		upcase_len = 0;
2729 	}
2730 	/*
2731 	 * Iterate over attributes in mft record starting at @ctx->attr, or the
2732 	 * attribute following that, if @ctx->is_first is TRUE.
2733 	 */
2734 	if (ctx->is_first) {
2735 		a = ctx->attr;
2736 		ctx->is_first = FALSE;
2737 	} else
2738 		a = (ATTR_RECORD*)((char*)ctx->attr +
2739 				le32_to_cpu(ctx->attr->length));
2740 	for (;;	a = (ATTR_RECORD*)((char*)a + le32_to_cpu(a->length))) {
2741 		if (p2n(a) < p2n(ctx->mrec) || (char*)a > (char*)ctx->mrec +
2742 				le32_to_cpu(ctx->mrec->bytes_allocated))
2743 			break;
2744 		ctx->attr = a;
2745 		if (((type != AT_UNUSED) && (le32_to_cpu(a->type) >
2746 				le32_to_cpu(type))) ||
2747 				(a->type == AT_END)) {
2748 			errno = ENOENT;
2749 			return -1;
2750 		}
2751 		if (!a->length)
2752 			break;
2753 		/* If this is an enumeration return this attribute. */
2754 		if (type == AT_UNUSED)
2755 			return 0;
2756 		if (a->type != type)
2757 			continue;
2758 		/*
2759 		 * If @name is AT_UNNAMED we want an unnamed attribute.
2760 		 * If @name is present, compare the two names.
2761 		 * Otherwise, match any attribute.
2762 		 */
2763 		if (name == AT_UNNAMED) {
2764 			/* The search failed if the found attribute is named. */
2765 			if (a->name_length) {
2766 				errno = ENOENT;
2767 				return -1;
2768 			}
2769 		} else {
2770 			register int rc;
2771 			if (name && ((rc = ntfs_names_full_collate(name,
2772 					name_len, (ntfschar*)((char*)a +
2773 						le16_to_cpu(a->name_offset)),
2774 					a->name_length, ic,
2775 					upcase, upcase_len)))) {
2776 				/*
2777 				 * If @name collates before a->name,
2778 				 * there is no matching attribute.
2779 				 */
2780 				if (rc < 0) {
2781 					errno = ENOENT;
2782 					return -1;
2783 				}
2784 			/* If the strings are not equal, continue search. */
2785 			continue;
2786 			}
2787 		}
2788 		/*
2789 		 * The names match or @name not present and attribute is
2790 		 * unnamed. If no @val specified, we have found the attribute
2791 		 * and are done.
2792 		 */
2793 		if (!val)
2794 			return 0;
2795 		/* @val is present; compare values. */
2796 		else {
2797 			register int rc;
2798 
2799 			rc = memcmp(val, (char*)a +le16_to_cpu(a->value_offset),
2800 					min(val_len,
2801 					le32_to_cpu(a->value_length)));
2802 			/*
2803 			 * If @val collates before the current attribute's
2804 			 * value, there is no matching attribute.
2805 			 */
2806 			if (!rc) {
2807 				register u32 avl;
2808 				avl = le32_to_cpu(a->value_length);
2809 				if (val_len == avl)
2810 					return 0;
2811 				if (val_len < avl) {
2812 					errno = ENOENT;
2813 					return -1;
2814 				}
2815 			} else if (rc < 0) {
2816 				errno = ENOENT;
2817 				return -1;
2818 			}
2819 		}
2820 	}
2821 	errno = EIO;
2822 	ntfs_log_perror("%s: Corrupt inode (%lld)", __FUNCTION__,
2823 			ctx->ntfs_ino ? (long long)ctx->ntfs_ino->mft_no : -1);
2824 	return -1;
2825 }
2826 
2827 void ntfs_attr_name_free(char **name)
2828 {
2829 	if (*name) {
2830 		free(*name);
2831 		*name = NULL;
2832 	}
2833 }
2834 
2835 char *ntfs_attr_name_get(const ntfschar *uname, const int uname_len)
2836 {
2837 	char *name = NULL;
2838 	int name_len;
2839 
2840 	name_len = ntfs_ucstombs(uname, uname_len, &name, 0);
2841 	if (name_len < 0) {
2842 		ntfs_log_perror("ntfs_ucstombs");
2843 		return NULL;
2844 
2845 	} else if (name_len > 0)
2846 		return name;
2847 
2848 	ntfs_attr_name_free(&name);
2849 	return NULL;
2850 }
2851 
2852 /**
2853  * ntfs_external_attr_find - find an attribute in the attribute list of an inode
2854  * @type:	attribute type to find
2855  * @name:	attribute name to find (optional, i.e. NULL means don't care)
2856  * @name_len:	attribute name length (only needed if @name present)
2857  * @ic:		IGNORE_CASE or CASE_SENSITIVE (ignored if @name not present)
2858  * @lowest_vcn:	lowest vcn to find (optional, non-resident attributes only)
2859  * @val:	attribute value to find (optional, resident attributes only)
2860  * @val_len:	attribute value length
2861  * @ctx:	search context with mft record and attribute to search from
2862  *
2863  * You shouldn't need to call this function directly. Use ntfs_attr_lookup()
2864  * instead.
2865  *
2866  * Find an attribute by searching the attribute list for the corresponding
2867  * attribute list entry. Having found the entry, map the mft record for read
2868  * if the attribute is in a different mft record/inode, find the attribute in
2869  * there and return it.
2870  *
2871  * If @type is AT_UNUSED, return the first found attribute, i.e. one can
2872  * enumerate all attributes by setting @type to AT_UNUSED and then calling
2873  * ntfs_external_attr_find() repeatedly until it returns -1 with errno set to
2874  * ENOENT to indicate that there are no more entries. During the enumeration,
2875  * each successful call of ntfs_external_attr_find() will return the next
2876  * attribute described by the attribute list of the base mft record described
2877  * by the search context @ctx.
2878  *
2879  * If @type is AT_END, seek to the end of the base mft record ignoring the
2880  * attribute list completely and return -1 with errno set to ENOENT.  AT_END is
2881  * not a valid attribute, its length is zero for example, thus it is safer to
2882  * return error instead of success in this case.
2883  *
2884  * If @name is AT_UNNAMED search for an unnamed attribute. If @name is present
2885  * but not AT_UNNAMED search for a named attribute matching @name. Otherwise,
2886  * match both named and unnamed attributes.
2887  *
2888  * On first search @ctx->ntfs_ino must be the inode of the base mft record and
2889  * @ctx must have been obtained from a call to ntfs_attr_get_search_ctx().
2890  * On subsequent calls, @ctx->ntfs_ino can be any extent inode, too
2891  * (@ctx->base_ntfs_ino is then the base inode).
2892  *
2893  * After finishing with the attribute/mft record you need to call
2894  * ntfs_attr_put_search_ctx() to cleanup the search context (unmapping any
2895  * mapped extent inodes, etc).
2896  *
2897  * Return 0 if the search was successful and -1 if not, with errno set to the
2898  * error code.
2899  *
2900  * On success, @ctx->attr is the found attribute, it is in mft record
2901  * @ctx->mrec, and @ctx->al_entry is the attribute list entry for this
2902  * attribute with @ctx->base_* being the base mft record to which @ctx->attr
2903  * belongs.
2904  *
2905  * On error ENOENT, i.e. attribute not found, @ctx->attr is set to the
2906  * attribute which collates just after the attribute being searched for in the
2907  * base ntfs inode, i.e. if one wants to add the attribute to the mft record
2908  * this is the correct place to insert it into, and if there is not enough
2909  * space, the attribute should be placed in an extent mft record.
2910  * @ctx->al_entry points to the position within @ctx->base_ntfs_ino->attr_list
2911  * at which the new attribute's attribute list entry should be inserted.  The
2912  * other @ctx fields, base_ntfs_ino, base_mrec, and base_attr are set to NULL.
2913  * The only exception to this is when @type is AT_END, in which case
2914  * @ctx->al_entry is set to NULL also (see above).
2915  *
2916  * The following error codes are defined:
2917  *	ENOENT	Attribute not found, not an error as such.
2918  *	EINVAL	Invalid arguments.
2919  *	EIO	I/O error or corrupt data structures found.
2920  *	ENOMEM	Not enough memory to allocate necessary buffers.
2921  */
2922 static int ntfs_external_attr_find(ATTR_TYPES type, const ntfschar *name,
2923 		const u32 name_len, const IGNORE_CASE_BOOL ic,
2924 		const VCN lowest_vcn, const u8 *val, const u32 val_len,
2925 		ntfs_attr_search_ctx *ctx)
2926 {
2927 	ntfs_inode *base_ni, *ni;
2928 	ntfs_volume *vol;
2929 	ATTR_LIST_ENTRY *al_entry, *next_al_entry;
2930 	u8 *al_start, *al_end;
2931 	ATTR_RECORD *a;
2932 	ntfschar *al_name;
2933 	u32 al_name_len;
2934 	BOOL is_first_search = FALSE;
2935 
2936 	ni = ctx->ntfs_ino;
2937 	base_ni = ctx->base_ntfs_ino;
2938 	ntfs_log_trace("Entering for inode %lld, attribute type 0x%x.\n",
2939 			(unsigned long long)ni->mft_no, type);
2940 	if (!base_ni) {
2941 		/* First call happens with the base mft record. */
2942 		base_ni = ctx->base_ntfs_ino = ctx->ntfs_ino;
2943 		ctx->base_mrec = ctx->mrec;
2944 	}
2945 	if (ni == base_ni)
2946 		ctx->base_attr = ctx->attr;
2947 	if (type == AT_END)
2948 		goto not_found;
2949 	vol = base_ni->vol;
2950 	al_start = base_ni->attr_list;
2951 	al_end = al_start + base_ni->attr_list_size;
2952 	if (!ctx->al_entry) {
2953 		ctx->al_entry = (ATTR_LIST_ENTRY*)al_start;
2954 		is_first_search = TRUE;
2955 	}
2956 	/*
2957 	 * Iterate over entries in attribute list starting at @ctx->al_entry,
2958 	 * or the entry following that, if @ctx->is_first is TRUE.
2959 	 */
2960 	if (ctx->is_first) {
2961 		al_entry = ctx->al_entry;
2962 		ctx->is_first = FALSE;
2963 		/*
2964 		 * If an enumeration and the first attribute is higher than
2965 		 * the attribute list itself, need to return the attribute list
2966 		 * attribute.
2967 		 */
2968 		if ((type == AT_UNUSED) && is_first_search &&
2969 				le32_to_cpu(al_entry->type) >
2970 				le32_to_cpu(AT_ATTRIBUTE_LIST))
2971 			goto find_attr_list_attr;
2972 	} else {
2973 		al_entry = (ATTR_LIST_ENTRY*)((char*)ctx->al_entry +
2974 				le16_to_cpu(ctx->al_entry->length));
2975 		/*
2976 		 * If this is an enumeration and the attribute list attribute
2977 		 * is the next one in the enumeration sequence, just return the
2978 		 * attribute list attribute from the base mft record as it is
2979 		 * not listed in the attribute list itself.
2980 		 */
2981 		if ((type == AT_UNUSED) && le32_to_cpu(ctx->al_entry->type) <
2982 				le32_to_cpu(AT_ATTRIBUTE_LIST) &&
2983 				le32_to_cpu(al_entry->type) >
2984 				le32_to_cpu(AT_ATTRIBUTE_LIST)) {
2985 			int rc;
2986 find_attr_list_attr:
2987 
2988 			/* Check for bogus calls. */
2989 			if (name || name_len || val || val_len || lowest_vcn) {
2990 				errno = EINVAL;
2991 				ntfs_log_perror("%s", __FUNCTION__);
2992 				return -1;
2993 			}
2994 
2995 			/* We want the base record. */
2996 			ctx->ntfs_ino = base_ni;
2997 			ctx->mrec = ctx->base_mrec;
2998 			ctx->is_first = TRUE;
2999 			/* Sanity checks are performed elsewhere. */
3000 			ctx->attr = (ATTR_RECORD*)((u8*)ctx->mrec +
3001 					le16_to_cpu(ctx->mrec->attrs_offset));
3002 
3003 			/* Find the attribute list attribute. */
3004 			rc = ntfs_attr_find(AT_ATTRIBUTE_LIST, NULL, 0,
3005 					IGNORE_CASE, NULL, 0, ctx);
3006 
3007 			/*
3008 			 * Setup the search context so the correct
3009 			 * attribute is returned next time round.
3010 			 */
3011 			ctx->al_entry = al_entry;
3012 			ctx->is_first = TRUE;
3013 
3014 			/* Got it. Done. */
3015 			if (!rc)
3016 				return 0;
3017 
3018 			/* Error! If other than not found return it. */
3019 			if (errno != ENOENT)
3020 				return rc;
3021 
3022 			/* Not found?!? Absurd! */
3023 			errno = EIO;
3024 			ntfs_log_error("Attribute list wasn't found");
3025 			return -1;
3026 		}
3027 	}
3028 	for (;; al_entry = next_al_entry) {
3029 		/* Out of bounds check. */
3030 		if ((u8*)al_entry < base_ni->attr_list ||
3031 				(u8*)al_entry > al_end)
3032 			break;	/* Inode is corrupt. */
3033 		ctx->al_entry = al_entry;
3034 		/* Catch the end of the attribute list. */
3035 		if ((u8*)al_entry == al_end)
3036 			goto not_found;
3037 		if (!al_entry->length)
3038 			break;
3039 		if ((u8*)al_entry + 6 > al_end || (u8*)al_entry +
3040 				le16_to_cpu(al_entry->length) > al_end)
3041 			break;
3042 		next_al_entry = (ATTR_LIST_ENTRY*)((u8*)al_entry +
3043 				le16_to_cpu(al_entry->length));
3044 		if (type != AT_UNUSED) {
3045 			if (le32_to_cpu(al_entry->type) > le32_to_cpu(type))
3046 				goto not_found;
3047 			if (type != al_entry->type)
3048 				continue;
3049 		}
3050 		al_name_len = al_entry->name_length;
3051 		al_name = (ntfschar*)((u8*)al_entry + al_entry->name_offset);
3052 		/*
3053 		 * If !@type we want the attribute represented by this
3054 		 * attribute list entry.
3055 		 */
3056 		if (type == AT_UNUSED)
3057 			goto is_enumeration;
3058 		/*
3059 		 * If @name is AT_UNNAMED we want an unnamed attribute.
3060 		 * If @name is present, compare the two names.
3061 		 * Otherwise, match any attribute.
3062 		 */
3063 		if (name == AT_UNNAMED) {
3064 			if (al_name_len)
3065 				goto not_found;
3066 		} else {
3067 			int rc;
3068 
3069 			if (name && ((rc = ntfs_names_full_collate(name,
3070 					name_len, al_name, al_name_len, ic,
3071 					vol->upcase, vol->upcase_len)))) {
3072 
3073 				/*
3074 				 * If @name collates before al_name,
3075 				 * there is no matching attribute.
3076 				 */
3077 				if (rc < 0)
3078 					goto not_found;
3079 				/* If the strings are not equal, continue search. */
3080 				continue;
3081 			}
3082 		}
3083 		/*
3084 		 * The names match or @name not present and attribute is
3085 		 * unnamed. Now check @lowest_vcn. Continue search if the
3086 		 * next attribute list entry still fits @lowest_vcn. Otherwise
3087 		 * we have reached the right one or the search has failed.
3088 		 */
3089 		if (lowest_vcn && (u8*)next_al_entry >= al_start	    &&
3090 				(u8*)next_al_entry + 6 < al_end	    &&
3091 				(u8*)next_al_entry + le16_to_cpu(
3092 					next_al_entry->length) <= al_end    &&
3093 				sle64_to_cpu(next_al_entry->lowest_vcn) <=
3094 					lowest_vcn			    &&
3095 				next_al_entry->type == al_entry->type	    &&
3096 				next_al_entry->name_length == al_name_len   &&
3097 				ntfs_names_are_equal((ntfschar*)((char*)
3098 					next_al_entry +
3099 					next_al_entry->name_offset),
3100 					next_al_entry->name_length,
3101 					al_name, al_name_len, CASE_SENSITIVE,
3102 					vol->upcase, vol->upcase_len))
3103 			continue;
3104 is_enumeration:
3105 		if (MREF_LE(al_entry->mft_reference) == ni->mft_no) {
3106 			if (MSEQNO_LE(al_entry->mft_reference) !=
3107 					le16_to_cpu(
3108 					ni->mrec->sequence_number)) {
3109 				ntfs_log_error("Found stale mft reference in "
3110 						"attribute list!\n");
3111 				break;
3112 			}
3113 		} else { /* Mft references do not match. */
3114 			/* Do we want the base record back? */
3115 			if (MREF_LE(al_entry->mft_reference) ==
3116 					base_ni->mft_no) {
3117 				ni = ctx->ntfs_ino = base_ni;
3118 				ctx->mrec = ctx->base_mrec;
3119 			} else {
3120 				/* We want an extent record. */
3121 				ni = ntfs_extent_inode_open(base_ni,
3122 						al_entry->mft_reference);
3123 				if (!ni)
3124 					break;
3125 				ctx->ntfs_ino = ni;
3126 				ctx->mrec = ni->mrec;
3127 			}
3128 		}
3129 		a = ctx->attr = (ATTR_RECORD*)((char*)ctx->mrec +
3130 				le16_to_cpu(ctx->mrec->attrs_offset));
3131 		/*
3132 		 * ctx->ntfs_ino, ctx->mrec, and ctx->attr now point to the
3133 		 * mft record containing the attribute represented by the
3134 		 * current al_entry.
3135 		 *
3136 		 * We could call into ntfs_attr_find() to find the right
3137 		 * attribute in this mft record but this would be less
3138 		 * efficient and not quite accurate as ntfs_attr_find() ignores
3139 		 * the attribute instance numbers for example which become
3140 		 * important when one plays with attribute lists. Also, because
3141 		 * a proper match has been found in the attribute list entry
3142 		 * above, the comparison can now be optimized. So it is worth
3143 		 * re-implementing a simplified ntfs_attr_find() here.
3144 		 *
3145 		 * Use a manual loop so we can still use break and continue
3146 		 * with the same meanings as above.
3147 		 */
3148 do_next_attr_loop:
3149 		if ((char*)a < (char*)ctx->mrec || (char*)a > (char*)ctx->mrec +
3150 				le32_to_cpu(ctx->mrec->bytes_allocated))
3151 			break;
3152 		if (a->type == AT_END)
3153 			continue;
3154 		if (!a->length)
3155 			break;
3156 		if (al_entry->instance != a->instance)
3157 			goto do_next_attr;
3158 		/*
3159 		 * If the type and/or the name are/is mismatched between the
3160 		 * attribute list entry and the attribute record, there is
3161 		 * corruption so we break and return error EIO.
3162 		 */
3163 		if (al_entry->type != a->type)
3164 			break;
3165 		if (!ntfs_names_are_equal((ntfschar*)((char*)a +
3166 				le16_to_cpu(a->name_offset)),
3167 				a->name_length, al_name,
3168 				al_name_len, CASE_SENSITIVE,
3169 				vol->upcase, vol->upcase_len))
3170 			break;
3171 		ctx->attr = a;
3172 		/*
3173 		 * If no @val specified or @val specified and it matches, we
3174 		 * have found it! Also, if !@type, it is an enumeration, so we
3175 		 * want the current attribute.
3176 		 */
3177 		if ((type == AT_UNUSED) || !val || (!a->non_resident &&
3178 				le32_to_cpu(a->value_length) == val_len &&
3179 				!memcmp((char*)a + le16_to_cpu(a->value_offset),
3180 				val, val_len))) {
3181 			return 0;
3182 		}
3183 do_next_attr:
3184 		/* Proceed to the next attribute in the current mft record. */
3185 		a = (ATTR_RECORD*)((char*)a + le32_to_cpu(a->length));
3186 		goto do_next_attr_loop;
3187 	}
3188 	if (ni != base_ni) {
3189 		ctx->ntfs_ino = base_ni;
3190 		ctx->mrec = ctx->base_mrec;
3191 		ctx->attr = ctx->base_attr;
3192 	}
3193 	errno = EIO;
3194 	ntfs_log_perror("Inode is corrupt (%lld)", (long long)base_ni->mft_no);
3195 	return -1;
3196 not_found:
3197 	/*
3198 	 * If we were looking for AT_END or we were enumerating and reached the
3199 	 * end, we reset the search context @ctx and use ntfs_attr_find() to
3200 	 * seek to the end of the base mft record.
3201 	 */
3202 	if (type == AT_UNUSED || type == AT_END) {
3203 		ntfs_attr_reinit_search_ctx(ctx);
3204 		return ntfs_attr_find(AT_END, name, name_len, ic, val, val_len,
3205 				ctx);
3206 	}
3207 	/*
3208 	 * The attribute wasn't found.  Before we return, we want to ensure
3209 	 * @ctx->mrec and @ctx->attr indicate the position at which the
3210 	 * attribute should be inserted in the base mft record.  Since we also
3211 	 * want to preserve @ctx->al_entry we cannot reinitialize the search
3212 	 * context using ntfs_attr_reinit_search_ctx() as this would set
3213 	 * @ctx->al_entry to NULL.  Thus we do the necessary bits manually (see
3214 	 * ntfs_attr_init_search_ctx() below).  Note, we _only_ preserve
3215 	 * @ctx->al_entry as the remaining fields (base_*) are identical to
3216 	 * their non base_ counterparts and we cannot set @ctx->base_attr
3217 	 * correctly yet as we do not know what @ctx->attr will be set to by
3218 	 * the call to ntfs_attr_find() below.
3219 	 */
3220 	ctx->mrec = ctx->base_mrec;
3221 	ctx->attr = (ATTR_RECORD*)((u8*)ctx->mrec +
3222 			le16_to_cpu(ctx->mrec->attrs_offset));
3223 	ctx->is_first = TRUE;
3224 	ctx->ntfs_ino = ctx->base_ntfs_ino;
3225 	ctx->base_ntfs_ino = NULL;
3226 	ctx->base_mrec = NULL;
3227 	ctx->base_attr = NULL;
3228 	/*
3229 	 * In case there are multiple matches in the base mft record, need to
3230 	 * keep enumerating until we get an attribute not found response (or
3231 	 * another error), otherwise we would keep returning the same attribute
3232 	 * over and over again and all programs using us for enumeration would
3233 	 * lock up in a tight loop.
3234 	 */
3235 	{
3236 		int ret;
3237 
3238 		do {
3239 			ret = ntfs_attr_find(type, name, name_len, ic, val,
3240 					val_len, ctx);
3241 		} while (!ret);
3242 		return ret;
3243 	}
3244 }
3245 
3246 /**
3247  * ntfs_attr_lookup - find an attribute in an ntfs inode
3248  * @type:	attribute type to find
3249  * @name:	attribute name to find (optional, i.e. NULL means don't care)
3250  * @name_len:	attribute name length (only needed if @name present)
3251  * @ic:		IGNORE_CASE or CASE_SENSITIVE (ignored if @name not present)
3252  * @lowest_vcn:	lowest vcn to find (optional, non-resident attributes only)
3253  * @val:	attribute value to find (optional, resident attributes only)
3254  * @val_len:	attribute value length
3255  * @ctx:	search context with mft record and attribute to search from
3256  *
3257  * Find an attribute in an ntfs inode. On first search @ctx->ntfs_ino must
3258  * be the base mft record and @ctx must have been obtained from a call to
3259  * ntfs_attr_get_search_ctx().
3260  *
3261  * This function transparently handles attribute lists and @ctx is used to
3262  * continue searches where they were left off at.
3263  *
3264  * If @type is AT_UNUSED, return the first found attribute, i.e. one can
3265  * enumerate all attributes by setting @type to AT_UNUSED and then calling
3266  * ntfs_attr_lookup() repeatedly until it returns -1 with errno set to ENOENT
3267  * to indicate that there are no more entries. During the enumeration, each
3268  * successful call of ntfs_attr_lookup() will return the next attribute, with
3269  * the current attribute being described by the search context @ctx.
3270  *
3271  * If @type is AT_END, seek to the end of the base mft record ignoring the
3272  * attribute list completely and return -1 with errno set to ENOENT.  AT_END is
3273  * not a valid attribute, its length is zero for example, thus it is safer to
3274  * return error instead of success in this case.  It should never be needed to
3275  * do this, but we implement the functionality because it allows for simpler
3276  * code inside ntfs_external_attr_find().
3277  *
3278  * If @name is AT_UNNAMED search for an unnamed attribute. If @name is present
3279  * but not AT_UNNAMED search for a named attribute matching @name. Otherwise,
3280  * match both named and unnamed attributes.
3281  *
3282  * After finishing with the attribute/mft record you need to call
3283  * ntfs_attr_put_search_ctx() to cleanup the search context (unmapping any
3284  * mapped extent inodes, etc).
3285  *
3286  * Return 0 if the search was successful and -1 if not, with errno set to the
3287  * error code.
3288  *
3289  * On success, @ctx->attr is the found attribute, it is in mft record
3290  * @ctx->mrec, and @ctx->al_entry is the attribute list entry for this
3291  * attribute with @ctx->base_* being the base mft record to which @ctx->attr
3292  * belongs.  If no attribute list attribute is present @ctx->al_entry and
3293  * @ctx->base_* are NULL.
3294  *
3295  * On error ENOENT, i.e. attribute not found, @ctx->attr is set to the
3296  * attribute which collates just after the attribute being searched for in the
3297  * base ntfs inode, i.e. if one wants to add the attribute to the mft record
3298  * this is the correct place to insert it into, and if there is not enough
3299  * space, the attribute should be placed in an extent mft record.
3300  * @ctx->al_entry points to the position within @ctx->base_ntfs_ino->attr_list
3301  * at which the new attribute's attribute list entry should be inserted.  The
3302  * other @ctx fields, base_ntfs_ino, base_mrec, and base_attr are set to NULL.
3303  * The only exception to this is when @type is AT_END, in which case
3304  * @ctx->al_entry is set to NULL also (see above).
3305  *
3306  *
3307  * The following error codes are defined:
3308  *	ENOENT	Attribute not found, not an error as such.
3309  *	EINVAL	Invalid arguments.
3310  *	EIO	I/O error or corrupt data structures found.
3311  *	ENOMEM	Not enough memory to allocate necessary buffers.
3312  */
3313 int ntfs_attr_lookup(const ATTR_TYPES type, const ntfschar *name,
3314 		const u32 name_len, const IGNORE_CASE_BOOL ic,
3315 		const VCN lowest_vcn, const u8 *val, const u32 val_len,
3316 		ntfs_attr_search_ctx *ctx)
3317 {
3318 	ntfs_volume *vol;
3319 	ntfs_inode *base_ni;
3320 	int ret = -1;
3321 
3322 	ntfs_log_enter("Entering for attribute type 0x%x\n", type);
3323 
3324 	if (!ctx || !ctx->mrec || !ctx->attr || (name && name != AT_UNNAMED &&
3325 			(!ctx->ntfs_ino || !(vol = ctx->ntfs_ino->vol) ||
3326 			!vol->upcase || !vol->upcase_len))) {
3327 		errno = EINVAL;
3328 		ntfs_log_perror("%s", __FUNCTION__);
3329 		goto out;
3330 	}
3331 
3332 	if (ctx->base_ntfs_ino)
3333 		base_ni = ctx->base_ntfs_ino;
3334 	else
3335 		base_ni = ctx->ntfs_ino;
3336 	if (!base_ni || !NInoAttrList(base_ni) || type == AT_ATTRIBUTE_LIST)
3337 		ret = ntfs_attr_find(type, name, name_len, ic, val, val_len, ctx);
3338 	else
3339 		ret = ntfs_external_attr_find(type, name, name_len, ic,
3340 					      lowest_vcn, val, val_len, ctx);
3341 out:
3342 	ntfs_log_leave("\n");
3343 	return ret;
3344 }
3345 
3346 /**
3347  * ntfs_attr_position - find given or next attribute type in an ntfs inode
3348  * @type:	attribute type to start lookup
3349  * @ctx:	search context with mft record and attribute to search from
3350  *
3351  * Find an attribute type in an ntfs inode or the next attribute which is not
3352  * the AT_END attribute. Please see more details at ntfs_attr_lookup.
3353  *
3354  * Return 0 if the search was successful and -1 if not, with errno set to the
3355  * error code.
3356  *
3357  * The following error codes are defined:
3358  *	EINVAL	Invalid arguments.
3359  *	EIO	I/O error or corrupt data structures found.
3360  *	ENOMEM	Not enough memory to allocate necessary buffers.
3361  * 	ENOSPC  No attribute was found after 'type', only AT_END.
3362  */
3363 int ntfs_attr_position(const ATTR_TYPES type, ntfs_attr_search_ctx *ctx)
3364 {
3365 	if (ntfs_attr_lookup(type, NULL, 0, CASE_SENSITIVE, 0, NULL, 0, ctx)) {
3366 		if (errno != ENOENT)
3367 			return -1;
3368 		if (ctx->attr->type == AT_END) {
3369 			errno = ENOSPC;
3370 			return -1;
3371 		}
3372 	}
3373 	return 0;
3374 }
3375 
3376 /**
3377  * ntfs_attr_init_search_ctx - initialize an attribute search context
3378  * @ctx:	attribute search context to initialize
3379  * @ni:		ntfs inode with which to initialize the search context
3380  * @mrec:	mft record with which to initialize the search context
3381  *
3382  * Initialize the attribute search context @ctx with @ni and @mrec.
3383  */
3384 static void ntfs_attr_init_search_ctx(ntfs_attr_search_ctx *ctx,
3385 		ntfs_inode *ni, MFT_RECORD *mrec)
3386 {
3387 	if (!mrec)
3388 		mrec = ni->mrec;
3389 	ctx->mrec = mrec;
3390 	/* Sanity checks are performed elsewhere. */
3391 	ctx->attr = (ATTR_RECORD*)((u8*)mrec + le16_to_cpu(mrec->attrs_offset));
3392 	ctx->is_first = TRUE;
3393 	ctx->ntfs_ino = ni;
3394 	ctx->al_entry = NULL;
3395 	ctx->base_ntfs_ino = NULL;
3396 	ctx->base_mrec = NULL;
3397 	ctx->base_attr = NULL;
3398 }
3399 
3400 /**
3401  * ntfs_attr_reinit_search_ctx - reinitialize an attribute search context
3402  * @ctx:	attribute search context to reinitialize
3403  *
3404  * Reinitialize the attribute search context @ctx.
3405  *
3406  * This is used when a search for a new attribute is being started to reset
3407  * the search context to the beginning.
3408  */
3409 void ntfs_attr_reinit_search_ctx(ntfs_attr_search_ctx *ctx)
3410 {
3411 	if (!ctx->base_ntfs_ino) {
3412 		/* No attribute list. */
3413 		ctx->is_first = TRUE;
3414 		/* Sanity checks are performed elsewhere. */
3415 		ctx->attr = (ATTR_RECORD*)((u8*)ctx->mrec +
3416 				le16_to_cpu(ctx->mrec->attrs_offset));
3417 		/*
3418 		 * This needs resetting due to ntfs_external_attr_find() which
3419 		 * can leave it set despite having zeroed ctx->base_ntfs_ino.
3420 		 */
3421 		ctx->al_entry = NULL;
3422 		return;
3423 	} /* Attribute list. */
3424 	ntfs_attr_init_search_ctx(ctx, ctx->base_ntfs_ino, ctx->base_mrec);
3425 	return;
3426 }
3427 
3428 /**
3429  * ntfs_attr_get_search_ctx - allocate/initialize a new attribute search context
3430  * @ni:		ntfs inode with which to initialize the search context
3431  * @mrec:	mft record with which to initialize the search context
3432  *
3433  * Allocate a new attribute search context, initialize it with @ni and @mrec,
3434  * and return it. Return NULL on error with errno set.
3435  *
3436  * @mrec can be NULL, in which case the mft record is taken from @ni.
3437  *
3438  * Note: For low level utilities which know what they are doing we allow @ni to
3439  * be NULL and @mrec to be set.  Do NOT do this unless you understand the
3440  * implications!!!  For example it is no longer safe to call ntfs_attr_lookup().
3441  */
3442 ntfs_attr_search_ctx *ntfs_attr_get_search_ctx(ntfs_inode *ni, MFT_RECORD *mrec)
3443 {
3444 	ntfs_attr_search_ctx *ctx;
3445 
3446 	if (!ni && !mrec) {
3447 		errno = EINVAL;
3448 		ntfs_log_perror("NULL arguments");
3449 		return NULL;
3450 	}
3451 	ctx = ntfs_malloc(sizeof(ntfs_attr_search_ctx));
3452 	if (ctx)
3453 		ntfs_attr_init_search_ctx(ctx, ni, mrec);
3454 	return ctx;
3455 }
3456 
3457 /**
3458  * ntfs_attr_put_search_ctx - release an attribute search context
3459  * @ctx:	attribute search context to free
3460  *
3461  * Release the attribute search context @ctx.
3462  */
3463 void ntfs_attr_put_search_ctx(ntfs_attr_search_ctx *ctx)
3464 {
3465 	// NOTE: save errno if it could change and function stays void!
3466 	free(ctx);
3467 }
3468 
3469 /**
3470  * ntfs_attr_find_in_attrdef - find an attribute in the $AttrDef system file
3471  * @vol:	ntfs volume to which the attribute belongs
3472  * @type:	attribute type which to find
3473  *
3474  * Search for the attribute definition record corresponding to the attribute
3475  * @type in the $AttrDef system file.
3476  *
3477  * Return the attribute type definition record if found and NULL if not found
3478  * or an error occurred. On error the error code is stored in errno. The
3479  * following error codes are defined:
3480  *	ENOENT	- The attribute @type is not specified in $AttrDef.
3481  *	EINVAL	- Invalid parameters (e.g. @vol is not valid).
3482  */
3483 ATTR_DEF *ntfs_attr_find_in_attrdef(const ntfs_volume *vol,
3484 		const ATTR_TYPES type)
3485 {
3486 	ATTR_DEF *ad;
3487 
3488 	if (!vol || !vol->attrdef || !type) {
3489 		errno = EINVAL;
3490 		ntfs_log_perror("%s: type=%d", __FUNCTION__, type);
3491 		return NULL;
3492 	}
3493 	for (ad = vol->attrdef; (u8*)ad - (u8*)vol->attrdef <
3494 			vol->attrdef_len && ad->type; ++ad) {
3495 		/* We haven't found it yet, carry on searching. */
3496 		if (le32_to_cpu(ad->type) < le32_to_cpu(type))
3497 			continue;
3498 		/* We found the attribute; return it. */
3499 		if (ad->type == type)
3500 			return ad;
3501 		/* We have gone too far already. No point in continuing. */
3502 		break;
3503 	}
3504 	errno = ENOENT;
3505 	ntfs_log_perror("%s: type=%d", __FUNCTION__, type);
3506 	return NULL;
3507 }
3508 
3509 /**
3510  * ntfs_attr_size_bounds_check - check a size of an attribute type for validity
3511  * @vol:	ntfs volume to which the attribute belongs
3512  * @type:	attribute type which to check
3513  * @size:	size which to check
3514  *
3515  * Check whether the @size in bytes is valid for an attribute of @type on the
3516  * ntfs volume @vol. This information is obtained from $AttrDef system file.
3517  *
3518  * Return 0 if valid and -1 if not valid or an error occurred. On error the
3519  * error code is stored in errno. The following error codes are defined:
3520  *	ERANGE	- @size is not valid for the attribute @type.
3521  *	ENOENT	- The attribute @type is not specified in $AttrDef.
3522  *	EINVAL	- Invalid parameters (e.g. @size is < 0 or @vol is not valid).
3523  */
3524 int ntfs_attr_size_bounds_check(const ntfs_volume *vol, const ATTR_TYPES type,
3525 		const s64 size)
3526 {
3527 	ATTR_DEF *ad;
3528 	s64 min_size, max_size;
3529 
3530 	if (size < 0) {
3531 		errno = EINVAL;
3532 		ntfs_log_perror("%s: size=%lld", __FUNCTION__,
3533 				(long long)size);
3534 		return -1;
3535 	}
3536 
3537 	/*
3538 	 * $ATTRIBUTE_LIST shouldn't be greater than 0x40000, otherwise
3539 	 * Windows would crash. This is not listed in the AttrDef.
3540 	 */
3541 	if (type == AT_ATTRIBUTE_LIST && size > 0x40000) {
3542 		errno = ERANGE;
3543 		ntfs_log_perror("Too large attrlist (%lld)", (long long)size);
3544 		return -1;
3545 	}
3546 
3547 	ad = ntfs_attr_find_in_attrdef(vol, type);
3548 	if (!ad)
3549 		return -1;
3550 
3551 	min_size = sle64_to_cpu(ad->min_size);
3552 	max_size = sle64_to_cpu(ad->max_size);
3553 
3554 	/* The $AttrDef generated by Windows specifies 2 as min_size for the
3555 	 * volume name attribute, but in reality Windows sets it to 0 when
3556 	 * clearing the volume name. If we want to be able to clear the volume
3557 	 * name we must also accept 0 as min_size, despite the $AttrDef
3558 	 * definition. */
3559 	if(type == AT_VOLUME_NAME)
3560 		min_size = 0;
3561 
3562 	if ((min_size && (size < min_size)) ||
3563 	    ((max_size > 0) && (size > max_size))) {
3564 		errno = ERANGE;
3565 		ntfs_log_perror("Attr type %d size check failed (min,size,max="
3566 			"%lld,%lld,%lld)", type, (long long)min_size,
3567 			(long long)size, (long long)max_size);
3568 		return -1;
3569 	}
3570 	return 0;
3571 }
3572 
3573 /**
3574  * ntfs_attr_can_be_non_resident - check if an attribute can be non-resident
3575  * @vol:	ntfs volume to which the attribute belongs
3576  * @type:	attribute type to check
3577  * @name:	attribute name to check
3578  * @name_len:	attribute name length
3579  *
3580  * Check whether the attribute of @type and @name with name length @name_len on
3581  * the ntfs volume @vol is allowed to be non-resident.  This information is
3582  * obtained from $AttrDef system file and is augmented by rules imposed by
3583  * Microsoft (e.g. see http://support.microsoft.com/kb/974729/).
3584  *
3585  * Return 0 if the attribute is allowed to be non-resident and -1 if not or an
3586  * error occurred. On error the error code is stored in errno. The following
3587  * error codes are defined:
3588  *	EPERM	- The attribute is not allowed to be non-resident.
3589  *	ENOENT	- The attribute @type is not specified in $AttrDef.
3590  *	EINVAL	- Invalid parameters (e.g. @vol is not valid).
3591  */
3592 static int ntfs_attr_can_be_non_resident(const ntfs_volume *vol, const ATTR_TYPES type,
3593 					const ntfschar *name, int name_len)
3594 {
3595 	ATTR_DEF *ad;
3596 	BOOL allowed;
3597 
3598 	/*
3599 	 * Microsoft has decreed that $LOGGED_UTILITY_STREAM attributes with a
3600 	 * name of $TXF_DATA must be resident despite the entry for
3601 	 * $LOGGED_UTILITY_STREAM in $AttrDef allowing them to be non-resident.
3602 	 * Failure to obey this on the root directory mft record of a volume
3603 	 * causes Windows Vista and later to see the volume as a RAW volume and
3604 	 * thus cannot mount it at all.
3605 	 */
3606 	if ((type == AT_LOGGED_UTILITY_STREAM)
3607 	    && name
3608 	    && ntfs_names_are_equal(TXF_DATA, 9, name, name_len,
3609 			CASE_SENSITIVE, vol->upcase, vol->upcase_len))
3610 		allowed = FALSE;
3611 	else {
3612 		/* Find the attribute definition record in $AttrDef. */
3613 		ad = ntfs_attr_find_in_attrdef(vol, type);
3614 		if (!ad)
3615 			return -1;
3616 		/* Check the flags and return the result. */
3617 		allowed = !(ad->flags & ATTR_DEF_RESIDENT);
3618 	}
3619 	if (!allowed) {
3620 		errno = EPERM;
3621 		ntfs_log_trace("Attribute can't be non-resident\n");
3622 		return -1;
3623 	}
3624 	return 0;
3625 }
3626 
3627 /**
3628  * ntfs_attr_can_be_resident - check if an attribute can be resident
3629  * @vol:	ntfs volume to which the attribute belongs
3630  * @type:	attribute type which to check
3631  *
3632  * Check whether the attribute of @type on the ntfs volume @vol is allowed to
3633  * be resident. This information is derived from our ntfs knowledge and may
3634  * not be completely accurate, especially when user defined attributes are
3635  * present. Basically we allow everything to be resident except for index
3636  * allocation and extended attribute attributes.
3637  *
3638  * Return 0 if the attribute is allowed to be resident and -1 if not or an
3639  * error occurred. On error the error code is stored in errno. The following
3640  * error codes are defined:
3641  *	EPERM	- The attribute is not allowed to be resident.
3642  *	EINVAL	- Invalid parameters (e.g. @vol is not valid).
3643  *
3644  * Warning: In the system file $MFT the attribute $Bitmap must be non-resident
3645  *	    otherwise windows will not boot (blue screen of death)!  We cannot
3646  *	    check for this here as we don't know which inode's $Bitmap is being
3647  *	    asked about so the caller needs to special case this.
3648  */
3649 int ntfs_attr_can_be_resident(const ntfs_volume *vol, const ATTR_TYPES type)
3650 {
3651 	if (!vol || !vol->attrdef || !type) {
3652 		errno = EINVAL;
3653 		return -1;
3654 	}
3655 	if (type != AT_INDEX_ALLOCATION)
3656 		return 0;
3657 
3658 	ntfs_log_trace("Attribute can't be resident\n");
3659 	errno = EPERM;
3660 	return -1;
3661 }
3662 
3663 /**
3664  * ntfs_make_room_for_attr - make room for an attribute inside an mft record
3665  * @m:		mft record
3666  * @pos:	position at which to make space
3667  * @size:	byte size to make available at this position
3668  *
3669  * @pos points to the attribute in front of which we want to make space.
3670  *
3671  * Return 0 on success or -1 on error. On error the error code is stored in
3672  * errno. Possible error codes are:
3673  *	ENOSPC	- There is not enough space available to complete operation. The
3674  *		  caller has to make space before calling this.
3675  *	EINVAL	- Input parameters were faulty.
3676  */
3677 int ntfs_make_room_for_attr(MFT_RECORD *m, u8 *pos, u32 size)
3678 {
3679 	u32 biu;
3680 
3681 	ntfs_log_trace("Entering for pos 0x%d, size %u.\n",
3682 		(int)(pos - (u8*)m), (unsigned) size);
3683 
3684 	/* Make size 8-byte alignment. */
3685 	size = (size + 7) & ~7;
3686 
3687 	/* Rigorous consistency checks. */
3688 	if (!m || !pos || pos < (u8*)m) {
3689 		errno = EINVAL;
3690 		ntfs_log_perror("%s: pos=%p  m=%p", __FUNCTION__, pos, m);
3691 		return -1;
3692 	}
3693 	/* The -8 is for the attribute terminator. */
3694 	if (pos - (u8*)m > (int)le32_to_cpu(m->bytes_in_use) - 8) {
3695 		errno = EINVAL;
3696 		return -1;
3697 	}
3698 	/* Nothing to do. */
3699 	if (!size)
3700 		return 0;
3701 
3702 	biu = le32_to_cpu(m->bytes_in_use);
3703 	/* Do we have enough space? */
3704 	if (biu + size > le32_to_cpu(m->bytes_allocated) ||
3705 	    pos + size > (u8*)m + le32_to_cpu(m->bytes_allocated)) {
3706 		errno = ENOSPC;
3707 		ntfs_log_trace("No enough space in the MFT record\n");
3708 		return -1;
3709 	}
3710 	/* Move everything after pos to pos + size. */
3711 	memmove(pos + size, pos, biu - (pos - (u8*)m));
3712 	/* Update mft record. */
3713 	m->bytes_in_use = cpu_to_le32(biu + size);
3714 	return 0;
3715 }
3716 
3717 /**
3718  * ntfs_resident_attr_record_add - add resident attribute to inode
3719  * @ni:		opened ntfs inode to which MFT record add attribute
3720  * @type:	type of the new attribute
3721  * @name:	name of the new attribute
3722  * @name_len:	name length of the new attribute
3723  * @val:	value of the new attribute
3724  * @size:	size of new attribute (length of @val, if @val != NULL)
3725  * @flags:	flags of the new attribute
3726  *
3727  * Return offset to attribute from the beginning of the mft record on success
3728  * and -1 on error. On error the error code is stored in errno.
3729  * Possible error codes are:
3730  *	EINVAL	- Invalid arguments passed to function.
3731  *	EEXIST	- Attribute of such type and with same name already exists.
3732  *	EIO	- I/O error occurred or damaged filesystem.
3733  */
3734 int ntfs_resident_attr_record_add(ntfs_inode *ni, ATTR_TYPES type,
3735 			ntfschar *name, u8 name_len, u8 *val, u32 size,
3736 			ATTR_FLAGS data_flags)
3737 {
3738 	ntfs_attr_search_ctx *ctx;
3739 	u32 length;
3740 	ATTR_RECORD *a;
3741 	MFT_RECORD *m;
3742 	int err, offset;
3743 	ntfs_inode *base_ni;
3744 
3745 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x, flags 0x%x.\n",
3746 		(long long) ni->mft_no, (unsigned) type, (unsigned) data_flags);
3747 
3748 	if (!ni || (!name && name_len)) {
3749 		errno = EINVAL;
3750 		return -1;
3751 	}
3752 
3753 	if (ntfs_attr_can_be_resident(ni->vol, type)) {
3754 		if (errno == EPERM)
3755 			ntfs_log_trace("Attribute can't be resident.\n");
3756 		else
3757 			ntfs_log_trace("ntfs_attr_can_be_resident failed.\n");
3758 		return -1;
3759 	}
3760 
3761 	/* Locate place where record should be. */
3762 	ctx = ntfs_attr_get_search_ctx(ni, NULL);
3763 	if (!ctx)
3764 		return -1;
3765 	/*
3766 	 * Use ntfs_attr_find instead of ntfs_attr_lookup to find place for
3767 	 * attribute in @ni->mrec, not any extent inode in case if @ni is base
3768 	 * file record.
3769 	 */
3770 	if (!ntfs_attr_find(type, name, name_len, CASE_SENSITIVE, val, size,
3771 			ctx)) {
3772 		err = EEXIST;
3773 		ntfs_log_trace("Attribute already present.\n");
3774 		goto put_err_out;
3775 	}
3776 	if (errno != ENOENT) {
3777 		err = EIO;
3778 		goto put_err_out;
3779 	}
3780 	a = ctx->attr;
3781 	m = ctx->mrec;
3782 
3783 	/* Make room for attribute. */
3784 	length = offsetof(ATTR_RECORD, resident_end) +
3785 				((name_len * sizeof(ntfschar) + 7) & ~7) +
3786 				((size + 7) & ~7);
3787 	if (ntfs_make_room_for_attr(ctx->mrec, (u8*) ctx->attr, length)) {
3788 		err = errno;
3789 		ntfs_log_trace("Failed to make room for attribute.\n");
3790 		goto put_err_out;
3791 	}
3792 
3793 	/* Setup record fields. */
3794 	offset = ((u8*)a - (u8*)m);
3795 	a->type = type;
3796 	a->length = cpu_to_le32(length);
3797 	a->non_resident = 0;
3798 	a->name_length = name_len;
3799 	a->name_offset = (name_len
3800 		? cpu_to_le16(offsetof(ATTR_RECORD, resident_end))
3801 		: const_cpu_to_le16(0));
3802 	a->flags = data_flags;
3803 	a->instance = m->next_attr_instance;
3804 	a->value_length = cpu_to_le32(size);
3805 	a->value_offset = cpu_to_le16(length - ((size + 7) & ~7));
3806 	if (val)
3807 		memcpy((u8*)a + le16_to_cpu(a->value_offset), val, size);
3808 	else
3809 		memset((u8*)a + le16_to_cpu(a->value_offset), 0, size);
3810 	if (type == AT_FILE_NAME)
3811 		a->resident_flags = RESIDENT_ATTR_IS_INDEXED;
3812 	else
3813 		a->resident_flags = 0;
3814 	if (name_len)
3815 		memcpy((u8*)a + le16_to_cpu(a->name_offset),
3816 			name, sizeof(ntfschar) * name_len);
3817 	m->next_attr_instance =
3818 		cpu_to_le16((le16_to_cpu(m->next_attr_instance) + 1) & 0xffff);
3819 	if (ni->nr_extents == -1)
3820 		base_ni = ni->base_ni;
3821 	else
3822 		base_ni = ni;
3823 	if (type != AT_ATTRIBUTE_LIST && NInoAttrList(base_ni)) {
3824 		if (ntfs_attrlist_entry_add(ni, a)) {
3825 			err = errno;
3826 			ntfs_attr_record_resize(m, a, 0);
3827 			ntfs_log_trace("Failed add attribute entry to "
3828 					"ATTRIBUTE_LIST.\n");
3829 			goto put_err_out;
3830 		}
3831 	}
3832 	if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY
3833 	    ? type == AT_INDEX_ROOT && name == NTFS_INDEX_I30
3834 	    : type == AT_DATA && name == AT_UNNAMED) {
3835 		ni->data_size = size;
3836 		ni->allocated_size = (size + 7) & ~7;
3837 		set_nino_flag(ni,KnownSize);
3838 	}
3839 	ntfs_inode_mark_dirty(ni);
3840 	ntfs_attr_put_search_ctx(ctx);
3841 	return offset;
3842 put_err_out:
3843 	ntfs_attr_put_search_ctx(ctx);
3844 	errno = err;
3845 	return -1;
3846 }
3847 
3848 /**
3849  * ntfs_non_resident_attr_record_add - add extent of non-resident attribute
3850  * @ni:			opened ntfs inode to which MFT record add attribute
3851  * @type:		type of the new attribute extent
3852  * @name:		name of the new attribute extent
3853  * @name_len:		name length of the new attribute extent
3854  * @lowest_vcn:		lowest vcn of the new attribute extent
3855  * @dataruns_size:	dataruns size of the new attribute extent
3856  * @flags:		flags of the new attribute extent
3857  *
3858  * Return offset to attribute from the beginning of the mft record on success
3859  * and -1 on error. On error the error code is stored in errno.
3860  * Possible error codes are:
3861  *	EINVAL	- Invalid arguments passed to function.
3862  *	EEXIST	- Attribute of such type, with same lowest vcn and with same
3863  *		  name already exists.
3864  *	EIO	- I/O error occurred or damaged filesystem.
3865  */
3866 int ntfs_non_resident_attr_record_add(ntfs_inode *ni, ATTR_TYPES type,
3867 		ntfschar *name, u8 name_len, VCN lowest_vcn, int dataruns_size,
3868 		ATTR_FLAGS flags)
3869 {
3870 	ntfs_attr_search_ctx *ctx;
3871 	u32 length;
3872 	ATTR_RECORD *a;
3873 	MFT_RECORD *m;
3874 	ntfs_inode *base_ni;
3875 	int err, offset;
3876 
3877 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x, lowest_vcn %lld, "
3878 			"dataruns_size %d, flags 0x%x.\n",
3879 			(long long) ni->mft_no, (unsigned) type,
3880 			(long long) lowest_vcn, dataruns_size, (unsigned) flags);
3881 
3882 	if (!ni || dataruns_size <= 0 || (!name && name_len)) {
3883 		errno = EINVAL;
3884 		return -1;
3885 	}
3886 
3887 	if (ntfs_attr_can_be_non_resident(ni->vol, type, name, name_len)) {
3888 		if (errno == EPERM)
3889 			ntfs_log_perror("Attribute can't be non resident");
3890 		else
3891 			ntfs_log_perror("ntfs_attr_can_be_non_resident failed");
3892 		return -1;
3893 	}
3894 
3895 	/* Locate place where record should be. */
3896 	ctx = ntfs_attr_get_search_ctx(ni, NULL);
3897 	if (!ctx)
3898 		return -1;
3899 	/*
3900 	 * Use ntfs_attr_find instead of ntfs_attr_lookup to find place for
3901 	 * attribute in @ni->mrec, not any extent inode in case if @ni is base
3902 	 * file record.
3903 	 */
3904 	if (!ntfs_attr_find(type, name, name_len, CASE_SENSITIVE, NULL, 0,
3905 			ctx)) {
3906 		err = EEXIST;
3907 		ntfs_log_perror("Attribute 0x%x already present", type);
3908 		goto put_err_out;
3909 	}
3910 	if (errno != ENOENT) {
3911 		ntfs_log_perror("ntfs_attr_find failed");
3912 		err = EIO;
3913 		goto put_err_out;
3914 	}
3915 	a = ctx->attr;
3916 	m = ctx->mrec;
3917 
3918 	/* Make room for attribute. */
3919 	dataruns_size = (dataruns_size + 7) & ~7;
3920 	length = offsetof(ATTR_RECORD, compressed_size) + ((sizeof(ntfschar) *
3921 			name_len + 7) & ~7) + dataruns_size +
3922 			((flags & (ATTR_IS_COMPRESSED | ATTR_IS_SPARSE)) ?
3923 			sizeof(a->compressed_size) : 0);
3924 	if (ntfs_make_room_for_attr(ctx->mrec, (u8*) ctx->attr, length)) {
3925 		err = errno;
3926 		ntfs_log_perror("Failed to make room for attribute");
3927 		goto put_err_out;
3928 	}
3929 
3930 	/* Setup record fields. */
3931 	a->type = type;
3932 	a->length = cpu_to_le32(length);
3933 	a->non_resident = 1;
3934 	a->name_length = name_len;
3935 	a->name_offset = cpu_to_le16(offsetof(ATTR_RECORD, compressed_size) +
3936 			((flags & (ATTR_IS_COMPRESSED | ATTR_IS_SPARSE)) ?
3937 			sizeof(a->compressed_size) : 0));
3938 	a->flags = flags;
3939 	a->instance = m->next_attr_instance;
3940 	a->lowest_vcn = cpu_to_sle64(lowest_vcn);
3941 	a->mapping_pairs_offset = cpu_to_le16(length - dataruns_size);
3942 	a->compression_unit = (flags & ATTR_IS_COMPRESSED)
3943 			? STANDARD_COMPRESSION_UNIT : 0;
3944 	/* If @lowest_vcn == 0, than setup empty attribute. */
3945 	if (!lowest_vcn) {
3946 		a->highest_vcn = cpu_to_sle64(-1);
3947 		a->allocated_size = 0;
3948 		a->data_size = 0;
3949 		a->initialized_size = 0;
3950 		/* Set empty mapping pairs. */
3951 		*((u8*)a + le16_to_cpu(a->mapping_pairs_offset)) = 0;
3952 	}
3953 	if (name_len)
3954 		memcpy((u8*)a + le16_to_cpu(a->name_offset),
3955 			name, sizeof(ntfschar) * name_len);
3956 	m->next_attr_instance =
3957 		cpu_to_le16((le16_to_cpu(m->next_attr_instance) + 1) & 0xffff);
3958 	if (ni->nr_extents == -1)
3959 		base_ni = ni->base_ni;
3960 	else
3961 		base_ni = ni;
3962 	if (type != AT_ATTRIBUTE_LIST && NInoAttrList(base_ni)) {
3963 		if (ntfs_attrlist_entry_add(ni, a)) {
3964 			err = errno;
3965 			ntfs_log_perror("Failed add attr entry to attrlist");
3966 			ntfs_attr_record_resize(m, a, 0);
3967 			goto put_err_out;
3968 		}
3969 	}
3970 	ntfs_inode_mark_dirty(ni);
3971 	/*
3972 	 * Locate offset from start of the MFT record where new attribute is
3973 	 * placed. We need relookup it, because record maybe moved during
3974 	 * update of attribute list.
3975 	 */
3976 	ntfs_attr_reinit_search_ctx(ctx);
3977 	if (ntfs_attr_lookup(type, name, name_len, CASE_SENSITIVE,
3978 					lowest_vcn, NULL, 0, ctx)) {
3979 		ntfs_log_perror("%s: attribute lookup failed", __FUNCTION__);
3980 		ntfs_attr_put_search_ctx(ctx);
3981 		return -1;
3982 
3983 	}
3984 	offset = (u8*)ctx->attr - (u8*)ctx->mrec;
3985 	ntfs_attr_put_search_ctx(ctx);
3986 	return offset;
3987 put_err_out:
3988 	ntfs_attr_put_search_ctx(ctx);
3989 	errno = err;
3990 	return -1;
3991 }
3992 
3993 /**
3994  * ntfs_attr_record_rm - remove attribute extent
3995  * @ctx:	search context describing the attribute which should be removed
3996  *
3997  * If this function succeed, user should reinit search context if he/she wants
3998  * use it anymore.
3999  *
4000  * Return 0 on success and -1 on error. On error the error code is stored in
4001  * errno. Possible error codes are:
4002  *	EINVAL	- Invalid arguments passed to function.
4003  *	EIO	- I/O error occurred or damaged filesystem.
4004  */
4005 int ntfs_attr_record_rm(ntfs_attr_search_ctx *ctx)
4006 {
4007 	ntfs_inode *base_ni, *ni;
4008 	ATTR_TYPES type;
4009 
4010 	if (!ctx || !ctx->ntfs_ino || !ctx->mrec || !ctx->attr) {
4011 		errno = EINVAL;
4012 		return -1;
4013 	}
4014 
4015 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x.\n",
4016 			(long long) ctx->ntfs_ino->mft_no,
4017 			(unsigned) le32_to_cpu(ctx->attr->type));
4018 	type = ctx->attr->type;
4019 	ni = ctx->ntfs_ino;
4020 	if (ctx->base_ntfs_ino)
4021 		base_ni = ctx->base_ntfs_ino;
4022 	else
4023 		base_ni = ctx->ntfs_ino;
4024 
4025 	/* Remove attribute itself. */
4026 	if (ntfs_attr_record_resize(ctx->mrec, ctx->attr, 0)) {
4027 		ntfs_log_trace("Couldn't remove attribute record. Bug or damaged MFT "
4028 				"record.\n");
4029 		if (NInoAttrList(base_ni) && type != AT_ATTRIBUTE_LIST)
4030 			if (ntfs_attrlist_entry_add(ni, ctx->attr))
4031 				ntfs_log_trace("Rollback failed. Leaving inconstant "
4032 						"metadata.\n");
4033 		errno = EIO;
4034 		return -1;
4035 	}
4036 	ntfs_inode_mark_dirty(ni);
4037 
4038 	/*
4039 	 * Remove record from $ATTRIBUTE_LIST if present and we don't want
4040 	 * delete $ATTRIBUTE_LIST itself.
4041 	 */
4042 	if (NInoAttrList(base_ni) && type != AT_ATTRIBUTE_LIST) {
4043 		if (ntfs_attrlist_entry_rm(ctx)) {
4044 			ntfs_log_trace("Couldn't delete record from "
4045 					"$ATTRIBUTE_LIST.\n");
4046 			return -1;
4047 		}
4048 	}
4049 
4050 	/* Post $ATTRIBUTE_LIST delete setup. */
4051 	if (type == AT_ATTRIBUTE_LIST) {
4052 		if (NInoAttrList(base_ni) && base_ni->attr_list)
4053 			free(base_ni->attr_list);
4054 		base_ni->attr_list = NULL;
4055 		NInoClearAttrList(base_ni);
4056 		NInoAttrListClearDirty(base_ni);
4057 	}
4058 
4059 	/* Free MFT record, if it doesn't contain attributes. */
4060 	if (le32_to_cpu(ctx->mrec->bytes_in_use) -
4061 			le16_to_cpu(ctx->mrec->attrs_offset) == 8) {
4062 		if (ntfs_mft_record_free(ni->vol, ni)) {
4063 			// FIXME: We need rollback here.
4064 			ntfs_log_trace("Couldn't free MFT record.\n");
4065 			errno = EIO;
4066 			return -1;
4067 		}
4068 		/* Remove done if we freed base inode. */
4069 		if (ni == base_ni)
4070 			return 0;
4071 	}
4072 
4073 	if (type == AT_ATTRIBUTE_LIST || !NInoAttrList(base_ni))
4074 		return 0;
4075 
4076 	/* Remove attribute list if we don't need it any more. */
4077 	if (!ntfs_attrlist_need(base_ni)) {
4078 		ntfs_attr_reinit_search_ctx(ctx);
4079 		if (ntfs_attr_lookup(AT_ATTRIBUTE_LIST, NULL, 0, CASE_SENSITIVE,
4080 				0, NULL, 0, ctx)) {
4081 			/*
4082 			 * FIXME: Should we succeed here? Definitely something
4083 			 * goes wrong because NInoAttrList(base_ni) returned
4084 			 * that we have got attribute list.
4085 			 */
4086 			ntfs_log_trace("Couldn't find attribute list. Succeed "
4087 					"anyway.\n");
4088 			return 0;
4089 		}
4090 		/* Deallocate clusters. */
4091 		if (ctx->attr->non_resident) {
4092 			runlist *al_rl;
4093 
4094 			al_rl = ntfs_mapping_pairs_decompress(base_ni->vol,
4095 					ctx->attr, NULL);
4096 			if (!al_rl) {
4097 				ntfs_log_trace("Couldn't decompress attribute list "
4098 						"runlist. Succeed anyway.\n");
4099 				return 0;
4100 			}
4101 			if (ntfs_cluster_free_from_rl(base_ni->vol, al_rl)) {
4102 				ntfs_log_trace("Leaking clusters! Run chkdsk. "
4103 						"Couldn't free clusters from "
4104 						"attribute list runlist.\n");
4105 			}
4106 			free(al_rl);
4107 		}
4108 		/* Remove attribute record itself. */
4109 		if (ntfs_attr_record_rm(ctx)) {
4110 			/*
4111 			 * FIXME: Should we succeed here? BTW, chkdsk doesn't
4112 			 * complain if it find MFT record with attribute list,
4113 			 * but without extents.
4114 			 */
4115 			ntfs_log_trace("Couldn't remove attribute list. Succeed "
4116 					"anyway.\n");
4117 			return 0;
4118 		}
4119 	}
4120 	return 0;
4121 }
4122 
4123 /**
4124  * ntfs_attr_add - add attribute to inode
4125  * @ni:		opened ntfs inode to which add attribute
4126  * @type:	type of the new attribute
4127  * @name:	name in unicode of the new attribute
4128  * @name_len:	name length in unicode characters of the new attribute
4129  * @val:	value of new attribute
4130  * @size:	size of the new attribute / length of @val (if specified)
4131  *
4132  * @val should always be specified for always resident attributes (eg. FILE_NAME
4133  * attribute), for attributes that can become non-resident @val can be NULL
4134  * (eg. DATA attribute). @size can be specified even if @val is NULL, in this
4135  * case data size will be equal to @size and initialized size will be equal
4136  * to 0.
4137  *
4138  * If inode haven't got enough space to add attribute, add attribute to one of
4139  * it extents, if no extents present or no one of them have enough space, than
4140  * allocate new extent and add attribute to it.
4141  *
4142  * If on one of this steps attribute list is needed but not present, than it is
4143  * added transparently to caller. So, this function should not be called with
4144  * @type == AT_ATTRIBUTE_LIST, if you really need to add attribute list call
4145  * ntfs_inode_add_attrlist instead.
4146  *
4147  * On success return 0. On error return -1 with errno set to the error code.
4148  */
4149 int ntfs_attr_add(ntfs_inode *ni, ATTR_TYPES type,
4150 		ntfschar *name, u8 name_len, u8 *val, s64 size)
4151 {
4152 	u32 attr_rec_size;
4153 	int err, i, offset;
4154 	BOOL is_resident;
4155 	BOOL can_be_non_resident = FALSE;
4156 	ntfs_inode *attr_ni;
4157 	ntfs_attr *na;
4158 	ATTR_FLAGS data_flags;
4159 
4160 	if (!ni || size < 0 || type == AT_ATTRIBUTE_LIST) {
4161 		errno = EINVAL;
4162 		ntfs_log_perror("%s: ni=%p  size=%lld", __FUNCTION__, ni,
4163 				(long long)size);
4164 		return -1;
4165 	}
4166 
4167 	ntfs_log_trace("Entering for inode %lld, attr %x, size %lld.\n",
4168 			(long long)ni->mft_no, type, (long long)size);
4169 
4170 	if (ni->nr_extents == -1)
4171 		ni = ni->base_ni;
4172 
4173 	/* Check the attribute type and the size. */
4174 	if (ntfs_attr_size_bounds_check(ni->vol, type, size)) {
4175 		if (errno == ENOENT)
4176 			errno = EIO;
4177 		return -1;
4178 	}
4179 
4180 	/* Sanity checks for always resident attributes. */
4181 	if (ntfs_attr_can_be_non_resident(ni->vol, type, name, name_len)) {
4182 		if (errno != EPERM) {
4183 			err = errno;
4184 			ntfs_log_perror("ntfs_attr_can_be_non_resident failed");
4185 			goto err_out;
4186 		}
4187 		/* @val is mandatory. */
4188 		if (!val) {
4189 			errno = EINVAL;
4190 			ntfs_log_perror("val is mandatory for always resident "
4191 					"attributes");
4192 			return -1;
4193 		}
4194 		if (size > ni->vol->mft_record_size) {
4195 			errno = ERANGE;
4196 			ntfs_log_perror("Attribute is too big");
4197 			return -1;
4198 		}
4199 	} else
4200 		can_be_non_resident = TRUE;
4201 
4202 	/*
4203 	 * Determine resident or not will be new attribute. We add 8 to size in
4204 	 * non resident case for mapping pairs.
4205 	 */
4206 	if (!ntfs_attr_can_be_resident(ni->vol, type)) {
4207 		is_resident = TRUE;
4208 	} else {
4209 		if (errno != EPERM) {
4210 			err = errno;
4211 			ntfs_log_perror("ntfs_attr_can_be_resident failed");
4212 			goto err_out;
4213 		}
4214 		is_resident = FALSE;
4215 	}
4216 	/* Calculate attribute record size. */
4217 	if (is_resident)
4218 		attr_rec_size = offsetof(ATTR_RECORD, resident_end) +
4219 				((name_len * sizeof(ntfschar) + 7) & ~7) +
4220 				((size + 7) & ~7);
4221 	else
4222 		attr_rec_size = offsetof(ATTR_RECORD, non_resident_end) +
4223 				((name_len * sizeof(ntfschar) + 7) & ~7) + 8;
4224 
4225 	/*
4226 	 * If we have enough free space for the new attribute in the base MFT
4227 	 * record, then add attribute to it.
4228 	 */
4229 	if (le32_to_cpu(ni->mrec->bytes_allocated) -
4230 			le32_to_cpu(ni->mrec->bytes_in_use) >= attr_rec_size) {
4231 		attr_ni = ni;
4232 		goto add_attr_record;
4233 	}
4234 
4235 	/* Try to add to extent inodes. */
4236 	if (ntfs_inode_attach_all_extents(ni)) {
4237 		err = errno;
4238 		ntfs_log_perror("Failed to attach all extents to inode");
4239 		goto err_out;
4240 	}
4241 	for (i = 0; i < ni->nr_extents; i++) {
4242 		attr_ni = ni->extent_nis[i];
4243 		if (le32_to_cpu(attr_ni->mrec->bytes_allocated) -
4244 				le32_to_cpu(attr_ni->mrec->bytes_in_use) >=
4245 				attr_rec_size)
4246 			goto add_attr_record;
4247 	}
4248 
4249 	/* There is no extent that contain enough space for new attribute. */
4250 	if (!NInoAttrList(ni)) {
4251 		/* Add attribute list not present, add it and retry. */
4252 		if (ntfs_inode_add_attrlist(ni)) {
4253 			err = errno;
4254 			ntfs_log_perror("Failed to add attribute list");
4255 			goto err_out;
4256 		}
4257 		return ntfs_attr_add(ni, type, name, name_len, val, size);
4258 	}
4259 	/* Allocate new extent. */
4260 	attr_ni = ntfs_mft_record_alloc(ni->vol, ni);
4261 	if (!attr_ni) {
4262 		err = errno;
4263 		ntfs_log_perror("Failed to allocate extent record");
4264 		goto err_out;
4265 	}
4266 
4267 add_attr_record:
4268 	if ((ni->flags & FILE_ATTR_COMPRESSED)
4269 	    && (ni->vol->major_ver >= 3)
4270 	    && NVolCompression(ni->vol)
4271 	    && (ni->vol->cluster_size <= MAX_COMPRESSION_CLUSTER_SIZE)
4272 	    && ((type == AT_DATA)
4273 	       || ((type == AT_INDEX_ROOT) && (name == NTFS_INDEX_I30))))
4274 		data_flags = ATTR_IS_COMPRESSED;
4275 	else
4276 		data_flags = const_cpu_to_le16(0);
4277 	if (is_resident) {
4278 		/* Add resident attribute. */
4279 		offset = ntfs_resident_attr_record_add(attr_ni, type, name,
4280 				name_len, val, size, data_flags);
4281 		if (offset < 0) {
4282 			if (errno == ENOSPC && can_be_non_resident)
4283 				goto add_non_resident;
4284 			err = errno;
4285 			ntfs_log_perror("Failed to add resident attribute");
4286 			goto free_err_out;
4287 		}
4288 		return 0;
4289 	}
4290 
4291 add_non_resident:
4292 	/* Add non resident attribute. */
4293 	offset = ntfs_non_resident_attr_record_add(attr_ni, type, name,
4294 				name_len, 0, 8, data_flags);
4295 	if (offset < 0) {
4296 		err = errno;
4297 		ntfs_log_perror("Failed to add non resident attribute");
4298 		goto free_err_out;
4299 	}
4300 
4301 	/* If @size == 0, we are done. */
4302 	if (!size)
4303 		return 0;
4304 
4305 	/* Open new attribute and resize it. */
4306 	na = ntfs_attr_open(ni, type, name, name_len);
4307 	if (!na) {
4308 		err = errno;
4309 		ntfs_log_perror("Failed to open just added attribute");
4310 		goto rm_attr_err_out;
4311 	}
4312 	/* Resize and set attribute value. */
4313 	if (ntfs_attr_truncate_i(na, size, HOLES_OK) ||
4314 			(val && (ntfs_attr_pwrite(na, 0, size, val) != size))) {
4315 		err = errno;
4316 		ntfs_log_perror("Failed to initialize just added attribute");
4317 		if (ntfs_attr_rm(na))
4318 			ntfs_log_perror("Failed to remove just added attribute");
4319 		ntfs_attr_close(na);
4320 		goto err_out;
4321 	}
4322 	ntfs_attr_close(na);
4323 	return 0;
4324 
4325 rm_attr_err_out:
4326 	/* Remove just added attribute. */
4327 	if (ntfs_attr_record_resize(attr_ni->mrec,
4328 			(ATTR_RECORD*)((u8*)attr_ni->mrec + offset), 0))
4329 		ntfs_log_perror("Failed to remove just added attribute #2");
4330 free_err_out:
4331 	/* Free MFT record, if it doesn't contain attributes. */
4332 	if (le32_to_cpu(attr_ni->mrec->bytes_in_use) -
4333 			le16_to_cpu(attr_ni->mrec->attrs_offset) == 8)
4334 		if (ntfs_mft_record_free(attr_ni->vol, attr_ni))
4335 			ntfs_log_perror("Failed to free MFT record");
4336 err_out:
4337 	errno = err;
4338 	return -1;
4339 }
4340 
4341 /*
4342  *		Change an attribute flag
4343  */
4344 
4345 int ntfs_attr_set_flags(ntfs_inode *ni, ATTR_TYPES type,
4346 		ntfschar *name, u8 name_len, ATTR_FLAGS flags, ATTR_FLAGS mask)
4347 {
4348 	ntfs_attr_search_ctx *ctx;
4349 	int res;
4350 
4351 	res = -1;
4352 	/* Search for designated attribute */
4353 	ctx = ntfs_attr_get_search_ctx(ni, NULL);
4354 	if (ctx) {
4355 		if (!ntfs_attr_lookup(type, name, name_len,
4356 					CASE_SENSITIVE, 0, NULL, 0, ctx)) {
4357 			/* do the requested change (all small endian le16) */
4358 			ctx->attr->flags = (ctx->attr->flags & ~mask)
4359 						| (flags & mask);
4360 			NInoSetDirty(ni);
4361 			res = 0;
4362 		}
4363 		ntfs_attr_put_search_ctx(ctx);
4364 	}
4365 	return (res);
4366 }
4367 
4368 
4369 /**
4370  * ntfs_attr_rm - remove attribute from ntfs inode
4371  * @na:		opened ntfs attribute to delete
4372  *
4373  * Remove attribute and all it's extents from ntfs inode. If attribute was non
4374  * resident also free all clusters allocated by attribute.
4375  *
4376  * Return 0 on success or -1 on error with errno set to the error code.
4377  */
4378 int ntfs_attr_rm(ntfs_attr *na)
4379 {
4380 	ntfs_attr_search_ctx *ctx;
4381 	int ret = 0;
4382 
4383 	if (!na) {
4384 		ntfs_log_trace("Invalid arguments passed.\n");
4385 		errno = EINVAL;
4386 		return -1;
4387 	}
4388 
4389 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x.\n",
4390 		(long long) na->ni->mft_no, na->type);
4391 
4392 	/* Free cluster allocation. */
4393 	if (NAttrNonResident(na)) {
4394 		if (ntfs_attr_map_whole_runlist(na))
4395 			return -1;
4396 		if (ntfs_cluster_free(na->ni->vol, na, 0, -1) < 0) {
4397 			ntfs_log_trace("Failed to free cluster allocation. Leaving "
4398 					"inconstant metadata.\n");
4399 			ret = -1;
4400 		}
4401 	}
4402 
4403 	/* Search for attribute extents and remove them all. */
4404 	ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
4405 	if (!ctx)
4406 		return -1;
4407 	while (!ntfs_attr_lookup(na->type, na->name, na->name_len,
4408 				CASE_SENSITIVE, 0, NULL, 0, ctx)) {
4409 		if (ntfs_attr_record_rm(ctx)) {
4410 			ntfs_log_trace("Failed to remove attribute extent. Leaving "
4411 					"inconstant metadata.\n");
4412 			ret = -1;
4413 		}
4414 		ntfs_attr_reinit_search_ctx(ctx);
4415 	}
4416 	ntfs_attr_put_search_ctx(ctx);
4417 	if (errno != ENOENT) {
4418 		ntfs_log_trace("Attribute lookup failed. Probably leaving inconstant "
4419 				"metadata.\n");
4420 		ret = -1;
4421 	}
4422 
4423 	return ret;
4424 }
4425 
4426 /**
4427  * ntfs_attr_record_resize - resize an attribute record
4428  * @m:		mft record containing attribute record
4429  * @a:		attribute record to resize
4430  * @new_size:	new size in bytes to which to resize the attribute record @a
4431  *
4432  * Resize the attribute record @a, i.e. the resident part of the attribute, in
4433  * the mft record @m to @new_size bytes.
4434  *
4435  * Return 0 on success and -1 on error with errno set to the error code.
4436  * The following error codes are defined:
4437  *	ENOSPC	- Not enough space in the mft record @m to perform the resize.
4438  * Note that on error no modifications have been performed whatsoever.
4439  *
4440  * Warning: If you make a record smaller without having copied all the data you
4441  *	    are interested in the data may be overwritten!
4442  */
4443 int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size)
4444 {
4445 	u32 old_size, alloc_size, attr_size;
4446 
4447 	old_size   = le32_to_cpu(m->bytes_in_use);
4448 	alloc_size = le32_to_cpu(m->bytes_allocated);
4449 	attr_size  = le32_to_cpu(a->length);
4450 
4451 	ntfs_log_trace("Sizes: old=%u alloc=%u attr=%u new=%u\n",
4452 		       (unsigned)old_size, (unsigned)alloc_size,
4453 		       (unsigned)attr_size, (unsigned)new_size);
4454 
4455 	/* Align to 8 bytes, just in case the caller hasn't. */
4456 	new_size = (new_size + 7) & ~7;
4457 
4458 	/* If the actual attribute length has changed, move things around. */
4459 	if (new_size != attr_size) {
4460 
4461 		u32 new_muse = old_size - attr_size + new_size;
4462 
4463 		/* Not enough space in this mft record. */
4464 		if (new_muse > alloc_size) {
4465 			errno = ENOSPC;
4466 			ntfs_log_trace("Not enough space in the MFT record "
4467 				       "(%u > %u)\n", new_muse, alloc_size);
4468 			return -1;
4469 		}
4470 
4471 		if (a->type == AT_INDEX_ROOT && new_size > attr_size &&
4472 		    new_muse + 120 > alloc_size && old_size + 120 <= alloc_size) {
4473 			errno = ENOSPC;
4474 			ntfs_log_trace("Too big INDEX_ROOT (%u > %u)\n",
4475 					new_muse, alloc_size);
4476 			return STATUS_RESIDENT_ATTRIBUTE_FILLED_MFT;
4477 		}
4478 
4479 		/* Move attributes following @a to their new location. */
4480 		memmove((u8 *)a + new_size, (u8 *)a + attr_size,
4481 			old_size - ((u8 *)a - (u8 *)m) - attr_size);
4482 
4483 		/* Adjust @m to reflect the change in used space. */
4484 		m->bytes_in_use = cpu_to_le32(new_muse);
4485 
4486 		/* Adjust @a to reflect the new size. */
4487 		if (new_size >= offsetof(ATTR_REC, length) + sizeof(a->length))
4488 			a->length = cpu_to_le32(new_size);
4489 	}
4490 	return 0;
4491 }
4492 
4493 /**
4494  * ntfs_resident_attr_value_resize - resize the value of a resident attribute
4495  * @m:		mft record containing attribute record
4496  * @a:		attribute record whose value to resize
4497  * @new_size:	new size in bytes to which to resize the attribute value of @a
4498  *
4499  * Resize the value of the attribute @a in the mft record @m to @new_size bytes.
4500  * If the value is made bigger, the newly "allocated" space is cleared.
4501  *
4502  * Return 0 on success and -1 on error with errno set to the error code.
4503  * The following error codes are defined:
4504  *	ENOSPC	- Not enough space in the mft record @m to perform the resize.
4505  * Note that on error no modifications have been performed whatsoever.
4506  */
4507 int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a,
4508 		const u32 new_size)
4509 {
4510 	int ret;
4511 
4512 	ntfs_log_trace("Entering for new size %u.\n", (unsigned)new_size);
4513 
4514 	/* Resize the resident part of the attribute record. */
4515 	if ((ret = ntfs_attr_record_resize(m, a, (le16_to_cpu(a->value_offset) +
4516 			new_size + 7) & ~7)) < 0)
4517 		return ret;
4518 	/*
4519 	 * If we made the attribute value bigger, clear the area between the
4520 	 * old size and @new_size.
4521 	 */
4522 	if (new_size > le32_to_cpu(a->value_length))
4523 		memset((u8*)a + le16_to_cpu(a->value_offset) +
4524 				le32_to_cpu(a->value_length), 0, new_size -
4525 				le32_to_cpu(a->value_length));
4526 	/* Finally update the length of the attribute value. */
4527 	a->value_length = cpu_to_le32(new_size);
4528 	return 0;
4529 }
4530 
4531 /**
4532  * ntfs_attr_record_move_to - move attribute record to target inode
4533  * @ctx:	attribute search context describing the attribute record
4534  * @ni:		opened ntfs inode to which move attribute record
4535  *
4536  * If this function succeed, user should reinit search context if he/she wants
4537  * use it anymore.
4538  *
4539  * Return 0 on success and -1 on error with errno set to the error code.
4540  */
4541 int ntfs_attr_record_move_to(ntfs_attr_search_ctx *ctx, ntfs_inode *ni)
4542 {
4543 	ntfs_attr_search_ctx *nctx;
4544 	ATTR_RECORD *a;
4545 	int err;
4546 
4547 	if (!ctx || !ctx->attr || !ctx->ntfs_ino || !ni) {
4548 		ntfs_log_trace("Invalid arguments passed.\n");
4549 		errno = EINVAL;
4550 		return -1;
4551 	}
4552 
4553 	ntfs_log_trace("Entering for ctx->attr->type 0x%x, ctx->ntfs_ino->mft_no "
4554 			"0x%llx, ni->mft_no 0x%llx.\n",
4555 			(unsigned) le32_to_cpu(ctx->attr->type),
4556 			(long long) ctx->ntfs_ino->mft_no,
4557 			(long long) ni->mft_no);
4558 
4559 	if (ctx->ntfs_ino == ni)
4560 		return 0;
4561 
4562 	if (!ctx->al_entry) {
4563 		ntfs_log_trace("Inode should contain attribute list to use this "
4564 				"function.\n");
4565 		errno = EINVAL;
4566 		return -1;
4567 	}
4568 
4569 	/* Find place in MFT record where attribute will be moved. */
4570 	a = ctx->attr;
4571 	nctx = ntfs_attr_get_search_ctx(ni, NULL);
4572 	if (!nctx)
4573 		return -1;
4574 
4575 	/*
4576 	 * Use ntfs_attr_find instead of ntfs_attr_lookup to find place for
4577 	 * attribute in @ni->mrec, not any extent inode in case if @ni is base
4578 	 * file record.
4579 	 */
4580 	if (!ntfs_attr_find(a->type, (ntfschar*)((u8*)a + le16_to_cpu(
4581 			a->name_offset)), a->name_length, CASE_SENSITIVE, NULL,
4582 			0, nctx)) {
4583 		ntfs_log_trace("Attribute of such type, with same name already "
4584 				"present in this MFT record.\n");
4585 		err = EEXIST;
4586 		goto put_err_out;
4587 	}
4588 	if (errno != ENOENT) {
4589 		err = errno;
4590 		ntfs_log_debug("Attribute lookup failed.\n");
4591 		goto put_err_out;
4592 	}
4593 
4594 	/* Make space and move attribute. */
4595 	if (ntfs_make_room_for_attr(ni->mrec, (u8*) nctx->attr,
4596 					le32_to_cpu(a->length))) {
4597 		err = errno;
4598 		ntfs_log_trace("Couldn't make space for attribute.\n");
4599 		goto put_err_out;
4600 	}
4601 	memcpy(nctx->attr, a, le32_to_cpu(a->length));
4602 	nctx->attr->instance = nctx->mrec->next_attr_instance;
4603 	nctx->mrec->next_attr_instance = cpu_to_le16(
4604 		(le16_to_cpu(nctx->mrec->next_attr_instance) + 1) & 0xffff);
4605 	ntfs_attr_record_resize(ctx->mrec, a, 0);
4606 	ntfs_inode_mark_dirty(ctx->ntfs_ino);
4607 	ntfs_inode_mark_dirty(ni);
4608 
4609 	/* Update attribute list. */
4610 	ctx->al_entry->mft_reference =
4611 		MK_LE_MREF(ni->mft_no, le16_to_cpu(ni->mrec->sequence_number));
4612 	ctx->al_entry->instance = nctx->attr->instance;
4613 	ntfs_attrlist_mark_dirty(ni);
4614 
4615 	ntfs_attr_put_search_ctx(nctx);
4616 	return 0;
4617 put_err_out:
4618 	ntfs_attr_put_search_ctx(nctx);
4619 	errno = err;
4620 	return -1;
4621 }
4622 
4623 /**
4624  * ntfs_attr_record_move_away - move away attribute record from it's mft record
4625  * @ctx:	attribute search context describing the attribute record
4626  * @extra:	minimum amount of free space in the new holder of record
4627  *
4628  * New attribute record holder must have free @extra bytes after moving
4629  * attribute record to it.
4630  *
4631  * If this function succeed, user should reinit search context if he/she wants
4632  * use it anymore.
4633  *
4634  * Return 0 on success and -1 on error with errno set to the error code.
4635  */
4636 int ntfs_attr_record_move_away(ntfs_attr_search_ctx *ctx, int extra)
4637 {
4638 	ntfs_inode *base_ni, *ni;
4639 	MFT_RECORD *m;
4640 	int i;
4641 
4642 	if (!ctx || !ctx->attr || !ctx->ntfs_ino || extra < 0) {
4643 		errno = EINVAL;
4644 		ntfs_log_perror("%s: ctx=%p ctx->attr=%p extra=%d", __FUNCTION__,
4645 				ctx, ctx ? ctx->attr : NULL, extra);
4646 		return -1;
4647 	}
4648 
4649 	ntfs_log_trace("Entering for attr 0x%x, inode %llu\n",
4650 			(unsigned) le32_to_cpu(ctx->attr->type),
4651 			(unsigned long long)ctx->ntfs_ino->mft_no);
4652 
4653 	if (ctx->ntfs_ino->nr_extents == -1)
4654 		base_ni = ctx->base_ntfs_ino;
4655 	else
4656 		base_ni = ctx->ntfs_ino;
4657 
4658 	if (!NInoAttrList(base_ni)) {
4659 		errno = EINVAL;
4660 		ntfs_log_perror("Inode %llu has no attrlist",
4661 				(unsigned long long)base_ni->mft_no);
4662 		return -1;
4663 	}
4664 
4665 	if (ntfs_inode_attach_all_extents(ctx->ntfs_ino)) {
4666 		ntfs_log_perror("Couldn't attach extents, inode=%llu",
4667 				(unsigned long long)base_ni->mft_no);
4668 		return -1;
4669 	}
4670 
4671 	/* Walk through all extents and try to move attribute to them. */
4672 	for (i = 0; i < base_ni->nr_extents; i++) {
4673 		ni = base_ni->extent_nis[i];
4674 		m = ni->mrec;
4675 
4676 		if (ctx->ntfs_ino->mft_no == ni->mft_no)
4677 			continue;
4678 
4679 		if (le32_to_cpu(m->bytes_allocated) -
4680 				le32_to_cpu(m->bytes_in_use) <
4681 				le32_to_cpu(ctx->attr->length) + extra)
4682 			continue;
4683 
4684 		/*
4685 		 * ntfs_attr_record_move_to can fail if extent with other lowest
4686 		 * VCN already present in inode we trying move record to. So,
4687 		 * do not return error.
4688 		 */
4689 		if (!ntfs_attr_record_move_to(ctx, ni))
4690 			return 0;
4691 	}
4692 
4693 	/*
4694 	 * Failed to move attribute to one of the current extents, so allocate
4695 	 * new extent and move attribute to it.
4696 	 */
4697 	ni = ntfs_mft_record_alloc(base_ni->vol, base_ni);
4698 	if (!ni) {
4699 		ntfs_log_perror("Couldn't allocate MFT record");
4700 		return -1;
4701 	}
4702 	if (ntfs_attr_record_move_to(ctx, ni)) {
4703 		ntfs_log_perror("Couldn't move attribute to MFT record");
4704 		return -1;
4705 	}
4706 	return 0;
4707 }
4708 
4709 /**
4710  * ntfs_attr_make_non_resident - convert a resident to a non-resident attribute
4711  * @na:		open ntfs attribute to make non-resident
4712  * @ctx:	ntfs search context describing the attribute
4713  *
4714  * Convert a resident ntfs attribute to a non-resident one.
4715  *
4716  * Return 0 on success and -1 on error with errno set to the error code. The
4717  * following error codes are defined:
4718  *	EPERM	- The attribute is not allowed to be non-resident.
4719  *	TODO: others...
4720  *
4721  * NOTE to self: No changes in the attribute list are required to move from
4722  *		 a resident to a non-resident attribute.
4723  *
4724  * Warning: We do not set the inode dirty and we do not write out anything!
4725  *	    We expect the caller to do this as this is a fairly low level
4726  *	    function and it is likely there will be further changes made.
4727  */
4728 int ntfs_attr_make_non_resident(ntfs_attr *na,
4729 		ntfs_attr_search_ctx *ctx)
4730 {
4731 	s64 new_allocated_size, bw;
4732 	ntfs_volume *vol = na->ni->vol;
4733 	ATTR_REC *a = ctx->attr;
4734 	runlist *rl;
4735 	int mp_size, mp_ofs, name_ofs, arec_size, err;
4736 
4737 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x.\n", (unsigned long
4738 			long)na->ni->mft_no, na->type);
4739 
4740 	/* Some preliminary sanity checking. */
4741 	if (NAttrNonResident(na)) {
4742 		ntfs_log_trace("Eeek!  Trying to make non-resident attribute "
4743 				"non-resident.  Aborting...\n");
4744 		errno = EINVAL;
4745 		return -1;
4746 	}
4747 
4748 	/* Check that the attribute is allowed to be non-resident. */
4749 	if (ntfs_attr_can_be_non_resident(vol, na->type, na->name, na->name_len))
4750 		return -1;
4751 
4752 	new_allocated_size = (le32_to_cpu(a->value_length) + vol->cluster_size
4753 			- 1) & ~(vol->cluster_size - 1);
4754 
4755 	if (new_allocated_size > 0) {
4756 			if ((a->flags & ATTR_COMPRESSION_MASK)
4757 					== ATTR_IS_COMPRESSED) {
4758 				/* must allocate full compression blocks */
4759 				new_allocated_size = ((new_allocated_size - 1)
4760 					| ((1L << (STANDARD_COMPRESSION_UNIT
4761 					   + vol->cluster_size_bits)) - 1)) + 1;
4762 			}
4763 		/* Start by allocating clusters to hold the attribute value. */
4764 		rl = ntfs_cluster_alloc(vol, 0, new_allocated_size >>
4765 				vol->cluster_size_bits, -1, DATA_ZONE);
4766 		if (!rl)
4767 			return -1;
4768 	} else
4769 		rl = NULL;
4770 	/*
4771 	 * Setup the in-memory attribute structure to be non-resident so that
4772 	 * we can use ntfs_attr_pwrite().
4773 	 */
4774 	NAttrSetNonResident(na);
4775 	NAttrSetBeingNonResident(na);
4776 	na->rl = rl;
4777 	na->allocated_size = new_allocated_size;
4778 	na->data_size = na->initialized_size = le32_to_cpu(a->value_length);
4779 	/*
4780 	 * FIXME: For now just clear all of these as we don't support them when
4781 	 * writing.
4782 	 */
4783 	NAttrClearSparse(na);
4784 	NAttrClearEncrypted(na);
4785 	if ((a->flags & ATTR_COMPRESSION_MASK) == ATTR_IS_COMPRESSED) {
4786 			/* set compression writing parameters */
4787 		na->compression_block_size
4788 			= 1 << (STANDARD_COMPRESSION_UNIT + vol->cluster_size_bits);
4789 		na->compression_block_clusters = 1 << STANDARD_COMPRESSION_UNIT;
4790 	}
4791 
4792 	if (rl) {
4793 		/* Now copy the attribute value to the allocated cluster(s). */
4794 		bw = ntfs_attr_pwrite(na, 0, le32_to_cpu(a->value_length),
4795 				(u8*)a + le16_to_cpu(a->value_offset));
4796 		if (bw != le32_to_cpu(a->value_length)) {
4797 			err = errno;
4798 			ntfs_log_debug("Eeek!  Failed to write out attribute value "
4799 					"(bw = %lli, errno = %i).  "
4800 					"Aborting...\n", (long long)bw, err);
4801 			if (bw >= 0)
4802 				err = EIO;
4803 			goto cluster_free_err_out;
4804 		}
4805 	}
4806 	/* Determine the size of the mapping pairs array. */
4807 	mp_size = ntfs_get_size_for_mapping_pairs(vol, rl, 0, INT_MAX);
4808 	if (mp_size < 0) {
4809 		err = errno;
4810 		ntfs_log_debug("Eeek!  Failed to get size for mapping pairs array.  "
4811 				"Aborting...\n");
4812 		goto cluster_free_err_out;
4813 	}
4814 	/* Calculate new offsets for the name and the mapping pairs array. */
4815 	if (na->ni->flags & FILE_ATTR_COMPRESSED)
4816 		name_ofs = (sizeof(ATTR_REC) + 7) & ~7;
4817 	else
4818 		name_ofs = (sizeof(ATTR_REC) - sizeof(a->compressed_size) + 7) & ~7;
4819 	mp_ofs = (name_ofs + a->name_length * sizeof(ntfschar) + 7) & ~7;
4820 	/*
4821 	 * Determine the size of the resident part of the non-resident
4822 	 * attribute record. (Not compressed thus no compressed_size element
4823 	 * present.)
4824 	 */
4825 	arec_size = (mp_ofs + mp_size + 7) & ~7;
4826 
4827 	/* Resize the resident part of the attribute record. */
4828 	if (ntfs_attr_record_resize(ctx->mrec, a, arec_size) < 0) {
4829 		err = errno;
4830 		goto cluster_free_err_out;
4831 	}
4832 
4833 	/*
4834 	 * Convert the resident part of the attribute record to describe a
4835 	 * non-resident attribute.
4836 	 */
4837 	a->non_resident = 1;
4838 
4839 	/* Move the attribute name if it exists and update the offset. */
4840 	if (a->name_length)
4841 		memmove((u8*)a + name_ofs, (u8*)a + le16_to_cpu(a->name_offset),
4842 				a->name_length * sizeof(ntfschar));
4843 	a->name_offset = cpu_to_le16(name_ofs);
4844 
4845 	/* Setup the fields specific to non-resident attributes. */
4846 	a->lowest_vcn = cpu_to_sle64(0);
4847 	a->highest_vcn = cpu_to_sle64((new_allocated_size - 1) >>
4848 						vol->cluster_size_bits);
4849 
4850 	a->mapping_pairs_offset = cpu_to_le16(mp_ofs);
4851 
4852 	/*
4853 	 * Update the flags to match the in-memory ones.
4854 	 * However cannot change the compression state if we had
4855 	 * a fuse_file_info open with a mark for release.
4856 	 * The decisions about compression can only be made when
4857 	 * creating/recreating the stream, not when making non resident.
4858 	 */
4859 	a->flags &= ~(ATTR_IS_SPARSE | ATTR_IS_ENCRYPTED);
4860 	if ((a->flags & ATTR_COMPRESSION_MASK) == ATTR_IS_COMPRESSED) {
4861 			/* support only ATTR_IS_COMPRESSED compression mode */
4862 		a->compression_unit = STANDARD_COMPRESSION_UNIT;
4863 		a->compressed_size = const_cpu_to_le64(0);
4864 	} else {
4865 		a->compression_unit = 0;
4866 		a->flags &= ~ATTR_COMPRESSION_MASK;
4867 		na->data_flags = a->flags;
4868 	}
4869 
4870 	memset(&a->reserved1, 0, sizeof(a->reserved1));
4871 
4872 	a->allocated_size = cpu_to_sle64(new_allocated_size);
4873 	a->data_size = a->initialized_size = cpu_to_sle64(na->data_size);
4874 
4875 	/* Generate the mapping pairs array in the attribute record. */
4876 	if (ntfs_mapping_pairs_build(vol, (u8*)a + mp_ofs, arec_size - mp_ofs,
4877 			rl, 0, NULL) < 0) {
4878 		// FIXME: Eeek! We need rollback! (AIA)
4879 		ntfs_log_trace("Eeek!  Failed to build mapping pairs.  Leaving "
4880 				"corrupt attribute record on disk.  In memory "
4881 				"runlist is still intact!  Error code is %i.  "
4882 				"FIXME:  Need to rollback instead!\n", errno);
4883 		return -1;
4884 	}
4885 
4886 	/* Done! */
4887 	return 0;
4888 
4889 cluster_free_err_out:
4890 	if (rl && ntfs_cluster_free(vol, na, 0, -1) < 0)
4891 		ntfs_log_trace("Eeek!  Failed to release allocated clusters in error "
4892 				"code path.  Leaving inconsistent metadata...\n");
4893 	NAttrClearNonResident(na);
4894 	NAttrClearFullyMapped(na);
4895 	na->allocated_size = na->data_size;
4896 	na->rl = NULL;
4897 	free(rl);
4898 	errno = err;
4899 	return -1;
4900 }
4901 
4902 
4903 static int ntfs_resident_attr_resize(ntfs_attr *na, const s64 newsize);
4904 
4905 /**
4906  * ntfs_resident_attr_resize - resize a resident, open ntfs attribute
4907  * @na:		resident ntfs attribute to resize
4908  * @newsize:	new size (in bytes) to which to resize the attribute
4909  *
4910  * Change the size of a resident, open ntfs attribute @na to @newsize bytes.
4911  * Can also be used to force an attribute non-resident. In this case, the
4912  * size cannot be changed.
4913  *
4914  * On success return 0
4915  * On error return values are:
4916  * 	STATUS_RESIDENT_ATTRIBUTE_FILLED_MFT
4917  * 	STATUS_ERROR - otherwise
4918  * The following error codes are defined:
4919  *	ENOMEM - Not enough memory to complete operation.
4920  *	ERANGE - @newsize is not valid for the attribute type of @na.
4921  *	ENOSPC - There is no enough space in base mft to resize $ATTRIBUTE_LIST.
4922  */
4923 static int ntfs_resident_attr_resize_i(ntfs_attr *na, const s64 newsize,
4924 			BOOL force_non_resident)
4925 {
4926 	ntfs_attr_search_ctx *ctx;
4927 	ntfs_volume *vol;
4928 	ntfs_inode *ni;
4929 	int err, ret = STATUS_ERROR;
4930 
4931 	ntfs_log_trace("Inode 0x%llx attr 0x%x new size %lld\n",
4932 		       (unsigned long long)na->ni->mft_no, na->type,
4933 		       (long long)newsize);
4934 
4935 	/* Get the attribute record that needs modification. */
4936 	ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
4937 	if (!ctx)
4938 		return -1;
4939 	if (ntfs_attr_lookup(na->type, na->name, na->name_len, 0, 0, NULL, 0,
4940 			ctx)) {
4941 		err = errno;
4942 		ntfs_log_perror("ntfs_attr_lookup failed");
4943 		goto put_err_out;
4944 	}
4945 	vol = na->ni->vol;
4946 	/*
4947 	 * Check the attribute type and the corresponding minimum and maximum
4948 	 * sizes against @newsize and fail if @newsize is out of bounds.
4949 	 */
4950 	if (ntfs_attr_size_bounds_check(vol, na->type, newsize) < 0) {
4951 		err = errno;
4952 		if (err == ENOENT)
4953 			err = EIO;
4954 		ntfs_log_perror("%s: bounds check failed", __FUNCTION__);
4955 		goto put_err_out;
4956 	}
4957 	/*
4958 	 * If @newsize is bigger than the mft record we need to make the
4959 	 * attribute non-resident if the attribute type supports it. If it is
4960 	 * smaller we can go ahead and attempt the resize.
4961 	 */
4962 	if ((newsize < vol->mft_record_size) && !force_non_resident) {
4963 		/* Perform the resize of the attribute record. */
4964 		if (!(ret = ntfs_resident_attr_value_resize(ctx->mrec, ctx->attr,
4965 				newsize))) {
4966 			/* Update attribute size everywhere. */
4967 			na->data_size = na->initialized_size = newsize;
4968 			na->allocated_size = (newsize + 7) & ~7;
4969 			if ((na->data_flags & ATTR_COMPRESSION_MASK)
4970 			    || NAttrSparse(na))
4971 				na->compressed_size = na->allocated_size;
4972 			if (na->ni->mrec->flags & MFT_RECORD_IS_DIRECTORY
4973 			    ? na->type == AT_INDEX_ROOT && na->name == NTFS_INDEX_I30
4974 			    : na->type == AT_DATA && na->name == AT_UNNAMED) {
4975 				na->ni->data_size = na->data_size;
4976 				if (((na->data_flags & ATTR_COMPRESSION_MASK)
4977 					|| NAttrSparse(na))
4978 						&& NAttrNonResident(na))
4979 					na->ni->allocated_size
4980 						= na->compressed_size;
4981 				else
4982 					na->ni->allocated_size
4983 						= na->allocated_size;
4984 				set_nino_flag(na->ni,KnownSize);
4985 				if (na->type == AT_DATA)
4986 					NInoFileNameSetDirty(na->ni);
4987 			}
4988 			goto resize_done;
4989 		}
4990 		/* Prefer AT_INDEX_ALLOCATION instead of AT_ATTRIBUTE_LIST */
4991 		if (ret == STATUS_RESIDENT_ATTRIBUTE_FILLED_MFT) {
4992 			err = errno;
4993 			goto put_err_out;
4994 		}
4995 	}
4996 	/* There is not enough space in the mft record to perform the resize. */
4997 
4998 	/* Make the attribute non-resident if possible. */
4999 	if (!ntfs_attr_make_non_resident(na, ctx)) {
5000 		ntfs_inode_mark_dirty(ctx->ntfs_ino);
5001 		ntfs_attr_put_search_ctx(ctx);
5002 		/*
5003 		 * do not truncate when forcing non-resident, this
5004 		 * could cause the attribute to be made resident again,
5005 		 * so size changes are not allowed.
5006 		 */
5007 		if (force_non_resident) {
5008 			ret = 0;
5009 			if (newsize != na->data_size) {
5010 				ntfs_log_error("Cannot change size when"
5011 					" forcing non-resident\n");
5012 				errno = EIO;
5013 				ret = STATUS_ERROR;
5014 			}
5015 			return (ret);
5016 		}
5017 		/* Resize non-resident attribute */
5018 		return ntfs_attr_truncate_i(na, newsize, HOLES_OK);
5019 	} else if (errno != ENOSPC && errno != EPERM) {
5020 		err = errno;
5021 		ntfs_log_perror("Failed to make attribute non-resident");
5022 		goto put_err_out;
5023 	}
5024 
5025 	/* Try to make other attributes non-resident and retry each time. */
5026 	ntfs_attr_init_search_ctx(ctx, NULL, na->ni->mrec);
5027 	while (!ntfs_attr_lookup(AT_UNUSED, NULL, 0, 0, 0, NULL, 0, ctx)) {
5028 		ntfs_attr *tna;
5029 		ATTR_RECORD *a;
5030 
5031 		a = ctx->attr;
5032 		if (a->non_resident)
5033 			continue;
5034 
5035 		/*
5036 		 * Check out whether convert is reasonable. Assume that mapping
5037 		 * pairs will take 8 bytes.
5038 		 */
5039 		if (le32_to_cpu(a->length) <= offsetof(ATTR_RECORD,
5040 				compressed_size) + ((a->name_length *
5041 				sizeof(ntfschar) + 7) & ~7) + 8)
5042 			continue;
5043 
5044 		tna = ntfs_attr_open(na->ni, a->type, (ntfschar*)((u8*)a +
5045 				le16_to_cpu(a->name_offset)), a->name_length);
5046 		if (!tna) {
5047 			err = errno;
5048 			ntfs_log_perror("Couldn't open attribute");
5049 			goto put_err_out;
5050 		}
5051 		if (ntfs_attr_make_non_resident(tna, ctx)) {
5052 			ntfs_attr_close(tna);
5053 			continue;
5054 		}
5055 		if ((tna->type == AT_DATA) && !tna->name_len) {
5056 			/*
5057 			 * If we had to make the unnamed data attribute
5058 			 * non-resident, propagate its new allocated size
5059 			 * to all name attributes and directory indexes
5060 			 */
5061 			tna->ni->allocated_size = tna->allocated_size;
5062 			NInoFileNameSetDirty(tna->ni);
5063 		}
5064 		if (((tna->data_flags & ATTR_COMPRESSION_MASK)
5065 						== ATTR_IS_COMPRESSED)
5066 		   && ntfs_attr_pclose(tna)) {
5067 			err = errno;
5068 			ntfs_attr_close(tna);
5069 			goto put_err_out;
5070 		}
5071 		ntfs_inode_mark_dirty(tna->ni);
5072 		ntfs_attr_close(tna);
5073 		ntfs_attr_put_search_ctx(ctx);
5074 		return ntfs_resident_attr_resize_i(na, newsize, force_non_resident);
5075 	}
5076 	/* Check whether error occurred. */
5077 	if (errno != ENOENT) {
5078 		err = errno;
5079 		ntfs_log_perror("%s: Attribute lookup failed 1", __FUNCTION__);
5080 		goto put_err_out;
5081 	}
5082 
5083 	/*
5084 	 * The standard information and attribute list attributes can't be
5085 	 * moved out from the base MFT record, so try to move out others.
5086 	 */
5087 	if (na->type==AT_STANDARD_INFORMATION || na->type==AT_ATTRIBUTE_LIST) {
5088 		ntfs_attr_put_search_ctx(ctx);
5089 		if (ntfs_inode_free_space(na->ni, offsetof(ATTR_RECORD,
5090 				non_resident_end) + 8)) {
5091 			ntfs_log_perror("Could not free space in MFT record");
5092 			return -1;
5093 		}
5094 		return ntfs_resident_attr_resize_i(na, newsize, force_non_resident);
5095 	}
5096 
5097 	/*
5098 	 * Move the attribute to a new mft record, creating an attribute list
5099 	 * attribute or modifying it if it is already present.
5100 	 */
5101 
5102 	/* Point search context back to attribute which we need resize. */
5103 	ntfs_attr_init_search_ctx(ctx, na->ni, NULL);
5104 	if (ntfs_attr_lookup(na->type, na->name, na->name_len, CASE_SENSITIVE,
5105 			0, NULL, 0, ctx)) {
5106 		ntfs_log_perror("%s: Attribute lookup failed 2", __FUNCTION__);
5107 		err = errno;
5108 		goto put_err_out;
5109 	}
5110 
5111 	/*
5112 	 * Check whether attribute is already single in this MFT record.
5113 	 * 8 added for the attribute terminator.
5114 	 */
5115 	if (le32_to_cpu(ctx->mrec->bytes_in_use) ==
5116 			le16_to_cpu(ctx->mrec->attrs_offset) +
5117 			le32_to_cpu(ctx->attr->length) + 8) {
5118 		err = ENOSPC;
5119 		ntfs_log_trace("MFT record is filled with one attribute\n");
5120 		ret = STATUS_RESIDENT_ATTRIBUTE_FILLED_MFT;
5121 		goto put_err_out;
5122 	}
5123 
5124 	/* Add attribute list if not present. */
5125 	if (na->ni->nr_extents == -1)
5126 		ni = na->ni->base_ni;
5127 	else
5128 		ni = na->ni;
5129 	if (!NInoAttrList(ni)) {
5130 		ntfs_attr_put_search_ctx(ctx);
5131 		if (ntfs_inode_add_attrlist(ni))
5132 			return -1;
5133 		return ntfs_resident_attr_resize_i(na, newsize, force_non_resident);
5134 	}
5135 	/* Allocate new mft record. */
5136 	ni = ntfs_mft_record_alloc(vol, ni);
5137 	if (!ni) {
5138 		err = errno;
5139 		ntfs_log_perror("Couldn't allocate new MFT record");
5140 		goto put_err_out;
5141 	}
5142 	/* Move attribute to it. */
5143 	if (ntfs_attr_record_move_to(ctx, ni)) {
5144 		err = errno;
5145 		ntfs_log_perror("Couldn't move attribute to new MFT record");
5146 		goto put_err_out;
5147 	}
5148 	/* Update ntfs attribute. */
5149 	if (na->ni->nr_extents == -1)
5150 		na->ni = ni;
5151 
5152 	ntfs_attr_put_search_ctx(ctx);
5153 	/* Try to perform resize once again. */
5154 	return ntfs_resident_attr_resize_i(na, newsize, force_non_resident);
5155 
5156 resize_done:
5157 	/*
5158 	 * Set the inode (and its base inode if it exists) dirty so it is
5159 	 * written out later.
5160 	 */
5161 	ntfs_inode_mark_dirty(ctx->ntfs_ino);
5162 	ntfs_attr_put_search_ctx(ctx);
5163 	return 0;
5164 put_err_out:
5165 	ntfs_attr_put_search_ctx(ctx);
5166 	errno = err;
5167 	return ret;
5168 }
5169 
5170 static int ntfs_resident_attr_resize(ntfs_attr *na, const s64 newsize)
5171 {
5172 	int ret;
5173 
5174 	ntfs_log_enter("Entering\n");
5175 	ret = ntfs_resident_attr_resize_i(na, newsize, FALSE);
5176 	ntfs_log_leave("\n");
5177 	return ret;
5178 }
5179 
5180 /*
5181  *		Force an attribute to be made non-resident without
5182  *	changing its size.
5183  *
5184  *	This is particularly needed when the attribute has no data,
5185  *	as the non-resident variant requires more space in the MFT
5186  *	record, and may imply expelling some other attribute.
5187  *
5188  *	As a consequence the existing ntfs_attr_search_ctx's have to
5189  *	be closed or reinitialized.
5190  *
5191  *	returns 0 if successful,
5192  *		< 0 if failed, with errno telling why
5193  */
5194 
5195 int ntfs_attr_force_non_resident(ntfs_attr *na)
5196 {
5197 	int res;
5198 
5199 	res = ntfs_resident_attr_resize_i(na, na->data_size, TRUE);
5200 	if (!res && !NAttrNonResident(na)) {
5201 		res = -1;
5202 		errno = EIO;
5203 		ntfs_log_error("Failed to force non-resident\n");
5204 	}
5205 	return (res);
5206 }
5207 
5208 /**
5209  * ntfs_attr_make_resident - convert a non-resident to a resident attribute
5210  * @na:		open ntfs attribute to make resident
5211  * @ctx:	ntfs search context describing the attribute
5212  *
5213  * Convert a non-resident ntfs attribute to a resident one.
5214  *
5215  * Return 0 on success and -1 on error with errno set to the error code. The
5216  * following error codes are defined:
5217  *	EINVAL	   - Invalid arguments passed.
5218  *	EPERM	   - The attribute is not allowed to be resident.
5219  *	EIO	   - I/O error, damaged inode or bug.
5220  *	ENOSPC	   - There is no enough space to perform conversion.
5221  *	EOPNOTSUPP - Requested conversion is not supported yet.
5222  *
5223  * Warning: We do not set the inode dirty and we do not write out anything!
5224  *	    We expect the caller to do this as this is a fairly low level
5225  *	    function and it is likely there will be further changes made.
5226  */
5227 static int ntfs_attr_make_resident(ntfs_attr *na, ntfs_attr_search_ctx *ctx)
5228 {
5229 	ntfs_volume *vol = na->ni->vol;
5230 	ATTR_REC *a = ctx->attr;
5231 	int name_ofs, val_ofs, err = EIO;
5232 	s64 arec_size, bytes_read;
5233 
5234 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x.\n", (unsigned long
5235 			long)na->ni->mft_no, na->type);
5236 
5237 	/* Should be called for the first extent of the attribute. */
5238 	if (sle64_to_cpu(a->lowest_vcn)) {
5239 		ntfs_log_trace("Eeek!  Should be called for the first extent of the "
5240 				"attribute.  Aborting...\n");
5241 		errno = EINVAL;
5242 		return -1;
5243 	}
5244 
5245 	/* Some preliminary sanity checking. */
5246 	if (!NAttrNonResident(na)) {
5247 		ntfs_log_trace("Eeek!  Trying to make resident attribute resident.  "
5248 				"Aborting...\n");
5249 		errno = EINVAL;
5250 		return -1;
5251 	}
5252 
5253 	/* Make sure this is not $MFT/$BITMAP or Windows will not boot! */
5254 	if (na->type == AT_BITMAP && na->ni->mft_no == FILE_MFT) {
5255 		errno = EPERM;
5256 		return -1;
5257 	}
5258 
5259 	/* Check that the attribute is allowed to be resident. */
5260 	if (ntfs_attr_can_be_resident(vol, na->type))
5261 		return -1;
5262 
5263 	if (na->data_flags & ATTR_IS_ENCRYPTED) {
5264 		ntfs_log_trace("Making encrypted streams resident is not "
5265 				"implemented yet.\n");
5266 		errno = EOPNOTSUPP;
5267 		return -1;
5268 	}
5269 
5270 	/* Work out offsets into and size of the resident attribute. */
5271 	name_ofs = 24; /* = sizeof(resident_ATTR_REC); */
5272 	val_ofs = (name_ofs + a->name_length * sizeof(ntfschar) + 7) & ~7;
5273 	arec_size = (val_ofs + na->data_size + 7) & ~7;
5274 
5275 	/* Sanity check the size before we start modifying the attribute. */
5276 	if (le32_to_cpu(ctx->mrec->bytes_in_use) - le32_to_cpu(a->length) +
5277 			arec_size > le32_to_cpu(ctx->mrec->bytes_allocated)) {
5278 		errno = ENOSPC;
5279 		ntfs_log_trace("Not enough space to make attribute resident\n");
5280 		return -1;
5281 	}
5282 
5283 	/* Read and cache the whole runlist if not already done. */
5284 	if (ntfs_attr_map_whole_runlist(na))
5285 		return -1;
5286 
5287 	/* Move the attribute name if it exists and update the offset. */
5288 	if (a->name_length) {
5289 		memmove((u8*)a + name_ofs, (u8*)a + le16_to_cpu(a->name_offset),
5290 				a->name_length * sizeof(ntfschar));
5291 	}
5292 	a->name_offset = cpu_to_le16(name_ofs);
5293 
5294 	/* Resize the resident part of the attribute record. */
5295 	if (ntfs_attr_record_resize(ctx->mrec, a, arec_size) < 0) {
5296 		/*
5297 		 * Bug, because ntfs_attr_record_resize should not fail (we
5298 		 * already checked that attribute fits MFT record).
5299 		 */
5300 		ntfs_log_error("BUG! Failed to resize attribute record. "
5301 				"Please report to the %s.  Aborting...\n",
5302 				NTFS_DEV_LIST);
5303 		errno = EIO;
5304 		return -1;
5305 	}
5306 
5307 	/* Convert the attribute record to describe a resident attribute. */
5308 	a->non_resident = 0;
5309 	a->flags = 0;
5310 	a->value_length = cpu_to_le32(na->data_size);
5311 	a->value_offset = cpu_to_le16(val_ofs);
5312 	/*
5313 	 *  If a data stream was wiped out, adjust the compression mode
5314 	 *  to current state of compression flag
5315 	 */
5316 	if (!na->data_size
5317 	    && (na->type == AT_DATA)
5318 	    && (na->ni->vol->major_ver >= 3)
5319 	    && NVolCompression(na->ni->vol)
5320 	    && (na->ni->vol->cluster_size <= MAX_COMPRESSION_CLUSTER_SIZE)
5321 	    && (na->ni->flags & FILE_ATTR_COMPRESSED)) {
5322 		a->flags |= ATTR_IS_COMPRESSED;
5323 		na->data_flags = a->flags;
5324 	}
5325 	/*
5326 	 * File names cannot be non-resident so we would never see this here
5327 	 * but at least it serves as a reminder that there may be attributes
5328 	 * for which we do need to set this flag. (AIA)
5329 	 */
5330 	if (a->type == AT_FILE_NAME)
5331 		a->resident_flags = RESIDENT_ATTR_IS_INDEXED;
5332 	else
5333 		a->resident_flags = 0;
5334 	a->reservedR = 0;
5335 
5336 	/* Sanity fixup...  Shouldn't really happen. (AIA) */
5337 	if (na->initialized_size > na->data_size)
5338 		na->initialized_size = na->data_size;
5339 
5340 	/* Copy data from run list to resident attribute value. */
5341 	bytes_read = ntfs_rl_pread(vol, na->rl, 0, na->initialized_size,
5342 			(u8*)a + val_ofs);
5343 	if (bytes_read != na->initialized_size) {
5344 		if (bytes_read < 0)
5345 			err = errno;
5346 		ntfs_log_trace("Eeek! Failed to read attribute data. Leaving "
5347 				"inconstant metadata. Run chkdsk.  "
5348 				"Aborting...\n");
5349 		errno = err;
5350 		return -1;
5351 	}
5352 
5353 	/* Clear memory in gap between initialized_size and data_size. */
5354 	if (na->initialized_size < na->data_size)
5355 		memset((u8*)a + val_ofs + na->initialized_size, 0,
5356 				na->data_size - na->initialized_size);
5357 
5358 	/*
5359 	 * Deallocate clusters from the runlist.
5360 	 *
5361 	 * NOTE: We can use ntfs_cluster_free() because we have already mapped
5362 	 * the whole run list and thus it doesn't matter that the attribute
5363 	 * record is in a transiently corrupted state at this moment in time.
5364 	 */
5365 	if (ntfs_cluster_free(vol, na, 0, -1) < 0) {
5366 		ntfs_log_perror("Eeek! Failed to release allocated clusters");
5367 		ntfs_log_trace("Ignoring error and leaving behind wasted "
5368 				"clusters.\n");
5369 	}
5370 
5371 	/* Throw away the now unused runlist. */
5372 	free(na->rl);
5373 	na->rl = NULL;
5374 
5375 	/* Update in-memory struct ntfs_attr. */
5376 	NAttrClearNonResident(na);
5377 	NAttrClearFullyMapped(na);
5378 	NAttrClearSparse(na);
5379 	NAttrClearEncrypted(na);
5380 	na->initialized_size = na->data_size;
5381 	na->allocated_size = na->compressed_size = (na->data_size + 7) & ~7;
5382 	na->compression_block_size = 0;
5383 	na->compression_block_size_bits = na->compression_block_clusters = 0;
5384 	return 0;
5385 }
5386 
5387 /*
5388  * If we are in the first extent, then set/clean sparse bit,
5389  * update allocated and compressed size.
5390  */
5391 static int ntfs_attr_update_meta(ATTR_RECORD *a, ntfs_attr *na, MFT_RECORD *m,
5392 				hole_type holes, ntfs_attr_search_ctx *ctx)
5393 {
5394 	int sparse, ret = 0;
5395 
5396 	ntfs_log_trace("Entering for inode 0x%llx, attr 0x%x\n",
5397 		       (unsigned long long)na->ni->mft_no, na->type);
5398 
5399 	if (a->lowest_vcn)
5400 		goto out;
5401 
5402 	a->allocated_size = cpu_to_sle64(na->allocated_size);
5403 
5404 	/* Update sparse bit, unless this is an intermediate state */
5405 	if (holes == HOLES_DELAY)
5406 		sparse = (a->flags & ATTR_IS_SPARSE) != const_cpu_to_le16(0);
5407 	else {
5408 		sparse = ntfs_rl_sparse(na->rl);
5409 		if (sparse == -1) {
5410 			errno = EIO;
5411 			goto error;
5412 		}
5413 	}
5414 
5415 	/* Check whether attribute becomes sparse, unless check is delayed. */
5416 	if ((holes != HOLES_DELAY)
5417 	    && sparse
5418 	    && !(a->flags & (ATTR_IS_SPARSE | ATTR_IS_COMPRESSED))) {
5419 		/*
5420 		 * Move attribute to another mft record, if attribute is too
5421 		 * small to add compressed_size field to it and we have no
5422 		 * free space in the current mft record.
5423 		 */
5424 		if ((le32_to_cpu(a->length) -
5425 				le16_to_cpu(a->mapping_pairs_offset) == 8)
5426 		    && !(le32_to_cpu(m->bytes_allocated) -
5427 				le32_to_cpu(m->bytes_in_use))) {
5428 
5429 			if (!NInoAttrList(na->ni)) {
5430 				ntfs_attr_put_search_ctx(ctx);
5431 				if (ntfs_inode_add_attrlist(na->ni))
5432 					goto leave;
5433 				goto retry;
5434 			}
5435 			if (ntfs_attr_record_move_away(ctx, 8)) {
5436 				ntfs_log_perror("Failed to move attribute");
5437 				goto error;
5438 			}
5439 			ntfs_attr_put_search_ctx(ctx);
5440 			goto retry;
5441 		}
5442 		if (!(le32_to_cpu(a->length) - le16_to_cpu(
5443 						a->mapping_pairs_offset))) {
5444 			errno = EIO;
5445 			ntfs_log_perror("Mapping pairs space is 0");
5446 			goto error;
5447 		}
5448 
5449 		NAttrSetSparse(na);
5450 		a->flags |= ATTR_IS_SPARSE;
5451 		na->data_flags = a->flags;
5452 		a->compression_unit = STANDARD_COMPRESSION_UNIT;  /* Windows
5453 		 set it so, even if attribute is not actually compressed. */
5454 
5455 		memmove((u8*)a + le16_to_cpu(a->name_offset) + 8,
5456 			(u8*)a + le16_to_cpu(a->name_offset),
5457 			a->name_length * sizeof(ntfschar));
5458 
5459 		a->name_offset = cpu_to_le16(le16_to_cpu(a->name_offset) + 8);
5460 
5461 		a->mapping_pairs_offset =
5462 			cpu_to_le16(le16_to_cpu(a->mapping_pairs_offset) + 8);
5463 	}
5464 
5465 	/* Attribute no longer sparse. */
5466 	if (!sparse && (a->flags & ATTR_IS_SPARSE) &&
5467 	    !(a->flags & ATTR_IS_COMPRESSED)) {
5468 
5469 		NAttrClearSparse(na);
5470 		a->flags &= ~ATTR_IS_SPARSE;
5471 		na->data_flags = a->flags;
5472 		a->compression_unit = 0;
5473 
5474 		memmove((u8*)a + le16_to_cpu(a->name_offset) - 8,
5475 			(u8*)a + le16_to_cpu(a->name_offset),
5476 			a->name_length * sizeof(ntfschar));
5477 
5478 		if (le16_to_cpu(a->name_offset) >= 8)
5479 			a->name_offset = cpu_to_le16(le16_to_cpu(a->name_offset) - 8);
5480 
5481 		a->mapping_pairs_offset =
5482 			cpu_to_le16(le16_to_cpu(a->mapping_pairs_offset) - 8);
5483 	}
5484 
5485 	/* Update compressed size if required. */
5486 	if (NAttrFullyMapped(na)
5487 	    && (sparse || (na->data_flags & ATTR_COMPRESSION_MASK))) {
5488 		s64 new_compr_size;
5489 
5490 		new_compr_size = ntfs_rl_get_compressed_size(na->ni->vol, na->rl);
5491 		if (new_compr_size == -1)
5492 			goto error;
5493 
5494 		na->compressed_size = new_compr_size;
5495 		a->compressed_size = cpu_to_sle64(new_compr_size);
5496 	}
5497 	/*
5498 	 * Set FILE_NAME dirty flag, to update sparse bit and
5499 	 * allocated size in the index.
5500 	 */
5501 	if (na->type == AT_DATA && na->name == AT_UNNAMED) {
5502 		if (sparse || (na->data_flags & ATTR_COMPRESSION_MASK))
5503 			na->ni->allocated_size = na->compressed_size;
5504 		else
5505 			na->ni->allocated_size = na->allocated_size;
5506 		NInoFileNameSetDirty(na->ni);
5507 	}
5508 out:
5509 	return ret;
5510 leave:	ret = -1; goto out;  /* return -1 */
5511 retry:	ret = -2; goto out;
5512 error:  ret = -3; goto out;
5513 }
5514 
5515 #define NTFS_VCN_DELETE_MARK -2
5516 /**
5517  * ntfs_attr_update_mapping_pairs_i - see ntfs_attr_update_mapping_pairs
5518  */
5519 static int ntfs_attr_update_mapping_pairs_i(ntfs_attr *na, VCN from_vcn,
5520 					hole_type holes)
5521 {
5522 	ntfs_attr_search_ctx *ctx;
5523 	ntfs_inode *ni, *base_ni;
5524 	MFT_RECORD *m;
5525 	ATTR_RECORD *a;
5526 	VCN stop_vcn;
5527 	const runlist_element *stop_rl;
5528 	int err, mp_size, cur_max_mp_size, exp_max_mp_size, ret = -1;
5529 	BOOL finished_build;
5530 	BOOL first_updated = FALSE;
5531 
5532 retry:
5533 	if (!na || !na->rl) {
5534 		errno = EINVAL;
5535 		ntfs_log_perror("%s: na=%p", __FUNCTION__, na);
5536 		return -1;
5537 	}
5538 
5539 	ntfs_log_trace("Entering for inode %llu, attr 0x%x\n",
5540 		       (unsigned long long)na->ni->mft_no, na->type);
5541 
5542 	if (!NAttrNonResident(na)) {
5543 		errno = EINVAL;
5544 		ntfs_log_perror("%s: resident attribute", __FUNCTION__);
5545 		return -1;
5546 	}
5547 
5548 #if PARTIAL_RUNLIST_UPDATING
5549 		/*
5550 		 * For a file just been made sparse, we will have
5551 		 * to reformat the first extent, so be sure the
5552 		 * runlist is fully mapped and fully processed.
5553 		 * Same if the file was sparse and is not any more.
5554 		 * Note : not needed if the full runlist is to be processed
5555 		 */
5556 	if ((holes != HOLES_DELAY)
5557 	   && (!NAttrFullyMapped(na) || from_vcn)
5558 	   && !(na->data_flags & ATTR_IS_COMPRESSED)) {
5559 		BOOL changed;
5560 
5561 		if (!(na->data_flags & ATTR_IS_SPARSE)) {
5562 			int sparse;
5563 			runlist_element *xrl;
5564 
5565 				/*
5566 				 * If attribute was not sparse, we only
5567 				 * have to check whether there is a hole
5568 				 * in the updated region.
5569 				 */
5570 			xrl = na->rl;
5571 			if (xrl->lcn == LCN_RL_NOT_MAPPED)
5572 				xrl++;
5573 			sparse = ntfs_rl_sparse(xrl);
5574 			if (sparse < 0) {
5575 				ntfs_log_error("Could not check whether sparse\n");
5576 				errno = EIO;
5577 				return (-1);
5578 			}
5579 			changed = sparse > 0;
5580 		} else {
5581 				/*
5582 				 * If attribute was sparse, the compressed
5583 				 * size has been maintained, and it gives
5584 				 * and easy way to check whether the
5585 				 * attribute is still sparse.
5586 				 */
5587 			changed = (((na->data_size - 1)
5588 					| (na->ni->vol->cluster_size - 1)) + 1)
5589 				== na->compressed_size;
5590 		}
5591 		if (changed) {
5592 			if (ntfs_attr_map_whole_runlist(na)) {
5593 				ntfs_log_error("Could not map whole for sparse change\n");
5594 				errno = EIO;
5595 				return (-1);
5596 			}
5597 			from_vcn = 0;
5598 		}
5599 	}
5600 #endif
5601 	if (na->ni->nr_extents == -1)
5602 		base_ni = na->ni->base_ni;
5603 	else
5604 		base_ni = na->ni;
5605 
5606 	ctx = ntfs_attr_get_search_ctx(base_ni, NULL);
5607 	if (!ctx)
5608 		return -1;
5609 
5610 	/* Fill attribute records with new mapping pairs. */
5611 	stop_vcn = 0;
5612 	stop_rl = na->rl;
5613 	finished_build = FALSE;
5614 	while (!ntfs_attr_lookup(na->type, na->name, na->name_len,
5615 				CASE_SENSITIVE, from_vcn, NULL, 0, ctx)) {
5616 		a = ctx->attr;
5617 		m = ctx->mrec;
5618 		if (!a->lowest_vcn)
5619 			first_updated = TRUE;
5620 		/*
5621 		 * If runlist is updating not from the beginning, then set
5622 		 * @stop_vcn properly, i.e. to the lowest vcn of record that
5623 		 * contain @from_vcn. Also we do not need @from_vcn anymore,
5624 		 * set it to 0 to make ntfs_attr_lookup enumerate attributes.
5625 		 */
5626 		if (from_vcn) {
5627 			LCN first_lcn;
5628 
5629 			stop_vcn = sle64_to_cpu(a->lowest_vcn);
5630 			from_vcn = 0;
5631 			/*
5632 			 * Check whether the first run we need to update is
5633 			 * the last run in runlist, if so, then deallocate
5634 			 * all attrubute extents starting this one.
5635 			 */
5636 			first_lcn = ntfs_rl_vcn_to_lcn(na->rl, stop_vcn);
5637 			if (first_lcn == LCN_EINVAL) {
5638 				errno = EIO;
5639 				ntfs_log_perror("Bad runlist");
5640 				goto put_err_out;
5641 			}
5642 			if (first_lcn == LCN_ENOENT ||
5643 					first_lcn == LCN_RL_NOT_MAPPED)
5644 				finished_build = TRUE;
5645 		}
5646 
5647 		/*
5648 		 * Check whether we finished mapping pairs build, if so mark
5649 		 * extent as need to delete (by setting highest vcn to
5650 		 * NTFS_VCN_DELETE_MARK (-2), we shall check it later and
5651 		 * delete extent) and continue search.
5652 		 */
5653 		if (finished_build) {
5654 			ntfs_log_trace("Mark attr 0x%x for delete in inode "
5655 				"%lld.\n", (unsigned)le32_to_cpu(a->type),
5656 				(long long)ctx->ntfs_ino->mft_no);
5657 			a->highest_vcn = cpu_to_sle64(NTFS_VCN_DELETE_MARK);
5658 			ntfs_inode_mark_dirty(ctx->ntfs_ino);
5659 			continue;
5660 		}
5661 
5662 		switch (ntfs_attr_update_meta(a, na, m, holes, ctx)) {
5663 			case -1: return -1;
5664 			case -2: goto retry;
5665 			case -3: goto put_err_out;
5666 		}
5667 
5668 		/*
5669 		 * Determine maximum possible length of mapping pairs,
5670 		 * if we shall *not* expand space for mapping pairs.
5671 		 */
5672 		cur_max_mp_size = le32_to_cpu(a->length) -
5673 				le16_to_cpu(a->mapping_pairs_offset);
5674 		/*
5675 		 * Determine maximum possible length of mapping pairs in the
5676 		 * current mft record, if we shall expand space for mapping
5677 		 * pairs.
5678 		 */
5679 		exp_max_mp_size = le32_to_cpu(m->bytes_allocated) -
5680 				le32_to_cpu(m->bytes_in_use) + cur_max_mp_size;
5681 		/* Get the size for the rest of mapping pairs array. */
5682 		mp_size = ntfs_get_size_for_mapping_pairs(na->ni->vol, stop_rl,
5683 						stop_vcn, exp_max_mp_size);
5684 		if (mp_size <= 0) {
5685 			ntfs_log_perror("%s: get MP size failed", __FUNCTION__);
5686 			goto put_err_out;
5687 		}
5688 		/* Test mapping pairs for fitting in the current mft record. */
5689 		if (mp_size > exp_max_mp_size) {
5690 			/*
5691 			 * Mapping pairs of $ATTRIBUTE_LIST attribute must fit
5692 			 * in the base mft record. Try to move out other
5693 			 * attributes and try again.
5694 			 */
5695 			if (na->type == AT_ATTRIBUTE_LIST) {
5696 				ntfs_attr_put_search_ctx(ctx);
5697 				if (ntfs_inode_free_space(na->ni, mp_size -
5698 							cur_max_mp_size)) {
5699 					ntfs_log_perror("Attribute list is too "
5700 							"big. Defragment the "
5701 							"volume\n");
5702 					return -1;
5703 				}
5704 				goto retry;
5705 			}
5706 
5707 			/* Add attribute list if it isn't present, and retry. */
5708 			if (!NInoAttrList(base_ni)) {
5709 				ntfs_attr_put_search_ctx(ctx);
5710 				if (ntfs_inode_add_attrlist(base_ni)) {
5711 					ntfs_log_perror("Can not add attrlist");
5712 					return -1;
5713 				}
5714 				goto retry;
5715 			}
5716 
5717 			/*
5718 			 * Set mapping pairs size to maximum possible for this
5719 			 * mft record. We shall write the rest of mapping pairs
5720 			 * to another MFT records.
5721 			 */
5722 			mp_size = exp_max_mp_size;
5723 		}
5724 
5725 		/* Change space for mapping pairs if we need it. */
5726 		if (((mp_size + 7) & ~7) != cur_max_mp_size) {
5727 			if (ntfs_attr_record_resize(m, a,
5728 					le16_to_cpu(a->mapping_pairs_offset) +
5729 					mp_size)) {
5730 				errno = EIO;
5731 				ntfs_log_perror("Failed to resize attribute");
5732 				goto put_err_out;
5733 			}
5734 		}
5735 
5736 		/* Update lowest vcn. */
5737 		a->lowest_vcn = cpu_to_sle64(stop_vcn);
5738 		ntfs_inode_mark_dirty(ctx->ntfs_ino);
5739 		if ((ctx->ntfs_ino->nr_extents == -1 ||
5740 					NInoAttrList(ctx->ntfs_ino)) &&
5741 					ctx->attr->type != AT_ATTRIBUTE_LIST) {
5742 			ctx->al_entry->lowest_vcn = cpu_to_sle64(stop_vcn);
5743 			ntfs_attrlist_mark_dirty(ctx->ntfs_ino);
5744 		}
5745 
5746 		/*
5747 		 * Generate the new mapping pairs array directly into the
5748 		 * correct destination, i.e. the attribute record itself.
5749 		 */
5750 		if (!ntfs_mapping_pairs_build(na->ni->vol, (u8*)a + le16_to_cpu(
5751 				a->mapping_pairs_offset), mp_size, na->rl,
5752 				stop_vcn, &stop_rl))
5753 			finished_build = TRUE;
5754 		if (stop_rl)
5755 			stop_vcn = stop_rl->vcn;
5756 		else
5757 			stop_vcn = 0;
5758 		if (!finished_build && errno != ENOSPC) {
5759 			ntfs_log_perror("Failed to build mapping pairs");
5760 			goto put_err_out;
5761 		}
5762 		a->highest_vcn = cpu_to_sle64(stop_vcn - 1);
5763 	}
5764 	/* Check whether error occurred. */
5765 	if (errno != ENOENT) {
5766 		ntfs_log_perror("%s: Attribute lookup failed", __FUNCTION__);
5767 		goto put_err_out;
5768 	}
5769 		/*
5770 		 * If the base extent was skipped in the above process,
5771 		 * we still may have to update the sizes.
5772 		 */
5773 	if (!first_updated) {
5774 		le16 spcomp;
5775 
5776 		ntfs_attr_reinit_search_ctx(ctx);
5777 		if (!ntfs_attr_lookup(na->type, na->name, na->name_len,
5778 				CASE_SENSITIVE, 0, NULL, 0, ctx)) {
5779 			a = ctx->attr;
5780 			a->allocated_size = cpu_to_sle64(na->allocated_size);
5781 			spcomp = na->data_flags
5782 				& (ATTR_IS_COMPRESSED | ATTR_IS_SPARSE);
5783 			if (spcomp)
5784 				a->compressed_size = cpu_to_sle64(na->compressed_size);
5785 			if ((na->type == AT_DATA) && (na->name == AT_UNNAMED)) {
5786 				na->ni->allocated_size
5787 					= (spcomp
5788 						? na->compressed_size
5789 						: na->allocated_size);
5790 				NInoFileNameSetDirty(na->ni);
5791 			}
5792 		} else {
5793 			ntfs_log_error("Failed to update sizes in base extent\n");
5794 			goto put_err_out;
5795 		}
5796 	}
5797 
5798 	/* Deallocate not used attribute extents and return with success. */
5799 	if (finished_build) {
5800 		ntfs_attr_reinit_search_ctx(ctx);
5801 		ntfs_log_trace("Deallocate marked extents.\n");
5802 		while (!ntfs_attr_lookup(na->type, na->name, na->name_len,
5803 				CASE_SENSITIVE, 0, NULL, 0, ctx)) {
5804 			if (sle64_to_cpu(ctx->attr->highest_vcn) !=
5805 							NTFS_VCN_DELETE_MARK)
5806 				continue;
5807 			/* Remove unused attribute record. */
5808 			if (ntfs_attr_record_rm(ctx)) {
5809 				ntfs_log_perror("Could not remove unused attr");
5810 				goto put_err_out;
5811 			}
5812 			ntfs_attr_reinit_search_ctx(ctx);
5813 		}
5814 		if (errno != ENOENT) {
5815 			ntfs_log_perror("%s: Attr lookup failed", __FUNCTION__);
5816 			goto put_err_out;
5817 		}
5818 		ntfs_log_trace("Deallocate done.\n");
5819 		ntfs_attr_put_search_ctx(ctx);
5820 		goto ok;
5821 	}
5822 	ntfs_attr_put_search_ctx(ctx);
5823 	ctx = NULL;
5824 
5825 	/* Allocate new MFT records for the rest of mapping pairs. */
5826 	while (1) {
5827 		/* Calculate size of rest mapping pairs. */
5828 		mp_size = ntfs_get_size_for_mapping_pairs(na->ni->vol,
5829 						na->rl, stop_vcn, INT_MAX);
5830 		if (mp_size <= 0) {
5831 			ntfs_log_perror("%s: get mp size failed", __FUNCTION__);
5832 			goto put_err_out;
5833 		}
5834 		/* Allocate new mft record. */
5835 		ni = ntfs_mft_record_alloc(na->ni->vol, base_ni);
5836 		if (!ni) {
5837 			ntfs_log_perror("Could not allocate new MFT record");
5838 			goto put_err_out;
5839 		}
5840 		m = ni->mrec;
5841 		/*
5842 		 * If mapping size exceed available space, set them to
5843 		 * possible maximum.
5844 		 */
5845 		cur_max_mp_size = le32_to_cpu(m->bytes_allocated) -
5846 				le32_to_cpu(m->bytes_in_use) -
5847 				(offsetof(ATTR_RECORD, compressed_size) +
5848 				(((na->data_flags & ATTR_COMPRESSION_MASK)
5849 				    || NAttrSparse(na)) ?
5850 				sizeof(a->compressed_size) : 0)) -
5851 				((sizeof(ntfschar) * na->name_len + 7) & ~7);
5852 		if (mp_size > cur_max_mp_size)
5853 			mp_size = cur_max_mp_size;
5854 		/* Add attribute extent to new record. */
5855 		err = ntfs_non_resident_attr_record_add(ni, na->type,
5856 			na->name, na->name_len, stop_vcn, mp_size,
5857 			na->data_flags);
5858 		if (err == -1) {
5859 			err = errno;
5860 			ntfs_log_perror("Could not add attribute extent");
5861 			if (ntfs_mft_record_free(na->ni->vol, ni))
5862 				ntfs_log_perror("Could not free MFT record");
5863 			errno = err;
5864 			goto put_err_out;
5865 		}
5866 		a = (ATTR_RECORD*)((u8*)m + err);
5867 
5868 		err = ntfs_mapping_pairs_build(na->ni->vol, (u8*)a +
5869 			le16_to_cpu(a->mapping_pairs_offset), mp_size, na->rl,
5870 			stop_vcn, &stop_rl);
5871 		if (stop_rl)
5872 			stop_vcn = stop_rl->vcn;
5873 		else
5874 			stop_vcn = 0;
5875 		if (err < 0 && errno != ENOSPC) {
5876 			err = errno;
5877 			ntfs_log_perror("Failed to build MP");
5878 			if (ntfs_mft_record_free(na->ni->vol, ni))
5879 				ntfs_log_perror("Couldn't free MFT record");
5880 			errno = err;
5881 			goto put_err_out;
5882 		}
5883 		a->highest_vcn = cpu_to_sle64(stop_vcn - 1);
5884 		ntfs_inode_mark_dirty(ni);
5885 		/* All mapping pairs has been written. */
5886 		if (!err)
5887 			break;
5888 	}
5889 ok:
5890 	ret = 0;
5891 out:
5892 	return ret;
5893 put_err_out:
5894 	if (ctx)
5895 		ntfs_attr_put_search_ctx(ctx);
5896 	goto out;
5897 }
5898 #undef NTFS_VCN_DELETE_MARK
5899 
5900 /**
5901  * ntfs_attr_update_mapping_pairs - update mapping pairs for ntfs attribute
5902  * @na:		non-resident ntfs open attribute for which we need update
5903  * @from_vcn:	update runlist starting this VCN
5904  *
5905  * Build mapping pairs from @na->rl and write them to the disk. Also, this
5906  * function updates sparse bit, allocated and compressed size (allocates/frees
5907  * space for this field if required).
5908  *
5909  * @na->allocated_size should be set to correct value for the new runlist before
5910  * call to this function. Vice-versa @na->compressed_size will be calculated and
5911  * set to correct value during this function.
5912  *
5913  * FIXME: This function does not update sparse bit and compressed size correctly
5914  * if called with @from_vcn != 0.
5915  *
5916  * FIXME: Rewrite without using NTFS_VCN_DELETE_MARK define.
5917  *
5918  * On success return 0 and on error return -1 with errno set to the error code.
5919  * The following error codes are defined:
5920  *	EINVAL - Invalid arguments passed.
5921  *	ENOMEM - Not enough memory to complete operation.
5922  *	ENOSPC - There is no enough space in base mft to resize $ATTRIBUTE_LIST
5923  *		 or there is no free MFT records left to allocate.
5924  */
5925 int ntfs_attr_update_mapping_pairs(ntfs_attr *na, VCN from_vcn)
5926 {
5927 	int ret;
5928 
5929 	ntfs_log_enter("Entering\n");
5930 	ret = ntfs_attr_update_mapping_pairs_i(na, from_vcn, HOLES_OK);
5931 	ntfs_log_leave("\n");
5932 	return ret;
5933 }
5934 
5935 /**
5936  * ntfs_non_resident_attr_shrink - shrink a non-resident, open ntfs attribute
5937  * @na:		non-resident ntfs attribute to shrink
5938  * @newsize:	new size (in bytes) to which to shrink the attribute
5939  *
5940  * Reduce the size of a non-resident, open ntfs attribute @na to @newsize bytes.
5941  *
5942  * On success return 0 and on error return -1 with errno set to the error code.
5943  * The following error codes are defined:
5944  *	ENOMEM	- Not enough memory to complete operation.
5945  *	ERANGE	- @newsize is not valid for the attribute type of @na.
5946  */
5947 static int ntfs_non_resident_attr_shrink(ntfs_attr *na, const s64 newsize)
5948 {
5949 	ntfs_volume *vol;
5950 	ntfs_attr_search_ctx *ctx;
5951 	VCN first_free_vcn;
5952 	s64 nr_freed_clusters;
5953 	int err;
5954 
5955 	ntfs_log_trace("Inode 0x%llx attr 0x%x new size %lld\n", (unsigned long long)
5956 		       na->ni->mft_no, na->type, (long long)newsize);
5957 
5958 	vol = na->ni->vol;
5959 
5960 	/*
5961 	 * Check the attribute type and the corresponding minimum size
5962 	 * against @newsize and fail if @newsize is too small.
5963 	 */
5964 	if (ntfs_attr_size_bounds_check(vol, na->type, newsize) < 0) {
5965 		if (errno == ERANGE) {
5966 			ntfs_log_trace("Eeek! Size bounds check failed. "
5967 					"Aborting...\n");
5968 		} else if (errno == ENOENT)
5969 			errno = EIO;
5970 		return -1;
5971 	}
5972 
5973 	/* The first cluster outside the new allocation. */
5974 	if (na->data_flags & ATTR_COMPRESSION_MASK)
5975 		/*
5976 		 * For compressed files we must keep full compressions blocks,
5977 		 * but currently we do not decompress/recompress the last
5978 		 * block to truncate the data, so we may leave more allocated
5979 		 * clusters than really needed.
5980 		 */
5981 		first_free_vcn = (((newsize - 1)
5982 				 | (na->compression_block_size - 1)) + 1)
5983 				   >> vol->cluster_size_bits;
5984 	else
5985 		first_free_vcn = (newsize + vol->cluster_size - 1) >>
5986 				vol->cluster_size_bits;
5987 	/*
5988 	 * Compare the new allocation with the old one and only deallocate
5989 	 * clusters if there is a change.
5990 	 */
5991 	if ((na->allocated_size >> vol->cluster_size_bits) != first_free_vcn) {
5992 		if (ntfs_attr_map_whole_runlist(na)) {
5993 			ntfs_log_trace("Eeek! ntfs_attr_map_whole_runlist "
5994 					"failed.\n");
5995 			return -1;
5996 		}
5997 		/* Deallocate all clusters starting with the first free one. */
5998 		nr_freed_clusters = ntfs_cluster_free(vol, na, first_free_vcn,
5999 				-1);
6000 		if (nr_freed_clusters < 0) {
6001 			ntfs_log_trace("Eeek! Freeing of clusters failed. "
6002 					"Aborting...\n");
6003 			return -1;
6004 		}
6005 
6006 		/* Truncate the runlist itself. */
6007 		if (ntfs_rl_truncate(&na->rl, first_free_vcn)) {
6008 			/*
6009 			 * Failed to truncate the runlist, so just throw it
6010 			 * away, it will be mapped afresh on next use.
6011 			 */
6012 			free(na->rl);
6013 			na->rl = NULL;
6014 			ntfs_log_trace("Eeek! Run list truncation failed.\n");
6015 			return -1;
6016 		}
6017 
6018 		/* Prepare to mapping pairs update. */
6019 		na->allocated_size = first_free_vcn << vol->cluster_size_bits;
6020 		/* Write mapping pairs for new runlist. */
6021 		if (ntfs_attr_update_mapping_pairs(na, 0 /*first_free_vcn*/)) {
6022 			ntfs_log_trace("Eeek! Mapping pairs update failed. "
6023 					"Leaving inconstant metadata. "
6024 					"Run chkdsk.\n");
6025 			return -1;
6026 		}
6027 	}
6028 
6029 	/* Get the first attribute record. */
6030 	ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
6031 	if (!ctx)
6032 		return -1;
6033 
6034 	if (ntfs_attr_lookup(na->type, na->name, na->name_len, CASE_SENSITIVE,
6035 			0, NULL, 0, ctx)) {
6036 		err = errno;
6037 		if (err == ENOENT)
6038 			err = EIO;
6039 		ntfs_log_trace("Eeek! Lookup of first attribute extent failed. "
6040 				"Leaving inconstant metadata.\n");
6041 		goto put_err_out;
6042 	}
6043 
6044 	/* Update data and initialized size. */
6045 	na->data_size = newsize;
6046 	ctx->attr->data_size = cpu_to_sle64(newsize);
6047 	if (newsize < na->initialized_size) {
6048 		na->initialized_size = newsize;
6049 		ctx->attr->initialized_size = cpu_to_sle64(newsize);
6050 	}
6051 	/* Update data size in the index. */
6052 	if (na->ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
6053 		if (na->type == AT_INDEX_ROOT && na->name == NTFS_INDEX_I30) {
6054 			na->ni->data_size = na->data_size;
6055 			na->ni->allocated_size = na->allocated_size;
6056 			set_nino_flag(na->ni,KnownSize);
6057 		}
6058 	} else {
6059 		if (na->type == AT_DATA && na->name == AT_UNNAMED) {
6060 			na->ni->data_size = na->data_size;
6061 			NInoFileNameSetDirty(na->ni);
6062 		}
6063 	}
6064 
6065 	/* If the attribute now has zero size, make it resident. */
6066 	if (!newsize) {
6067 		if (ntfs_attr_make_resident(na, ctx)) {
6068 			/* If couldn't make resident, just continue. */
6069 			if (errno != EPERM)
6070 				ntfs_log_error("Failed to make attribute "
6071 						"resident. Leaving as is...\n");
6072 		}
6073 	}
6074 
6075 	/* Set the inode dirty so it is written out later. */
6076 	ntfs_inode_mark_dirty(ctx->ntfs_ino);
6077 	/* Done! */
6078 	ntfs_attr_put_search_ctx(ctx);
6079 	return 0;
6080 put_err_out:
6081 	ntfs_attr_put_search_ctx(ctx);
6082 	errno = err;
6083 	return -1;
6084 }
6085 
6086 /**
6087  * ntfs_non_resident_attr_expand - expand a non-resident, open ntfs attribute
6088  * @na:		non-resident ntfs attribute to expand
6089  * @newsize:	new size (in bytes) to which to expand the attribute
6090  *
6091  * Expand the size of a non-resident, open ntfs attribute @na to @newsize bytes,
6092  * by allocating new clusters.
6093  *
6094  * On success return 0 and on error return -1 with errno set to the error code.
6095  * The following error codes are defined:
6096  *	ENOMEM - Not enough memory to complete operation.
6097  *	ERANGE - @newsize is not valid for the attribute type of @na.
6098  *	ENOSPC - There is no enough space in base mft to resize $ATTRIBUTE_LIST.
6099  */
6100 static int ntfs_non_resident_attr_expand_i(ntfs_attr *na, const s64 newsize,
6101 					hole_type holes)
6102 {
6103 	LCN lcn_seek_from;
6104 	VCN first_free_vcn;
6105 	ntfs_volume *vol;
6106 	ntfs_attr_search_ctx *ctx;
6107 	runlist *rl, *rln;
6108 	s64 org_alloc_size;
6109 	int err;
6110 
6111 	ntfs_log_trace("Inode %lld, attr 0x%x, new size %lld old size %lld\n",
6112 			(unsigned long long)na->ni->mft_no, na->type,
6113 			(long long)newsize, (long long)na->data_size);
6114 
6115 	vol = na->ni->vol;
6116 
6117 	/*
6118 	 * Check the attribute type and the corresponding maximum size
6119 	 * against @newsize and fail if @newsize is too big.
6120 	 */
6121 	if (ntfs_attr_size_bounds_check(vol, na->type, newsize) < 0) {
6122 		if (errno == ENOENT)
6123 			errno = EIO;
6124 		ntfs_log_perror("%s: bounds check failed", __FUNCTION__);
6125 		return -1;
6126 	}
6127 
6128 	if (na->type == AT_DATA)
6129 		NAttrSetDataAppending(na);
6130 	/* Save for future use. */
6131 	org_alloc_size = na->allocated_size;
6132 	/* The first cluster outside the new allocation. */
6133 	first_free_vcn = (newsize + vol->cluster_size - 1) >>
6134 			vol->cluster_size_bits;
6135 	/*
6136 	 * Compare the new allocation with the old one and only allocate
6137 	 * clusters if there is a change.
6138 	 */
6139 	if ((na->allocated_size >> vol->cluster_size_bits) < first_free_vcn) {
6140 #if PARTIAL_RUNLIST_UPDATING
6141 		s64 start_update;
6142 
6143 		/*
6144 		 * Update from the last previously allocated run,
6145 		 * as we may have to expand an existing hole.
6146 		 */
6147 		start_update = na->allocated_size >> vol->cluster_size_bits;
6148 		if (start_update)
6149 			start_update--;
6150 		if (ntfs_attr_map_partial_runlist(na, start_update)) {
6151 			ntfs_log_perror("failed to map partial runlist");
6152 			return -1;
6153 		}
6154 #else
6155 		if (ntfs_attr_map_whole_runlist(na)) {
6156 			ntfs_log_perror("ntfs_attr_map_whole_runlist failed");
6157 			return -1;
6158 		}
6159 #endif
6160 
6161 		/*
6162 		 * If we extend $DATA attribute on NTFS 3+ volume, we can add
6163 		 * sparse runs instead of real allocation of clusters.
6164 		 */
6165 		if ((na->type == AT_DATA) && (vol->major_ver >= 3)
6166 					 && (holes != HOLES_NO)) {
6167 			rl = ntfs_malloc(0x1000);
6168 			if (!rl)
6169 				return -1;
6170 
6171 			rl[0].vcn = (na->allocated_size >>
6172 					vol->cluster_size_bits);
6173 			rl[0].lcn = LCN_HOLE;
6174 			rl[0].length = first_free_vcn -
6175 				(na->allocated_size >> vol->cluster_size_bits);
6176 			rl[1].vcn = first_free_vcn;
6177 			rl[1].lcn = LCN_ENOENT;
6178 			rl[1].length = 0;
6179 		} else {
6180 			/*
6181 			 * Determine first after last LCN of attribute.
6182 			 * We will start seek clusters from this LCN to avoid
6183 			 * fragmentation.  If there are no valid LCNs in the
6184 			 * attribute let the cluster allocator choose the
6185 			 * starting LCN.
6186 			 */
6187 			lcn_seek_from = -1;
6188 			if (na->rl->length) {
6189 				/* Seek to the last run list element. */
6190 				for (rl = na->rl; (rl + 1)->length; rl++)
6191 					;
6192 				/*
6193 				 * If the last LCN is a hole or similar seek
6194 				 * back to last valid LCN.
6195 				 */
6196 				while (rl->lcn < 0 && rl != na->rl)
6197 					rl--;
6198 				/*
6199 				 * Only set lcn_seek_from it the LCN is valid.
6200 				 */
6201 				if (rl->lcn >= 0)
6202 					lcn_seek_from = rl->lcn + rl->length;
6203 			}
6204 
6205 			rl = ntfs_cluster_alloc(vol, na->allocated_size >>
6206 					vol->cluster_size_bits, first_free_vcn -
6207 					(na->allocated_size >>
6208 					vol->cluster_size_bits), lcn_seek_from,
6209 					DATA_ZONE);
6210 			if (!rl) {
6211 				ntfs_log_perror("Cluster allocation failed "
6212 						"(%lld)",
6213 						(long long)first_free_vcn -
6214 						((long long)na->allocated_size >>
6215 						 vol->cluster_size_bits));
6216 				return -1;
6217 			}
6218 		}
6219 
6220 		/* Append new clusters to attribute runlist. */
6221 		rln = ntfs_runlists_merge(na->rl, rl);
6222 		if (!rln) {
6223 			/* Failed, free just allocated clusters. */
6224 			err = errno;
6225 			ntfs_log_perror("Run list merge failed");
6226 			ntfs_cluster_free_from_rl(vol, rl);
6227 			free(rl);
6228 			errno = err;
6229 			return -1;
6230 		}
6231 		na->rl = rln;
6232 
6233 		/* Prepare to mapping pairs update. */
6234 		na->allocated_size = first_free_vcn << vol->cluster_size_bits;
6235 		/* Write mapping pairs for new runlist. */
6236 #if PARTIAL_RUNLIST_UPDATING
6237 		if (ntfs_attr_update_mapping_pairs_i(na, start_update, holes)) {
6238 #else
6239 		if (ntfs_attr_update_mapping_pairs(na, 0)) {
6240 #endif
6241 			err = errno;
6242 			ntfs_log_perror("Mapping pairs update failed");
6243 			goto rollback;
6244 		}
6245 	}
6246 
6247 	ctx = ntfs_attr_get_search_ctx(na->ni, NULL);
6248 	if (!ctx) {
6249 		err = errno;
6250 		if (na->allocated_size == org_alloc_size) {
6251 			errno = err;
6252 			return -1;
6253 		} else
6254 			goto rollback;
6255 	}
6256 
6257 	if (ntfs_attr_lookup(na->type, na->name, na->name_len, CASE_SENSITIVE,
6258 			0, NULL, 0, ctx)) {
6259 		err = errno;
6260 		ntfs_log_perror("Lookup of first attribute extent failed");
6261 		if (err == ENOENT)
6262 			err = EIO;
6263 		if (na->allocated_size != org_alloc_size) {
6264 			ntfs_attr_put_search_ctx(ctx);
6265 			goto rollback;
6266 		} else
6267 			goto put_err_out;
6268 	}
6269 
6270 	/* Update data size. */
6271 	na->data_size = newsize;
6272 	ctx->attr->data_size = cpu_to_sle64(newsize);
6273 	/* Update data size in the index. */
6274 	if (na->ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
6275 		if (na->type == AT_INDEX_ROOT && na->name == NTFS_INDEX_I30) {
6276 			na->ni->data_size = na->data_size;
6277 			na->ni->allocated_size = na->allocated_size;
6278 			set_nino_flag(na->ni,KnownSize);
6279 		}
6280 	} else {
6281 		if (na->type == AT_DATA && na->name == AT_UNNAMED) {
6282 			na->ni->data_size = na->data_size;
6283 			NInoFileNameSetDirty(na->ni);
6284 		}
6285 	}
6286 	/* Set the inode dirty so it is written out later. */
6287 	ntfs_inode_mark_dirty(ctx->ntfs_ino);
6288 	/* Done! */
6289 	ntfs_attr_put_search_ctx(ctx);
6290 	return 0;
6291 rollback:
6292 	/* Free allocated clusters. */
6293 	if (ntfs_cluster_free(vol, na, org_alloc_size >>
6294 			vol->cluster_size_bits, -1) < 0) {
6295 		err = EIO;
6296 		ntfs_log_perror("Leaking clusters");
6297 	}
6298 	/* Now, truncate the runlist itself. */
6299 	if (ntfs_rl_truncate(&na->rl, org_alloc_size >>
6300 			vol->cluster_size_bits)) {
6301 		/*
6302 		 * Failed to truncate the runlist, so just throw it away, it
6303 		 * will be mapped afresh on next use.
6304 		 */
6305 		free(na->rl);
6306 		na->rl = NULL;
6307 		ntfs_log_perror("Couldn't truncate runlist. Rollback failed");
6308 	} else {
6309 		/* Prepare to mapping pairs update. */
6310 		na->allocated_size = org_alloc_size;
6311 		/* Restore mapping pairs. */
6312 		if (ntfs_attr_update_mapping_pairs(na, 0 /*na->allocated_size >>
6313 					vol->cluster_size_bits*/)) {
6314 			ntfs_log_perror("Failed to restore old mapping pairs");
6315 		}
6316 	}
6317 	errno = err;
6318 	return -1;
6319 put_err_out:
6320 	ntfs_attr_put_search_ctx(ctx);
6321 	errno = err;
6322 	return -1;
6323 }
6324 
6325 
6326 static int ntfs_non_resident_attr_expand(ntfs_attr *na, const s64 newsize,
6327 				hole_type holes)
6328 {
6329 	int ret;
6330 
6331 	ntfs_log_enter("Entering\n");
6332 	ret = ntfs_non_resident_attr_expand_i(na, newsize, holes);
6333 	ntfs_log_leave("\n");
6334 	return ret;
6335 }
6336 
6337 /**
6338  * ntfs_attr_truncate - resize an ntfs attribute
6339  * @na:		open ntfs attribute to resize
6340  * @newsize:	new size (in bytes) to which to resize the attribute
6341  * @holes:	how to create a hole if expanding
6342  *
6343  * Change the size of an open ntfs attribute @na to @newsize bytes. If the
6344  * attribute is made bigger and the attribute is resident the newly
6345  * "allocated" space is cleared and if the attribute is non-resident the
6346  * newly allocated space is marked as not initialised and no real allocation
6347  * on disk is performed.
6348  *
6349  * On success return 0.
6350  * On error return values are:
6351  * 	STATUS_RESIDENT_ATTRIBUTE_FILLED_MFT
6352  * 	STATUS_ERROR - otherwise
6353  * The following error codes are defined:
6354  *	EINVAL	   - Invalid arguments were passed to the function.
6355  *	EOPNOTSUPP - The desired resize is not implemented yet.
6356  * 	EACCES     - Encrypted attribute.
6357  */
6358 static int ntfs_attr_truncate_i(ntfs_attr *na, const s64 newsize,
6359 					hole_type holes)
6360 {
6361 	int ret = STATUS_ERROR;
6362 	s64 fullsize;
6363 	BOOL compressed;
6364 
6365 	if (!na || newsize < 0 ||
6366 			(na->ni->mft_no == FILE_MFT && na->type == AT_DATA)) {
6367 		ntfs_log_trace("Invalid arguments passed.\n");
6368 		errno = EINVAL;
6369 		return STATUS_ERROR;
6370 	}
6371 
6372 	ntfs_log_enter("Entering for inode %lld, attr 0x%x, size %lld\n",
6373 		       (unsigned long long)na->ni->mft_no, na->type,
6374 		       (long long)newsize);
6375 
6376 	if (na->data_size == newsize) {
6377 		ntfs_log_trace("Size is already ok\n");
6378 		ret = STATUS_OK;
6379 		goto out;
6380 	}
6381 	/*
6382 	 * Encrypted attributes are not supported. We return access denied,
6383 	 * which is what Windows NT4 does, too.
6384 	 */
6385 	if (na->data_flags & ATTR_IS_ENCRYPTED) {
6386 		errno = EACCES;
6387 		ntfs_log_trace("Cannot truncate encrypted attribute\n");
6388 		goto out;
6389 	}
6390 	/*
6391 	 * TODO: Implement making handling of compressed attributes.
6392 	 * Currently we can only expand the attribute or delete it,
6393 	 * and only for ATTR_IS_COMPRESSED. This is however possible
6394 	 * for resident attributes when there is no open fuse context
6395 	 * (important case : $INDEX_ROOT:$I30)
6396 	 */
6397 	compressed = (na->data_flags & ATTR_COMPRESSION_MASK)
6398 			 != const_cpu_to_le16(0);
6399 	if (compressed
6400 	   && NAttrNonResident(na)
6401 	   && ((na->data_flags & ATTR_COMPRESSION_MASK) != ATTR_IS_COMPRESSED)) {
6402 		errno = EOPNOTSUPP;
6403 		ntfs_log_perror("Failed to truncate compressed attribute");
6404 		goto out;
6405 	}
6406 	if (NAttrNonResident(na)) {
6407 		/*
6408 		 * For compressed data, the last block must be fully
6409 		 * allocated, and we do not know the size of compression
6410 		 * block until the attribute has been made non-resident.
6411 		 * Moreover we can only process a single compression
6412 		 * block at a time (from where we are about to write),
6413 		 * so we silently do not allocate more.
6414 		 *
6415 		 * Note : do not request upsizing of compressed files
6416 		 * unless being able to face the consequences !
6417 		 */
6418 		if (compressed && newsize && (newsize > na->data_size))
6419 			fullsize = (na->initialized_size
6420 				 | (na->compression_block_size - 1)) + 1;
6421 		else
6422 			fullsize = newsize;
6423 		if (fullsize > na->data_size)
6424 			ret = ntfs_non_resident_attr_expand(na, fullsize,
6425 								holes);
6426 		else
6427 			ret = ntfs_non_resident_attr_shrink(na, fullsize);
6428 	} else
6429 		ret = ntfs_resident_attr_resize(na, newsize);
6430 out:
6431 	ntfs_log_leave("Return status %d\n", ret);
6432 	return ret;
6433 }
6434 
6435 /*
6436  *		Resize an attribute, creating a hole if relevant
6437  */
6438 
6439 int ntfs_attr_truncate(ntfs_attr *na, const s64 newsize)
6440 {
6441 	int r;
6442 
6443 	r = ntfs_attr_truncate_i(na, newsize, HOLES_OK);
6444 	NAttrClearDataAppending(na);
6445 	NAttrClearBeingNonResident(na);
6446 	return (r);
6447 }
6448 
6449 /*
6450  *		Resize an attribute, avoiding hole creation
6451  */
6452 
6453 int ntfs_attr_truncate_solid(ntfs_attr *na, const s64 newsize)
6454 {
6455 	return (ntfs_attr_truncate_i(na, newsize, HOLES_NO));
6456 }
6457 
6458 /*
6459  *		Stuff a hole in a compressed file
6460  *
6461  *	An unallocated hole must be aligned on compression block size.
6462  *	If needed current block and target block are stuffed with zeroes.
6463  *
6464  *	Returns 0 if succeeded,
6465  *		-1 if it failed (as explained in errno)
6466  */
6467 
6468 static int stuff_hole(ntfs_attr *na, const s64 pos)
6469 {
6470 	s64 size;
6471 	s64 begin_size;
6472 	s64 end_size;
6473 	char *buf;
6474 	int ret;
6475 
6476 	ret = 0;
6477 		/*
6478 		 * If the attribute is resident, the compression block size
6479 		 * is not defined yet and we can make no decision.
6480 		 * So we first try resizing to the target and if the
6481 		 * attribute is still resident, we're done
6482 		 */
6483 	if (!NAttrNonResident(na)) {
6484 		ret = ntfs_resident_attr_resize(na, pos);
6485 		if (!ret && !NAttrNonResident(na))
6486 			na->initialized_size = na->data_size = pos;
6487 	}
6488 	if (!ret && NAttrNonResident(na)) {
6489 			/* does the hole span over several compression block ? */
6490 		if ((pos ^ na->initialized_size)
6491 				& ~(na->compression_block_size - 1)) {
6492 			begin_size = ((na->initialized_size - 1)
6493 					| (na->compression_block_size - 1))
6494 					+ 1 - na->initialized_size;
6495 			end_size = pos & (na->compression_block_size - 1);
6496 			size = (begin_size > end_size ? begin_size : end_size);
6497 		} else {
6498 			/* short stuffing in a single compression block */
6499 			begin_size = size = pos - na->initialized_size;
6500 			end_size = 0;
6501 		}
6502 		if (size)
6503 			buf = (char*)ntfs_malloc(size);
6504 		else
6505 			buf = (char*)NULL;
6506 		if (buf || !size) {
6507 			memset(buf,0,size);
6508 				/* stuff into current block */
6509 			if (begin_size
6510 			    && (ntfs_attr_pwrite(na,
6511 				na->initialized_size, begin_size, buf)
6512 				   != begin_size))
6513 				ret = -1;
6514 				/* create an unstuffed hole */
6515 			if (!ret
6516 			    && ((na->initialized_size + end_size) < pos)
6517 			    && ntfs_non_resident_attr_expand(na,
6518 					pos - end_size, HOLES_OK))
6519 				ret = -1;
6520 			else
6521 				na->initialized_size
6522 				    = na->data_size = pos - end_size;
6523 				/* stuff into the target block */
6524 			if (!ret && end_size
6525 			    && (ntfs_attr_pwrite(na,
6526 				na->initialized_size, end_size, buf)
6527 				    != end_size))
6528 				ret = -1;
6529 			if (buf)
6530 				free(buf);
6531 		} else
6532 			ret = -1;
6533 	}
6534 		/* make absolutely sure we have reached the target */
6535 	if (!ret && (na->initialized_size != pos)) {
6536 		ntfs_log_error("Failed to stuff a compressed file"
6537 			"target %lld reached %lld\n",
6538 			(long long)pos, (long long)na->initialized_size);
6539 		errno = EIO;
6540 		ret = -1;
6541 	}
6542 	return (ret);
6543 }
6544 
6545 /**
6546  * ntfs_attr_readall - read the entire data from an ntfs attribute
6547  * @ni:		open ntfs inode in which the ntfs attribute resides
6548  * @type:	attribute type
6549  * @name:	attribute name in little endian Unicode or AT_UNNAMED or NULL
6550  * @name_len:	length of attribute @name in Unicode characters (if @name given)
6551  * @data_size:	if non-NULL then store here the data size
6552  *
6553  * This function will read the entire content of an ntfs attribute.
6554  * If @name is AT_UNNAMED then look specifically for an unnamed attribute.
6555  * If @name is NULL then the attribute could be either named or not.
6556  * In both those cases @name_len is not used at all.
6557  *
6558  * On success a buffer is allocated with the content of the attribute
6559  * and which needs to be freed when it's not needed anymore. If the
6560  * @data_size parameter is non-NULL then the data size is set there.
6561  *
6562  * On error NULL is returned with errno set to the error code.
6563  */
6564 void *ntfs_attr_readall(ntfs_inode *ni, const ATTR_TYPES type,
6565 			ntfschar *name, u32 name_len, s64 *data_size)
6566 {
6567 	ntfs_attr *na;
6568 	void *data, *ret = NULL;
6569 	s64 size;
6570 
6571 	ntfs_log_enter("Entering\n");
6572 
6573 	na = ntfs_attr_open(ni, type, name, name_len);
6574 	if (!na) {
6575 		ntfs_log_perror("ntfs_attr_open failed");
6576 		goto err_exit;
6577 	}
6578 	data = ntfs_malloc(na->data_size);
6579 	if (!data)
6580 		goto out;
6581 
6582 	size = ntfs_attr_pread(na, 0, na->data_size, data);
6583 	if (size != na->data_size) {
6584 		ntfs_log_perror("ntfs_attr_pread failed");
6585 		free(data);
6586 		goto out;
6587 	}
6588 	ret = data;
6589 	if (data_size)
6590 		*data_size = size;
6591 out:
6592 	ntfs_attr_close(na);
6593 err_exit:
6594 	ntfs_log_leave("\n");
6595 	return ret;
6596 }
6597 
6598 /*
6599  *		Read some data from a data attribute
6600  *
6601  *	Returns the amount of data read, negative if there was an error
6602  */
6603 
6604 int ntfs_attr_data_read(ntfs_inode *ni,
6605 		ntfschar *stream_name, int stream_name_len,
6606 		char *buf, size_t size, off_t offset)
6607 {
6608 	ntfs_attr *na = NULL;
6609 	int res, total = 0;
6610 
6611 	na = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_len);
6612 	if (!na) {
6613 		res = -errno;
6614 		goto exit;
6615 	}
6616 	if ((size_t)offset < (size_t)na->data_size) {
6617 		if (offset + size > (size_t)na->data_size)
6618 			size = na->data_size - offset;
6619 		while (size) {
6620 			res = ntfs_attr_pread(na, offset, size, buf + total);
6621 			if ((off_t)res < (off_t)size)
6622 				ntfs_log_perror("ntfs_attr_pread partial read "
6623 					"(%lld : %lld <> %d)",
6624 					(long long)offset,
6625 					(long long)size, res);
6626 			if (res <= 0) {
6627 				res = -errno;
6628 				goto exit;
6629 			}
6630 			size -= res;
6631 			offset += res;
6632 			total += res;
6633 		}
6634 	}
6635 	res = total;
6636 exit:
6637 	if (na)
6638 		ntfs_attr_close(na);
6639 	return res;
6640 }
6641 
6642 
6643 /*
6644  *		Write some data into a data attribute
6645  *
6646  *	Returns the amount of data written, negative if there was an error
6647  */
6648 
6649 int ntfs_attr_data_write(ntfs_inode *ni,
6650 		ntfschar *stream_name, int stream_name_len,
6651 		char *buf, size_t size, off_t offset)
6652 {
6653 	ntfs_attr *na = NULL;
6654 	int res, total = 0;
6655 
6656 	na = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_len);
6657 	if (!na) {
6658 		res = -errno;
6659 		goto exit;
6660 	}
6661 	while (size) {
6662 		res = ntfs_attr_pwrite(na, offset, size, buf + total);
6663 		if (res < (s64)size)
6664 			ntfs_log_perror("ntfs_attr_pwrite partial write (%lld: "
6665 				"%lld <> %d)", (long long)offset,
6666 				(long long)size, res);
6667 		if (res <= 0) {
6668 			res = -errno;
6669 			goto exit;
6670 		}
6671 		size -= res;
6672 		offset += res;
6673 		total += res;
6674 	}
6675 	res = total;
6676 exit:
6677 	if (na)
6678 		ntfs_attr_close(na);
6679 	return res;
6680 }
6681 
6682 
6683 int ntfs_attr_exist(ntfs_inode *ni, const ATTR_TYPES type, ntfschar *name,
6684 		    u32 name_len)
6685 {
6686 	ntfs_attr_search_ctx *ctx;
6687 	int ret;
6688 
6689 	ntfs_log_trace("Entering\n");
6690 
6691 	ctx = ntfs_attr_get_search_ctx(ni, NULL);
6692 	if (!ctx)
6693 		return 0;
6694 
6695 	ret = ntfs_attr_lookup(type, name, name_len, CASE_SENSITIVE, 0, NULL, 0,
6696 			       ctx);
6697 
6698 	ntfs_attr_put_search_ctx(ctx);
6699 
6700 	return !ret;
6701 }
6702 
6703 int ntfs_attr_remove(ntfs_inode *ni, const ATTR_TYPES type, ntfschar *name,
6704 		     u32 name_len)
6705 {
6706 	ntfs_attr *na;
6707 	int ret;
6708 
6709 	ntfs_log_trace("Entering\n");
6710 
6711 	if (!ni) {
6712 		ntfs_log_error("%s: NULL inode pointer", __FUNCTION__);
6713 		errno = EINVAL;
6714 		return -1;
6715 	}
6716 
6717 	na = ntfs_attr_open(ni, type, name, name_len);
6718 	if (!na) {
6719 			/* do not log removal of non-existent stream */
6720 		if (type != AT_DATA) {
6721 			ntfs_log_perror("Failed to open attribute 0x%02x of inode "
6722 				"0x%llx", type, (unsigned long long)ni->mft_no);
6723 		}
6724 		return -1;
6725 	}
6726 
6727 	ret = ntfs_attr_rm(na);
6728 	if (ret)
6729 		ntfs_log_perror("Failed to remove attribute 0x%02x of inode "
6730 				"0x%llx", type, (unsigned long long)ni->mft_no);
6731 	ntfs_attr_close(na);
6732 
6733 	return ret;
6734 }
6735 
6736 /* Below macros are 32-bit ready. */
6737 #define BCX(x) ((x) - (((x) >> 1) & 0x77777777) - \
6738 		      (((x) >> 2) & 0x33333333) - \
6739 		      (((x) >> 3) & 0x11111111))
6740 #define BITCOUNT(x) (((BCX(x) + (BCX(x) >> 4)) & 0x0F0F0F0F) % 255)
6741 
6742 static u8 *ntfs_init_lut256(void)
6743 {
6744 	int i;
6745 	u8 *lut;
6746 
6747 	lut = ntfs_malloc(256);
6748 	if (lut)
6749 		for(i = 0; i < 256; i++)
6750 			*(lut + i) = 8 - BITCOUNT(i);
6751 	return lut;
6752 }
6753 
6754 s64 ntfs_attr_get_free_bits(ntfs_attr *na)
6755 {
6756 	u8 *buf, *lut;
6757 	s64 br      = 0;
6758 	s64 total   = 0;
6759 	s64 nr_free = 0;
6760 
6761 	lut = ntfs_init_lut256();
6762 	if (!lut)
6763 		return -1;
6764 
6765 	buf = ntfs_malloc(65536);
6766 	if (!buf)
6767 		goto out;
6768 
6769 	while (1) {
6770 		u32 *p;
6771 		br = ntfs_attr_pread(na, total, 65536, buf);
6772 		if (br <= 0)
6773 			break;
6774 		total += br;
6775 		p = (u32 *)buf + br / 4 - 1;
6776 		for (; (u8 *)p >= buf; p--) {
6777 			nr_free += lut[ *p        & 255] +
6778 			           lut[(*p >>  8) & 255] +
6779 			           lut[(*p >> 16) & 255] +
6780 			           lut[(*p >> 24)      ];
6781 		}
6782 		switch (br % 4) {
6783 			case 3:  nr_free += lut[*(buf + br - 3)];
6784 			case 2:  nr_free += lut[*(buf + br - 2)];
6785 			case 1:  nr_free += lut[*(buf + br - 1)];
6786 		}
6787 	}
6788 	free(buf);
6789 out:
6790 	free(lut);
6791 	if (!total || br < 0)
6792 		return -1;
6793 	return nr_free;
6794 }
6795