xref: /haiku/src/add-ons/kernel/file_systems/ntfs/libntfs/volume.c (revision 0f9ffb37c166a9d9257044c8937f6450f4257b75)
1 /**
2  * volume.c - NTFS volume handling code. Originated from the Linux-NTFS project.
3  *
4  * Copyright (c) 2000-2006 Anton Altaparmakov
5  * Copyright (c) 2002-2009 Szabolcs Szakacsits
6  * Copyright (c) 2004-2005 Richard Russon
7  * Copyright (c) 2010      Jean-Pierre Andre
8  *
9  * This program/include file is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as published
11  * by the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program/include file is distributed in the hope that it will be
15  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program (in the main directory of the NTFS-3G
21  * distribution in the file COPYING); if not, write to the Free Software
22  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  */
24 
25 #ifdef HAVE_CONFIG_H
26 #include "config.h"
27 #endif
28 
29 #ifdef HAVE_STDLIB_H
30 #include <stdlib.h>
31 #endif
32 #ifdef HAVE_STDIO_H
33 #include <stdio.h>
34 #endif
35 #ifdef HAVE_STRING_H
36 #include <string.h>
37 #endif
38 #ifdef HAVE_FCNTL_H
39 #include <fcntl.h>
40 #endif
41 #ifdef HAVE_UNISTD_H
42 #include <unistd.h>
43 #endif
44 #ifdef HAVE_ERRNO_H
45 #include <errno.h>
46 #endif
47 #ifdef HAVE_SYS_STAT_H
48 #include <sys/stat.h>
49 #endif
50 #ifdef HAVE_LIMITS_H
51 #include <limits.h>
52 #endif
53 #ifdef HAVE_LOCALE_H
54 #include <locale.h>
55 #endif
56 
57 #if defined(__sun) && defined (__SVR4)
58 #include <sys/mnttab.h>
59 #endif
60 
61 #include "param.h"
62 #include "compat.h"
63 #include "volume.h"
64 #include "attrib.h"
65 #include "mft.h"
66 #include "bootsect.h"
67 #include "device.h"
68 #include "debug.h"
69 #include "inode.h"
70 #include "runlist.h"
71 #include "logfile.h"
72 #include "dir.h"
73 #include "logging.h"
74 #include "cache.h"
75 #include "realpath.h"
76 #include "misc.h"
77 #include "security.h"
78 
79 const char *ntfs_home =
80 "News, support and information:  http://tuxera.com\n";
81 
82 static const char *invalid_ntfs_msg =
83 "The device '%s' doesn't seem to have a valid NTFS.\n"
84 "Maybe the wrong device is used? Or the whole disk instead of a\n"
85 "partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?\n";
86 
87 static const char *corrupt_volume_msg =
88 "NTFS is either inconsistent, or there is a hardware fault, or it's a\n"
89 "SoftRAID/FakeRAID hardware. In the first case run chkdsk /f on Windows\n"
90 "then reboot into Windows twice. The usage of the /f parameter is very\n"
91 "important! If the device is a SoftRAID/FakeRAID then first activate\n"
92 "it and mount a different device under the /dev/mapper/ directory, (e.g.\n"
93 "/dev/mapper/nvidia_eahaabcc1). Please see the 'dmraid' documentation\n"
94 "for more details.\n";
95 
96 static const char *hibernated_volume_msg =
97 "The NTFS partition is in an unsafe state. Please resume and shutdown\n"
98 "Windows fully (no hibernation or fast restarting), or mount the volume\n"
99 "read-only with the 'ro' mount option.\n";
100 
101 static const char *fallback_readonly_msg =
102 "Falling back to read-only mount because the NTFS partition is in an\n"
103 "unsafe state. Please resume and shutdown Windows fully (no hibernation\n"
104 "or fast restarting.)\n";
105 
106 static const char *unclean_journal_msg =
107 "Write access is denied because the disk wasn't safely powered\n"
108 "off and the 'norecover' mount option was specified.\n";
109 
110 static const char *opened_volume_msg =
111 "Mount is denied because the NTFS volume is already exclusively opened.\n"
112 "The volume may be already mounted, or another software may use it which\n"
113 "could be identified for example by the help of the 'fuser' command.\n";
114 
115 static const char *fakeraid_msg =
116 "Either the device is missing or it's powered down, or you have\n"
117 "SoftRAID hardware and must use an activated, different device under\n"
118 "/dev/mapper/, (e.g. /dev/mapper/nvidia_eahaabcc1) to mount NTFS.\n"
119 "Please see the 'dmraid' documentation for help.\n";
120 
121 static const char *access_denied_msg =
122 "Please check '%s' and the ntfs-3g binary permissions,\n"
123 "and the mounting user ID. More explanation is provided at\n"
124 "http://tuxera.com/community/ntfs-3g-faq/#unprivileged\n";
125 
126 /**
127  * ntfs_volume_alloc - Create an NTFS volume object and initialise it
128  *
129  * Description...
130  *
131  * Returns:
132  */
133 ntfs_volume *ntfs_volume_alloc(void)
134 {
135 	return ntfs_calloc(sizeof(ntfs_volume));
136 }
137 
138 static void ntfs_attr_free(ntfs_attr **na)
139 {
140 	if (na && *na) {
141 		ntfs_attr_close(*na);
142 		*na = NULL;
143 	}
144 }
145 
146 static int ntfs_inode_free(ntfs_inode **ni)
147 {
148 	int ret = -1;
149 
150 	if (ni && *ni) {
151 		ret = ntfs_inode_close(*ni);
152 		*ni = NULL;
153 	}
154 
155 	return ret;
156 }
157 
158 static void ntfs_error_set(int *err)
159 {
160 	if (!*err)
161 		*err = errno;
162 }
163 
164 /**
165  * __ntfs_volume_release - Destroy an NTFS volume object
166  * @v:
167  *
168  * Description...
169  *
170  * Returns:
171  */
172 static int __ntfs_volume_release(ntfs_volume *v)
173 {
174 	int err = 0;
175 
176 	if (ntfs_close_secure(v))
177 		ntfs_error_set(&err);
178 
179 	if (ntfs_inode_free(&v->vol_ni))
180 		ntfs_error_set(&err);
181 	/*
182 	 * FIXME: Inodes must be synced before closing
183 	 * attributes, otherwise unmount could fail.
184 	 */
185 	if (v->lcnbmp_ni && NInoDirty(v->lcnbmp_ni))
186 		ntfs_inode_sync(v->lcnbmp_ni);
187 	ntfs_attr_free(&v->lcnbmp_na);
188 	if (ntfs_inode_free(&v->lcnbmp_ni))
189 		ntfs_error_set(&err);
190 
191 	if (v->mft_ni && NInoDirty(v->mft_ni))
192 		ntfs_inode_sync(v->mft_ni);
193 	ntfs_attr_free(&v->mftbmp_na);
194 	ntfs_attr_free(&v->mft_na);
195 	if (ntfs_inode_free(&v->mft_ni))
196 		ntfs_error_set(&err);
197 
198 	if (v->mftmirr_ni && NInoDirty(v->mftmirr_ni))
199 		ntfs_inode_sync(v->mftmirr_ni);
200 	ntfs_attr_free(&v->mftmirr_na);
201 	if (ntfs_inode_free(&v->mftmirr_ni))
202 		ntfs_error_set(&err);
203 
204 	if (v->dev) {
205 		struct ntfs_device *dev = v->dev;
206 
207 		if (dev->d_ops->sync(dev))
208 			ntfs_error_set(&err);
209 		if (dev->d_ops->close(dev))
210 			ntfs_error_set(&err);
211 	}
212 
213 	ntfs_free_lru_caches(v);
214 	free(v->vol_name);
215 	free(v->upcase);
216 	if (v->locase) free(v->locase);
217 	free(v->attrdef);
218 	free(v);
219 
220 	errno = err;
221 	return errno ? -1 : 0;
222 }
223 
224 static void ntfs_attr_setup_flag(ntfs_inode *ni)
225 {
226 	STANDARD_INFORMATION *si;
227 
228 	si = ntfs_attr_readall(ni, AT_STANDARD_INFORMATION, AT_UNNAMED, 0, NULL);
229 	if (si) {
230 		ni->flags = si->file_attributes;
231 		free(si);
232 	}
233 }
234 
235 /**
236  * ntfs_mft_load - load the $MFT and setup the ntfs volume with it
237  * @vol:	ntfs volume whose $MFT to load
238  *
239  * Load $MFT from @vol and setup @vol with it. After calling this function the
240  * volume @vol is ready for use by all read access functions provided by the
241  * ntfs library.
242  *
243  * Return 0 on success and -1 on error with errno set to the error code.
244  */
245 static int ntfs_mft_load(ntfs_volume *vol)
246 {
247 	VCN next_vcn, last_vcn, highest_vcn;
248 	s64 l;
249 	MFT_RECORD *mb = NULL;
250 	ntfs_attr_search_ctx *ctx = NULL;
251 	ATTR_RECORD *a;
252 	int eo;
253 
254 	/* Manually setup an ntfs_inode. */
255 	vol->mft_ni = ntfs_inode_allocate(vol);
256 	mb = ntfs_malloc(vol->mft_record_size);
257 	if (!vol->mft_ni || !mb) {
258 		ntfs_log_perror("Error allocating memory for $MFT");
259 		goto error_exit;
260 	}
261 	vol->mft_ni->mft_no = 0;
262 	vol->mft_ni->mrec = mb;
263 	/* Can't use any of the higher level functions yet! */
264 	l = ntfs_mst_pread(vol->dev, vol->mft_lcn << vol->cluster_size_bits, 1,
265 			vol->mft_record_size, mb);
266 	if (l != 1) {
267 		if (l != -1)
268 			errno = EIO;
269 		ntfs_log_perror("Error reading $MFT");
270 		goto error_exit;
271 	}
272 
273 	if (ntfs_mft_record_check(vol, 0, mb))
274 		goto error_exit;
275 
276 	ctx = ntfs_attr_get_search_ctx(vol->mft_ni, NULL);
277 	if (!ctx)
278 		goto error_exit;
279 
280 	/* Find the $ATTRIBUTE_LIST attribute in $MFT if present. */
281 	if (ntfs_attr_lookup(AT_ATTRIBUTE_LIST, AT_UNNAMED, 0, 0, 0, NULL, 0,
282 			ctx)) {
283 		if (errno != ENOENT) {
284 			ntfs_log_error("$MFT has corrupt attribute list.\n");
285 			goto io_error_exit;
286 		}
287 		goto mft_has_no_attr_list;
288 	}
289 	NInoSetAttrList(vol->mft_ni);
290 	l = ntfs_get_attribute_value_length(ctx->attr);
291 	if (l <= 0 || l > 0x40000) {
292 		ntfs_log_error("$MFT/$ATTR_LIST invalid length (%lld).\n",
293 			       (long long)l);
294 		goto io_error_exit;
295 	}
296 	vol->mft_ni->attr_list_size = l;
297 	vol->mft_ni->attr_list = ntfs_malloc(l);
298 	if (!vol->mft_ni->attr_list)
299 		goto error_exit;
300 
301 	l = ntfs_get_attribute_value(vol, ctx->attr, vol->mft_ni->attr_list);
302 	if (!l) {
303 		ntfs_log_error("Failed to get value of $MFT/$ATTR_LIST.\n");
304 		goto io_error_exit;
305 	}
306 	if (l != vol->mft_ni->attr_list_size) {
307 		ntfs_log_error("Partial read of $MFT/$ATTR_LIST (%lld != "
308 			       "%u).\n", (long long)l,
309 			       vol->mft_ni->attr_list_size);
310 		goto io_error_exit;
311 	}
312 
313 mft_has_no_attr_list:
314 
315 	ntfs_attr_setup_flag(vol->mft_ni);
316 
317 	/* We now have a fully setup ntfs inode for $MFT in vol->mft_ni. */
318 
319 	/* Get an ntfs attribute for $MFT/$DATA and set it up, too. */
320 	vol->mft_na = ntfs_attr_open(vol->mft_ni, AT_DATA, AT_UNNAMED, 0);
321 	if (!vol->mft_na) {
322 		ntfs_log_perror("Failed to open ntfs attribute");
323 		goto error_exit;
324 	}
325 	/* Read all extents from the $DATA attribute in $MFT. */
326 	ntfs_attr_reinit_search_ctx(ctx);
327 	last_vcn = vol->mft_na->allocated_size >> vol->cluster_size_bits;
328 	highest_vcn = next_vcn = 0;
329 	a = NULL;
330 	while (!ntfs_attr_lookup(AT_DATA, AT_UNNAMED, 0, 0, next_vcn, NULL, 0,
331 			ctx)) {
332 		runlist_element *nrl;
333 
334 		a = ctx->attr;
335 		/* $MFT must be non-resident. */
336 		if (!a->non_resident) {
337 			ntfs_log_error("$MFT must be non-resident.\n");
338 			goto io_error_exit;
339 		}
340 		/* $MFT must be uncompressed and unencrypted. */
341 		if (a->flags & ATTR_COMPRESSION_MASK ||
342 				a->flags & ATTR_IS_ENCRYPTED) {
343 			ntfs_log_error("$MFT must be uncompressed and "
344 				       "unencrypted.\n");
345 			goto io_error_exit;
346 		}
347 		/*
348 		 * Decompress the mapping pairs array of this extent and merge
349 		 * the result into the existing runlist. No need for locking
350 		 * as we have exclusive access to the inode at this time and we
351 		 * are a mount in progress task, too.
352 		 */
353 		nrl = ntfs_mapping_pairs_decompress(vol, a, vol->mft_na->rl);
354 		if (!nrl) {
355 			ntfs_log_perror("ntfs_mapping_pairs_decompress() failed");
356 			goto error_exit;
357 		}
358 		vol->mft_na->rl = nrl;
359 
360 		/* Get the lowest vcn for the next extent. */
361 		highest_vcn = sle64_to_cpu(a->highest_vcn);
362 		next_vcn = highest_vcn + 1;
363 
364 		/* Only one extent or error, which we catch below. */
365 		if (next_vcn <= 0)
366 			break;
367 
368 		/* Avoid endless loops due to corruption. */
369 		if (next_vcn < sle64_to_cpu(a->lowest_vcn)) {
370 			ntfs_log_error("$MFT has corrupt attribute list.\n");
371 			goto io_error_exit;
372 		}
373 	}
374 	if (!a) {
375 		ntfs_log_error("$MFT/$DATA attribute not found.\n");
376 		goto io_error_exit;
377 	}
378 	if (highest_vcn && highest_vcn != last_vcn - 1) {
379 		ntfs_log_error("Failed to load runlist for $MFT/$DATA.\n");
380 		ntfs_log_error("highest_vcn = 0x%llx, last_vcn - 1 = 0x%llx\n",
381 			       (long long)highest_vcn, (long long)last_vcn - 1);
382 		goto io_error_exit;
383 	}
384 	/* Done with the $Mft mft record. */
385 	ntfs_attr_put_search_ctx(ctx);
386 	ctx = NULL;
387 
388 	/* Update the size fields in the inode. */
389 	vol->mft_ni->data_size = vol->mft_na->data_size;
390 	vol->mft_ni->allocated_size = vol->mft_na->allocated_size;
391 	set_nino_flag(vol->mft_ni, KnownSize);
392 
393 	/*
394 	 * The volume is now setup so we can use all read access functions.
395 	 */
396 	vol->mftbmp_na = ntfs_attr_open(vol->mft_ni, AT_BITMAP, AT_UNNAMED, 0);
397 	if (!vol->mftbmp_na) {
398 		ntfs_log_perror("Failed to open $MFT/$BITMAP");
399 		goto error_exit;
400 	}
401 	return 0;
402 io_error_exit:
403 	errno = EIO;
404 error_exit:
405 	eo = errno;
406 	if (ctx)
407 		ntfs_attr_put_search_ctx(ctx);
408 	if (vol->mft_na) {
409 		ntfs_attr_close(vol->mft_na);
410 		vol->mft_na = NULL;
411 	}
412 	if (vol->mft_ni) {
413 		ntfs_inode_close(vol->mft_ni);
414 		vol->mft_ni = NULL;
415 	}
416 	errno = eo;
417 	return -1;
418 }
419 
420 /**
421  * ntfs_mftmirr_load - load the $MFTMirr and setup the ntfs volume with it
422  * @vol:	ntfs volume whose $MFTMirr to load
423  *
424  * Load $MFTMirr from @vol and setup @vol with it. After calling this function
425  * the volume @vol is ready for use by all write access functions provided by
426  * the ntfs library (assuming ntfs_mft_load() has been called successfully
427  * beforehand).
428  *
429  * Return 0 on success and -1 on error with errno set to the error code.
430  */
431 static int ntfs_mftmirr_load(ntfs_volume *vol)
432 {
433 	int err;
434 
435 	vol->mftmirr_ni = ntfs_inode_open(vol, FILE_MFTMirr);
436 	if (!vol->mftmirr_ni) {
437 		ntfs_log_perror("Failed to open inode $MFTMirr");
438 		return -1;
439 	}
440 
441 	vol->mftmirr_na = ntfs_attr_open(vol->mftmirr_ni, AT_DATA, AT_UNNAMED, 0);
442 	if (!vol->mftmirr_na) {
443 		ntfs_log_perror("Failed to open $MFTMirr/$DATA");
444 		goto error_exit;
445 	}
446 
447 	if (ntfs_attr_map_runlist(vol->mftmirr_na, 0) < 0) {
448 		ntfs_log_perror("Failed to map runlist of $MFTMirr/$DATA");
449 		goto error_exit;
450 	}
451 
452 	return 0;
453 
454 error_exit:
455 	err = errno;
456 	if (vol->mftmirr_na) {
457 		ntfs_attr_close(vol->mftmirr_na);
458 		vol->mftmirr_na = NULL;
459 	}
460 	ntfs_inode_close(vol->mftmirr_ni);
461 	vol->mftmirr_ni = NULL;
462 	errno = err;
463 	return -1;
464 }
465 
466 /**
467  * ntfs_volume_startup - allocate and setup an ntfs volume
468  * @dev:	device to open
469  * @flags:	optional mount flags
470  *
471  * Load, verify, and parse bootsector; load and setup $MFT and $MFTMirr. After
472  * calling this function, the volume is setup sufficiently to call all read
473  * and write access functions provided by the library.
474  *
475  * Return the allocated volume structure on success and NULL on error with
476  * errno set to the error code.
477  */
478 ntfs_volume *ntfs_volume_startup(struct ntfs_device *dev,
479 		ntfs_mount_flags flags)
480 {
481 	LCN mft_zone_size, mft_lcn;
482 	s64 br;
483 	ntfs_volume *vol;
484 	NTFS_BOOT_SECTOR *bs;
485 	int eo;
486 
487 	if (!dev || !dev->d_ops || !dev->d_name) {
488 		errno = EINVAL;
489 		ntfs_log_perror("%s: dev = %p", __FUNCTION__, dev);
490 		return NULL;
491 	}
492 
493 	bs = ntfs_malloc(sizeof(NTFS_BOOT_SECTOR));
494 	if (!bs)
495 		return NULL;
496 
497 	/* Allocate the volume structure. */
498 	vol = ntfs_volume_alloc();
499 	if (!vol)
500 		goto error_exit;
501 
502 	/* Create the default upcase table. */
503 	vol->upcase_len = ntfs_upcase_build_default(&vol->upcase);
504 	if (!vol->upcase_len || !vol->upcase)
505 		goto error_exit;
506 
507 	/* Default with no locase table and case sensitive file names */
508 	vol->locase = (ntfschar*)NULL;
509 	NVolSetCaseSensitive(vol);
510 
511 		/* by default, all files are shown and not marked hidden */
512 	NVolSetShowSysFiles(vol);
513 	NVolSetShowHidFiles(vol);
514 	NVolClearHideDotFiles(vol);
515 		/* set default compression */
516 #if DEFAULT_COMPRESSION
517 	NVolSetCompression(vol);
518 #else
519 	NVolClearCompression(vol);
520 #endif
521 	if (flags & NTFS_MNT_RDONLY)
522 		NVolSetReadOnly(vol);
523 
524 	/* ...->open needs bracketing to compile with glibc 2.7 */
525 	if ((dev->d_ops->open)(dev, NVolReadOnly(vol) ? O_RDONLY: O_RDWR)) {
526 		if (!NVolReadOnly(vol) && (errno == EROFS)) {
527 			if ((dev->d_ops->open)(dev, O_RDONLY)) {
528 				ntfs_log_perror("Error opening read-only '%s'",
529 						dev->d_name);
530 				goto error_exit;
531 			} else {
532 				ntfs_log_info("Can only open '%s' as read-only\n",
533 						dev->d_name);
534 				NVolSetReadOnly(vol);
535 			}
536 		} else {
537 			ntfs_log_perror("Error opening '%s'", dev->d_name);
538 			goto error_exit;
539 		}
540 	}
541 	/* Attach the device to the volume. */
542 	vol->dev = dev;
543 
544 	/* Now read the bootsector. */
545 	br = ntfs_pread(dev, 0, sizeof(NTFS_BOOT_SECTOR), bs);
546 	if (br != sizeof(NTFS_BOOT_SECTOR)) {
547 		if (br != -1)
548 			errno = EINVAL;
549 		if (!br)
550 			ntfs_log_error("Failed to read bootsector (size=0)\n");
551 		else
552 			ntfs_log_perror("Error reading bootsector");
553 		goto error_exit;
554 	}
555 	if (!ntfs_boot_sector_is_ntfs(bs)) {
556 		errno = EINVAL;
557 		goto error_exit;
558 	}
559 	if (ntfs_boot_sector_parse(vol, bs) < 0)
560 		goto error_exit;
561 
562 	free(bs);
563 	bs = NULL;
564 	/* Now set the device block size to the sector size. */
565 	if (ntfs_device_block_size_set(vol->dev, vol->sector_size))
566 		ntfs_log_debug("Failed to set the device block size to the "
567 				"sector size.  This may affect performance "
568 				"but should be harmless otherwise.  Error: "
569 				"%s\n", strerror(errno));
570 
571 	/* We now initialize the cluster allocator. */
572 	vol->full_zones = 0;
573 	mft_zone_size = vol->nr_clusters >> 3;      /* 12.5% */
574 
575 	/* Setup the mft zone. */
576 	vol->mft_zone_start = vol->mft_zone_pos = vol->mft_lcn;
577 	ntfs_log_debug("mft_zone_pos = 0x%llx\n", (long long)vol->mft_zone_pos);
578 
579 	/*
580 	 * Calculate the mft_lcn for an unmodified NTFS volume (see mkntfs
581 	 * source) and if the actual mft_lcn is in the expected place or even
582 	 * further to the front of the volume, extend the mft_zone to cover the
583 	 * beginning of the volume as well. This is in order to protect the
584 	 * area reserved for the mft bitmap as well within the mft_zone itself.
585 	 * On non-standard volumes we don't protect it as the overhead would be
586 	 * higher than the speed increase we would get by doing it.
587 	 */
588 	mft_lcn = (8192 + 2 * vol->cluster_size - 1) / vol->cluster_size;
589 	if (mft_lcn * vol->cluster_size < 16 * 1024)
590 		mft_lcn = (16 * 1024 + vol->cluster_size - 1) /
591 				vol->cluster_size;
592 	if (vol->mft_zone_start <= mft_lcn)
593 		vol->mft_zone_start = 0;
594 	ntfs_log_debug("mft_zone_start = 0x%llx\n", (long long)vol->mft_zone_start);
595 
596 	/*
597 	 * Need to cap the mft zone on non-standard volumes so that it does
598 	 * not point outside the boundaries of the volume. We do this by
599 	 * halving the zone size until we are inside the volume.
600 	 */
601 	vol->mft_zone_end = vol->mft_lcn + mft_zone_size;
602 	while (vol->mft_zone_end >= vol->nr_clusters) {
603 		mft_zone_size >>= 1;
604 		vol->mft_zone_end = vol->mft_lcn + mft_zone_size;
605 	}
606 	ntfs_log_debug("mft_zone_end = 0x%llx\n", (long long)vol->mft_zone_end);
607 
608 	/*
609 	 * Set the current position within each data zone to the start of the
610 	 * respective zone.
611 	 */
612 	vol->data1_zone_pos = vol->mft_zone_end;
613 	ntfs_log_debug("data1_zone_pos = %lld\n", (long long)vol->data1_zone_pos);
614 	vol->data2_zone_pos = 0;
615 	ntfs_log_debug("data2_zone_pos = %lld\n", (long long)vol->data2_zone_pos);
616 
617 	/* Set the mft data allocation position to mft record 24. */
618 	vol->mft_data_pos = 24;
619 
620 	/*
621 	 * The cluster allocator is now fully operational.
622 	 */
623 
624 	/* Need to setup $MFT so we can use the library read functions. */
625 	if (ntfs_mft_load(vol) < 0) {
626 		ntfs_log_perror("Failed to load $MFT");
627 		goto error_exit;
628 	}
629 
630 	/* Need to setup $MFTMirr so we can use the write functions, too. */
631 	if (ntfs_mftmirr_load(vol) < 0) {
632 		ntfs_log_perror("Failed to load $MFTMirr");
633 		goto error_exit;
634 	}
635 	return vol;
636 error_exit:
637 	eo = errno;
638 	free(bs);
639 	if (vol)
640 		__ntfs_volume_release(vol);
641 	errno = eo;
642 	return NULL;
643 }
644 
645 /**
646  * ntfs_volume_check_logfile - check logfile on target volume
647  * @vol:	volume on which to check logfile
648  *
649  * Return 0 on success and -1 on error with errno set error code.
650  */
651 static int ntfs_volume_check_logfile(ntfs_volume *vol)
652 {
653 	ntfs_inode *ni;
654 	ntfs_attr *na = NULL;
655 	RESTART_PAGE_HEADER *rp = NULL;
656 	int err = 0;
657 
658 	ni = ntfs_inode_open(vol, FILE_LogFile);
659 	if (!ni) {
660 		ntfs_log_perror("Failed to open inode FILE_LogFile");
661 		errno = EIO;
662 		return -1;
663 	}
664 
665 	na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);
666 	if (!na) {
667 		ntfs_log_perror("Failed to open $FILE_LogFile/$DATA");
668 		err = EIO;
669 		goto out;
670 	}
671 
672 	if (!ntfs_check_logfile(na, &rp) || !ntfs_is_logfile_clean(na, rp))
673 		err = EOPNOTSUPP;
674 		/*
675 		 * If the latest restart page was identified as version
676 		 * 2.0, then Windows may have kept a cached copy of
677 		 * metadata for fast restarting, and we should not mount.
678 		 * Hibernation will be seen the same way on a non
679 		 * Windows-system partition, so we have to use the same
680 		 * error code (EPERM).
681 		 * The restart page may also be identified as version 2.0
682 		 * when access to the file system is terminated abruptly
683 		 * by unplugging or power cut, so mounting is also rejected
684 		 * after such an event.
685 		 */
686 	if (rp
687 	    && (rp->major_ver == const_cpu_to_le16(2))
688 	    && (rp->minor_ver == const_cpu_to_le16(0))) {
689 		ntfs_log_error("Metadata kept in Windows cache, refused to mount.\n");
690 		err = EPERM;
691 	}
692 	free(rp);
693 	ntfs_attr_close(na);
694 out:
695 	if (ntfs_inode_close(ni))
696 		ntfs_error_set(&err);
697 	if (err) {
698 		errno = err;
699 		return -1;
700 	}
701 	return 0;
702 }
703 
704 /**
705  * ntfs_hiberfile_open - Find and open '/hiberfil.sys'
706  * @vol:    An ntfs volume obtained from ntfs_mount
707  *
708  * Return:  inode  Success, hiberfil.sys is valid
709  *	    NULL   hiberfil.sys doesn't exist or some other error occurred
710  */
711 static ntfs_inode *ntfs_hiberfile_open(ntfs_volume *vol)
712 {
713 	u64 inode;
714 	ntfs_inode *ni_root;
715 	ntfs_inode *ni_hibr = NULL;
716 	ntfschar   *unicode = NULL;
717 	int unicode_len;
718 	const char *hiberfile = "hiberfil.sys";
719 
720 	if (!vol) {
721 		errno = EINVAL;
722 		return NULL;
723 	}
724 
725 	ni_root = ntfs_inode_open(vol, FILE_root);
726 	if (!ni_root) {
727 		ntfs_log_debug("Couldn't open the root directory.\n");
728 		return NULL;
729 	}
730 
731 	unicode_len = ntfs_mbstoucs(hiberfile, &unicode);
732 	if (unicode_len < 0) {
733 		ntfs_log_perror("Couldn't convert 'hiberfil.sys' to Unicode");
734 		goto out;
735 	}
736 
737 	inode = ntfs_inode_lookup_by_name(ni_root, unicode, unicode_len);
738 	if (inode == (u64)-1) {
739 		ntfs_log_debug("Couldn't find file '%s'.\n", hiberfile);
740 		goto out;
741 	}
742 
743 	inode = MREF(inode);
744 	ni_hibr = ntfs_inode_open(vol, inode);
745 	if (!ni_hibr) {
746 		ntfs_log_debug("Couldn't open inode %lld.\n", (long long)inode);
747 		goto out;
748 	}
749 out:
750 	if (ntfs_inode_close(ni_root)) {
751 		ntfs_inode_close(ni_hibr);
752 		ni_hibr = NULL;
753 	}
754 	free(unicode);
755 	return ni_hibr;
756 }
757 
758 
759 #define NTFS_HIBERFILE_HEADER_SIZE	4096
760 
761 /**
762  * ntfs_volume_check_hiberfile - check hiberfil.sys whether Windows is
763  *                               hibernated on the target volume
764  * @vol:    volume on which to check hiberfil.sys
765  *
766  * Return:  0 if Windows isn't hibernated for sure
767  *         -1 otherwise and errno is set to the appropriate value
768  */
769 int ntfs_volume_check_hiberfile(ntfs_volume *vol, int verbose)
770 {
771 	ntfs_inode *ni;
772 	ntfs_attr *na = NULL;
773 	int bytes_read, err;
774 	char *buf = NULL;
775 
776 	ni = ntfs_hiberfile_open(vol);
777 	if (!ni) {
778 		if (errno == ENOENT)
779 			return 0;
780 		return -1;
781 	}
782 
783 	buf = ntfs_malloc(NTFS_HIBERFILE_HEADER_SIZE);
784 	if (!buf)
785 		goto out;
786 
787 	na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);
788 	if (!na) {
789 		ntfs_log_perror("Failed to open hiberfil.sys data attribute");
790 		goto out;
791 	}
792 
793 	bytes_read = ntfs_attr_pread(na, 0, NTFS_HIBERFILE_HEADER_SIZE, buf);
794 	if (bytes_read == -1) {
795 		ntfs_log_perror("Failed to read hiberfil.sys");
796 		goto out;
797 	}
798 	if (bytes_read < NTFS_HIBERFILE_HEADER_SIZE) {
799 		if (verbose)
800 			ntfs_log_error("Hibernated non-system partition, "
801 				       "refused to mount.\n");
802 		errno = EPERM;
803 		goto out;
804 	}
805 	if ((memcmp(buf, "hibr", 4) == 0)
806 	   ||  (memcmp(buf, "HIBR", 4) == 0)) {
807 		if (verbose)
808 			ntfs_log_error("Windows is hibernated, refused to mount.\n");
809 		errno = EPERM;
810 		goto out;
811 	}
812         /* All right, all header bytes are zero */
813 	errno = 0;
814 out:
815 	if (na)
816 		ntfs_attr_close(na);
817 	free(buf);
818 	err = errno;
819 	if (ntfs_inode_close(ni))
820 		ntfs_error_set(&err);
821 	errno = err;
822 	return errno ? -1 : 0;
823 }
824 
825 /*
826  *		Make sure a LOGGED_UTILITY_STREAM attribute named "$TXF_DATA"
827  *	on the root directory is resident.
828  *	When it is non-resident, the partition cannot be mounted on Vista
829  *	(see http://support.microsoft.com/kb/974729)
830  *
831  *	We take care to avoid this situation, however this can be a
832  *	consequence of having used an older version (including older
833  *	Windows version), so we had better fix it.
834  *
835  *	Returns 0 if unneeded or successful
836  *		-1 if there was an error, explained by errno
837  */
838 
839 static int fix_txf_data(ntfs_volume *vol)
840 {
841 	void *txf_data;
842 	s64 txf_data_size;
843 	ntfs_inode *ni;
844 	ntfs_attr *na;
845 	int res;
846 
847 	res = 0;
848 	ntfs_log_debug("Loading root directory\n");
849 	ni = ntfs_inode_open(vol, FILE_root);
850 	if (!ni) {
851 		ntfs_log_perror("Failed to open root directory");
852 		res = -1;
853 	} else {
854 		/* Get the $TXF_DATA attribute */
855 		na = ntfs_attr_open(ni, AT_LOGGED_UTILITY_STREAM, TXF_DATA, 9);
856 		if (na) {
857 			if (NAttrNonResident(na)) {
858 				/*
859 				 * Fix the attribute by truncating, then
860 				 * rewriting it.
861 				 */
862 				ntfs_log_debug("Making $TXF_DATA resident\n");
863 				txf_data = ntfs_attr_readall(ni,
864 						AT_LOGGED_UTILITY_STREAM,
865 						TXF_DATA, 9, &txf_data_size);
866 				if (txf_data) {
867 					if (ntfs_attr_truncate(na, 0)
868 					    || (ntfs_attr_pwrite(na, 0,
869 						 txf_data_size, txf_data)
870 							!= txf_data_size))
871 						res = -1;
872 					free(txf_data);
873 				}
874 			if (res)
875 				ntfs_log_error("Failed to make $TXF_DATA resident\n");
876 			else
877 				ntfs_log_error("$TXF_DATA made resident\n");
878 			}
879 			ntfs_attr_close(na);
880 		}
881 		if (ntfs_inode_close(ni)) {
882 			ntfs_log_perror("Failed to close root");
883 			res = -1;
884 		}
885 	}
886 	return (res);
887 }
888 
889 /**
890  * ntfs_device_mount - open ntfs volume
891  * @dev:	device to open
892  * @flags:	optional mount flags
893  *
894  * This function mounts an ntfs volume. @dev should describe the device which
895  * to mount as the ntfs volume.
896  *
897  * @flags is an optional second parameter. The same flags are used as for
898  * the mount system call (man 2 mount). Currently only the following flag
899  * is implemented:
900  *	NTFS_MNT_RDONLY	- mount volume read-only
901  *
902  * The function opens the device @dev and verifies that it contains a valid
903  * bootsector. Then, it allocates an ntfs_volume structure and initializes
904  * some of the values inside the structure from the information stored in the
905  * bootsector. It proceeds to load the necessary system files and completes
906  * setting up the structure.
907  *
908  * Return the allocated volume structure on success and NULL on error with
909  * errno set to the error code.
910  */
911 ntfs_volume *ntfs_device_mount(struct ntfs_device *dev, ntfs_mount_flags flags)
912 {
913 	s64 l;
914 	ntfs_volume *vol;
915 	u8 *m = NULL, *m2 = NULL;
916 	ntfs_attr_search_ctx *ctx = NULL;
917 	ntfs_inode *ni;
918 	ntfs_attr *na;
919 	ATTR_RECORD *a;
920 	VOLUME_INFORMATION *vinf;
921 	ntfschar *vname;
922 	u32 record_size;
923 	int i, j, eo;
924 	unsigned int k;
925 	u32 u;
926 	BOOL need_fallback_ro;
927 
928 	need_fallback_ro = FALSE;
929 	vol = ntfs_volume_startup(dev, flags);
930 	if (!vol)
931 		return NULL;
932 
933 	/* Load data from $MFT and $MFTMirr and compare the contents. */
934 	m  = ntfs_malloc(vol->mftmirr_size << vol->mft_record_size_bits);
935 	m2 = ntfs_malloc(vol->mftmirr_size << vol->mft_record_size_bits);
936 	if (!m || !m2)
937 		goto error_exit;
938 
939 	l = ntfs_attr_mst_pread(vol->mft_na, 0, vol->mftmirr_size,
940 			vol->mft_record_size, m);
941 	if (l != vol->mftmirr_size) {
942 		if (l == -1)
943 			ntfs_log_perror("Failed to read $MFT");
944 		else {
945 			ntfs_log_error("Failed to read $MFT, unexpected length "
946 				       "(%lld != %d).\n", (long long)l,
947 				       vol->mftmirr_size);
948 			errno = EIO;
949 		}
950 		goto error_exit;
951 	}
952 	l = ntfs_attr_mst_pread(vol->mftmirr_na, 0, vol->mftmirr_size,
953 			vol->mft_record_size, m2);
954 	if (l != vol->mftmirr_size) {
955 		if (l == -1) {
956 			ntfs_log_perror("Failed to read $MFTMirr");
957 			goto error_exit;
958 		}
959 		vol->mftmirr_size = l;
960 	}
961 	ntfs_log_debug("Comparing $MFTMirr to $MFT...\n");
962 	for (i = 0; i < vol->mftmirr_size; ++i) {
963 		MFT_RECORD *mrec, *mrec2;
964 		const char *ESTR[12] = { "$MFT", "$MFTMirr", "$LogFile",
965 			"$Volume", "$AttrDef", "root directory", "$Bitmap",
966 			"$Boot", "$BadClus", "$Secure", "$UpCase", "$Extend" };
967 		const char *s;
968 
969 		if (i < 12)
970 			s = ESTR[i];
971 		else if (i < 16)
972 			s = "system file";
973 		else
974 			s = "mft record";
975 
976 		mrec = (MFT_RECORD*)(m + i * vol->mft_record_size);
977 		if (mrec->flags & MFT_RECORD_IN_USE) {
978 			if (ntfs_is_baad_record(mrec->magic)) {
979 				ntfs_log_error("$MFT error: Incomplete multi "
980 					       "sector transfer detected in "
981 					       "'%s'.\n", s);
982 				goto io_error_exit;
983 			}
984 			if (!ntfs_is_mft_record(mrec->magic)) {
985 				ntfs_log_error("$MFT error: Invalid mft "
986 						"record for '%s'.\n", s);
987 				goto io_error_exit;
988 			}
989 		}
990 		mrec2 = (MFT_RECORD*)(m2 + i * vol->mft_record_size);
991 		if (mrec2->flags & MFT_RECORD_IN_USE) {
992 			if (ntfs_is_baad_record(mrec2->magic)) {
993 				ntfs_log_error("$MFTMirr error: Incomplete "
994 						"multi sector transfer "
995 						"detected in '%s'.\n", s);
996 				goto io_error_exit;
997 			}
998 			if (!ntfs_is_mft_record(mrec2->magic)) {
999 				ntfs_log_error("$MFTMirr error: Invalid mft "
1000 						"record for '%s'.\n", s);
1001 				goto io_error_exit;
1002 			}
1003 		}
1004 		record_size = ntfs_mft_record_get_data_size(mrec);
1005 		if ((record_size <= sizeof(MFT_RECORD))
1006 		    || (record_size > vol->mft_record_size)
1007 		    || memcmp(mrec, mrec2, record_size)) {
1008 			ntfs_log_error("$MFTMirr does not match $MFT (record "
1009 				       "%d).\n", i);
1010 			goto io_error_exit;
1011 		}
1012 	}
1013 
1014 	free(m2);
1015 	free(m);
1016 	m = m2 = NULL;
1017 
1018 	/* Now load the bitmap from $Bitmap. */
1019 	ntfs_log_debug("Loading $Bitmap...\n");
1020 	vol->lcnbmp_ni = ntfs_inode_open(vol, FILE_Bitmap);
1021 	if (!vol->lcnbmp_ni) {
1022 		ntfs_log_perror("Failed to open inode FILE_Bitmap");
1023 		goto error_exit;
1024 	}
1025 
1026 	vol->lcnbmp_na = ntfs_attr_open(vol->lcnbmp_ni, AT_DATA, AT_UNNAMED, 0);
1027 	if (!vol->lcnbmp_na) {
1028 		ntfs_log_perror("Failed to open ntfs attribute");
1029 		goto error_exit;
1030 	}
1031 
1032 	if (vol->lcnbmp_na->data_size > vol->lcnbmp_na->allocated_size) {
1033 		ntfs_log_error("Corrupt cluster map size (%lld > %lld)\n",
1034 				(long long)vol->lcnbmp_na->data_size,
1035 				(long long)vol->lcnbmp_na->allocated_size);
1036 		goto io_error_exit;
1037 	}
1038 
1039 	/* Now load the upcase table from $UpCase. */
1040 	ntfs_log_debug("Loading $UpCase...\n");
1041 	ni = ntfs_inode_open(vol, FILE_UpCase);
1042 	if (!ni) {
1043 		ntfs_log_perror("Failed to open inode FILE_UpCase");
1044 		goto error_exit;
1045 	}
1046 	/* Get an ntfs attribute for $UpCase/$DATA. */
1047 	na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);
1048 	if (!na) {
1049 		ntfs_log_perror("Failed to open ntfs attribute");
1050 		goto error_exit;
1051 	}
1052 	/*
1053 	 * Note: Normally, the upcase table has a length equal to 65536
1054 	 * 2-byte Unicode characters but allow for different cases, so no
1055 	 * checks done. Just check we don't overflow 32-bits worth of Unicode
1056 	 * characters.
1057 	 */
1058 	if (na->data_size & ~0x1ffffffffULL) {
1059 		ntfs_log_error("Error: Upcase table is too big (max 32-bit "
1060 				"allowed).\n");
1061 		errno = EINVAL;
1062 		goto error_exit;
1063 	}
1064 	if (vol->upcase_len != na->data_size >> 1) {
1065 		vol->upcase_len = na->data_size >> 1;
1066 		/* Throw away default table. */
1067 		free(vol->upcase);
1068 		vol->upcase = ntfs_malloc(na->data_size);
1069 		if (!vol->upcase)
1070 			goto error_exit;
1071 	}
1072 	/* Read in the $DATA attribute value into the buffer. */
1073 	l = ntfs_attr_pread(na, 0, na->data_size, vol->upcase);
1074 	if (l != na->data_size) {
1075 		ntfs_log_error("Failed to read $UpCase, unexpected length "
1076 			       "(%lld != %lld).\n", (long long)l,
1077 			       (long long)na->data_size);
1078 		errno = EIO;
1079 		goto error_exit;
1080 	}
1081 	/* Done with the $UpCase mft record. */
1082 	ntfs_attr_close(na);
1083 	if (ntfs_inode_close(ni)) {
1084 		ntfs_log_perror("Failed to close $UpCase");
1085 		goto error_exit;
1086 	}
1087 	/* Consistency check of $UpCase, restricted to plain ASCII chars */
1088 	k = 0x20;
1089 	while ((k < vol->upcase_len)
1090 	    && (k < 0x7f)
1091 	    && (le16_to_cpu(vol->upcase[k])
1092 			== ((k < 'a') || (k > 'z') ? k : k + 'A' - 'a')))
1093 		k++;
1094 	if (k < 0x7f) {
1095 		ntfs_log_error("Corrupted file $UpCase\n");
1096 		goto io_error_exit;
1097 	}
1098 
1099 	/*
1100 	 * Now load $Volume and set the version information and flags in the
1101 	 * vol structure accordingly.
1102 	 */
1103 	ntfs_log_debug("Loading $Volume...\n");
1104 	vol->vol_ni = ntfs_inode_open(vol, FILE_Volume);
1105 	if (!vol->vol_ni) {
1106 		ntfs_log_perror("Failed to open inode FILE_Volume");
1107 		goto error_exit;
1108 	}
1109 	/* Get a search context for the $Volume/$VOLUME_INFORMATION lookup. */
1110 	ctx = ntfs_attr_get_search_ctx(vol->vol_ni, NULL);
1111 	if (!ctx)
1112 		goto error_exit;
1113 
1114 	/* Find the $VOLUME_INFORMATION attribute. */
1115 	if (ntfs_attr_lookup(AT_VOLUME_INFORMATION, AT_UNNAMED, 0, 0, 0, NULL,
1116 			0, ctx)) {
1117 		ntfs_log_perror("$VOLUME_INFORMATION attribute not found in "
1118 				"$Volume");
1119 		goto error_exit;
1120 	}
1121 	a = ctx->attr;
1122 	/* Has to be resident. */
1123 	if (a->non_resident) {
1124 		ntfs_log_error("Attribute $VOLUME_INFORMATION must be "
1125 			       "resident but it isn't.\n");
1126 		errno = EIO;
1127 		goto error_exit;
1128 	}
1129 	/* Get a pointer to the value of the attribute. */
1130 	vinf = (VOLUME_INFORMATION*)(le16_to_cpu(a->value_offset) + (char*)a);
1131 	/* Sanity checks. */
1132 	if ((char*)vinf + le32_to_cpu(a->value_length) > (char*)ctx->mrec +
1133 			le32_to_cpu(ctx->mrec->bytes_in_use) ||
1134 			le16_to_cpu(a->value_offset) + le32_to_cpu(
1135 			a->value_length) > le32_to_cpu(a->length)) {
1136 		ntfs_log_error("$VOLUME_INFORMATION in $Volume is corrupt.\n");
1137 		errno = EIO;
1138 		goto error_exit;
1139 	}
1140 	/* Setup vol from the volume information attribute value. */
1141 	vol->major_ver = vinf->major_ver;
1142 	vol->minor_ver = vinf->minor_ver;
1143 	/* Do not use le16_to_cpu() macro here as our VOLUME_FLAGS are
1144 	   defined using cpu_to_le16() macro and hence are consistent. */
1145 	vol->flags = vinf->flags;
1146 	/*
1147 	 * Reinitialize the search context for the $Volume/$VOLUME_NAME lookup.
1148 	 */
1149 	ntfs_attr_reinit_search_ctx(ctx);
1150 	if (ntfs_attr_lookup(AT_VOLUME_NAME, AT_UNNAMED, 0, 0, 0, NULL, 0,
1151 			ctx)) {
1152 		if (errno != ENOENT) {
1153 			ntfs_log_perror("Failed to lookup of $VOLUME_NAME in "
1154 					"$Volume failed");
1155 			goto error_exit;
1156 		}
1157 		/*
1158 		 * Attribute not present.  This has been seen in the field.
1159 		 * Treat this the same way as if the attribute was present but
1160 		 * had zero length.
1161 		 */
1162 		vol->vol_name = ntfs_malloc(1);
1163 		if (!vol->vol_name)
1164 			goto error_exit;
1165 		vol->vol_name[0] = '\0';
1166 	} else {
1167 		a = ctx->attr;
1168 		/* Has to be resident. */
1169 		if (a->non_resident) {
1170 			ntfs_log_error("$VOLUME_NAME must be resident.\n");
1171 			errno = EIO;
1172 			goto error_exit;
1173 		}
1174 		/* Get a pointer to the value of the attribute. */
1175 		vname = (ntfschar*)(le16_to_cpu(a->value_offset) + (char*)a);
1176 		u = le32_to_cpu(a->value_length) / 2;
1177 		/*
1178 		 * Convert Unicode volume name to current locale multibyte
1179 		 * format.
1180 		 */
1181 		vol->vol_name = NULL;
1182 		if (ntfs_ucstombs(vname, u, &vol->vol_name, 0) == -1) {
1183 			ntfs_log_perror("Volume name could not be converted "
1184 					"to current locale");
1185 			ntfs_log_debug("Forcing name into ASCII by replacing "
1186 				"non-ASCII characters with underscores.\n");
1187 			vol->vol_name = ntfs_malloc(u + 1);
1188 			if (!vol->vol_name)
1189 				goto error_exit;
1190 
1191 			for (j = 0; j < (s32)u; j++) {
1192 				u16 uc = le16_to_cpu(vname[j]);
1193 				if (uc > 0xff)
1194 					uc = (u16)'_';
1195 				vol->vol_name[j] = (char)uc;
1196 			}
1197 			vol->vol_name[u] = '\0';
1198 		}
1199 	}
1200 	ntfs_attr_put_search_ctx(ctx);
1201 	ctx = NULL;
1202 	/* Now load the attribute definitions from $AttrDef. */
1203 	ntfs_log_debug("Loading $AttrDef...\n");
1204 	ni = ntfs_inode_open(vol, FILE_AttrDef);
1205 	if (!ni) {
1206 		ntfs_log_perror("Failed to open $AttrDef");
1207 		goto error_exit;
1208 	}
1209 	/* Get an ntfs attribute for $AttrDef/$DATA. */
1210 	na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);
1211 	if (!na) {
1212 		ntfs_log_perror("Failed to open ntfs attribute");
1213 		goto error_exit;
1214 	}
1215 	/* Check we don't overflow 32-bits. */
1216 	if (na->data_size > 0xffffffffLL) {
1217 		ntfs_log_error("Attribute definition table is too big (max "
1218 			       "32-bit allowed).\n");
1219 		errno = EINVAL;
1220 		goto error_exit;
1221 	}
1222 	vol->attrdef_len = na->data_size;
1223 	vol->attrdef = ntfs_malloc(na->data_size);
1224 	if (!vol->attrdef)
1225 		goto error_exit;
1226 	/* Read in the $DATA attribute value into the buffer. */
1227 	l = ntfs_attr_pread(na, 0, na->data_size, vol->attrdef);
1228 	if (l != na->data_size) {
1229 		ntfs_log_error("Failed to read $AttrDef, unexpected length "
1230 			       "(%lld != %lld).\n", (long long)l,
1231 			       (long long)na->data_size);
1232 		errno = EIO;
1233 		goto error_exit;
1234 	}
1235 	/* Done with the $AttrDef mft record. */
1236 	ntfs_attr_close(na);
1237 	if (ntfs_inode_close(ni)) {
1238 		ntfs_log_perror("Failed to close $AttrDef");
1239 		goto error_exit;
1240 	}
1241 
1242 	/* Open $Secure. */
1243 	if (ntfs_open_secure(vol))
1244 		goto error_exit;
1245 
1246 	/*
1247 	 * Check for dirty logfile and hibernated Windows.
1248 	 * We care only about read-write mounts.
1249 	 */
1250 	if (!(flags & (NTFS_MNT_RDONLY | NTFS_MNT_FORENSIC))) {
1251 		if (!(flags & NTFS_MNT_IGNORE_HIBERFILE) &&
1252 		    ntfs_volume_check_hiberfile(vol, 1) < 0) {
1253 			if (flags & NTFS_MNT_MAY_RDONLY)
1254 				need_fallback_ro = TRUE;
1255 			else
1256 				goto error_exit;
1257 			}
1258 		if (ntfs_volume_check_logfile(vol) < 0) {
1259 			/* Always reject cached metadata for now */
1260 			if (!(flags & NTFS_MNT_RECOVER) || (errno == EPERM)) {
1261 				if (flags & NTFS_MNT_MAY_RDONLY)
1262 					need_fallback_ro = TRUE;
1263 				else
1264 					goto error_exit;
1265 			} else {
1266 				ntfs_log_info("The file system wasn't safely "
1267 					      "closed on Windows. Fixing.\n");
1268 				if (ntfs_logfile_reset(vol))
1269 					goto error_exit;
1270 			}
1271 		}
1272 		/* make $TXF_DATA resident if present on the root directory */
1273 		if (!(flags & NTFS_MNT_RDONLY) && !need_fallback_ro) {
1274 			if (fix_txf_data(vol))
1275 				goto error_exit;
1276 		}
1277 	}
1278 	if (need_fallback_ro) {
1279 		NVolSetReadOnly(vol);
1280 		ntfs_log_error("%s", fallback_readonly_msg);
1281 	}
1282 
1283 	return vol;
1284 io_error_exit:
1285 	errno = EIO;
1286 error_exit:
1287 	eo = errno;
1288 	if (ctx)
1289 		ntfs_attr_put_search_ctx(ctx);
1290 	free(m);
1291 	free(m2);
1292 	__ntfs_volume_release(vol);
1293 	errno = eo;
1294 	return NULL;
1295 }
1296 
1297 /*
1298  *		Set appropriate flags for showing NTFS metafiles
1299  *	or files marked as hidden.
1300  *	Not set in ntfs_mount() to avoid breaking existing tools.
1301  */
1302 
1303 int ntfs_set_shown_files(ntfs_volume *vol,
1304 			BOOL show_sys_files, BOOL show_hid_files,
1305 			BOOL hide_dot_files)
1306 {
1307 	int res;
1308 
1309 	res = -1;
1310 	if (vol) {
1311 		NVolClearShowSysFiles(vol);
1312 		NVolClearShowHidFiles(vol);
1313 		NVolClearHideDotFiles(vol);
1314 		if (show_sys_files)
1315 			NVolSetShowSysFiles(vol);
1316 		if (show_hid_files)
1317 			NVolSetShowHidFiles(vol);
1318 		if (hide_dot_files)
1319 			NVolSetHideDotFiles(vol);
1320 		res = 0;
1321 	}
1322 	if (res)
1323 		ntfs_log_error("Failed to set file visibility\n");
1324 	return (res);
1325 }
1326 
1327 /*
1328  *		Set ignore case mode
1329  */
1330 
1331 int ntfs_set_ignore_case(ntfs_volume *vol)
1332 {
1333 	int res;
1334 
1335 	res = -1;
1336 	if (vol && vol->upcase) {
1337 		vol->locase = ntfs_locase_table_build(vol->upcase,
1338 					vol->upcase_len);
1339 		if (vol->locase) {
1340 			NVolClearCaseSensitive(vol);
1341 			res = 0;
1342 		}
1343 	}
1344 	if (res)
1345 		ntfs_log_error("Failed to set ignore_case mode\n");
1346 	return (res);
1347 }
1348 
1349 /**
1350  * ntfs_mount - open ntfs volume
1351  * @name:	name of device/file to open
1352  * @flags:	optional mount flags
1353  *
1354  * This function mounts an ntfs volume. @name should contain the name of the
1355  * device/file to mount as the ntfs volume.
1356  *
1357  * @flags is an optional second parameter. The same flags are used as for
1358  * the mount system call (man 2 mount). Currently only the following flags
1359  * is implemented:
1360  *	NTFS_MNT_RDONLY	- mount volume read-only
1361  *
1362  * The function opens the device or file @name and verifies that it contains a
1363  * valid bootsector. Then, it allocates an ntfs_volume structure and initializes
1364  * some of the values inside the structure from the information stored in the
1365  * bootsector. It proceeds to load the necessary system files and completes
1366  * setting up the structure.
1367  *
1368  * Return the allocated volume structure on success and NULL on error with
1369  * errno set to the error code.
1370  *
1371  * Note, that a copy is made of @name, and hence it can be discarded as
1372  * soon as the function returns.
1373  */
1374 ntfs_volume *ntfs_mount(const char *name __attribute__((unused)),
1375 		ntfs_mount_flags flags __attribute__((unused)))
1376 {
1377 #ifndef NO_NTFS_DEVICE_DEFAULT_IO_OPS
1378 	struct ntfs_device *dev;
1379 	ntfs_volume *vol;
1380 
1381 	/* Allocate an ntfs_device structure. */
1382 	dev = ntfs_device_alloc(name, 0, &ntfs_device_default_io_ops, NULL);
1383 	if (!dev)
1384 		return NULL;
1385 	/* Call ntfs_device_mount() to do the actual mount. */
1386 	vol = ntfs_device_mount(dev, flags);
1387 	if (!vol) {
1388 		int eo = errno;
1389 		ntfs_device_free(dev);
1390 		errno = eo;
1391 	} else
1392 		ntfs_create_lru_caches(vol);
1393 	return vol;
1394 #else
1395 	/*
1396 	 * ntfs_mount() makes no sense if NO_NTFS_DEVICE_DEFAULT_IO_OPS is
1397 	 * defined as there are no device operations available in libntfs in
1398 	 * this case.
1399 	 */
1400 	errno = EOPNOTSUPP;
1401 	return NULL;
1402 #endif
1403 }
1404 
1405 /**
1406  * ntfs_umount - close ntfs volume
1407  * @vol: address of ntfs_volume structure of volume to close
1408  * @force: if true force close the volume even if it is busy
1409  *
1410  * Deallocate all structures (including @vol itself) associated with the ntfs
1411  * volume @vol.
1412  *
1413  * Return 0 on success. On error return -1 with errno set appropriately
1414  * (most likely to one of EAGAIN, EBUSY or EINVAL). The EAGAIN error means that
1415  * an operation is in progress and if you try the close later the operation
1416  * might be completed and the close succeed.
1417  *
1418  * If @force is true (i.e. not zero) this function will close the volume even
1419  * if this means that data might be lost.
1420  *
1421  * @vol must have previously been returned by a call to ntfs_mount().
1422  *
1423  * @vol itself is deallocated and should no longer be dereferenced after this
1424  * function returns success. If it returns an error then nothing has been done
1425  * so it is safe to continue using @vol.
1426  */
1427 int ntfs_umount(ntfs_volume *vol, const BOOL force __attribute__((unused)))
1428 {
1429 	struct ntfs_device *dev;
1430 	int ret;
1431 
1432 	if (!vol) {
1433 		errno = EINVAL;
1434 		return -1;
1435 	}
1436 	dev = vol->dev;
1437 	ret = __ntfs_volume_release(vol);
1438 	ntfs_device_free(dev);
1439 	return ret;
1440 }
1441 
1442 #ifdef HAVE_MNTENT_H
1443 
1444 /**
1445  * ntfs_mntent_check - desc
1446  *
1447  * If you are wanting to use this, you actually wanted to use
1448  * ntfs_check_if_mounted(), you just didn't realize. (-:
1449  *
1450  * See description of ntfs_check_if_mounted(), below.
1451  */
1452 static int ntfs_mntent_check(const char *file, unsigned long *mnt_flags)
1453 {
1454 	struct mntent *mnt;
1455 	char *real_file = NULL, *real_fsname = NULL;
1456 	FILE *f;
1457 	int err = 0;
1458 
1459 	real_file = ntfs_malloc(PATH_MAX + 1);
1460 	if (!real_file)
1461 		return -1;
1462 	real_fsname = ntfs_malloc(PATH_MAX + 1);
1463 	if (!real_fsname) {
1464 		err = errno;
1465 		goto exit;
1466 	}
1467 	if (!ntfs_realpath_canonicalize(file, real_file)) {
1468 		err = errno;
1469 		goto exit;
1470 	}
1471 	f = setmntent("/proc/mounts", "r");
1472 	if (!f && !(f = setmntent(MOUNTED, "r"))) {
1473 		err = errno;
1474 		goto exit;
1475 	}
1476 	while ((mnt = getmntent(f))) {
1477 		if (!ntfs_realpath_canonicalize(mnt->mnt_fsname, real_fsname))
1478 			continue;
1479 		if (!strcmp(real_file, real_fsname))
1480 			break;
1481 	}
1482 	endmntent(f);
1483 	if (!mnt)
1484 		goto exit;
1485 	*mnt_flags = NTFS_MF_MOUNTED;
1486 	if (!strcmp(mnt->mnt_dir, "/"))
1487 		*mnt_flags |= NTFS_MF_ISROOT;
1488 #ifdef HAVE_HASMNTOPT
1489 	if (hasmntopt(mnt, "ro") && !hasmntopt(mnt, "rw"))
1490 		*mnt_flags |= NTFS_MF_READONLY;
1491 #endif
1492 exit:
1493 	free(real_file);
1494 	free(real_fsname);
1495 	if (err) {
1496 		errno = err;
1497 		return -1;
1498 	}
1499 	return 0;
1500 }
1501 
1502 #else /* HAVE_MNTENT_H */
1503 
1504 #if defined(__sun) && defined (__SVR4)
1505 
1506 static int ntfs_mntent_check(const char *file, unsigned long *mnt_flags)
1507 {
1508 	struct mnttab *mnt = NULL;
1509 	char *real_file = NULL, *real_fsname = NULL;
1510 	FILE *f;
1511 	int err = 0;
1512 
1513 	real_file = (char*)ntfs_malloc(PATH_MAX + 1);
1514 	if (!real_file)
1515 		return -1;
1516 	real_fsname = (char*)ntfs_malloc(PATH_MAX + 1);
1517 	mnt = (struct mnttab*)ntfs_malloc(MNT_LINE_MAX + 1);
1518 	if (!real_fsname || !mnt) {
1519 		err = errno;
1520 		goto exit;
1521 	}
1522 	if (!ntfs_realpath_canonicalize(file, real_file)) {
1523 		err = errno;
1524 		goto exit;
1525 	}
1526 	if (!(f = fopen(MNTTAB, "r"))) {
1527 		err = errno;
1528 		goto exit;
1529 	}
1530 	while (!getmntent(f, mnt)) {
1531 		if (!ntfs_realpath_canonicalize(mnt->mnt_special, real_fsname))
1532 			continue;
1533 		if (!strcmp(real_file, real_fsname)) {
1534 			*mnt_flags = NTFS_MF_MOUNTED;
1535 			if (!strcmp(mnt->mnt_mountp, "/"))
1536 				*mnt_flags |= NTFS_MF_ISROOT;
1537 			if (hasmntopt(mnt, "ro") && !hasmntopt(mnt, "rw"))
1538 				*mnt_flags |= NTFS_MF_READONLY;
1539 			break;
1540 		}
1541 	}
1542 	fclose(f);
1543 exit:
1544 	free(mnt);
1545 	free(real_file);
1546 	free(real_fsname);
1547 	if (err) {
1548 		errno = err;
1549 		return -1;
1550 	}
1551 	return 0;
1552 }
1553 
1554 #endif /* defined(__sun) && defined (__SVR4) */
1555 #endif /* HAVE_MNTENT_H */
1556 
1557 /**
1558  * ntfs_check_if_mounted - check if an ntfs volume is currently mounted
1559  * @file:	device file to check
1560  * @mnt_flags:	pointer into which to return the ntfs mount flags (see volume.h)
1561  *
1562  * If the running system does not support the {set,get,end}mntent() calls,
1563  * just return 0 and set *@mnt_flags to zero.
1564  *
1565  * When the system does support the calls, ntfs_check_if_mounted() first tries
1566  * to find the device @file in /etc/mtab (or wherever this is kept on the
1567  * running system). If it is not found, assume the device is not mounted and
1568  * return 0 and set *@mnt_flags to zero.
1569  *
1570  * If the device @file is found, set the NTFS_MF_MOUNTED flags in *@mnt_flags.
1571  *
1572  * Further if @file is mounted as the file system root ("/"), set the flag
1573  * NTFS_MF_ISROOT in *@mnt_flags.
1574  *
1575  * Finally, check if the file system is mounted read-only, and if so set the
1576  * NTFS_MF_READONLY flag in *@mnt_flags.
1577  *
1578  * On success return 0 with *@mnt_flags set to the ntfs mount flags.
1579  *
1580  * On error return -1 with errno set to the error code.
1581  */
1582 int ntfs_check_if_mounted(const char *file __attribute__((unused)),
1583 		unsigned long *mnt_flags)
1584 {
1585 	*mnt_flags = 0;
1586 #if defined(HAVE_MNTENT_H) || (defined(__sun) && defined (__SVR4))
1587 	return ntfs_mntent_check(file, mnt_flags);
1588 #else
1589 	return 0;
1590 #endif
1591 }
1592 
1593 /**
1594  * ntfs_version_is_supported - check if NTFS version is supported.
1595  * @vol:	ntfs volume whose version we're interested in.
1596  *
1597  * The function checks if the NTFS volume version is known or not.
1598  * Version 1.1 and 1.2 are used by Windows NT3.x and NT4.
1599  * Version 2.x is used by Windows 2000 Betas.
1600  * Version 3.0 is used by Windows 2000.
1601  * Version 3.1 is used by Windows XP, Windows Server 2003 and Longhorn.
1602  *
1603  * Return 0 if NTFS version is supported otherwise -1 with errno set.
1604  *
1605  * The following error codes are defined:
1606  *	EOPNOTSUPP - Unknown NTFS version
1607  *	EINVAL	   - Invalid argument
1608  */
1609 int ntfs_version_is_supported(ntfs_volume *vol)
1610 {
1611 	u8 major, minor;
1612 
1613 	if (!vol) {
1614 		errno = EINVAL;
1615 		return -1;
1616 	}
1617 
1618 	major = vol->major_ver;
1619 	minor = vol->minor_ver;
1620 
1621 	if (NTFS_V1_1(major, minor) || NTFS_V1_2(major, minor))
1622 		return 0;
1623 
1624 	if (NTFS_V2_X(major, minor))
1625 		return 0;
1626 
1627 	if (NTFS_V3_0(major, minor) || NTFS_V3_1(major, minor))
1628 		return 0;
1629 
1630 	errno = EOPNOTSUPP;
1631 	return -1;
1632 }
1633 
1634 /**
1635  * ntfs_logfile_reset - "empty" $LogFile data attribute value
1636  * @vol:	ntfs volume whose $LogFile we intend to reset.
1637  *
1638  * Fill the value of the $LogFile data attribute, i.e. the contents of
1639  * the file, with 0xff's, thus marking the journal as empty.
1640  *
1641  * FIXME(?): We might need to zero the LSN field of every single mft
1642  * record as well. (But, first try without doing that and see what
1643  * happens, since chkdsk might pickup the pieces and do it for us...)
1644  *
1645  * On success return 0.
1646  *
1647  * On error return -1 with errno set to the error code.
1648  */
1649 int ntfs_logfile_reset(ntfs_volume *vol)
1650 {
1651 	ntfs_inode *ni;
1652 	ntfs_attr *na;
1653 	int eo;
1654 
1655 	if (!vol) {
1656 		errno = EINVAL;
1657 		return -1;
1658 	}
1659 
1660 	ni = ntfs_inode_open(vol, FILE_LogFile);
1661 	if (!ni) {
1662 		ntfs_log_perror("Failed to open inode FILE_LogFile");
1663 		return -1;
1664 	}
1665 
1666 	na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);
1667 	if (!na) {
1668 		eo = errno;
1669 		ntfs_log_perror("Failed to open $FILE_LogFile/$DATA");
1670 		goto error_exit;
1671 	}
1672 
1673 	if (ntfs_empty_logfile(na)) {
1674 		eo = errno;
1675 		ntfs_attr_close(na);
1676 		goto error_exit;
1677 	}
1678 
1679 	ntfs_attr_close(na);
1680 	return ntfs_inode_close(ni);
1681 
1682 error_exit:
1683 	ntfs_inode_close(ni);
1684 	errno = eo;
1685 	return -1;
1686 }
1687 
1688 /**
1689  * ntfs_volume_write_flags - set the flags of an ntfs volume
1690  * @vol:	ntfs volume where we set the volume flags
1691  * @flags:	new flags
1692  *
1693  * Set the on-disk volume flags in the mft record of $Volume and
1694  * on volume @vol to @flags.
1695  *
1696  * Return 0 if successful and -1 if not with errno set to the error code.
1697  */
1698 int ntfs_volume_write_flags(ntfs_volume *vol, const le16 flags)
1699 {
1700 	ATTR_RECORD *a;
1701 	VOLUME_INFORMATION *c;
1702 	ntfs_attr_search_ctx *ctx;
1703 	int ret = -1;	/* failure */
1704 
1705 	if (!vol || !vol->vol_ni) {
1706 		errno = EINVAL;
1707 		return -1;
1708 	}
1709 	/* Get a pointer to the volume information attribute. */
1710 	ctx = ntfs_attr_get_search_ctx(vol->vol_ni, NULL);
1711 	if (!ctx)
1712 		return -1;
1713 
1714 	if (ntfs_attr_lookup(AT_VOLUME_INFORMATION, AT_UNNAMED, 0, 0, 0, NULL,
1715 			0, ctx)) {
1716 		ntfs_log_error("Attribute $VOLUME_INFORMATION was not found "
1717 			       "in $Volume!\n");
1718 		goto err_out;
1719 	}
1720 	a = ctx->attr;
1721 	/* Sanity check. */
1722 	if (a->non_resident) {
1723 		ntfs_log_error("Attribute $VOLUME_INFORMATION must be resident "
1724 			       "but it isn't.\n");
1725 		errno = EIO;
1726 		goto err_out;
1727 	}
1728 	/* Get a pointer to the value of the attribute. */
1729 	c = (VOLUME_INFORMATION*)(le16_to_cpu(a->value_offset) + (char*)a);
1730 	/* Sanity checks. */
1731 	if ((char*)c + le32_to_cpu(a->value_length) > (char*)ctx->mrec +
1732 			le32_to_cpu(ctx->mrec->bytes_in_use) ||
1733 			le16_to_cpu(a->value_offset) +
1734 			le32_to_cpu(a->value_length) > le32_to_cpu(a->length)) {
1735 		ntfs_log_error("Attribute $VOLUME_INFORMATION in $Volume is "
1736 			       "corrupt!\n");
1737 		errno = EIO;
1738 		goto err_out;
1739 	}
1740 	/* Set the volume flags. */
1741 	vol->flags = c->flags = flags & VOLUME_FLAGS_MASK;
1742 	/* Write them to disk. */
1743 	ntfs_inode_mark_dirty(vol->vol_ni);
1744 	if (ntfs_inode_sync(vol->vol_ni))
1745 		goto err_out;
1746 
1747 	ret = 0; /* success */
1748 err_out:
1749 	ntfs_attr_put_search_ctx(ctx);
1750 	return ret;
1751 }
1752 
1753 int ntfs_volume_error(int err)
1754 {
1755 	int ret;
1756 
1757 	switch (err) {
1758 		case 0:
1759 			ret = NTFS_VOLUME_OK;
1760 			break;
1761 		case EINVAL:
1762 			ret = NTFS_VOLUME_NOT_NTFS;
1763 			break;
1764 		case EIO:
1765 			ret = NTFS_VOLUME_CORRUPT;
1766 			break;
1767 		case EPERM:
1768 			/*
1769 			 * Hibernation and fast restarting are seen the
1770 			 * same way on a non Windows-system partition.
1771 			 */
1772 			ret = NTFS_VOLUME_HIBERNATED;
1773 			break;
1774 		case EOPNOTSUPP:
1775 			ret = NTFS_VOLUME_UNCLEAN_UNMOUNT;
1776 			break;
1777 		case EBUSY:
1778 			ret = NTFS_VOLUME_LOCKED;
1779 			break;
1780 		case ENXIO:
1781 			ret = NTFS_VOLUME_RAID;
1782 			break;
1783 		case EACCES:
1784 			ret = NTFS_VOLUME_NO_PRIVILEGE;
1785 			break;
1786 		default:
1787 			ret = NTFS_VOLUME_UNKNOWN_REASON;
1788 			break;
1789 	}
1790 	return ret;
1791 }
1792 
1793 
1794 void ntfs_mount_error(const char *volume, const char *mntpoint, int err)
1795 {
1796 	switch (err) {
1797 		case NTFS_VOLUME_NOT_NTFS:
1798 			ntfs_log_error(invalid_ntfs_msg, volume);
1799 			break;
1800 		case NTFS_VOLUME_CORRUPT:
1801 			ntfs_log_error("%s", corrupt_volume_msg);
1802 			break;
1803 		case NTFS_VOLUME_HIBERNATED:
1804 			ntfs_log_error(hibernated_volume_msg, volume, mntpoint);
1805 			break;
1806 		case NTFS_VOLUME_UNCLEAN_UNMOUNT:
1807 			ntfs_log_error("%s", unclean_journal_msg);
1808 			break;
1809 		case NTFS_VOLUME_LOCKED:
1810 			ntfs_log_error("%s", opened_volume_msg);
1811 			break;
1812 		case NTFS_VOLUME_RAID:
1813 			ntfs_log_error("%s", fakeraid_msg);
1814 			break;
1815 		case NTFS_VOLUME_NO_PRIVILEGE:
1816 			ntfs_log_error(access_denied_msg, volume);
1817 			break;
1818 	}
1819 }
1820 
1821 int ntfs_set_locale(void)
1822 {
1823 #ifndef __HAIKU__
1824 	const char *locale;
1825 
1826 	locale = setlocale(LC_ALL, "");
1827 	if (!locale) {
1828 		locale = setlocale(LC_ALL, NULL);
1829 		ntfs_log_error("Couldn't set local environment, using default "
1830 			       "'%s'.\n", locale);
1831 		return 1;
1832 	}
1833 #endif
1834 	return 0;
1835 }
1836 
1837 /*
1838  *		Feed the counts of free clusters and free mft records
1839  */
1840 
1841 int ntfs_volume_get_free_space(ntfs_volume *vol)
1842 {
1843 	ntfs_attr *na;
1844 	int ret;
1845 
1846 	ret = -1; /* default return */
1847 	vol->free_clusters = ntfs_attr_get_free_bits(vol->lcnbmp_na);
1848 	if (vol->free_clusters < 0) {
1849 		ntfs_log_perror("Failed to read NTFS $Bitmap");
1850 	} else {
1851 		na = vol->mftbmp_na;
1852 		vol->free_mft_records = ntfs_attr_get_free_bits(na);
1853 
1854 		if (vol->free_mft_records >= 0)
1855 			vol->free_mft_records += (na->allocated_size - na->data_size) << 3;
1856 
1857 		if (vol->free_mft_records < 0)
1858 			ntfs_log_perror("Failed to calculate free MFT records");
1859 		else
1860 			ret = 0;
1861 	}
1862 	return (ret);
1863 }
1864 
1865 /**
1866  * ntfs_volume_rename - change the current label on a volume
1867  * @vol:	volume to change the label on
1868  * @label:	the new label
1869  * @label_len:	the length of @label in ntfschars including the terminating NULL
1870  *		character, which is mandatory (the value can not exceed 128)
1871  *
1872  * Change the label on the volume @vol to @label.
1873  */
1874 int ntfs_volume_rename(ntfs_volume *vol, const ntfschar *label, int label_len)
1875 {
1876 	ntfs_attr *na;
1877 	char *old_vol_name;
1878 	char *new_vol_name = NULL;
1879 	int new_vol_name_len;
1880 	int err;
1881 
1882 	if (NVolReadOnly(vol)) {
1883 		ntfs_log_error("Refusing to change label on read-only mounted "
1884 			"volume.\n");
1885 		errno = EROFS;
1886 		return -1;
1887 	}
1888 
1889 	label_len *= sizeof(ntfschar);
1890 	if (label_len > 0x100) {
1891 		ntfs_log_error("New label is too long. Maximum %u characters "
1892 				"allowed.\n",
1893 				(unsigned)(0x100 / sizeof(ntfschar)));
1894 		errno = ERANGE;
1895 		return -1;
1896 	}
1897 
1898 	na = ntfs_attr_open(vol->vol_ni, AT_VOLUME_NAME, AT_UNNAMED, 0);
1899 	if (!na) {
1900 		if (errno != ENOENT) {
1901 			err = errno;
1902 			ntfs_log_perror("Lookup of $VOLUME_NAME attribute "
1903 				"failed");
1904 			goto err_out;
1905 		}
1906 
1907 		/* The volume name attribute does not exist.  Need to add it. */
1908 		if (ntfs_attr_add(vol->vol_ni, AT_VOLUME_NAME, AT_UNNAMED, 0,
1909 			(const u8*) label, label_len))
1910 		{
1911 			err = errno;
1912 			ntfs_log_perror("Encountered error while adding "
1913 				"$VOLUME_NAME attribute");
1914 			goto err_out;
1915 		}
1916 	}
1917 	else {
1918 		s64 written;
1919 
1920 		if (NAttrNonResident(na)) {
1921 			err = errno;
1922 			ntfs_log_error("Error: Attribute $VOLUME_NAME must be "
1923 					"resident.\n");
1924 			goto err_out;
1925 		}
1926 
1927 		if (na->data_size != label_len) {
1928 			if (ntfs_attr_truncate(na, label_len)) {
1929 				err = errno;
1930 				ntfs_log_perror("Error resizing resident "
1931 					"attribute");
1932 				goto err_out;
1933 			}
1934 		}
1935 
1936 		if (label_len) {
1937 			written = ntfs_attr_pwrite(na, 0, label_len, label);
1938 			if (written == -1) {
1939 				err = errno;
1940 				ntfs_log_perror("Error when writing "
1941 					"$VOLUME_NAME data");
1942 				goto err_out;
1943 			}
1944 			else if (written != label_len) {
1945 				err = EIO;
1946 				ntfs_log_error("Partial write when writing "
1947 					"$VOLUME_NAME data.");
1948 				goto err_out;
1949 
1950 			}
1951 		}
1952 	}
1953 
1954 	new_vol_name_len =
1955 		ntfs_ucstombs(label, label_len, &new_vol_name, 0);
1956 	if (new_vol_name_len == -1) {
1957 		err = errno;
1958 		ntfs_log_perror("Error while decoding new volume name");
1959 		goto err_out;
1960 	}
1961 
1962 	old_vol_name = vol->vol_name;
1963 	vol->vol_name = new_vol_name;
1964 	free(old_vol_name);
1965 
1966 	err = 0;
1967 err_out:
1968 	if (na)
1969 		ntfs_attr_close(na);
1970 	if (err)
1971 		errno = err;
1972 	return err ? -1 : 0;
1973 }
1974