1 /** 2 * inode.c - Inode handling code. Originated from the Linux-NTFS project. 3 * 4 * Copyright (c) 2002-2005 Anton Altaparmakov 5 * Copyright (c) 2002-2008 Szabolcs Szakacsits 6 * Copyright (c) 2004-2007 Yura Pakhuchiy 7 * Copyright (c) 2004-2005 Richard Russon 8 * Copyright (c) 2009-2010 Jean-Pierre Andre 9 * 10 * This program/include file is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License as published 12 * by the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program/include file is distributed in the hope that it will be 16 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 17 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program (in the main directory of the NTFS-3G 22 * distribution in the file COPYING); if not, write to the Free Software 23 * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 24 */ 25 26 #ifdef HAVE_CONFIG_H 27 #include "config.h" 28 #endif 29 30 #ifdef HAVE_STDLIB_H 31 #include <stdlib.h> 32 #endif 33 #ifdef HAVE_STRING_H 34 #include <string.h> 35 #endif 36 #ifdef HAVE_ERRNO_H 37 #include <errno.h> 38 #endif 39 40 #ifdef __HAIKU__ 41 #include <KernelExport.h> 42 #endif 43 44 #include "param.h" 45 #include "compat.h" 46 #include "types.h" 47 #include "volume.h" 48 #include "cache.h" 49 #include "inode.h" 50 #include "attrib.h" 51 #include "debug.h" 52 #include "mft.h" 53 #include "attrlist.h" 54 #include "runlist.h" 55 #include "lcnalloc.h" 56 #include "index.h" 57 #include "dir.h" 58 #include "ntfstime.h" 59 #include "logging.h" 60 #include "misc.h" 61 #include "xattrs.h" 62 63 ntfs_inode *ntfs_inode_base(ntfs_inode *ni) 64 { 65 if (ni->nr_extents == -1) 66 return ni->base_ni; 67 return ni; 68 } 69 70 /** 71 * ntfs_inode_mark_dirty - set the inode (and its base inode if it exists) dirty 72 * @ni: ntfs inode to set dirty 73 * 74 * Set the inode @ni dirty so it is written out later (at the latest at 75 * ntfs_inode_close() time). If @ni is an extent inode, set the base inode 76 * dirty, too. 77 * 78 * This function cannot fail. 79 */ 80 void ntfs_inode_mark_dirty(ntfs_inode *ni) 81 { 82 NInoSetDirty(ni); 83 if (ni->nr_extents == -1) 84 NInoSetDirty(ni->base_ni); 85 } 86 87 /** 88 * __ntfs_inode_allocate - Create and initialise an NTFS inode object 89 * @vol: 90 * 91 * Description... 92 * 93 * Returns: 94 */ 95 static ntfs_inode *__ntfs_inode_allocate(ntfs_volume *vol) 96 { 97 ntfs_inode *ni; 98 99 ni = (ntfs_inode*)ntfs_calloc(sizeof(ntfs_inode)); 100 if (ni) 101 ni->vol = vol; 102 return ni; 103 } 104 105 /** 106 * ntfs_inode_allocate - Create an NTFS inode object 107 * @vol: 108 * 109 * Description... 110 * 111 * Returns: 112 */ 113 ntfs_inode *ntfs_inode_allocate(ntfs_volume *vol) 114 { 115 return __ntfs_inode_allocate(vol); 116 } 117 118 /** 119 * __ntfs_inode_release - Destroy an NTFS inode object 120 * @ni: 121 * 122 * Description... 123 * 124 * Returns: 125 */ 126 static void __ntfs_inode_release(ntfs_inode *ni) 127 { 128 if (NInoDirty(ni)) 129 ntfs_log_error("Releasing dirty inode %lld!\n", 130 (long long)ni->mft_no); 131 if (NInoAttrList(ni) && ni->attr_list) 132 free(ni->attr_list); 133 free(ni->mrec); 134 free(ni); 135 return; 136 } 137 138 /** 139 * ntfs_inode_open - open an inode ready for access 140 * @vol: volume to get the inode from 141 * @mref: inode number / mft record number to open 142 * 143 * Allocate an ntfs_inode structure and initialize it for the given inode 144 * specified by @mref. @mref specifies the inode number / mft record to read, 145 * including the sequence number, which can be 0 if no sequence number checking 146 * is to be performed. 147 * 148 * Then, allocate a buffer for the mft record, read the mft record from the 149 * volume @vol, and attach it to the ntfs_inode structure (->mrec). The 150 * mft record is mst deprotected and sanity checked for validity and we abort 151 * if deprotection or checks fail. 152 * 153 * Finally, search for an attribute list attribute in the mft record and if one 154 * is found, load the attribute list attribute value and attach it to the 155 * ntfs_inode structure (->attr_list). Also set the NI_AttrList bit to indicate 156 * this. 157 * 158 * Return a pointer to the ntfs_inode structure on success or NULL on error, 159 * with errno set to the error code. 160 */ 161 static ntfs_inode *ntfs_inode_real_open(ntfs_volume *vol, const MFT_REF mref) 162 { 163 s64 l; 164 ntfs_inode *ni = NULL; 165 ntfs_attr_search_ctx *ctx; 166 STANDARD_INFORMATION *std_info; 167 le32 lthle; 168 int olderrno; 169 170 ntfs_log_enter("Entering for inode %lld\n", (long long)MREF(mref)); 171 if (!vol) { 172 errno = EINVAL; 173 goto out; 174 } 175 ni = __ntfs_inode_allocate(vol); 176 if (!ni) 177 goto out; 178 if (ntfs_file_record_read(vol, mref, &ni->mrec, NULL)) 179 goto err_out; 180 if (!(ni->mrec->flags & MFT_RECORD_IN_USE)) { 181 errno = ENOENT; 182 goto err_out; 183 } 184 ni->mft_no = MREF(mref); 185 ctx = ntfs_attr_get_search_ctx(ni, NULL); 186 if (!ctx) 187 goto err_out; 188 /* Receive some basic information about inode. */ 189 if (ntfs_attr_lookup(AT_STANDARD_INFORMATION, AT_UNNAMED, 190 0, CASE_SENSITIVE, 0, NULL, 0, ctx)) { 191 if (!ni->mrec->base_mft_record) 192 ntfs_log_perror("No STANDARD_INFORMATION in base record" 193 " %lld", (long long)MREF(mref)); 194 goto put_err_out; 195 } 196 lthle = ctx->attr->value_length; 197 if (le32_to_cpu(lthle) < offsetof(STANDARD_INFORMATION, owner_id)) { 198 ntfs_log_error("Corrupt STANDARD_INFORMATION in base" 199 " record %lld\n", 200 (long long)MREF(mref)); 201 goto put_err_out; 202 } 203 std_info = (STANDARD_INFORMATION *)((u8 *)ctx->attr + 204 le16_to_cpu(ctx->attr->value_offset)); 205 ni->flags = std_info->file_attributes; 206 ni->creation_time = std_info->creation_time; 207 ni->last_data_change_time = std_info->last_data_change_time; 208 ni->last_mft_change_time = std_info->last_mft_change_time; 209 ni->last_access_time = std_info->last_access_time; 210 /* Insert v3 extensions if present */ 211 /* length may be seen as 48 (v1.x) or 72 (v3.x) */ 212 if (le32_to_cpu(lthle) >= offsetof(STANDARD_INFORMATION, v3_end)) { 213 set_nino_flag(ni, v3_Extensions); 214 ni->owner_id = std_info->owner_id; 215 ni->security_id = std_info->security_id; 216 ni->quota_charged = std_info->quota_charged; 217 ni->usn = std_info->usn; 218 } else { 219 clear_nino_flag(ni, v3_Extensions); 220 ni->owner_id = const_cpu_to_le32(0); 221 ni->security_id = const_cpu_to_le32(0); 222 } 223 /* Set attribute list information. */ 224 olderrno = errno; 225 if (ntfs_attr_lookup(AT_ATTRIBUTE_LIST, AT_UNNAMED, 0, 226 CASE_SENSITIVE, 0, NULL, 0, ctx)) { 227 if (errno != ENOENT) 228 goto put_err_out; 229 /* Attribute list attribute does not present. */ 230 /* restore previous errno to avoid misinterpretation */ 231 errno = olderrno; 232 goto get_size; 233 } 234 NInoSetAttrList(ni); 235 l = ntfs_get_attribute_value_length(ctx->attr); 236 if (!l) 237 goto put_err_out; 238 if ((u64)l > 0x40000) { 239 errno = EIO; 240 ntfs_log_perror("Too large attrlist attribute (%llu), inode " 241 "%lld", (long long)l, (long long)MREF(mref)); 242 goto put_err_out; 243 } 244 ni->attr_list_size = l; 245 ni->attr_list = ntfs_malloc(ni->attr_list_size); 246 if (!ni->attr_list) 247 goto put_err_out; 248 l = ntfs_get_attribute_value(vol, ctx->attr, ni->attr_list); 249 if (!l) 250 goto put_err_out; 251 if (l != ni->attr_list_size) { 252 errno = EIO; 253 ntfs_log_perror("Unexpected attrlist size (%lld <> %u), inode " 254 "%lld", (long long)l, ni->attr_list_size, 255 (long long)MREF(mref)); 256 goto put_err_out; 257 } 258 get_size: 259 olderrno = errno; 260 if (ntfs_attr_lookup(AT_DATA, AT_UNNAMED, 0, 0, 0, NULL, 0, ctx)) { 261 if (errno != ENOENT) 262 goto put_err_out; 263 /* Directory or special file. */ 264 /* restore previous errno to avoid misinterpretation */ 265 errno = olderrno; 266 ni->data_size = ni->allocated_size = 0; 267 } else { 268 if (ctx->attr->non_resident) { 269 ni->data_size = sle64_to_cpu(ctx->attr->data_size); 270 if (ctx->attr->flags & 271 (ATTR_IS_COMPRESSED | ATTR_IS_SPARSE)) 272 ni->allocated_size = sle64_to_cpu( 273 ctx->attr->compressed_size); 274 else 275 ni->allocated_size = sle64_to_cpu( 276 ctx->attr->allocated_size); 277 } else { 278 ni->data_size = le32_to_cpu(ctx->attr->value_length); 279 ni->allocated_size = (ni->data_size + 7) & ~7; 280 } 281 set_nino_flag(ni,KnownSize); 282 } 283 ntfs_attr_put_search_ctx(ctx); 284 out: 285 ntfs_log_leave("\n"); 286 return ni; 287 288 put_err_out: 289 ntfs_attr_put_search_ctx(ctx); 290 err_out: 291 __ntfs_inode_release(ni); 292 ni = NULL; 293 goto out; 294 } 295 296 /** 297 * ntfs_inode_close - close an ntfs inode and free all associated memory 298 * @ni: ntfs inode to close 299 * 300 * Make sure the ntfs inode @ni is clean. 301 * 302 * If the ntfs inode @ni is a base inode, close all associated extent inodes, 303 * then deallocate all memory attached to it, and finally free the ntfs inode 304 * structure itself. 305 * 306 * If it is an extent inode, we disconnect it from its base inode before we 307 * destroy it. 308 * 309 * It is OK to pass NULL to this function, it is just noop in this case. 310 * 311 * Return 0 on success or -1 on error with errno set to the error code. On 312 * error, @ni has not been freed. The user should attempt to handle the error 313 * and call ntfs_inode_close() again. The following error codes are defined: 314 * 315 * EBUSY @ni and/or its attribute list runlist is/are dirty and the 316 * attempt to write it/them to disk failed. 317 * EINVAL @ni is invalid (probably it is an extent inode). 318 * EIO I/O error while trying to write inode to disk. 319 */ 320 321 int ntfs_inode_real_close(ntfs_inode *ni) 322 { 323 int ret = -1; 324 325 if (!ni) 326 return 0; 327 328 ntfs_log_enter("Entering for inode %lld\n", (long long)ni->mft_no); 329 330 /* If we have dirty metadata, write it out. */ 331 if (NInoDirty(ni) || NInoAttrListDirty(ni)) { 332 if (ntfs_inode_sync(ni)) { 333 if (errno != EIO) 334 errno = EBUSY; 335 goto err; 336 } 337 } 338 /* Is this a base inode with mapped extent inodes? */ 339 if (ni->nr_extents > 0) { 340 while (ni->nr_extents > 0) { 341 if (ntfs_inode_real_close(ni->extent_nis[0])) { 342 if (errno != EIO) 343 errno = EBUSY; 344 goto err; 345 } 346 } 347 } else if (ni->nr_extents == -1) { 348 ntfs_inode **tmp_nis; 349 ntfs_inode *base_ni; 350 s32 i; 351 352 /* 353 * If the inode is an extent inode, disconnect it from the 354 * base inode before destroying it. 355 */ 356 base_ni = ni->base_ni; 357 for (i = 0; i < base_ni->nr_extents; ++i) { 358 tmp_nis = base_ni->extent_nis; 359 if (tmp_nis[i] != ni) 360 continue; 361 /* Found it. Disconnect. */ 362 memmove(tmp_nis + i, tmp_nis + i + 1, 363 (base_ni->nr_extents - i - 1) * 364 sizeof(ntfs_inode *)); 365 /* Buffer should be for multiple of four extents. */ 366 if ((--base_ni->nr_extents) & 3) { 367 i = -1; 368 break; 369 } 370 /* 371 * ElectricFence is unhappy with realloc(x,0) as free(x) 372 * thus we explicitly separate these two cases. 373 */ 374 if (base_ni->nr_extents) { 375 /* Resize the memory buffer. */ 376 tmp_nis = realloc(tmp_nis, base_ni->nr_extents * 377 sizeof(ntfs_inode *)); 378 /* Ignore errors, they don't really matter. */ 379 if (tmp_nis) 380 base_ni->extent_nis = tmp_nis; 381 } else if (tmp_nis) { 382 free(tmp_nis); 383 base_ni->extent_nis = (ntfs_inode**)NULL; 384 } 385 /* Allow for error checking. */ 386 i = -1; 387 break; 388 } 389 390 /* 391 * We could successfully sync, so only log this error 392 * and try to sync other inode extents too. 393 */ 394 if (i != -1) 395 ntfs_log_error("Extent inode %lld was not found\n", 396 (long long)ni->mft_no); 397 } 398 399 __ntfs_inode_release(ni); 400 ret = 0; 401 err: 402 ntfs_log_leave("\n"); 403 return ret; 404 } 405 406 #if CACHE_NIDATA_SIZE 407 408 /* 409 * Free an inode structure when there is not more space 410 * in the cache 411 */ 412 413 void ntfs_inode_nidata_free(const struct CACHED_GENERIC *cached) 414 { 415 ntfs_inode_real_close(((const struct CACHED_NIDATA*)cached)->ni); 416 } 417 418 /* 419 * Compute a hash value for an inode entry 420 */ 421 422 int ntfs_inode_nidata_hash(const struct CACHED_GENERIC *item) 423 { 424 return (((const struct CACHED_NIDATA*)item)->inum 425 % (2*CACHE_NIDATA_SIZE)); 426 } 427 428 /* 429 * inum comparing for entering/fetching from cache 430 */ 431 432 static int idata_cache_compare(const struct CACHED_GENERIC *cached, 433 const struct CACHED_GENERIC *wanted) 434 { 435 return (((const struct CACHED_NIDATA*)cached)->inum 436 != ((const struct CACHED_NIDATA*)wanted)->inum); 437 } 438 439 /* 440 * Invalidate an inode entry when not needed anymore. 441 * The entry should have been synced, it may be reused later, 442 * if it is requested before it is dropped from cache. 443 */ 444 445 void ntfs_inode_invalidate(ntfs_volume *vol, const MFT_REF mref) 446 { 447 struct CACHED_NIDATA item; 448 449 item.inum = MREF(mref); 450 item.ni = (ntfs_inode*)NULL; 451 item.pathname = (const char*)NULL; 452 item.varsize = 0; 453 ntfs_invalidate_cache(vol->nidata_cache, 454 GENERIC(&item),idata_cache_compare,CACHE_FREE); 455 } 456 457 #endif 458 459 /* 460 * Open an inode 461 * 462 * When possible, an entry recorded in the cache is reused 463 * 464 * **NEVER REOPEN** an inode, this can lead to a duplicated 465 * cache entry (hard to detect), and to an obsolete one being 466 * reused. System files are however protected from being cached. 467 */ 468 469 ntfs_inode *ntfs_inode_open(ntfs_volume *vol, const MFT_REF mref) 470 { 471 ntfs_inode *ni; 472 #if CACHE_NIDATA_SIZE 473 struct CACHED_NIDATA item; 474 struct CACHED_NIDATA *cached; 475 476 /* fetch idata from cache */ 477 item.inum = MREF(mref); 478 debug_double_inode(item.inum,1); 479 item.pathname = (const char*)NULL; 480 item.varsize = 0; 481 cached = (struct CACHED_NIDATA*)ntfs_fetch_cache(vol->nidata_cache, 482 GENERIC(&item),idata_cache_compare); 483 if (cached) { 484 ni = cached->ni; 485 /* do not keep open entries in cache */ 486 ntfs_remove_cache(vol->nidata_cache, 487 (struct CACHED_GENERIC*)cached,0); 488 } else { 489 ni = ntfs_inode_real_open(vol, mref); 490 } 491 if (!ni) { 492 debug_double_inode(item.inum, 0); 493 } 494 #else 495 ni = ntfs_inode_real_open(vol, mref); 496 #endif 497 return (ni); 498 } 499 500 /* 501 * Close an inode entry 502 * 503 * If cacheing is in use, the entry is synced and kept available 504 * in cache for further use. 505 * 506 * System files (inode < 16 or having the IS_4 flag) are protected 507 * against being cached. 508 */ 509 510 int ntfs_inode_close(ntfs_inode *ni) 511 { 512 int res; 513 #if CACHE_NIDATA_SIZE 514 BOOL dirty; 515 struct CACHED_NIDATA item; 516 517 if (ni) { 518 debug_double_inode(ni->mft_no,0); 519 /* do not cache system files : could lead to double entries */ 520 if (ni->vol && ni->vol->nidata_cache 521 && ((ni->mft_no == FILE_root) 522 || ((ni->mft_no >= FILE_first_user) 523 && !(ni->mrec->flags & MFT_RECORD_IS_4)))) { 524 /* If we have dirty metadata, write it out. */ 525 dirty = NInoDirty(ni) || NInoAttrListDirty(ni); 526 if (dirty) { 527 res = ntfs_inode_sync(ni); 528 /* do a real close if sync failed */ 529 if (res) 530 ntfs_inode_real_close(ni); 531 } else 532 res = 0; 533 534 if (!res) { 535 /* feed idata into cache */ 536 item.inum = ni->mft_no; 537 item.ni = ni; 538 item.pathname = (const char*)NULL; 539 item.varsize = 0; 540 debug_cached_inode(ni); 541 #if defined(__HAIKU__) 542 if (ntfs_fetch_cache(ni->vol->nidata_cache, 543 GENERIC(&item), idata_cache_compare)) { 544 panic("ntfs_inode_close: %llu already in cache!", ni->mft_no); 545 } 546 #endif 547 ntfs_enter_cache(ni->vol->nidata_cache, 548 GENERIC(&item), idata_cache_compare); 549 } 550 } else { 551 /* cache not ready or system file, really close */ 552 res = ntfs_inode_real_close(ni); 553 } 554 } else 555 res = 0; 556 #else 557 res = ntfs_inode_real_close(ni); 558 #endif 559 return (res); 560 } 561 562 /** 563 * ntfs_extent_inode_open - load an extent inode and attach it to its base 564 * @base_ni: base ntfs inode 565 * @mref: mft reference of the extent inode to load (in little endian) 566 * 567 * First check if the extent inode @mref is already attached to the base ntfs 568 * inode @base_ni, and if so, return a pointer to the attached extent inode. 569 * 570 * If the extent inode is not already attached to the base inode, allocate an 571 * ntfs_inode structure and initialize it for the given inode @mref. @mref 572 * specifies the inode number / mft record to read, including the sequence 573 * number, which can be 0 if no sequence number checking is to be performed. 574 * 575 * Then, allocate a buffer for the mft record, read the mft record from the 576 * volume @base_ni->vol, and attach it to the ntfs_inode structure (->mrec). 577 * The mft record is mst deprotected and sanity checked for validity and we 578 * abort if deprotection or checks fail. 579 * 580 * Finally attach the ntfs inode to its base inode @base_ni and return a 581 * pointer to the ntfs_inode structure on success or NULL on error, with errno 582 * set to the error code. 583 * 584 * Note, extent inodes are never closed directly. They are automatically 585 * disposed off by the closing of the base inode. 586 */ 587 ntfs_inode *ntfs_extent_inode_open(ntfs_inode *base_ni, const leMFT_REF mref) 588 { 589 u64 mft_no = MREF_LE(mref); 590 VCN extent_vcn; 591 runlist_element *rl; 592 ntfs_volume *vol; 593 ntfs_inode *ni = NULL; 594 ntfs_inode **extent_nis; 595 int i; 596 597 if (!base_ni) { 598 errno = EINVAL; 599 ntfs_log_perror("%s", __FUNCTION__); 600 return NULL; 601 } 602 603 ntfs_log_enter("Opening extent inode %lld (base mft record %lld).\n", 604 (unsigned long long)mft_no, 605 (unsigned long long)base_ni->mft_no); 606 607 if (!base_ni->mft_no) { 608 /* 609 * When getting extents of MFT, we must be sure 610 * they are in the MFT part which has already 611 * been mapped, otherwise we fall into an endless 612 * recursion. 613 * Situations have been met where extents locations 614 * are described in themselves. 615 * This is a severe error which chkdsk cannot fix. 616 */ 617 vol = base_ni->vol; 618 extent_vcn = mft_no << vol->mft_record_size_bits 619 >> vol->cluster_size_bits; 620 rl = vol->mft_na->rl; 621 if (rl) { 622 while (rl->length 623 && ((rl->vcn + rl->length) <= extent_vcn)) 624 rl++; 625 } 626 if (!rl || (rl->lcn < 0)) { 627 ntfs_log_error("MFT is corrupt, cannot read" 628 " its unmapped extent record %lld\n", 629 (long long)mft_no); 630 ntfs_log_error("Note : chkdsk cannot fix this," 631 " try ntfsfix\n"); 632 errno = EIO; 633 ni = (ntfs_inode*)NULL; 634 goto out; 635 } 636 } 637 638 /* Is the extent inode already open and attached to the base inode? */ 639 if (base_ni->nr_extents > 0) { 640 extent_nis = base_ni->extent_nis; 641 for (i = 0; i < base_ni->nr_extents; i++) { 642 u16 seq_no; 643 644 ni = extent_nis[i]; 645 if (mft_no != ni->mft_no) 646 continue; 647 /* Verify the sequence number if given. */ 648 seq_no = MSEQNO_LE(mref); 649 if (seq_no && seq_no != le16_to_cpu( 650 ni->mrec->sequence_number)) { 651 errno = EIO; 652 ntfs_log_perror("Found stale extent mft " 653 "reference mft=%lld", 654 (long long)ni->mft_no); 655 goto out; 656 } 657 goto out; 658 } 659 } 660 /* Wasn't there, we need to load the extent inode. */ 661 ni = __ntfs_inode_allocate(base_ni->vol); 662 if (!ni) 663 goto out; 664 if (ntfs_file_record_read(base_ni->vol, le64_to_cpu(mref), &ni->mrec, NULL)) 665 goto err_out; 666 ni->mft_no = mft_no; 667 ni->nr_extents = -1; 668 ni->base_ni = base_ni; 669 /* Attach extent inode to base inode, reallocating memory if needed. */ 670 if (!(base_ni->nr_extents & 3)) { 671 i = (base_ni->nr_extents + 4) * sizeof(ntfs_inode *); 672 673 extent_nis = ntfs_malloc(i); 674 if (!extent_nis) 675 goto err_out; 676 if (base_ni->nr_extents) { 677 memcpy(extent_nis, base_ni->extent_nis, 678 i - 4 * sizeof(ntfs_inode *)); 679 free(base_ni->extent_nis); 680 } 681 base_ni->extent_nis = extent_nis; 682 } 683 base_ni->extent_nis[base_ni->nr_extents++] = ni; 684 out: 685 ntfs_log_leave("\n"); 686 return ni; 687 err_out: 688 __ntfs_inode_release(ni); 689 ni = NULL; 690 goto out; 691 } 692 693 /** 694 * ntfs_inode_attach_all_extents - attach all extents for target inode 695 * @ni: opened ntfs inode for which perform attach 696 * 697 * Return 0 on success and -1 on error with errno set to the error code. 698 */ 699 int ntfs_inode_attach_all_extents(ntfs_inode *ni) 700 { 701 ATTR_LIST_ENTRY *ale; 702 u64 prev_attached = 0; 703 704 if (!ni) { 705 ntfs_log_trace("Invalid arguments.\n"); 706 errno = EINVAL; 707 return -1; 708 } 709 710 if (ni->nr_extents == -1) 711 ni = ni->base_ni; 712 713 ntfs_log_trace("Entering for inode 0x%llx.\n", (long long) ni->mft_no); 714 715 /* Inode haven't got attribute list, thus nothing to attach. */ 716 if (!NInoAttrList(ni)) 717 return 0; 718 719 if (!ni->attr_list) { 720 ntfs_log_trace("Corrupt in-memory struct.\n"); 721 errno = EINVAL; 722 return -1; 723 } 724 725 /* Walk through attribute list and attach all extents. */ 726 errno = 0; 727 ale = (ATTR_LIST_ENTRY *)ni->attr_list; 728 while ((u8*)ale < ni->attr_list + ni->attr_list_size) { 729 if (ni->mft_no != MREF_LE(ale->mft_reference) && 730 prev_attached != MREF_LE(ale->mft_reference)) { 731 if (!ntfs_extent_inode_open(ni, ale->mft_reference)) { 732 ntfs_log_trace("Couldn't attach extent inode.\n"); 733 return -1; 734 } 735 prev_attached = MREF_LE(ale->mft_reference); 736 } 737 ale = (ATTR_LIST_ENTRY *)((u8*)ale + le16_to_cpu(ale->length)); 738 } 739 return 0; 740 } 741 742 /** 743 * ntfs_inode_sync_standard_information - update standard information attribute 744 * @ni: ntfs inode to update standard information 745 * 746 * Return 0 on success or -1 on error with errno set to the error code. 747 */ 748 static int ntfs_inode_sync_standard_information(ntfs_inode *ni) 749 { 750 ntfs_attr_search_ctx *ctx; 751 STANDARD_INFORMATION *std_info; 752 u32 lth; 753 le32 lthle; 754 755 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no); 756 757 ctx = ntfs_attr_get_search_ctx(ni, NULL); 758 if (!ctx) 759 return -1; 760 if (ntfs_attr_lookup(AT_STANDARD_INFORMATION, AT_UNNAMED, 761 0, CASE_SENSITIVE, 0, NULL, 0, ctx)) { 762 ntfs_log_perror("Failed to sync standard info (inode %lld)", 763 (long long)ni->mft_no); 764 ntfs_attr_put_search_ctx(ctx); 765 return -1; 766 } 767 std_info = (STANDARD_INFORMATION *)((u8 *)ctx->attr + 768 le16_to_cpu(ctx->attr->value_offset)); 769 std_info->file_attributes = ni->flags; 770 if (!test_nino_flag(ni, TimesSet)) { 771 std_info->creation_time = ni->creation_time; 772 std_info->last_data_change_time = ni->last_data_change_time; 773 std_info->last_mft_change_time = ni->last_mft_change_time; 774 std_info->last_access_time = ni->last_access_time; 775 } 776 777 /* JPA update v3.x extensions, ensuring consistency */ 778 779 lthle = ctx->attr->value_length; 780 lth = le32_to_cpu(lthle); 781 if (test_nino_flag(ni, v3_Extensions) 782 && (lth < offsetof(STANDARD_INFORMATION, v3_end))) 783 ntfs_log_error("bad sync of standard information\n"); 784 785 if (lth >= offsetof(STANDARD_INFORMATION, v3_end)) { 786 std_info->owner_id = ni->owner_id; 787 std_info->security_id = ni->security_id; 788 std_info->quota_charged = ni->quota_charged; 789 std_info->usn = ni->usn; 790 } 791 ntfs_inode_mark_dirty(ctx->ntfs_ino); 792 ntfs_attr_put_search_ctx(ctx); 793 return 0; 794 } 795 796 /** 797 * ntfs_inode_sync_file_name - update FILE_NAME attributes 798 * @ni: ntfs inode to update FILE_NAME attributes 799 * 800 * Update all FILE_NAME attributes for inode @ni in the index. 801 * 802 * Return 0 on success or -1 on error with errno set to the error code. 803 */ 804 static int ntfs_inode_sync_file_name(ntfs_inode *ni, ntfs_inode *dir_ni) 805 { 806 ntfs_attr_search_ctx *ctx = NULL; 807 ntfs_index_context *ictx; 808 ntfs_inode *index_ni; 809 FILE_NAME_ATTR *fn; 810 FILE_NAME_ATTR *fnx; 811 REPARSE_POINT *rpp; 812 le32 reparse_tag; 813 int err = 0; 814 815 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no); 816 817 ctx = ntfs_attr_get_search_ctx(ni, NULL); 818 if (!ctx) { 819 err = errno; 820 goto err_out; 821 } 822 /* Collect the reparse tag, if any */ 823 reparse_tag = const_cpu_to_le32(0); 824 if (ni->flags & FILE_ATTR_REPARSE_POINT) { 825 if (!ntfs_attr_lookup(AT_REPARSE_POINT, NULL, 826 0, CASE_SENSITIVE, 0, NULL, 0, ctx)) { 827 rpp = (REPARSE_POINT*)((u8 *)ctx->attr + 828 le16_to_cpu(ctx->attr->value_offset)); 829 reparse_tag = rpp->reparse_tag; 830 } 831 ntfs_attr_reinit_search_ctx(ctx); 832 } 833 /* Walk through all FILE_NAME attributes and update them. */ 834 while (!ntfs_attr_lookup(AT_FILE_NAME, NULL, 0, 0, 0, NULL, 0, ctx)) { 835 fn = (FILE_NAME_ATTR *)((u8 *)ctx->attr + 836 le16_to_cpu(ctx->attr->value_offset)); 837 if (MREF_LE(fn->parent_directory) == ni->mft_no) { 838 /* 839 * WARNING: We cheat here and obtain 2 attribute 840 * search contexts for one inode (first we obtained 841 * above, second will be obtained inside 842 * ntfs_index_lookup), it's acceptable for library, 843 * but will deadlock in the kernel. 844 */ 845 index_ni = ni; 846 } else 847 if (dir_ni) 848 index_ni = dir_ni; 849 else 850 index_ni = ntfs_inode_open(ni->vol, 851 le64_to_cpu(fn->parent_directory)); 852 if (!index_ni) { 853 if (!err) 854 err = errno; 855 ntfs_log_perror("Failed to open inode %lld with index", 856 (long long)MREF_LE(fn->parent_directory)); 857 continue; 858 } 859 ictx = ntfs_index_ctx_get(index_ni, NTFS_INDEX_I30, 4); 860 if (!ictx) { 861 if (!err) 862 err = errno; 863 ntfs_log_perror("Failed to get index ctx, inode %lld", 864 (long long)index_ni->mft_no); 865 if ((ni != index_ni) && !dir_ni 866 && ntfs_inode_close(index_ni) && !err) 867 err = errno; 868 continue; 869 } 870 if (ntfs_index_lookup(fn, sizeof(FILE_NAME_ATTR), ictx)) { 871 if (!err) { 872 if (errno == ENOENT) 873 err = EIO; 874 else 875 err = errno; 876 } 877 ntfs_log_perror("Index lookup failed, inode %lld", 878 (long long)index_ni->mft_no); 879 ntfs_index_ctx_put(ictx); 880 if (ni != index_ni && ntfs_inode_close(index_ni) && !err) 881 err = errno; 882 continue; 883 } 884 /* Update flags and file size. */ 885 fnx = (FILE_NAME_ATTR *)ictx->data; 886 fnx->file_attributes = 887 (fnx->file_attributes & ~FILE_ATTR_VALID_FLAGS) | 888 (ni->flags & FILE_ATTR_VALID_FLAGS); 889 if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) 890 fnx->data_size = fnx->allocated_size 891 = const_cpu_to_sle64(0); 892 else { 893 fnx->allocated_size = cpu_to_sle64(ni->allocated_size); 894 fnx->data_size = cpu_to_sle64(ni->data_size); 895 /* 896 * The file name record has also to be fixed if some 897 * attribute update implied the unnamed data to be 898 * made non-resident 899 */ 900 fn->allocated_size = fnx->allocated_size; 901 } 902 /* update or clear the reparse tag in the index */ 903 fnx->reparse_point_tag = reparse_tag; 904 if (!test_nino_flag(ni, TimesSet)) { 905 fnx->creation_time = ni->creation_time; 906 fnx->last_data_change_time = ni->last_data_change_time; 907 fnx->last_mft_change_time = ni->last_mft_change_time; 908 fnx->last_access_time = ni->last_access_time; 909 } else { 910 fnx->creation_time = fn->creation_time; 911 fnx->last_data_change_time = fn->last_data_change_time; 912 fnx->last_mft_change_time = fn->last_mft_change_time; 913 fnx->last_access_time = fn->last_access_time; 914 } 915 ntfs_index_entry_mark_dirty(ictx); 916 ntfs_index_ctx_put(ictx); 917 if ((ni != index_ni) && !dir_ni 918 && ntfs_inode_close(index_ni) && !err) 919 err = errno; 920 } 921 /* Check for real error occurred. */ 922 if (errno != ENOENT) { 923 err = errno; 924 ntfs_log_perror("Attribute lookup failed, inode %lld", 925 (long long)ni->mft_no); 926 goto err_out; 927 } 928 ntfs_attr_put_search_ctx(ctx); 929 if (err) { 930 errno = err; 931 return -1; 932 } 933 return 0; 934 err_out: 935 if (ctx) 936 ntfs_attr_put_search_ctx(ctx); 937 errno = err; 938 return -1; 939 } 940 941 /** 942 * ntfs_inode_sync - write the inode (and its dirty extents) to disk 943 * @ni: ntfs inode to write 944 * 945 * Write the inode @ni to disk as well as its dirty extent inodes if such 946 * exist and @ni is a base inode. If @ni is an extent inode, only @ni is 947 * written completely disregarding its base inode and any other extent inodes. 948 * 949 * For a base inode with dirty extent inodes if any writes fail for whatever 950 * reason, the failing inode is skipped and the sync process is continued. At 951 * the end the error condition that brought about the failure is returned. Thus 952 * the smallest amount of data loss possible occurs. 953 * 954 * Return 0 on success or -1 on error with errno set to the error code. 955 * The following error codes are defined: 956 * EINVAL - Invalid arguments were passed to the function. 957 * EBUSY - Inode and/or one of its extents is busy, try again later. 958 * EIO - I/O error while writing the inode (or one of its extents). 959 */ 960 static int ntfs_inode_sync_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni) 961 { 962 int ret = 0; 963 int err = 0; 964 if (!ni) { 965 errno = EINVAL; 966 ntfs_log_error("Failed to sync NULL inode\n"); 967 return -1; 968 } 969 970 ntfs_log_enter("Entering for inode %lld\n", (long long)ni->mft_no); 971 972 /* Update STANDARD_INFORMATION. */ 973 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 && 974 ntfs_inode_sync_standard_information(ni)) { 975 if (!err || errno == EIO) { 976 err = errno; 977 if (err != EIO) 978 err = EBUSY; 979 } 980 } 981 982 /* Update FILE_NAME's in the index. */ 983 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 && 984 NInoFileNameTestAndClearDirty(ni) && 985 ntfs_inode_sync_file_name(ni, dir_ni)) { 986 if (!err || errno == EIO) { 987 err = errno; 988 if (err != EIO) 989 err = EBUSY; 990 } 991 ntfs_log_perror("Failed to sync FILE_NAME (inode %lld)", 992 (long long)ni->mft_no); 993 NInoFileNameSetDirty(ni); 994 } 995 996 /* Write out attribute list from cache to disk. */ 997 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 && 998 NInoAttrList(ni) && NInoAttrListTestAndClearDirty(ni)) { 999 ntfs_attr *na; 1000 1001 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0); 1002 if (!na) { 1003 if (!err || errno == EIO) { 1004 err = errno; 1005 if (err != EIO) 1006 err = EBUSY; 1007 ntfs_log_perror("Attribute list sync failed " 1008 "(open, inode %lld)", 1009 (long long)ni->mft_no); 1010 } 1011 NInoAttrListSetDirty(ni); 1012 goto sync_inode; 1013 } 1014 1015 if (na->data_size == ni->attr_list_size) { 1016 if (ntfs_attr_pwrite(na, 0, ni->attr_list_size, 1017 ni->attr_list) != ni->attr_list_size) { 1018 if (!err || errno == EIO) { 1019 err = errno; 1020 if (err != EIO) 1021 err = EBUSY; 1022 ntfs_log_perror("Attribute list sync " 1023 "failed (write, inode %lld)", 1024 (long long)ni->mft_no); 1025 } 1026 NInoAttrListSetDirty(ni); 1027 } 1028 } else { 1029 err = EIO; 1030 ntfs_log_error("Attribute list sync failed (bad size, " 1031 "inode %lld)\n", (long long)ni->mft_no); 1032 NInoAttrListSetDirty(ni); 1033 } 1034 ntfs_attr_close(na); 1035 } 1036 1037 sync_inode: 1038 /* Write this inode out to the $MFT (and $MFTMirr if applicable). */ 1039 if (NInoTestAndClearDirty(ni)) { 1040 if (ntfs_mft_record_write(ni->vol, ni->mft_no, ni->mrec)) { 1041 if (!err || errno == EIO) { 1042 err = errno; 1043 if (err != EIO) 1044 err = EBUSY; 1045 } 1046 NInoSetDirty(ni); 1047 ntfs_log_perror("MFT record sync failed, inode %lld", 1048 (long long)ni->mft_no); 1049 } 1050 } 1051 1052 /* If this is a base inode with extents write all dirty extents, too. */ 1053 if (ni->nr_extents > 0) { 1054 s32 i; 1055 1056 for (i = 0; i < ni->nr_extents; ++i) { 1057 ntfs_inode *eni; 1058 1059 eni = ni->extent_nis[i]; 1060 if (!NInoTestAndClearDirty(eni)) 1061 continue; 1062 1063 if (ntfs_mft_record_write(eni->vol, eni->mft_no, 1064 eni->mrec)) { 1065 if (!err || errno == EIO) { 1066 err = errno; 1067 if (err != EIO) 1068 err = EBUSY; 1069 } 1070 NInoSetDirty(eni); 1071 ntfs_log_perror("Extent MFT record sync failed," 1072 " inode %lld/%lld", 1073 (long long)ni->mft_no, 1074 (long long)eni->mft_no); 1075 } 1076 } 1077 } 1078 1079 if (err) { 1080 errno = err; 1081 ret = -1; 1082 } 1083 1084 ntfs_log_leave("\n"); 1085 return ret; 1086 } 1087 1088 int ntfs_inode_sync(ntfs_inode *ni) 1089 { 1090 return (ntfs_inode_sync_in_dir(ni, (ntfs_inode*)NULL)); 1091 } 1092 1093 /* 1094 * Close an inode with an open parent inode 1095 */ 1096 1097 int ntfs_inode_close_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni) 1098 { 1099 int res; 1100 1101 res = ntfs_inode_sync_in_dir(ni, dir_ni); 1102 if (res) { 1103 if (errno != EIO) 1104 errno = EBUSY; 1105 } else 1106 res = ntfs_inode_close(ni); 1107 return (res); 1108 } 1109 1110 /** 1111 * ntfs_inode_add_attrlist - add attribute list to inode and fill it 1112 * @ni: opened ntfs inode to which add attribute list 1113 * 1114 * Return 0 on success or -1 on error with errno set to the error code. 1115 * The following error codes are defined: 1116 * EINVAL - Invalid arguments were passed to the function. 1117 * EEXIST - Attribute list already exist. 1118 * EIO - Input/Ouput error occurred. 1119 * ENOMEM - Not enough memory to perform add. 1120 */ 1121 int ntfs_inode_add_attrlist(ntfs_inode *ni) 1122 { 1123 int err; 1124 ntfs_attr_search_ctx *ctx; 1125 u8 *al = NULL, *aln; 1126 int al_len = 0; 1127 ATTR_LIST_ENTRY *ale = NULL; 1128 ntfs_attr *na; 1129 1130 if (!ni) { 1131 errno = EINVAL; 1132 ntfs_log_perror("%s", __FUNCTION__); 1133 return -1; 1134 } 1135 1136 ntfs_log_trace("inode %llu\n", (unsigned long long) ni->mft_no); 1137 1138 if (NInoAttrList(ni) || ni->nr_extents) { 1139 errno = EEXIST; 1140 ntfs_log_perror("Inode already has attribute list"); 1141 return -1; 1142 } 1143 1144 /* Form attribute list. */ 1145 ctx = ntfs_attr_get_search_ctx(ni, NULL); 1146 if (!ctx) { 1147 err = errno; 1148 goto err_out; 1149 } 1150 /* Walk through all attributes. */ 1151 while (!ntfs_attr_lookup(AT_UNUSED, NULL, 0, 0, 0, NULL, 0, ctx)) { 1152 1153 int ale_size; 1154 1155 if (ctx->attr->type == AT_ATTRIBUTE_LIST) { 1156 err = EIO; 1157 ntfs_log_perror("Attribute list already present"); 1158 goto put_err_out; 1159 } 1160 1161 ale_size = (sizeof(ATTR_LIST_ENTRY) + sizeof(ntfschar) * 1162 ctx->attr->name_length + 7) & ~7; 1163 al_len += ale_size; 1164 1165 aln = realloc(al, al_len); 1166 if (!aln) { 1167 err = errno; 1168 ntfs_log_perror("Failed to realloc %d bytes", al_len); 1169 goto put_err_out; 1170 } 1171 ale = (ATTR_LIST_ENTRY *)(aln + ((u8 *)ale - al)); 1172 al = aln; 1173 1174 memset(ale, 0, ale_size); 1175 1176 /* Add attribute to attribute list. */ 1177 ale->type = ctx->attr->type; 1178 ale->length = cpu_to_le16((sizeof(ATTR_LIST_ENTRY) + 1179 sizeof(ntfschar) * ctx->attr->name_length + 7) & ~7); 1180 ale->name_length = ctx->attr->name_length; 1181 ale->name_offset = (u8 *)ale->name - (u8 *)ale; 1182 if (ctx->attr->non_resident) 1183 ale->lowest_vcn = ctx->attr->lowest_vcn; 1184 else 1185 ale->lowest_vcn = const_cpu_to_sle64(0); 1186 ale->mft_reference = MK_LE_MREF(ni->mft_no, 1187 le16_to_cpu(ni->mrec->sequence_number)); 1188 ale->instance = ctx->attr->instance; 1189 memcpy(ale->name, (u8 *)ctx->attr + 1190 le16_to_cpu(ctx->attr->name_offset), 1191 ctx->attr->name_length * sizeof(ntfschar)); 1192 ale = (ATTR_LIST_ENTRY *)(al + al_len); 1193 } 1194 /* Check for real error occurred. */ 1195 if (errno != ENOENT) { 1196 err = errno; 1197 ntfs_log_perror("%s: Attribute lookup failed, inode %lld", 1198 __FUNCTION__, (long long)ni->mft_no); 1199 goto put_err_out; 1200 } 1201 1202 /* Set in-memory attribute list. */ 1203 ni->attr_list = al; 1204 ni->attr_list_size = al_len; 1205 NInoSetAttrList(ni); 1206 NInoAttrListSetDirty(ni); 1207 1208 /* Free space if there is not enough it for $ATTRIBUTE_LIST. */ 1209 if (le32_to_cpu(ni->mrec->bytes_allocated) - 1210 le32_to_cpu(ni->mrec->bytes_in_use) < 1211 offsetof(ATTR_RECORD, resident_end)) { 1212 if (ntfs_inode_free_space(ni, 1213 offsetof(ATTR_RECORD, resident_end))) { 1214 /* Failed to free space. */ 1215 err = errno; 1216 ntfs_log_perror("Failed to free space for attrlist"); 1217 goto rollback; 1218 } 1219 } 1220 1221 /* Add $ATTRIBUTE_LIST to mft record. */ 1222 if (ntfs_resident_attr_record_add(ni, 1223 AT_ATTRIBUTE_LIST, NULL, 0, NULL, 0, const_cpu_to_le16(0)) < 0) { 1224 err = errno; 1225 ntfs_log_perror("Couldn't add $ATTRIBUTE_LIST to MFT"); 1226 goto rollback; 1227 } 1228 1229 /* Resize it. */ 1230 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0); 1231 if (!na) { 1232 err = errno; 1233 ntfs_log_perror("Failed to open just added $ATTRIBUTE_LIST"); 1234 goto remove_attrlist_record; 1235 } 1236 if (ntfs_attr_truncate(na, al_len)) { 1237 err = errno; 1238 ntfs_log_perror("Failed to resize just added $ATTRIBUTE_LIST"); 1239 ntfs_attr_close(na); 1240 goto remove_attrlist_record;; 1241 } 1242 1243 ntfs_attr_put_search_ctx(ctx); 1244 ntfs_attr_close(na); 1245 return 0; 1246 1247 remove_attrlist_record: 1248 /* Prevent ntfs_attr_recorm_rm from freeing attribute list. */ 1249 ni->attr_list = NULL; 1250 NInoClearAttrList(ni); 1251 /* Remove $ATTRIBUTE_LIST record. */ 1252 ntfs_attr_reinit_search_ctx(ctx); 1253 if (!ntfs_attr_lookup(AT_ATTRIBUTE_LIST, NULL, 0, 1254 CASE_SENSITIVE, 0, NULL, 0, ctx)) { 1255 if (ntfs_attr_record_rm(ctx)) 1256 ntfs_log_perror("Rollback failed to remove attrlist"); 1257 } else 1258 ntfs_log_perror("Rollback failed to find attrlist"); 1259 /* Setup back in-memory runlist. */ 1260 ni->attr_list = al; 1261 ni->attr_list_size = al_len; 1262 NInoSetAttrList(ni); 1263 rollback: 1264 /* 1265 * Scan attribute list for attributes that placed not in the base MFT 1266 * record and move them to it. 1267 */ 1268 ntfs_attr_reinit_search_ctx(ctx); 1269 ale = (ATTR_LIST_ENTRY*)al; 1270 while ((u8*)ale < al + al_len) { 1271 if (MREF_LE(ale->mft_reference) != ni->mft_no) { 1272 if (!ntfs_attr_lookup(ale->type, ale->name, 1273 ale->name_length, 1274 CASE_SENSITIVE, 1275 sle64_to_cpu(ale->lowest_vcn), 1276 NULL, 0, ctx)) { 1277 if (ntfs_attr_record_move_to(ctx, ni)) 1278 ntfs_log_perror("Rollback failed to " 1279 "move attribute"); 1280 } else 1281 ntfs_log_perror("Rollback failed to find attr"); 1282 ntfs_attr_reinit_search_ctx(ctx); 1283 } 1284 ale = (ATTR_LIST_ENTRY*)((u8*)ale + le16_to_cpu(ale->length)); 1285 } 1286 /* Remove in-memory attribute list. */ 1287 ni->attr_list = NULL; 1288 ni->attr_list_size = 0; 1289 NInoClearAttrList(ni); 1290 NInoAttrListClearDirty(ni); 1291 put_err_out: 1292 ntfs_attr_put_search_ctx(ctx); 1293 err_out: 1294 free(al); 1295 errno = err; 1296 return -1; 1297 } 1298 1299 /** 1300 * ntfs_inode_free_space - free space in the MFT record of an inode 1301 * @ni: ntfs inode in which MFT record needs more free space 1302 * @size: amount of space needed to free 1303 * 1304 * Return 0 on success or -1 on error with errno set to the error code. 1305 */ 1306 int ntfs_inode_free_space(ntfs_inode *ni, int size) 1307 { 1308 ntfs_attr_search_ctx *ctx; 1309 int freed; 1310 1311 if (!ni || size < 0) { 1312 errno = EINVAL; 1313 ntfs_log_perror("%s: ni=%p size=%d", __FUNCTION__, ni, size); 1314 return -1; 1315 } 1316 1317 ntfs_log_trace("Entering for inode %lld, size %d\n", 1318 (unsigned long long)ni->mft_no, size); 1319 1320 freed = (le32_to_cpu(ni->mrec->bytes_allocated) - 1321 le32_to_cpu(ni->mrec->bytes_in_use)); 1322 1323 if (size <= freed) 1324 return 0; 1325 1326 ctx = ntfs_attr_get_search_ctx(ni, NULL); 1327 if (!ctx) 1328 return -1; 1329 /* 1330 * $STANDARD_INFORMATION and $ATTRIBUTE_LIST must stay in the base MFT 1331 * record, so position search context on the first attribute after them. 1332 */ 1333 if (ntfs_attr_position(AT_FILE_NAME, ctx)) 1334 goto put_err_out; 1335 1336 while (1) { 1337 int record_size; 1338 /* 1339 * Check whether attribute is from different MFT record. If so, 1340 * find next, because we don't need such. 1341 */ 1342 while (ctx->ntfs_ino->mft_no != ni->mft_no) { 1343 retry: 1344 if (ntfs_attr_position(AT_UNUSED, ctx)) 1345 goto put_err_out; 1346 } 1347 1348 if (ntfs_inode_base(ctx->ntfs_ino)->mft_no == FILE_MFT && 1349 ctx->attr->type == AT_DATA) 1350 goto retry; 1351 1352 if (ctx->attr->type == AT_INDEX_ROOT) 1353 goto retry; 1354 1355 record_size = le32_to_cpu(ctx->attr->length); 1356 1357 if (ntfs_attr_record_move_away(ctx, 0)) { 1358 ntfs_log_perror("Failed to move out attribute #2"); 1359 break; 1360 } 1361 freed += record_size; 1362 1363 /* Check whether we are done. */ 1364 if (size <= freed) { 1365 ntfs_attr_put_search_ctx(ctx); 1366 return 0; 1367 } 1368 /* 1369 * Reposition to first attribute after $STANDARD_INFORMATION 1370 * and $ATTRIBUTE_LIST instead of simply skipping this attribute 1371 * because in the case when we have got only in-memory attribute 1372 * list then ntfs_attr_lookup will fail when it tries to find 1373 * $ATTRIBUTE_LIST. 1374 */ 1375 ntfs_attr_reinit_search_ctx(ctx); 1376 if (ntfs_attr_position(AT_FILE_NAME, ctx)) 1377 break; 1378 } 1379 put_err_out: 1380 ntfs_attr_put_search_ctx(ctx); 1381 if (errno == ENOSPC) 1382 ntfs_log_trace("No attributes left that could be moved out.\n"); 1383 return -1; 1384 } 1385 1386 /** 1387 * ntfs_inode_update_times - update selected time fields for ntfs inode 1388 * @ni: ntfs inode for which update time fields 1389 * @mask: select which time fields should be updated 1390 * 1391 * This function updates time fields to current time. Fields to update are 1392 * selected using @mask (see enum @ntfs_time_update_flags for posssible values). 1393 */ 1394 void ntfs_inode_update_times(ntfs_inode *ni, ntfs_time_update_flags mask) 1395 { 1396 ntfs_time now; 1397 1398 if (!ni) { 1399 ntfs_log_error("%s(): Invalid arguments.\n", __FUNCTION__); 1400 return; 1401 } 1402 1403 if ((ni->mft_no < FILE_first_user && ni->mft_no != FILE_root) || 1404 NVolReadOnly(ni->vol) || !mask) 1405 return; 1406 1407 now = ntfs_current_time(); 1408 if (mask & NTFS_UPDATE_ATIME) 1409 ni->last_access_time = now; 1410 if (mask & NTFS_UPDATE_MTIME) 1411 ni->last_data_change_time = now; 1412 if (mask & NTFS_UPDATE_CTIME) 1413 ni->last_mft_change_time = now; 1414 1415 NInoFileNameSetDirty(ni); 1416 NInoSetDirty(ni); 1417 } 1418 1419 /** 1420 * ntfs_inode_badclus_bad - check for $Badclus:$Bad data attribute 1421 * @mft_no: mft record number where @attr is present 1422 * @attr: attribute record used to check for the $Bad attribute 1423 * 1424 * Check if the mft record given by @mft_no and @attr contains the bad sector 1425 * list. Please note that mft record numbers describing $Badclus extent inodes 1426 * will not match the current $Badclus:$Bad check. 1427 * 1428 * On success return 1 if the file is $Badclus:$Bad, otherwise return 0. 1429 * On error return -1 with errno set to the error code. 1430 */ 1431 int ntfs_inode_badclus_bad(u64 mft_no, ATTR_RECORD *attr) 1432 { 1433 int len, ret = 0; 1434 ntfschar *ustr; 1435 1436 if (!attr) { 1437 ntfs_log_error("Invalid argument.\n"); 1438 errno = EINVAL; 1439 return -1; 1440 } 1441 1442 if (mft_no != FILE_BadClus) 1443 return 0; 1444 1445 if (attr->type != AT_DATA) 1446 return 0; 1447 1448 if ((ustr = ntfs_str2ucs("$Bad", &len)) == NULL) { 1449 ntfs_log_perror("Couldn't convert '$Bad' to Unicode"); 1450 return -1; 1451 } 1452 1453 if (ustr && ntfs_names_are_equal(ustr, len, 1454 (ntfschar *)((u8 *)attr + le16_to_cpu(attr->name_offset)), 1455 attr->name_length, 0, NULL, 0)) 1456 ret = 1; 1457 1458 ntfs_ucsfree(ustr); 1459 1460 return ret; 1461 } 1462 1463 /* 1464 * Get high precision NTFS times 1465 * 1466 * They are returned in following order : create, update, access, change 1467 * provided they fit in requested size. 1468 * 1469 * Returns the modified size if successfull (or 32 if buffer size is null) 1470 * -errno if failed 1471 */ 1472 1473 int ntfs_inode_get_times(ntfs_inode *ni, char *value, size_t size) 1474 { 1475 ntfs_attr_search_ctx *ctx; 1476 STANDARD_INFORMATION *std_info; 1477 u64 *times; 1478 int ret; 1479 1480 ret = 0; 1481 ctx = ntfs_attr_get_search_ctx(ni, NULL); 1482 if (ctx) { 1483 if (ntfs_attr_lookup(AT_STANDARD_INFORMATION, AT_UNNAMED, 1484 0, CASE_SENSITIVE, 0, NULL, 0, ctx)) { 1485 ntfs_log_perror("Failed to get standard info (inode %lld)", 1486 (long long)ni->mft_no); 1487 } else { 1488 std_info = (STANDARD_INFORMATION *)((u8 *)ctx->attr + 1489 le16_to_cpu(ctx->attr->value_offset)); 1490 if (value && (size >= 8)) { 1491 times = (u64*)value; 1492 times[0] = sle64_to_cpu(std_info->creation_time); 1493 ret = 8; 1494 if (size >= 16) { 1495 times[1] = sle64_to_cpu(std_info->last_data_change_time); 1496 ret = 16; 1497 } 1498 if (size >= 24) { 1499 times[2] = sle64_to_cpu(std_info->last_access_time); 1500 ret = 24; 1501 } 1502 if (size >= 32) { 1503 times[3] = sle64_to_cpu(std_info->last_mft_change_time); 1504 ret = 32; 1505 } 1506 } else 1507 if (!size) 1508 ret = 32; 1509 else 1510 ret = -ERANGE; 1511 } 1512 ntfs_attr_put_search_ctx(ctx); 1513 } 1514 return (ret ? ret : -errno); 1515 } 1516 1517 /* 1518 * Set high precision NTFS times 1519 * 1520 * They are expected in this order : create, update, access 1521 * provided they are present in input. The change time is set to 1522 * current time. 1523 * 1524 * The times are inserted directly in the standard_information and 1525 * file names attributes to avoid manipulating low precision times 1526 * 1527 * Returns 0 if success 1528 * -1 if there were an error (described by errno) 1529 */ 1530 1531 int ntfs_inode_set_times(ntfs_inode *ni, const char *value, size_t size, 1532 int flags) 1533 { 1534 ntfs_attr_search_ctx *ctx; 1535 STANDARD_INFORMATION *std_info; 1536 FILE_NAME_ATTR *fn; 1537 u64 times[4]; 1538 ntfs_time now; 1539 int cnt; 1540 int ret; 1541 1542 ret = -1; 1543 if ((size >= 8) && !(flags & XATTR_CREATE)) { 1544 /* Copy, to avoid alignment issue encountered on ARM */ 1545 memcpy(times, value, 1546 (size < sizeof(times) ? size : sizeof(times))); 1547 now = ntfs_current_time(); 1548 /* update the standard information attribute */ 1549 ctx = ntfs_attr_get_search_ctx(ni, NULL); 1550 if (ctx) { 1551 if (ntfs_attr_lookup(AT_STANDARD_INFORMATION, 1552 AT_UNNAMED, 0, CASE_SENSITIVE, 1553 0, NULL, 0, ctx)) { 1554 ntfs_log_perror("Failed to get standard info (inode %lld)", 1555 (long long)ni->mft_no); 1556 } else { 1557 std_info = (STANDARD_INFORMATION *)((u8 *)ctx->attr + 1558 le16_to_cpu(ctx->attr->value_offset)); 1559 /* 1560 * Mark times set to avoid overwriting 1561 * them when the inode is closed. 1562 * The inode structure must also be updated 1563 * (with loss of precision) because of cacheing. 1564 * TODO : use NTFS precision in inode, and 1565 * return sub-second times in getattr() 1566 */ 1567 set_nino_flag(ni, TimesSet); 1568 std_info->creation_time = cpu_to_sle64(times[0]); 1569 ni->creation_time 1570 = std_info->creation_time; 1571 if (size >= 16) { 1572 std_info->last_data_change_time = cpu_to_sle64(times[1]); 1573 ni->last_data_change_time 1574 = std_info->last_data_change_time; 1575 } 1576 if (size >= 24) { 1577 std_info->last_access_time = cpu_to_sle64(times[2]); 1578 ni->last_access_time 1579 = std_info->last_access_time; 1580 } 1581 std_info->last_mft_change_time = now; 1582 ni->last_mft_change_time = now; 1583 ntfs_inode_mark_dirty(ctx->ntfs_ino); 1584 NInoFileNameSetDirty(ni); 1585 1586 /* update the file names attributes */ 1587 ntfs_attr_reinit_search_ctx(ctx); 1588 cnt = 0; 1589 while (!ntfs_attr_lookup(AT_FILE_NAME, 1590 AT_UNNAMED, 0, CASE_SENSITIVE, 1591 0, NULL, 0, ctx)) { 1592 fn = (FILE_NAME_ATTR*)((u8 *)ctx->attr + 1593 le16_to_cpu(ctx->attr->value_offset)); 1594 fn->creation_time 1595 = cpu_to_sle64(times[0]); 1596 if (size >= 16) 1597 fn->last_data_change_time 1598 = cpu_to_sle64(times[1]); 1599 if (size >= 24) 1600 fn->last_access_time 1601 = cpu_to_sle64(times[2]); 1602 fn->last_mft_change_time = now; 1603 cnt++; 1604 } 1605 if (cnt) 1606 ret = 0; 1607 else { 1608 ntfs_log_perror("Failed to get file names (inode %lld)", 1609 (long long)ni->mft_no); 1610 } 1611 } 1612 ntfs_attr_put_search_ctx(ctx); 1613 } 1614 } else 1615 if (size < 8) 1616 errno = ERANGE; 1617 else 1618 errno = EEXIST; 1619 return (ret); 1620 } 1621