1 /**
   2  * dir.c - Directory handling code. Part of the Linux-NTFS project.
   3  *
   4  * Copyright (c) 2002-2005 Anton Altaparmakov
   5  * Copyright (c) 2005-2007 Yura Pakhuchiy
   6  * Copyright (c) 2004-2005 Richard Russon
   7  *
   8  * This program/include file is free software; you can redistribute it and/or
   9  * modify it under the terms of the GNU General Public License as published
  10  * by the Free Software Foundation; either version 2 of the License, or
  11  * (at your option) any later version.
  12  *
  13  * This program/include file is distributed in the hope that it will be
  14  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  15  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16  * GNU General Public License for more details.
  17  *
  18  * You should have received a copy of the GNU General Public License
  19  * along with this program (in the main directory of the Linux-NTFS
  20  * distribution in the file COPYING); if not, write to the Free Software
  21  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22  */
  23 
  24 #ifdef HAVE_CONFIG_H
  25 #include "config.h"
  26 #endif
  27 
  28 #ifdef HAVE_STDLIB_H
  29 #include <stdlib.h>
  30 #endif
  31 #ifdef HAVE_ERRNO_H
  32 #include <errno.h>
  33 #endif
  34 #ifdef HAVE_STRING_H
  35 #include <string.h>
  36 #endif
  37 #ifdef HAVE_SYS_STAT_H
  38 #include <sys/stat.h>
  39 #endif
  40 
  41 #ifdef HAVE_SYS_SYSMACROS_H
  42 #include <sys/sysmacros.h>
  43 #endif
  44 
  45 #include "compat.h"
  46 #include "types.h"
  47 #include "debug.h"
  48 #include "attrib.h"
  49 #include "inode.h"
  50 #include "dir.h"
  51 #include "volume.h"
  52 #include "mft.h"
  53 #include "index.h"
  54 #include "ntfstime.h"
  55 #include "lcnalloc.h"
  56 #include "logging.h"
  57 
  58 /*
  59  * The little endian Unicode strings "$I30", "$SII", "$SDH", "$O"
  60  *  and "$Q" as global constants.
  61  */
  62 ntfschar NTFS_INDEX_I30[5] = { const_cpu_to_le16('$'), const_cpu_to_le16('I'),
  63                 const_cpu_to_le16('3'), const_cpu_to_le16('0'),
  64                 const_cpu_to_le16('\0') };
  65 ntfschar NTFS_INDEX_SII[5] = { const_cpu_to_le16('$'), const_cpu_to_le16('S'),
  66                 const_cpu_to_le16('I'), const_cpu_to_le16('I'),
  67                 const_cpu_to_le16('\0') };
  68 ntfschar NTFS_INDEX_SDH[5] = { const_cpu_to_le16('$'), const_cpu_to_le16('S'),
  69                 const_cpu_to_le16('D'), const_cpu_to_le16('H'),
  70                 const_cpu_to_le16('\0') };
  71 ntfschar NTFS_INDEX_O[3] = { const_cpu_to_le16('$'), const_cpu_to_le16('O'),
  72                 const_cpu_to_le16('\0') };
  73 ntfschar NTFS_INDEX_Q[3] = { const_cpu_to_le16('$'), const_cpu_to_le16('Q'),
  74                 const_cpu_to_le16('\0') };
  75 ntfschar NTFS_INDEX_R[3] = { const_cpu_to_le16('$'), const_cpu_to_le16('R'),
  76                 const_cpu_to_le16('\0') };
  77 
  78 /**
  79  * ntfs_inode_lookup_by_name - find an inode in a directory given its name
  80  * @dir_ni:     ntfs inode of the directory in which to search for the name
  81  * @uname:      Unicode name for which to search in the directory
  82  * @uname_len:  length of the name @uname in Unicode characters
  83  *
  84  * Look for an inode with name @uname in the directory with inode @dir_ni.
  85  * ntfs_inode_lookup_by_name() walks the contents of the directory looking for
  86  * the Unicode name. If the name is found in the directory, the corresponding
  87  * inode number (>= 0) is returned as a mft reference in cpu format, i.e. it
  88  * is a 64-bit number containing the sequence number.
  89  *
  90  * On error, return -1 with errno set to the error code. If the inode is is not
  91  * found errno is ENOENT.
  92  *
  93  * Note, @uname_len does not include the (optional) terminating NULL character.
  94  *
  95  * Note, we look for a case sensitive match first but we also look for a case
  96  * insensitive match at the same time. If we find a case insensitive match, we
  97  * save that for the case that we don't find an exact match, where we return
  98  * the mft reference of the case insensitive match.
  99  *
 100  * If the volume is mounted with the case sensitive flag set, then we only
 101  * allow exact matches.
 102  */
 103 u64 ntfs_inode_lookup_by_name(ntfs_inode *dir_ni, const ntfschar *uname,
 104                 const int uname_len)
 105 {
 106         VCN vcn;
 107         u64 mref = 0;
 108         s64 br;
 109         ntfs_volume *vol = dir_ni->vol;
 110         ntfs_attr_search_ctx *ctx;
 111         INDEX_ROOT *ir;
 112         INDEX_ENTRY *ie;
 113         INDEX_ALLOCATION *ia;
 114         u8 *index_end;
 115         ntfs_attr *ia_na;
 116         int eo, rc;
 117         u32 index_block_size, index_vcn_size;
 118         u8 index_vcn_size_bits;
 119 
 120         if (!dir_ni || !dir_ni->mrec || !uname || uname_len <= 0) {
 121                 errno = EINVAL;
 122                 return -1;
 123         }
 124 
 125         ctx = ntfs_attr_get_search_ctx(dir_ni, NULL);
 126         if (!ctx)
 127                 return -1;
 128 
 129         /* Find the index root attribute in the mft record. */
 130         if (ntfs_attr_lookup(AT_INDEX_ROOT, NTFS_INDEX_I30, 4, CASE_SENSITIVE,
 131                                 0, NULL, 0, ctx)) {
 132                 ntfs_log_perror("Index root attribute missing in directory "
 133                                 "inode 0x%llx", (unsigned long long)dir_ni->
 134                                 mft_no);
 135                 goto put_err_out;
 136         }
 137         /* Get to the index root value. */
 138         ir = (INDEX_ROOT*)((u8*)ctx->attr +
 139                         le16_to_cpu(ctx->attr->u.res.value_offset));
 140         index_block_size = le32_to_cpu(ir->index_block_size);
 141         if (index_block_size < NTFS_BLOCK_SIZE ||
 142                         index_block_size & (index_block_size - 1)) {
 143                 ntfs_log_debug("Index block size %u is invalid.\n",
 144                                 (unsigned)index_block_size);
 145                 goto put_err_out;
 146         }
 147         index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
 148         /* The first index entry. */
 149         ie = (INDEX_ENTRY*)((u8*)&ir->index +
 150                         le32_to_cpu(ir->index.entries_offset));
 151         /*
 152          * Loop until we exceed valid memory (corruption case) or until we
 153          * reach the last entry.
 154          */
 155         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
 156                 /* Bounds checks. */
 157                 if ((u8*)ie < (u8*)ctx->mrec || (u8*)ie +
 158                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
 159                                 (u8*)ie + le16_to_cpu(ie->key_length) >
 160                                 index_end)
 161                         goto put_err_out;
 162                 /*
 163                  * The last entry cannot contain a name. It can however contain
 164                  * a pointer to a child node in the B+tree so we just break out.
 165                  */
 166                 if (ie->flags & INDEX_ENTRY_END)
 167                         break;
 168                 /*
 169                  * We perform a case sensitive comparison and if that matches
 170                  * we are done and return the mft reference of the inode (i.e.
 171                  * the inode number together with the sequence number for
 172                  * consistency checking). We convert it to cpu format before
 173                  * returning.
 174                  */
 175                 if (ntfs_names_are_equal(uname, uname_len,
 176                                 (ntfschar*)&ie->key.file_name.file_name,
 177                                 ie->key.file_name.file_name_length,
 178                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len)) {
 179 found_it:
 180                         /*
 181                          * We have a perfect match, so we don't need to care
 182                          * about having matched imperfectly before.
 183                          */
 184                         mref = le64_to_cpu(ie->u.indexed_file);
 185                         ntfs_attr_put_search_ctx(ctx);
 186                         return mref;
 187                 }
 188                 /*
 189                  * For a case insensitive mount, we also perform a case
 190                  * insensitive comparison. If the comparison matches, we cache
 191                  * the mft reference in mref. Use first case insensitive match
 192                  * in case if no name matches case sensitive, but several names
 193                  * matches case insensitive.
 194                  */
 195                 if (!mref && !NVolCaseSensitive(vol) &&
 196                                 ntfs_names_are_equal(uname, uname_len,
 197                                 (ntfschar*)&ie->key.file_name.file_name,
 198                                 ie->key.file_name.file_name_length,
 199                                 IGNORE_CASE, vol->upcase, vol->upcase_len))
 200                         mref = le64_to_cpu(ie->u.indexed_file);
 201                 /*
 202                  * Not a perfect match, need to do full blown collation so we
 203                  * know which way in the B+tree we have to go.
 204                  */
 205                 rc = ntfs_names_collate(uname, uname_len,
 206                                 (ntfschar*)&ie->key.file_name.file_name,
 207                                 ie->key.file_name.file_name_length, 1,
 208                                 IGNORE_CASE, vol->upcase, vol->upcase_len);
 209                 /*
 210                  * If uname collates before the name of the current entry, there
 211                  * is definitely no such name in this index but we might need to
 212                  * descend into the B+tree so we just break out of the loop.
 213                  */
 214                 if (rc == -1)
 215                         break;
 216                 /* The names are not equal, continue the search. */
 217                 if (rc)
 218                         continue;
 219                 /*
 220                  * Names match with case insensitive comparison, now try the
 221                  * case sensitive comparison, which is required for proper
 222                  * collation.
 223                  */
 224                 rc = ntfs_names_collate(uname, uname_len,
 225                                 (ntfschar*)&ie->key.file_name.file_name,
 226                                 ie->key.file_name.file_name_length, 1,
 227                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len);
 228                 if (rc == -1)
 229                         break;
 230                 if (rc)
 231                         continue;
 232                 /*
 233                  * Perfect match, this will never happen as the
 234                  * ntfs_are_names_equal() call will have gotten a match but we
 235                  * still treat it correctly.
 236                  */
 237                 goto found_it;
 238         }
 239         /*
 240          * We have finished with this index without success. Check for the
 241          * presence of a child node and if not present return error code
 242          * ENOENT, unless we have got the mft reference of a matching name
 243          * cached in mref in which case return mref.
 244          */
 245         if (!(ie->flags & INDEX_ENTRY_NODE)) {
 246                 ntfs_attr_put_search_ctx(ctx);
 247                 if (mref)
 248                         return mref;
 249                 ntfs_log_debug("Entry not found.\n");
 250                 errno = ENOENT;
 251                 return -1;
 252         } /* Child node present, descend into it. */
 253 
 254         /* Open the index allocation attribute. */
 255         ia_na = ntfs_attr_open(dir_ni, AT_INDEX_ALLOCATION, NTFS_INDEX_I30, 4);
 256         if (!ia_na) {
 257                 ntfs_log_perror("Failed to open index allocation attribute. "
 258                                 "Directory inode 0x%llx is corrupt or driver "
 259                                 "bug", (unsigned long long)dir_ni->mft_no);
 260                 goto put_err_out;
 261         }
 262 
 263         /* Allocate a buffer for the current index block. */
 264         ia = (INDEX_ALLOCATION*)malloc(index_block_size);
 265         if (!ia) {
 266                 ntfs_log_perror("Failed to allocate buffer for index block");
 267                 ntfs_attr_close(ia_na);
 268                 goto put_err_out;
 269         }
 270 
 271         /* Determine the size of a vcn in the directory index. */
 272         if (vol->cluster_size <= index_block_size) {
 273                 index_vcn_size = vol->cluster_size;
 274                 index_vcn_size_bits = vol->cluster_size_bits;
 275         } else {
 276                 index_vcn_size = vol->sector_size;
 277                 index_vcn_size_bits = vol->sector_size_bits;
 278         }
 279 
 280         /* Get the starting vcn of the index_block holding the child node. */
 281         vcn = sle64_to_cpup((u8*)ie + le16_to_cpu(ie->length) - 8);
 282 
 283 descend_into_child_node:
 284 
 285         /* Read the index block starting at vcn. */
 286         br = ntfs_attr_mst_pread(ia_na, vcn << index_vcn_size_bits, 1,
 287                         index_block_size, ia);
 288         if (br != 1) {
 289                 if (br != -1)
 290                         errno = EIO;
 291                 ntfs_log_perror("Failed to read vcn 0x%llx",
 292                                 (unsigned long long)vcn);
 293                 goto close_err_out;
 294         }
 295 
 296         if (sle64_to_cpu(ia->index_block_vcn) != vcn) {
 297                 ntfs_log_debug("Actual VCN (0x%llx) of index buffer is "
 298                                 "different from expected VCN (0x%llx).\n",
 299                                 (long long)sle64_to_cpu(ia->index_block_vcn),
 300                                 (long long)vcn);
 301                 errno = EIO;
 302                 goto close_err_out;
 303         }
 304         if (le32_to_cpu(ia->index.allocated_size) + 0x18 != index_block_size) {
 305                 ntfs_log_debug("Index buffer (VCN 0x%llx) of directory inode "
 306                                 "0x%llx has a size (%u) differing from the "
 307                                 "directory specified size (%u).\n",
 308                                 (long long)vcn, (unsigned long long)dir_ni->
 309                                 mft_no, (unsigned)le32_to_cpu(ia->index.
 310                                 allocated_size) + 0x18, (unsigned)
 311                                 index_block_size);
 312                 errno = EIO;
 313                 goto close_err_out;
 314         }
 315         index_end = (u8*)&ia->index + le32_to_cpu(ia->index.index_length);
 316         if (index_end > (u8*)ia + index_block_size) {
 317                 ntfs_log_debug("Size of index buffer (VCN 0x%llx) of directory "
 318                                 "inode 0x%llx exceeds maximum size.\n",
 319                                 (long long)vcn, (unsigned long long)dir_ni->
 320                                 mft_no);
 321                 errno = EIO;
 322                 goto close_err_out;
 323         }
 324 
 325         /* The first index entry. */
 326         ie = (INDEX_ENTRY*)((u8*)&ia->index +
 327                         le32_to_cpu(ia->index.entries_offset));
 328         /*
 329          * Iterate similar to above big loop but applied to index buffer, thus
 330          * loop until we exceed valid memory (corruption case) or until we
 331          * reach the last entry.
 332          */
 333         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
 334                 /* Bounds check. */
 335                 if ((u8*)ie < (u8*)ia || (u8*)ie +
 336                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
 337                                 (u8*)ie + le16_to_cpu(ie->key_length) >
 338                                 index_end) {
 339                         ntfs_log_debug("Index entry out of bounds in directory "
 340                                         "inode 0x%llx.\n",
 341                                         (unsigned long long)dir_ni->mft_no);
 342                         errno = EIO;
 343                         goto close_err_out;
 344                 }
 345                 /*
 346                  * The last entry cannot contain a name. It can however contain
 347                  * a pointer to a child node in the B+tree so we just break out.
 348                  */
 349                 if (ie->flags & INDEX_ENTRY_END)
 350                         break;
 351                 /*
 352                  * We perform a case sensitive comparison and if that matches
 353                  * we are done and return the mft reference of the inode (i.e.
 354                  * the inode number together with the sequence number for
 355                  * consistency checking). We convert it to cpu format before
 356                  * returning.
 357                  */
 358                 if (ntfs_names_are_equal(uname, uname_len,
 359                                 (ntfschar*)&ie->key.file_name.file_name,
 360                                 ie->key.file_name.file_name_length,
 361                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len)) {
 362 found_it2:
 363                         /*
 364                          * We have a perfect match, so we don't need to care
 365                          * about having matched imperfectly before.
 366                          */
 367                         mref = le64_to_cpu(ie->u.indexed_file);
 368                         free(ia);
 369                         ntfs_attr_close(ia_na);
 370                         ntfs_attr_put_search_ctx(ctx);
 371                         return mref;
 372                 }
 373                 /*
 374                  * For a case insensitive mount, we also perform a case
 375                  * insensitive comparison. If the comparison matches, we cache
 376                  * the mft reference in mref. Use first case insensitive match
 377                  * in case if no name matches case sensitive, but several names
 378                  * matches case insensitive.
 379                  */
 380                 if (!mref && !NVolCaseSensitive(vol) &&
 381                                 ntfs_names_are_equal(uname, uname_len,
 382                                 (ntfschar*)&ie->key.file_name.file_name,
 383                                 ie->key.file_name.file_name_length,
 384                                 IGNORE_CASE, vol->upcase, vol->upcase_len))
 385                         mref = le64_to_cpu(ie->u.indexed_file);
 386                 /*
 387                  * Not a perfect match, need to do full blown collation so we
 388                  * know which way in the B+tree we have to go.
 389                  */
 390                 rc = ntfs_names_collate(uname, uname_len,
 391                                 (ntfschar*)&ie->key.file_name.file_name,
 392                                 ie->key.file_name.file_name_length, 1,
 393                                 IGNORE_CASE, vol->upcase, vol->upcase_len);
 394                 /*
 395                  * If uname collates before the name of the current entry, there
 396                  * is definitely no such name in this index but we might need to
 397                  * descend into the B+tree so we just break out of the loop.
 398                  */
 399                 if (rc == -1)
 400                         break;
 401                 /* The names are not equal, continue the search. */
 402                 if (rc)
 403                         continue;
 404                 /*
 405                  * Names match with case insensitive comparison, now try the
 406                  * case sensitive comparison, which is required for proper
 407                  * collation.
 408                  */
 409                 rc = ntfs_names_collate(uname, uname_len,
 410                                 (ntfschar*)&ie->key.file_name.file_name,
 411                                 ie->key.file_name.file_name_length, 1,
 412                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len);
 413                 if (rc == -1)
 414                         break;
 415                 if (rc)
 416                         continue;
 417                 /*
 418                  * Perfect match, this will never happen as the
 419                  * ntfs_are_names_equal() call will have gotten a match but we
 420                  * still treat it correctly.
 421                  */
 422                 goto found_it2;
 423         }
 424         /*
 425          * We have finished with this index buffer without success. Check for
 426          * the presence of a child node.
 427          */
 428         if (ie->flags & INDEX_ENTRY_NODE) {
 429                 if ((ia->index.flags & NODE_MASK) == LEAF_NODE) {
 430                         ntfs_log_debug("Index entry with child node found in a "
 431                                         "leaf node in directory inode "
 432                                         "0x%llx.\n",
 433                                         (unsigned long long)dir_ni->mft_no);
 434                         errno = EIO;
 435                         goto close_err_out;
 436                 }
 437                 /* Child node present, descend into it. */
 438                 vcn = sle64_to_cpup((u8*)ie + le16_to_cpu(ie->length) - 8);
 439                 if (vcn >= 0)
 440                         goto descend_into_child_node;
 441                 ntfs_log_debug("Negative child node vcn in directory inode "
 442                                 "0x%llx.\n", (unsigned long long)dir_ni->
 443                                 mft_no);
 444                 errno = EIO;
 445                 goto close_err_out;
 446         }
 447         free(ia);
 448         ntfs_attr_close(ia_na);
 449         ntfs_attr_put_search_ctx(ctx);
 450         /*
 451          * No child node present, return error code ENOENT, unless we have got
 452          * the mft reference of a matching name cached in mref in which case
 453          * return mref.
 454          */
 455         if (mref)
 456                 return mref;
 457         ntfs_log_debug("Entry not found.\n");
 458         errno = ENOENT;
 459         return -1;
 460 put_err_out:
 461         eo = EIO;
 462         ntfs_log_debug("Corrupt directory. Aborting lookup.\n");
 463 eo_put_err_out:
 464         ntfs_attr_put_search_ctx(ctx);
 465         errno = eo;
 466         return -1;
 467 close_err_out:
 468         eo = errno;
 469         free(ia);
 470         ntfs_attr_close(ia_na);
 471         goto eo_put_err_out;
 472 }
 473 
 474 /**
 475  * ntfs_pathname_to_inode_num - find the inode number which represents the
 476  *                              given pathname
 477  * @vol:       An ntfs volume obtained from ntfs_mount
 478  * @parent:    A directory inode to begin the search (may be NULL)
 479  * @pathname:  Pathname to be located
 480  *
 481  * Take an ASCII pathname and find the inode that represents it.  The function
 482  * splits the path and then descends the directory tree.  If @parent is NULL,
 483  * then the root directory '.' will be used as the base for the search.
 484  *
 485  * Return:  -1    Error, the pathname was invalid, or some other error occurred
 486  *          else  Success, the pathname was valid
 487  */
 488 u64 ntfs_pathname_to_inode_num(ntfs_volume *vol, ntfs_inode *parent,
 489                 const char *pathname)
 490 {
 491         u64 inum, result;
 492         int len, err = 0;
 493         char *p, *q;
 494         ntfs_inode *ni = NULL;
 495         ntfschar *unicode = NULL;
 496         char *ascii = NULL;
 497 
 498         inum = result = (u64)-1;
 499         if (!vol || !pathname) {
 500                 err = EINVAL;
 501                 goto close;
 502         }
 503         ntfs_log_trace("Path: '%s'\n", pathname);
 504         if (parent) {
 505                 ni = parent;
 506         } else
 507                 inum = FILE_root;
 508         unicode = calloc(1, MAX_PATH);
 509         ascii = strdup(pathname);
 510         if (!unicode || !ascii) {
 511                 ntfs_log_error("Out of memory.\n");
 512                 err = ENOMEM;
 513                 goto close;
 514         }
 515         p = ascii;
 516         /* Remove leading /'s. */
 517         while (p && *p == PATH_SEP)
 518                 p++;
 519         while (p && *p) {
 520                 if (!ni) {
 521                         ni = ntfs_inode_open(vol, inum);
 522                         if (!ni) {
 523                                 ntfs_log_debug("Cannot open inode %llu.\n",
 524                                                 (unsigned long long)inum);
 525                                 err = EIO;
 526                                 goto close;
 527                         }
 528                 }
 529                 /* Find the end of the first token. */
 530                 q = strchr(p, PATH_SEP);
 531                 if (q != NULL) {
 532                         *q = 0;
 533                         q++;
 534                 }
 535                 len = ntfs_mbstoucs(p, &unicode, MAX_PATH);
 536                 if (len < 0) {
 537                         ntfs_log_debug("Couldn't convert name to Unicode: "
 538                                         "%s.\n", p);
 539                         err = EILSEQ;
 540                         goto close;
 541                 }
 542                 inum = ntfs_inode_lookup_by_name(ni, unicode, len);
 543                 if (inum == (u64)-1) {
 544                         ntfs_log_debug("Couldn't find name '%s' in pathname "
 545                                         "'%s'.\n", p, pathname);
 546                         err = ENOENT;
 547                         goto close;
 548                 }
 549                 inum = MREF(inum);
 550                 if (ni != parent)
 551                         ntfs_inode_close(ni);
 552                 ni = NULL;
 553                 p = q;
 554                 while (p && *p == PATH_SEP)
 555                         p++;
 556         }
 557         result = inum;
 558 close:
 559         if (ni && (ni != parent))
 560                 ntfs_inode_close(ni);
 561         free(ascii);
 562         free(unicode);
 563         if (err)
 564                 errno = err;
 565         return result;
 566 }
 567 
 568 /**
 569  * ntfs_pathname_to_inode - Find the inode which represents the given pathname
 570  * @vol:       An ntfs volume obtained from ntfs_mount
 571  * @parent:    A directory inode to begin the search (may be NULL)
 572  * @pathname:  Pathname to be located
 573  *
 574  * Take an ASCII pathname and find the inode that represents it.  The function
 575  * splits the path and then descends the directory tree.  If @parent is NULL,
 576  * then the root directory '.' will be used as the base for the search.
 577  *
 578  * Return:  inode  Success, the pathname was valid
 579  *          NULL   Error, the pathname was invalid, or some other error occurred
 580  */
 581 ntfs_inode *ntfs_pathname_to_inode(ntfs_volume *vol, ntfs_inode *parent,
 582                 const char *pathname)
 583 {
 584         u64 inum;
 585 
 586         inum = ntfs_pathname_to_inode_num(vol, parent, pathname);
 587         if (inum == (u64)-1)
 588                 return NULL;
 589         return ntfs_inode_open(vol, inum);
 590 }
 591 
 592 /*
 593  * The little endian Unicode string ".." for ntfs_readdir().
 594  */
 595 static const ntfschar dotdot[3] = { const_cpu_to_le16('.'),
 596                                    const_cpu_to_le16('.'),
 597                                    const_cpu_to_le16('\0') };
 598 
 599 /**
 600  * ntfs_filldir - ntfs specific filldir method
 601  * @vol:        ntfs volume with wjich we are working
 602  * @pos:        current position in directory
 603  * @ie:         current index entry
 604  * @dirent:     context for filldir callback supplied by the caller
 605  * @filldir:    filldir callback supplied by the caller
 606  *
 607  * Pass information specifying the current directory entry @ie to the @filldir
 608  * callback.
 609  */
 610 static int ntfs_filldir(ntfs_volume *vol, s64 *pos, INDEX_ENTRY *ie,
 611                 void *dirent, ntfs_filldir_t filldir)
 612 {
 613         FILE_NAME_ATTR *fn = &ie->key.file_name;
 614         unsigned dt_type;
 615 
 616         ntfs_log_trace("Entering.\n");
 617 
 618         /* Skip root directory self reference entry. */
 619         if (MREF_LE(ie->u.indexed_file) == FILE_root)
 620                 return 0;
 621         if (ie->key.file_name.file_attributes & FILE_ATTR_I30_INDEX_PRESENT)
 622                 dt_type = NTFS_DT_DIR;
 623         else {
 624                 if (NVolInterix(vol) && fn->file_attributes & FILE_ATTR_SYSTEM)
 625                         dt_type = NTFS_DT_UNKNOWN;
 626                 else
 627                         dt_type = NTFS_DT_REG;
 628         }
 629         return filldir(dirent, fn->file_name, fn->file_name_length,
 630                         fn->file_name_type, *pos,
 631                         le64_to_cpu(ie->u.indexed_file), dt_type);
 632 }
 633 
 634 /**
 635  * ntfs_mft_get_parent_ref - find mft reference of parent directory of an inode
 636  * @ni:         ntfs inode whose parent directory to find
 637  *
 638  * Find the parent directory of the ntfs inode @ni. To do this, find the first
 639  * file name attribute in the mft record of @ni and return the parent mft
 640  * reference from that.
 641  *
 642  * Note this only makes sense for directories, since files can be hard linked
 643  * from multiple directories and there is no way for us to tell which one is
 644  * being looked for.
 645  *
 646  * Technically directories can have hard links, too, but we consider that as
 647  * illegal as Linux/UNIX do not support directory hard links.
 648  *
 649  * Return the mft reference of the parent directory on success or -1 on error
 650  * with errno set to the error code.
 651  */
 652 static MFT_REF ntfs_mft_get_parent_ref(ntfs_inode *ni)
 653 {
 654         MFT_REF mref;
 655         ntfs_attr_search_ctx *ctx;
 656         FILE_NAME_ATTR *fn;
 657         int eo;
 658 
 659         ntfs_log_trace("Entering.\n");
 660 
 661         if (!ni) {
 662                 errno = EINVAL;
 663                 return ERR_MREF(-1);
 664         }
 665 
 666         ctx = ntfs_attr_get_search_ctx(ni, NULL);
 667         if (!ctx)
 668                 return ERR_MREF(-1);
 669         if (ntfs_attr_lookup(AT_FILE_NAME, AT_UNNAMED, 0, 0, 0, NULL, 0, ctx)) {
 670                 ntfs_log_debug("No file name found in inode 0x%llx. Corrupt "
 671                                 "inode.\n", (unsigned long long)ni->mft_no);
 672                 goto err_out;
 673         }
 674         if (ctx->attr->non_resident) {
 675                 ntfs_log_debug("File name attribute must be resident. "
 676                                 "Corrupt inode 0x%llx.\n",
 677                                 (unsigned long long)ni->mft_no);
 678                 goto io_err_out;
 679         }
 680         fn = (FILE_NAME_ATTR*)((u8*)ctx->attr +
 681                         le16_to_cpu(ctx->attr->u.res.value_offset));
 682         if ((u8*)fn +   le32_to_cpu(ctx->attr->u.res.value_length) >
 683                         (u8*)ctx->attr + le32_to_cpu(ctx->attr->length)) {
 684                 ntfs_log_debug("Corrupt file name attribute in inode 0x%llx.\n",
 685                                 (unsigned long long)ni->mft_no);
 686                 goto io_err_out;
 687         }
 688         mref = le64_to_cpu(fn->parent_directory);
 689         ntfs_attr_put_search_ctx(ctx);
 690         return mref;
 691 io_err_out:
 692         errno = EIO;
 693 err_out:
 694         eo = errno;
 695         ntfs_attr_put_search_ctx(ctx);
 696         errno = eo;
 697         return ERR_MREF(-1);
 698 }
 699 
 700 /**
 701  * ntfs_readdir - read the contents of an ntfs directory
 702  * @dir_ni:     ntfs inode of current directory
 703  * @pos:        current position in directory
 704  * @dirent:     context for filldir callback supplied by the caller
 705  * @filldir:    filldir callback supplied by the caller
 706  *
 707  * Parse the index root and the index blocks that are marked in use in the
 708  * index bitmap and hand each found directory entry to the @filldir callback
 709  * supplied by the caller.
 710  *
 711  * Return 0 on success or -1 on error with errno set to the error code.
 712  *
 713  * Note: Index blocks are parsed in ascending vcn order, from which follows
 714  * that the directory entries are not returned sorted.
 715  */
 716 int ntfs_readdir(ntfs_inode *dir_ni, s64 *pos,
 717                 void *dirent, ntfs_filldir_t filldir)
 718 {
 719         s64 i_size, br, ia_pos, bmp_pos, ia_start;
 720         ntfs_volume *vol;
 721         ntfs_attr *ia_na, *bmp_na = NULL;
 722         ntfs_attr_search_ctx *ctx = NULL;
 723         u8 *index_end, *bmp = NULL;
 724         INDEX_ROOT *ir;
 725         INDEX_ENTRY *ie;
 726         INDEX_ALLOCATION *ia = NULL;
 727         int rc, ir_pos, bmp_buf_size, bmp_buf_pos, eo;
 728         u32 index_block_size, index_vcn_size;
 729         u8 index_block_size_bits, index_vcn_size_bits;
 730 
 731         ntfs_log_trace("Entering.\n");
 732 
 733         if (!dir_ni || !pos || !filldir) {
 734                 errno = EINVAL;
 735                 return -1;
 736         }
 737 
 738         if (!(dir_ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)) {
 739                 errno = ENOTDIR;
 740                 return -1;
 741         }
 742 
 743         vol = dir_ni->vol;
 744 
 745         ntfs_log_trace("Entering for inode 0x%llx, *pos 0x%llx.\n",
 746                         (unsigned long long)dir_ni->mft_no, (long long)*pos);
 747 
 748         /* Open the index allocation attribute. */
 749         ia_na = ntfs_attr_open(dir_ni, AT_INDEX_ALLOCATION, NTFS_INDEX_I30, 4);
 750         if (!ia_na) {
 751                 if (errno != ENOENT) {
 752                         ntfs_log_perror("Failed to open index allocation "
 753                                         "attribute. Directory inode 0x%llx is "
 754                                         "corrupt or bug", (unsigned long long)
 755                                         dir_ni->mft_no);
 756                         return -1;
 757                 }
 758                 i_size = 0;
 759         } else
 760                 i_size = ia_na->data_size;
 761 
 762         rc = 0;
 763 
 764         /* Are we at end of dir yet? */
 765         if (*pos >= i_size + vol->mft_record_size)
 766                 goto done;
 767 
 768         /* Emulate . and .. for all directories. */
 769         if (!*pos) {
 770                 rc = filldir(dirent, dotdot, 1, FILE_NAME_POSIX, *pos,
 771                                 MK_MREF(dir_ni->mft_no,
 772                                 le16_to_cpu(dir_ni->mrec->sequence_number)),
 773                                 NTFS_DT_DIR);
 774                 if (rc)
 775                         goto err_out;
 776                 ++*pos;
 777         }
 778         if (*pos == 1) {
 779                 MFT_REF parent_mref;
 780 
 781                 parent_mref = ntfs_mft_get_parent_ref(dir_ni);
 782                 if (parent_mref == ERR_MREF(-1)) {
 783                         ntfs_log_perror("Parent directory not found");
 784                         goto dir_err_out;
 785                 }
 786 
 787                 rc = filldir(dirent, dotdot, 2, FILE_NAME_POSIX, *pos,
 788                                 parent_mref, NTFS_DT_DIR);
 789                 if (rc)
 790                         goto err_out;
 791                 ++*pos;
 792         }
 793 
 794         ctx = ntfs_attr_get_search_ctx(dir_ni, NULL);
 795         if (!ctx)
 796                 goto err_out;
 797 
 798         /* Get the offset into the index root attribute. */
 799         ir_pos = (int)*pos;
 800         /* Find the index root attribute in the mft record. */
 801         if (ntfs_attr_lookup(AT_INDEX_ROOT, NTFS_INDEX_I30, 4, CASE_SENSITIVE,
 802                                 0, NULL, 0, ctx)) {
 803                 ntfs_log_debug("Index root attribute missing in directory "
 804                                 "inode 0x%llx.\n", (unsigned long long)dir_ni->
 805                                 mft_no);
 806                 goto dir_err_out;
 807         }
 808         /* Get to the index root value. */
 809         ir = (INDEX_ROOT*)((u8*)ctx->attr +
 810                         le16_to_cpu(ctx->attr->u.res.value_offset));
 811 
 812         /* Determine the size of a vcn in the directory index. */
 813         index_block_size = le32_to_cpu(ir->index_block_size);
 814         if (index_block_size < NTFS_BLOCK_SIZE ||
 815                         index_block_size & (index_block_size - 1)) {
 816                 ntfs_log_debug("Index block size %u is invalid.\n",
 817                                 (unsigned)index_block_size);
 818                 goto dir_err_out;
 819         }
 820         index_block_size_bits = ffs(index_block_size) - 1;
 821         if (vol->cluster_size <= index_block_size) {
 822                 index_vcn_size = vol->cluster_size;
 823                 index_vcn_size_bits = vol->cluster_size_bits;
 824         } else {
 825                 index_vcn_size = vol->sector_size;
 826                 index_vcn_size_bits = vol->sector_size_bits;
 827         }
 828 
 829         /* Are we jumping straight into the index allocation attribute? */
 830         if (*pos >= vol->mft_record_size) {
 831                 ntfs_attr_put_search_ctx(ctx);
 832                 ctx = NULL;
 833                 goto skip_index_root;
 834         }
 835 
 836         index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
 837         /* The first index entry. */
 838         ie = (INDEX_ENTRY*)((u8*)&ir->index +
 839                         le32_to_cpu(ir->index.entries_offset));
 840         /*
 841          * Loop until we exceed valid memory (corruption case) or until we
 842          * reach the last entry or until filldir tells us it has had enough
 843          * or signals an error (both covered by the rc test).
 844          */
 845         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
 846                 ntfs_log_debug("In index root, offset 0x%x.\n",
 847                                 (u8*)ie - (u8*)ir);
 848                 /* Bounds checks. */
 849                 if ((u8*)ie < (u8*)ctx->mrec || (u8*)ie +
 850                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
 851                                 (u8*)ie + le16_to_cpu(ie->key_length) >
 852                                 index_end)
 853                         goto dir_err_out;
 854                 /* The last entry cannot contain a name. */
 855                 if (ie->flags & INDEX_ENTRY_END)
 856                         break;
 857                 /* Skip index root entry if continuing previous readdir. */
 858                 if (ir_pos > (u8*)ie - (u8*)ir)
 859                         continue;
 860                 /* Advance the position even if going to skip the entry. */
 861                 *pos = (u8*)ie - (u8*)ir;
 862                 /*
 863                  * Submit the directory entry to ntfs_filldir(), which will
 864                  * invoke the filldir() callback as appropriate.
 865                  */
 866                 rc = ntfs_filldir(vol, pos, ie, dirent, filldir);
 867                 if (rc)
 868                         goto err_out;
 869         }
 870         ntfs_attr_put_search_ctx(ctx);
 871         ctx = NULL;
 872 
 873         /* If there is no index allocation attribute we are finished. */
 874         if (!ia_na)
 875                 goto EOD;
 876 
 877         /* Advance *pos to the beginning of the index allocation. */
 878         *pos = vol->mft_record_size;
 879 
 880 skip_index_root:
 881 
 882         if (!ia_na)
 883                 goto done;
 884 
 885         /* Allocate a buffer for the current index block. */
 886         ia = (INDEX_ALLOCATION*)malloc(index_block_size);
 887         if (!ia) {
 888                 ntfs_log_perror("Failed to allocate buffer for index block");
 889                 goto err_out;
 890         }
 891 
 892         bmp_na = ntfs_attr_open(dir_ni, AT_BITMAP, NTFS_INDEX_I30, 4);
 893         if (!bmp_na) {
 894                 ntfs_log_perror("Failed to open index bitmap attribute");
 895                 goto dir_err_out;
 896         }
 897 
 898         /* Get the offset into the index allocation attribute. */
 899         ia_pos = *pos - vol->mft_record_size;
 900 
 901         bmp_pos = ia_pos >> index_block_size_bits;
 902         if (bmp_pos >> 3 >= bmp_na->data_size) {
 903                 ntfs_log_debug("Current index position exceeds index bitmap "
 904                                 "size.\n");
 905                 goto dir_err_out;
 906         }
 907 
 908         bmp_buf_size = min(bmp_na->data_size - (bmp_pos >> 3), 4096);
 909         bmp = (u8*)malloc(bmp_buf_size);
 910         if (!bmp) {
 911                 ntfs_log_perror("Failed to allocate bitmap buffer");
 912                 goto err_out;
 913         }
 914 
 915         br = ntfs_attr_pread(bmp_na, bmp_pos >> 3, bmp_buf_size, bmp);
 916         if (br != bmp_buf_size) {
 917                 if (br != -1)
 918                         errno = EIO;
 919                 ntfs_log_perror("Failed to read from index bitmap attribute");
 920                 goto err_out;
 921         }
 922 
 923         bmp_buf_pos = 0;
 924         /* If the index block is not in use find the next one that is. */
 925         while (!(bmp[bmp_buf_pos >> 3] & (1 << (bmp_buf_pos & 7)))) {
 926 find_next_index_buffer:
 927                 bmp_pos++;
 928                 bmp_buf_pos++;
 929                 /* If we have reached the end of the bitmap, we are done. */
 930                 if (bmp_pos >> 3 >= bmp_na->data_size)
 931                         goto EOD;
 932                 ia_pos = bmp_pos << index_block_size_bits;
 933                 if (bmp_buf_pos >> 3 < bmp_buf_size)
 934                         continue;
 935                 /* Read next chunk from the index bitmap. */
 936                 if ((bmp_pos >> 3) + bmp_buf_size > bmp_na->data_size)
 937                         bmp_buf_size = bmp_na->data_size - (bmp_pos >> 3);
 938                 br = ntfs_attr_pread(bmp_na, bmp_pos >> 3, bmp_buf_size, bmp);
 939                 if (br != bmp_buf_size) {
 940                         if (br != -1)
 941                                 errno = EIO;
 942                         ntfs_log_perror("Failed to read from index bitmap "
 943                                         "attribute");
 944                         goto err_out;
 945                 }
 946         }
 947 
 948         ntfs_log_debug("Handling index block 0x%llx.\n", (long long)bmp_pos);
 949 
 950         /* Read the index block starting at bmp_pos. */
 951         br = ntfs_attr_mst_pread(ia_na, bmp_pos << index_block_size_bits, 1,
 952                         index_block_size, ia);
 953         if (br != 1) {
 954                 if (br != -1)
 955                         errno = EIO;
 956                 ntfs_log_perror("Failed to read index block");
 957                 goto err_out;
 958         }
 959 
 960         ia_start = ia_pos & ~(s64)(index_block_size - 1);
 961         if (sle64_to_cpu(ia->index_block_vcn) != ia_start >>
 962                         index_vcn_size_bits) {
 963                 ntfs_log_debug("Actual VCN (0x%llx) of index buffer is "
 964                                 "different from expected VCN (0x%llx) in "
 965                                 "inode 0x%llx.\n",
 966                                 (long long)sle64_to_cpu(ia->index_block_vcn),
 967                                 (long long)ia_start >> index_vcn_size_bits,
 968                                 (unsigned long long)dir_ni->mft_no);
 969                 goto dir_err_out;
 970         }
 971         if (le32_to_cpu(ia->index.allocated_size) + 0x18 != index_block_size) {
 972                 ntfs_log_debug("Index buffer (VCN 0x%llx) of directory inode "
 973                                 "0x%llx has a size (%u) differing from the "
 974                                 "directory specified size (%u).\n",
 975                                 (long long)ia_start >> index_vcn_size_bits,
 976                                 (unsigned long long)dir_ni->mft_no,
 977                                 (unsigned) le32_to_cpu(ia->index.allocated_size)
 978                                 + 0x18, (unsigned)index_block_size);
 979                 goto dir_err_out;
 980         }
 981         index_end = (u8*)&ia->index + le32_to_cpu(ia->index.index_length);
 982         if (index_end > (u8*)ia + index_block_size) {
 983                 ntfs_log_debug("Size of index buffer (VCN 0x%llx) of directory "
 984                                 "inode 0x%llx exceeds maximum size.\n",
 985                                 (long long)ia_start >> index_vcn_size_bits,
 986                                 (unsigned long long)dir_ni->mft_no);
 987                 goto dir_err_out;
 988         }
 989         /* The first index entry. */
 990         ie = (INDEX_ENTRY*)((u8*)&ia->index +
 991                         le32_to_cpu(ia->index.entries_offset));
 992         /*
 993          * Loop until we exceed valid memory (corruption case) or until we
 994          * reach the last entry or until ntfs_filldir tells us it has had
 995          * enough or signals an error (both covered by the rc test).
 996          */
 997         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
 998                 ntfs_log_debug("In index allocation, offset 0x%llx.\n",
 999                                 (long long)ia_start + ((u8*)ie - (u8*)ia));
1000                 /* Bounds checks. */
1001                 if ((u8*)ie < (u8*)ia || (u8*)ie +
1002                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
1003                                 (u8*)ie + le16_to_cpu(ie->key_length) >
1004                                 index_end) {
1005                         ntfs_log_debug("Index entry out of bounds in directory "
1006                                         "inode 0x%llx.\n", (unsigned long long)
1007                                         dir_ni->mft_no);
1008                         goto dir_err_out;
1009                 }
1010                 /* The last entry cannot contain a name. */
1011                 if (ie->flags & INDEX_ENTRY_END)
1012                         break;
1013                 /* Skip index entry if continuing previous readdir. */
1014                 if (ia_pos - ia_start > (u8*)ie - (u8*)ia)
1015                         continue;
1016                 /* Advance the position even if going to skip the entry. */
1017                 *pos = (u8*)ie - (u8*)ia + (sle64_to_cpu(
1018                                 ia->index_block_vcn) << index_vcn_size_bits) +
1019                                 dir_ni->vol->mft_record_size;
1020                 /*
1021                  * Submit the directory entry to ntfs_filldir(), which will
1022                  * invoke the filldir() callback as appropriate.
1023                  */
1024                 rc = ntfs_filldir(vol, pos, ie, dirent, filldir);
1025                 if (rc)
1026                         goto err_out;
1027         }
1028         goto find_next_index_buffer;
1029 EOD:
1030         /* We are finished, set *pos to EOD. */
1031         *pos = i_size + vol->mft_record_size;
1032 done:
1033         free(ia);
1034         free(bmp);
1035         if (bmp_na)
1036                 ntfs_attr_close(bmp_na);
1037         if (ia_na)
1038                 ntfs_attr_close(ia_na);
1039         ntfs_log_debug("EOD, *pos 0x%llx, returning 0.\n", (long long)*pos);
1040         return 0;
1041 dir_err_out:
1042         errno = EIO;
1043 err_out:
1044         eo = errno;
1045         if (rc)
1046                 ntfs_log_trace("filldir returned %i, *pos 0x%llx.", rc,
1047                                 (long long)*pos);
1048         ntfs_log_trace("Failed.\n");
1049         if (ctx)
1050                 ntfs_attr_put_search_ctx(ctx);
1051         free(ia);
1052         free(bmp);
1053         if (bmp_na)
1054                 ntfs_attr_close(bmp_na);
1055         if (ia_na)
1056                 ntfs_attr_close(ia_na);
1057         errno = eo;
1058         return -1;
1059 }
1060 
1061 /**
1062  * __ntfs_create - create object on ntfs volume
1063  * @dir_ni:     ntfs inode for directory in which create new object
1064  * @name:       unicode name of new object
1065  * @name_len:   length of the name in unicode characters
1066  * @type:       type of the object to create
1067  * @dev:        major and minor device numbers (obtained from makedev())
1068  * @target:     target in unicode (only for symlinks)
1069  * @target_len: length of target in unicode characters
1070  *
1071  * Internal, use ntfs_create{,_device,_symlink} wrappers instead.
1072  *
1073  * @type can be:
1074  *      S_IFREG         to create regular file
1075  *      S_IFDIR         to create directory
1076  *      S_IFBLK         to create block device
1077  *      S_IFCHR         to create character device
1078  *      S_IFLNK         to create symbolic link
1079  *      S_IFIFO         to create FIFO
1080  *      S_IFSOCK        to create socket
1081  * other values are invalid.
1082  *
1083  * @dev is used only if @type is S_IFBLK or S_IFCHR, in other cases its value
1084  * ignored.
1085  *
1086  * @target and @target_len are used only if @type is S_IFLNK, in other cases
1087  * their value ignored.
1088  *
1089  * Return opened ntfs inode that describes created object on success or NULL
1090  * on error with errno set to the error code.
1091  */
1092 static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni,
1093                 ntfschar *name, u8 name_len, dev_t type, dev_t dev,
1094                 ntfschar *target, u8 target_len)
1095 {
1096         ntfs_inode *ni;
1097         int rollback_data = 0, rollback_sd = 0;
1098         FILE_NAME_ATTR *fn = NULL;
1099         STANDARD_INFORMATION *si = NULL;
1100         SECURITY_DESCRIPTOR_ATTR *sd = NULL;
1101         ACL *acl;
1102         ACCESS_ALLOWED_ACE *ace;
1103         SID *sid;
1104         int err, fn_len, si_len, sd_len;
1105 
1106         ntfs_log_trace("Entering.\n");
1107 
1108         /* Sanity checks. */
1109         if (!dir_ni || !name || !name_len) {
1110                 ntfs_log_error("Invalid arguments.\n");
1111                 errno = EINVAL;
1112                 return NULL;
1113         }
1114         /* FIXME: Reparse points requires special handling. */
1115         if (dir_ni->flags & FILE_ATTR_REPARSE_POINT) {
1116                 errno = EOPNOTSUPP;
1117                 return NULL;
1118         }
1119         /* Allocate MFT record for new file. */
1120         ni = ntfs_mft_record_alloc(dir_ni->vol, NULL);
1121         if (!ni) {
1122                 ntfs_log_error("Failed to allocate new MFT record: %s.\n",
1123                                 strerror(errno));
1124                 return NULL;
1125         }
1126         /*
1127          * Create STANDARD_INFORMATION attribute. Write STANDARD_INFORMATION
1128          * version 1.2, windows will upgrade it to version 3 if needed.
1129          */
1130         si_len = offsetof(STANDARD_INFORMATION, u.v12.v1_end);
1131         si = calloc(1, si_len);
1132         if (!si) {
1133                 err = errno;
1134                 ntfs_log_error("Not enough memory.\n");
1135                 goto err_out;
1136         }
1137         si->creation_time = utc2ntfs(ni->creation_time);
1138         si->last_data_change_time = utc2ntfs(ni->last_data_change_time);
1139         si->last_mft_change_time = utc2ntfs(ni->last_mft_change_time);
1140         si->last_access_time = utc2ntfs(ni->last_access_time);
1141         if (!S_ISREG(type) && !S_ISDIR(type)) {
1142                 si->file_attributes = FILE_ATTR_SYSTEM;
1143                 ni->flags = FILE_ATTR_SYSTEM;
1144         }
1145         /* Add STANDARD_INFORMATION to inode. */
1146         if (ntfs_attr_add(ni, AT_STANDARD_INFORMATION, AT_UNNAMED, 0,
1147                         (u8*)si, si_len)) {
1148                 err = errno;
1149                 ntfs_log_error("Failed to add STANDARD_INFORMATION "
1150                                 "attribute.\n");
1151                 goto err_out;
1152         }
1153         /* Create SECURITY_DESCRIPTOR attribute (everyone has full access). */
1154         /*
1155          * Calculate security descriptor length. We have 2 sub-authorities in
1156          * owner and group SIDs, but structure SID contain only one, so add
1157          * 4 bytes to every SID.
1158          */
1159         sd_len = sizeof(SECURITY_DESCRIPTOR_ATTR) + 2 * (sizeof(SID) + 4) +
1160                 sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE);
1161         sd = calloc(1, sd_len);
1162         if (!sd) {
1163                 err = errno;
1164                 ntfs_log_error("Not enough memory.\n");
1165                 goto err_out;
1166         }
1167         sd->revision = 1;
1168         sd->control = SE_DACL_PRESENT | SE_SELF_RELATIVE;
1169         sid = (SID*)((u8*)sd + sizeof(SECURITY_DESCRIPTOR_ATTR));
1170         sd->owner = cpu_to_le32((u8*)sid - (u8*)sd);
1171         sid->revision = 1;
1172         sid->sub_authority_count = 2;
1173         sid->sub_authority[0] = cpu_to_le32(32);
1174         sid->sub_authority[1] = cpu_to_le32(544);
1175         sid->identifier_authority.value[5] = 5;
1176         sid = (SID*)((u8*)sid + sizeof(SID) + 4);
1177         sd->group = cpu_to_le32((u8*)sid - (u8*)sd);
1178         sid->revision = 1;
1179         sid->sub_authority_count = 2;
1180         sid->sub_authority[0] = cpu_to_le32(32);
1181         sid->sub_authority[1] = cpu_to_le32(544);
1182         sid->identifier_authority.value[5] = 5;
1183         acl = (ACL*)((u8*)sid + sizeof(SID) + 4);
1184         sd->dacl = cpu_to_le32((u8*)acl - (u8*)sd);
1185         acl->revision = 2;
1186         acl->size = cpu_to_le16(sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE));
1187         acl->ace_count = cpu_to_le16(1);
1188         ace = (ACCESS_ALLOWED_ACE*)((u8*)acl + sizeof(ACL));
1189         ace->type = ACCESS_ALLOWED_ACE_TYPE;
1190         ace->flags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE;
1191         ace->size = cpu_to_le16(sizeof(ACCESS_ALLOWED_ACE));
1192         ace->mask = cpu_to_le32(0x1f01ff); /* FIXME */
1193         ace->sid.revision = 1;
1194         ace->sid.sub_authority_count = 1;
1195         ace->sid.sub_authority[0] = 0;
1196         ace->sid.identifier_authority.value[5] = 1;
1197         /* Add SECURITY_DESCRIPTOR attribute to inode. */
1198         if (ntfs_attr_add(ni, AT_SECURITY_DESCRIPTOR, AT_UNNAMED, 0,
1199                         (u8*)sd, sd_len)) {
1200                 err = errno;
1201                 ntfs_log_error("Failed to add SECURITY_DESCRIPTOR "
1202                                 "attribute.\n");
1203                 goto err_out;
1204         }
1205         rollback_sd = 1;
1206         /* Add DATA/INDEX_ROOT attribute. */
1207         if (S_ISDIR(type)) {
1208                 INDEX_ROOT *ir = NULL;
1209                 INDEX_ENTRY *ie;
1210                 int ir_len, index_len;
1211 
1212                 /* Create INDEX_ROOT attribute. */
1213                 index_len = sizeof(INDEX_HEADER) + sizeof(INDEX_ENTRY_HEADER);
1214                 ir_len = offsetof(INDEX_ROOT, index) + index_len;
1215                 ir = calloc(1, ir_len);
1216                 if (!ir) {
1217                         err = errno;
1218                         ntfs_log_error("Not enough memory.\n");
1219                         goto err_out;
1220                 }
1221                 ir->type = AT_FILE_NAME;
1222                 ir->collation_rule = COLLATION_FILE_NAME;
1223                 ir->index_block_size = cpu_to_le32(ni->vol->indx_record_size);
1224                 if (ni->vol->cluster_size <= ni->vol->indx_record_size)
1225                         ir->clusters_per_index_block =
1226                                         ni->vol->indx_record_size >>
1227                                         ni->vol->cluster_size_bits;
1228                 else
1229                         ir->clusters_per_index_block =
1230                                         ni->vol->indx_record_size >>
1231                                         ni->vol->sector_size_bits;
1232                 ir->index.entries_offset = cpu_to_le32(sizeof(INDEX_HEADER));
1233                 ir->index.index_length = cpu_to_le32(index_len);
1234                 ir->index.allocated_size = cpu_to_le32(index_len);
1235                 ie = (INDEX_ENTRY*)((u8*)ir + sizeof(INDEX_ROOT));
1236                 ie->length = cpu_to_le16(sizeof(INDEX_ENTRY_HEADER));
1237                 ie->key_length = 0;
1238                 ie->flags = INDEX_ENTRY_END;
1239                 /* Add INDEX_ROOT attribute to inode. */
1240                 if (ntfs_attr_add(ni, AT_INDEX_ROOT, NTFS_INDEX_I30, 4,
1241                                 (u8*)ir, ir_len)) {
1242                         err = errno;
1243                         free(ir);
1244                         ntfs_log_error("Failed to add INDEX_ROOT attribute.\n");
1245                         goto err_out;
1246                 }
1247                 free(ir);
1248         } else {
1249                 INTX_FILE *data;
1250                 int data_len;
1251 
1252                 switch (type) {
1253                         case S_IFBLK:
1254                         case S_IFCHR:
1255                                 data_len = offsetof(INTX_FILE, u.s.device_end);
1256                                 data = ntfs_malloc(data_len);
1257                                 if (!data) {
1258                                         err = errno;
1259                                         goto err_out;
1260                                 }
1261                                 data->u.s.major = cpu_to_le64(major(dev));
1262                                 data->u.s.minor = cpu_to_le64(minor(dev));
1263                                 if (type == S_IFBLK)
1264                                         data->magic = INTX_BLOCK_DEVICE;
1265                                 if (type == S_IFCHR)
1266                                         data->magic = INTX_CHARACTER_DEVICE;
1267                                 break;
1268                         case S_IFLNK:
1269                                 data_len = sizeof(INTX_FILE_TYPES) +
1270                                                 target_len * sizeof(ntfschar);
1271                                 data = ntfs_malloc(data_len);
1272                                 if (!data) {
1273                                         err = errno;
1274                                         goto err_out;
1275                                 }
1276                                 data->magic = INTX_SYMBOLIC_LINK;
1277                                 memcpy(data->u.target, target,
1278                                                 target_len * sizeof(ntfschar));
1279                                 break;
1280                         case S_IFSOCK:
1281                                 data = NULL;
1282                                 data_len = 1;
1283                                 break;
1284                         default: /* FIFO or regular file. */
1285                                 data = NULL;
1286                                 data_len = 0;
1287                                 break;
1288                 }
1289                 /* Add DATA attribute to inode. */
1290                 if (ntfs_attr_add(ni, AT_DATA, AT_UNNAMED, 0, (u8*)data,
1291                                 data_len)) {
1292                         err = errno;
1293                         free(data);
1294                         ntfs_log_error("Failed to add DATA attribute.\n");
1295                         goto err_out;
1296                 }
1297                 rollback_data = 1;
1298                 free(data);
1299         }
1300         /* Create FILE_NAME attribute. */
1301         fn_len = sizeof(FILE_NAME_ATTR) + name_len * sizeof(ntfschar);
1302         fn = ntfs_calloc(fn_len);
1303         if (!fn) {
1304                 err = errno;
1305                 goto err_out;
1306         }
1307         fn->parent_directory = MK_LE_MREF(dir_ni->mft_no,
1308                         le16_to_cpu(dir_ni->mrec->sequence_number));
1309         fn->file_name_length = name_len;
1310         fn->file_name_type = FILE_NAME_POSIX;
1311         if (S_ISDIR(type))
1312                 fn->file_attributes = FILE_ATTR_I30_INDEX_PRESENT;
1313         if (!S_ISREG(type) && !S_ISDIR(type))
1314                 fn->file_attributes = FILE_ATTR_SYSTEM;
1315         fn->creation_time = utc2ntfs(ni->creation_time);
1316         fn->last_data_change_time = utc2ntfs(ni->last_data_change_time);
1317         fn->last_mft_change_time = utc2ntfs(ni->last_mft_change_time);
1318         fn->last_access_time = utc2ntfs(ni->last_access_time);
1319         memcpy(fn->file_name, name, name_len * sizeof(ntfschar));
1320         /* Add FILE_NAME attribute to inode. */
1321         if (ntfs_attr_add(ni, AT_FILE_NAME, AT_UNNAMED, 0, (u8*)fn, fn_len)) {
1322                 err = errno;
1323                 ntfs_log_error("Failed to add FILE_NAME attribute.\n");
1324                 goto err_out;
1325         }
1326         /* Add FILE_NAME attribute to index. */
1327         if (ntfs_index_add_filename(dir_ni, fn, MK_MREF(ni->mft_no,
1328                         le16_to_cpu(ni->mrec->sequence_number)))) {
1329                 err = errno;
1330                 ntfs_log_perror("Failed to add entry to the index");
1331                 goto err_out;
1332         }
1333         /* Set hard links count and directory flag. */
1334         ni->mrec->link_count = cpu_to_le16(1);
1335         if (S_ISDIR(type))
1336                 ni->mrec->flags |= MFT_RECORD_IS_DIRECTORY;
1337         ntfs_inode_mark_dirty(ni);
1338         /* Done! */
1339         free(fn);
1340         free(si);
1341         free(sd);
1342         ntfs_log_trace("Done.\n");
1343         return ni;
1344 err_out:
1345         ntfs_log_trace("Failed.\n");
1346         if (rollback_sd) {
1347                 ntfs_attr *na;
1348 
1349                 na = ntfs_attr_open(ni, AT_SECURITY_DESCRIPTOR, AT_UNNAMED, 0);
1350                 if (!na)
1351                         ntfs_log_perror("Failed to open SD (0x50) attribute of "
1352                                         " inode 0x%llx. Run chkdsk.\n",
1353                                         (unsigned long long)ni->mft_no);
1354                 else if (ntfs_attr_rm(na))
1355                         ntfs_log_perror("Failed to remove SD (0x50) attribute "
1356                                         "of inode 0x%llx. Run chkdsk.\n",
1357                                         (unsigned long long)ni->mft_no);
1358         }
1359         if (rollback_data) {
1360                 ntfs_attr *na;
1361 
1362                 na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);
1363                 if (!na)
1364                         ntfs_log_perror("Failed to open data attribute of "
1365                                         " inode 0x%llx. Run chkdsk.\n",
1366                                         (unsigned long long)ni->mft_no);
1367                 else if (ntfs_attr_rm(na))
1368                         ntfs_log_perror("Failed to remove data attribute of "
1369                                         "inode 0x%llx. Run chkdsk.\n",
1370                                         (unsigned long long)ni->mft_no);
1371         }
1372         /*
1373          * Free extent MFT records (should not exist any with current
1374          * ntfs_create implementation, but for any case if something will be
1375          * changed in the future).
1376          */
1377         while (ni->nr_extents)
1378                 if (ntfs_mft_record_free(ni->vol, *(ni->u.extent_nis))) {
1379                         err = errno;
1380                         ntfs_log_error("Failed to free extent MFT record.  "
1381                                         "Leaving inconsistent metadata.\n");
1382                 }
1383         if (ntfs_mft_record_free(ni->vol, ni))
1384                 ntfs_log_error("Failed to free MFT record.  "
1385                                 "Leaving inconsistent metadata. Run chkdsk.\n");
1386         free(fn);
1387         free(si);
1388         free(sd);
1389         errno = err;
1390         return NULL;
1391 }
1392 
1393 /**
1394  * Some wrappers around __ntfs_create() ...
1395  */
1396 
1397 ntfs_inode *ntfs_create(ntfs_inode *dir_ni, ntfschar *name, u8 name_len,
1398                 dev_t type)
1399 {
1400         if (type != S_IFREG && type != S_IFDIR && type != S_IFIFO &&
1401                         type != S_IFSOCK) {
1402                 ntfs_log_error("Invalid arguments.\n");
1403                 return NULL;
1404         }
1405         return __ntfs_create(dir_ni, name, name_len, type, 0, NULL, 0);
1406 }
1407 
1408 ntfs_inode *ntfs_create_device(ntfs_inode *dir_ni, ntfschar *name, u8 name_len,
1409                 dev_t type, dev_t dev)
1410 {
1411         if (type != S_IFCHR && type != S_IFBLK) {
1412                 ntfs_log_error("Invalid arguments.\n");
1413                 return NULL;
1414         }
1415         return __ntfs_create(dir_ni, name, name_len, type, dev, NULL, 0);
1416 }
1417 
1418 ntfs_inode *ntfs_create_symlink(ntfs_inode *dir_ni, ntfschar *name, u8 name_len,
1419                 ntfschar *target, u8 target_len)
1420 {
1421         if (!target || !target_len) {
1422                 ntfs_log_error("Invalid arguments.\n");
1423                 return NULL;
1424         }
1425         return __ntfs_create(dir_ni, name, name_len, S_IFLNK, 0,
1426                         target, target_len);
1427 }
1428 
1429 /**
1430  * ntfs_delete - delete file or directory from ntfs volume
1431  * @pni:        ntfs inode for object to delete
1432  * @dir_ni:     ntfs inode for directory in which delete object
1433  * @name:       unicode name of the object to delete
1434  * @name_len:   length of the name in unicode characters
1435  *
1436  * @pni is pointer to pointer to ntfs_inode structure. Upon successful
1437  * completion and if inode is really deleted (there are no more links left to
1438  * it) this function will close @*pni and set it to NULL, in the other cases
1439  * @*pni will stay opened.
1440  *
1441  * Return 0 on success or -1 on error with errno set to the error code.
1442  */
1443 int ntfs_delete(ntfs_inode **pni, ntfs_inode *dir_ni, ntfschar *name,
1444                 u8 name_len)
1445 {
1446         ntfs_attr_search_ctx *actx = NULL;
1447         ntfs_index_context *ictx = NULL;
1448         ntfs_inode *ni;
1449         FILE_NAME_ATTR *fn = NULL;
1450         BOOL looking_for_dos_name = FALSE, looking_for_win32_name = FALSE;
1451         BOOL case_sensitive_match = TRUE;
1452         int err = 0;
1453 
1454         ntfs_log_trace("Entering.\n");
1455 
1456         if (!pni || !(ni = *pni) || !dir_ni || !name || !name_len ||
1457                         ni->nr_extents == -1 || dir_ni->nr_extents == -1) {
1458                 ntfs_log_error("Invalid arguments.\n");
1459                 errno = EINVAL;
1460                 goto err_out;
1461         }
1462         if (ni->nr_references > 1 && le16_to_cpu(ni->mrec->link_count) == 1) {
1463                 ntfs_log_error("Trying to deleting inode with left "
1464                                 "references.\n");
1465                 errno = EINVAL;
1466                 goto err_out;
1467         }
1468         /*
1469          * Search for FILE_NAME attribute with such name. If it's in POSIX or
1470          * WIN32_AND_DOS namespace, then simply remove it from index and inode.
1471          * If filename in DOS or in WIN32 namespace, then remove DOS name first,
1472          * only then remove WIN32 name. Mark WIN32 name as POSIX name to prevent
1473          * chkdsk to complain about DOS name absence in case if DOS name had
1474          * been successfully deleted, but WIN32 name remove failed.
1475          */
1476         actx = ntfs_attr_get_search_ctx(ni, NULL);
1477         if (!actx)
1478                 goto err_out;
1479 search:
1480         while (!ntfs_attr_lookup(AT_FILE_NAME, AT_UNNAMED, 0, CASE_SENSITIVE,
1481                         0, NULL, 0, actx)) {
1482                 errno = 0;
1483                 fn = (FILE_NAME_ATTR*)((u8*)actx->attr +
1484                                 le16_to_cpu(actx->attr->u.res.value_offset));
1485                 ntfs_log_trace("Found filename with instance number %d.\n",
1486                                 le16_to_cpu(actx->attr->instance));
1487                 if (looking_for_dos_name) {
1488                         if (fn->file_name_type == FILE_NAME_DOS)
1489                                 break;
1490                         else
1491                                 continue;
1492                 }
1493                 if (looking_for_win32_name) {
1494                         if  (fn->file_name_type == FILE_NAME_WIN32)
1495                                 break;
1496                         else
1497                                 continue;
1498                 }
1499                 if (dir_ni->mft_no == MREF_LE(fn->parent_directory) &&
1500                                 ntfs_names_are_equal(fn->file_name,
1501                                 fn->file_name_length, name,
1502                                 name_len, case_sensitive_match ?
1503                                 CASE_SENSITIVE : IGNORE_CASE, ni->vol->upcase,
1504                                 ni->vol->upcase_len)) {
1505                         if (fn->file_name_type == FILE_NAME_WIN32) {
1506                                 looking_for_dos_name = TRUE;
1507                                 ntfs_attr_reinit_search_ctx(actx);
1508                                 ntfs_log_trace("Restart search. "
1509                                                 "Looking for DOS name.\n");
1510                                 continue;
1511                         }
1512                         if (fn->file_name_type == FILE_NAME_DOS)
1513                                 looking_for_dos_name = TRUE;
1514                         break;
1515                 }
1516         }
1517         if (errno) {
1518                 /*
1519                  * If case sensitive search failed and volume mounted case
1520                  * insensitive, then try once again ignoring case.
1521                  */
1522                 if (errno == ENOENT && !NVolCaseSensitive(ni->vol) &&
1523                                 case_sensitive_match) {
1524                         case_sensitive_match = FALSE;
1525                         ntfs_attr_reinit_search_ctx(actx);
1526                         ntfs_log_trace("Restart search. Ignore case.");
1527                         goto search;
1528                 }
1529                 ntfs_log_error("Failed to find requested filename in FILE_NAME "
1530                                 "attributes that belong to this inode.\n");
1531                 goto err_out;
1532         }
1533         /* If deleting directory check it to be empty. */
1534         if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
1535                 ntfs_attr *na;
1536 
1537                 na = ntfs_attr_open(ni, AT_INDEX_ROOT, NTFS_INDEX_I30, 4);
1538                 if (!na) {
1539                         ntfs_log_error("Corrupt directory or library bug.\n");
1540                         errno = EIO;
1541                         goto err_out;
1542                 }
1543                 /*
1544                  * Do not allow non-empty directory deletion if hard links count
1545                  * is 1 (always) or 2 (in case if filename in DOS namespace,
1546                  * because we delete it first in file which have both WIN32 and
1547                  * DOS names).
1548                  */
1549                 if ((na->data_size != sizeof(INDEX_ROOT) + sizeof(
1550                                 INDEX_ENTRY_HEADER)) && (le16_to_cpu(
1551                                 ni->mrec->link_count) == 1 ||
1552                                 (le16_to_cpu(ni->mrec->link_count) == 2 &&
1553                                 fn->file_name_type == FILE_NAME_DOS))) {
1554                         ntfs_attr_close(na);
1555                         ntfs_log_error("Directory is not empty.\n");
1556                         errno = ENOTEMPTY;
1557                         goto err_out;
1558                 }
1559                 ntfs_attr_close(na);
1560         }
1561         /* One more sanity check. */
1562         if (ni->nr_references > 1 && looking_for_dos_name &&
1563                         le16_to_cpu(ni->mrec->link_count) == 2) {
1564                 ntfs_log_error("Trying to deleting inode with left "
1565                                 "references.\n");
1566                 errno = EINVAL;
1567                 goto err_out;
1568         }
1569         ntfs_log_trace("Found!\n");
1570         /* Search for such FILE_NAME in index. */
1571         ictx = ntfs_index_ctx_get(dir_ni, NTFS_INDEX_I30, 4);
1572         if (!ictx)
1573                 goto err_out;
1574         if (ntfs_index_lookup(fn, le32_to_cpu(actx->attr->u.res.value_length), ictx))
1575                 goto err_out;
1576         /* Set namespace to POSIX for WIN32 name. */
1577         if (fn->file_name_type == FILE_NAME_WIN32) {
1578                 fn->file_name_type = FILE_NAME_POSIX;
1579                 ntfs_inode_mark_dirty(actx->ntfs_ino);
1580                 ((FILE_NAME_ATTR*)ictx->data)->file_name_type = FILE_NAME_POSIX;
1581                 ntfs_index_entry_mark_dirty(ictx);
1582         }
1583         /* Do not support reparse point deletion yet. */
1584         if (((FILE_NAME_ATTR*)ictx->data)->file_attributes &
1585                         FILE_ATTR_REPARSE_POINT) {
1586                 errno = EOPNOTSUPP;
1587                 goto err_out;
1588         }
1589         /* Remove FILE_NAME from index. */
1590         if (ntfs_index_rm(ictx))
1591                 goto err_out;
1592 
1593         /* Remove FILE_NAME from inode. */
1594         if (ntfs_attr_record_rm(actx))
1595                 goto err_out;
1596         /* Decrement hard link count. */
1597         ni->mrec->link_count = cpu_to_le16(le16_to_cpu(
1598                         ni->mrec->link_count) - 1);
1599         ntfs_inode_mark_dirty(ni);
1600         if (looking_for_dos_name) {
1601                 looking_for_dos_name = FALSE;
1602                 looking_for_win32_name = TRUE;
1603                 ntfs_attr_reinit_search_ctx(actx);
1604                 ntfs_log_trace("DOS name deleted. "
1605                                 "Now search for WIN32 name.\n");
1606                 goto search;
1607         } else
1608                 ntfs_log_trace("Deleted.\n");
1609         /* TODO: Update object id, quota and security indexes if required. */
1610         /*
1611          * If hard link count is not equal to zero then we are done. In other
1612          * case there are no reference to this inode left, so we should free all
1613          * non-resident attributes and mark all MFT record as not in use.
1614          */
1615         if (ni->mrec->link_count)
1616                 goto out;
1617         ntfs_attr_reinit_search_ctx(actx);
1618         while (!ntfs_attrs_walk(actx)) {
1619                 if (actx->attr->non_resident) {
1620                         runlist *rl;
1621 
1622                         rl = ntfs_mapping_pairs_decompress(ni->vol, actx->attr,
1623                                         NULL);
1624                         if (!rl) {
1625                                 err = errno;
1626                                 ntfs_log_error("Failed to decompress runlist.  "
1627                                                 "Leaving inconsistent "
1628                                                 "metadata.\n");
1629                                 continue;
1630                         }
1631                         if (ntfs_cluster_free_from_rl(ni->vol, rl)) {
1632                                 err = errno;
1633                                 ntfs_log_error("Failed to free clusters.  "
1634                                                 "Leaving inconsistent "
1635                                                 "metadata.\n");
1636                                 continue;
1637                         }
1638                         free(rl);
1639                 }
1640         }
1641         if (errno != ENOENT) {
1642                 err = errno;
1643                 ntfs_log_error("Attribute enumeration failed.  "
1644                                 "Probably leaving inconsistent metadata.\n");
1645         }
1646         /* All extents should be attached after attribute walk. */
1647         while (ni->nr_extents)
1648                 if (ntfs_mft_record_free(ni->vol, *(ni->u.extent_nis))) {
1649                         err = errno;
1650                         ntfs_log_error("Failed to free extent MFT record.  "
1651                                         "Leaving inconsistent metadata.\n");
1652                 }
1653         if (ntfs_mft_record_free(ni->vol, ni)) {
1654                 err = errno;
1655                 ntfs_log_error("Failed to free base MFT record.  "
1656                                 "Leaving inconsistent metadata.\n");
1657         }
1658         *pni = NULL;
1659 out:
1660         if (actx)
1661                 ntfs_attr_put_search_ctx(actx);
1662         if (ictx)
1663                 ntfs_index_ctx_put(ictx);
1664         if (err) {
1665                 ntfs_log_error("%s(): Failed.\n", "ntfs_delete");
1666                 errno = err;
1667                 return -1;
1668         }
1669         ntfs_log_trace("Done.\n");
1670         return 0;
1671 err_out:
1672         err = errno;
1673         goto out;
1674 }
1675 
1676 /**
1677  * ntfs_link - create hard link for file or directory
1678  * @ni:         ntfs inode for object to create hard link
1679  * @dir_ni:     ntfs inode for directory in which new link should be placed
1680  * @name:       unicode name of the new link
1681  * @name_len:   length of the name in unicode characters
1682  *
1683  * NOTE: At present we allow creating hard links to directories, we use them
1684  * in a temporary state during rename. But it's definitely bad idea to have
1685  * hard links to directories as a result of operation.
1686  * FIXME: Create internal  __ntfs_link that allows hard links to a directories
1687  * and external ntfs_link that do not. Write ntfs_rename that uses __ntfs_link.
1688  *
1689  * Return 0 on success or -1 on error with errno set to the error code.
1690  */
1691 int ntfs_link(ntfs_inode *ni, ntfs_inode *dir_ni, ntfschar *name, u8 name_len)
1692 {
1693         FILE_NAME_ATTR *fn = NULL;
1694         int fn_len, err;
1695 
1696         ntfs_log_trace("Entering.\n");
1697 
1698         if (!ni || !dir_ni || !name || !name_len ||
1699                         ni->mft_no == dir_ni->mft_no) {
1700                 err = EINVAL;
1701                 ntfs_log_error("Invalid arguments.");
1702                 goto err_out;
1703         }
1704         /* FIXME: Reparse points requires special handling. */
1705         if (ni->flags & FILE_ATTR_REPARSE_POINT) {
1706                 err = EOPNOTSUPP;
1707                 goto err_out;
1708         }
1709         /* Create FILE_NAME attribute. */
1710         fn_len = sizeof(FILE_NAME_ATTR) + name_len * sizeof(ntfschar);
1711         fn = ntfs_calloc(fn_len);
1712         if (!fn) {
1713                 err = errno;
1714                 goto err_out;
1715         }
1716         fn->parent_directory = MK_LE_MREF(dir_ni->mft_no,
1717                         le16_to_cpu(dir_ni->mrec->sequence_number));
1718         fn->file_name_length = name_len;
1719         fn->file_name_type = FILE_NAME_POSIX;
1720         fn->file_attributes = ni->flags;
1721         if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)
1722                 fn->file_attributes |= FILE_ATTR_I30_INDEX_PRESENT;
1723         fn->allocated_size = cpu_to_sle64(ni->allocated_size);
1724         fn->data_size = cpu_to_sle64(ni->data_size);
1725         fn->creation_time = utc2ntfs(ni->creation_time);
1726         fn->last_data_change_time = utc2ntfs(ni->last_data_change_time);
1727         fn->last_mft_change_time = utc2ntfs(ni->last_mft_change_time);
1728         fn->last_access_time = utc2ntfs(ni->last_access_time);
1729         memcpy(fn->file_name, name, name_len * sizeof(ntfschar));
1730         /* Add FILE_NAME attribute to index. */
1731         if (ntfs_index_add_filename(dir_ni, fn, MK_MREF(ni->mft_no,
1732                         le16_to_cpu(ni->mrec->sequence_number)))) {
1733                 err = errno;
1734                 ntfs_log_error("Failed to add entry to the index.\n");
1735                 goto err_out;
1736         }
1737         /* Add FILE_NAME attribute to inode. */
1738         if (ntfs_attr_add(ni, AT_FILE_NAME, AT_UNNAMED, 0, (u8*)fn, fn_len)) {
1739                 ntfs_index_context *ictx;
1740 
1741                 err = errno;
1742                 ntfs_log_error("Failed to add FILE_NAME attribute.\n");
1743                 /* Try to remove just added attribute from index. */
1744                 ictx = ntfs_index_ctx_get(dir_ni, NTFS_INDEX_I30, 4);
1745                 if (!ictx)
1746                         goto rollback_failed;
1747                 if (ntfs_index_lookup(fn, fn_len, ictx)) {
1748                         ntfs_index_ctx_put(ictx);
1749                         goto rollback_failed;
1750                 }
1751                 if (ntfs_index_rm(ictx)) {
1752                         ntfs_index_ctx_put(ictx);
1753                         goto rollback_failed;
1754                 }
1755                 goto err_out;
1756         }
1757         /* Increment hard links count. */
1758         ni->mrec->link_count = cpu_to_le16(le16_to_cpu(
1759                         ni->mrec->link_count) + 1);
1760         /* Done! */
1761         ntfs_inode_mark_dirty(ni);
1762         free(fn);
1763         ntfs_log_trace("Done.\n");
1764         return 0;
1765 rollback_failed:
1766         ntfs_log_error("Rollback failed. Leaving inconsistent metadata.\n");
1767 err_out:
1768         ntfs_log_error("%s(): Failed.\n", "ntfs_link");
1769         free(fn);
1770         errno = err;
1771         return -1;
1772 }
1773