inode.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:72k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * inode.c
  3.  *
  4.  * Copyright (C) 1995-1999 Martin von L鰓is
  5.  * Copyright (C) 1996 Albert D. Cahalan
  6.  * Copyright (C) 1996-1997 R間is Duchesne
  7.  * Copyright (C) 1998 Joseph Malicki
  8.  * Copyright (C) 1999 Steve Dodd
  9.  * Copyright (C) 2000-2001 Anton Altaparmakov (AIA)
  10.  */
  11. #include "ntfstypes.h"
  12. #include "ntfsendian.h"
  13. #include "struct.h"
  14. #include "inode.h"
  15. #include <linux/errno.h>
  16. #include "macros.h"
  17. #include "attr.h"
  18. #include "super.h"
  19. #include "dir.h"
  20. #include "support.h"
  21. #include "util.h"
  22. #include <linux/ntfs_fs.h>
  23. #include <linux/smp_lock.h>
  24. typedef struct {
  25. int recno;
  26. unsigned char *record;
  27. } ntfs_mft_record;
  28. typedef struct {
  29. int size;
  30. int count;
  31. ntfs_mft_record *records;
  32. } ntfs_disk_inode;
  33. static void ntfs_fill_mft_header(ntfs_u8 *mft, int rec_size, int seq_no,
  34. int links, int flags)
  35. {
  36. int fixup_ofs = 0x2a;
  37. int fixup_cnt = rec_size / NTFS_SECTOR_SIZE + 1;
  38. int attr_ofs = (fixup_ofs + 2 * fixup_cnt + 7) & ~7;
  39. NTFS_PUTU32(mft + 0x00, 0x454c4946); /* FILE */
  40. NTFS_PUTU16(mft + 0x04, fixup_ofs); /* Offset to fixup. */
  41. NTFS_PUTU16(mft + 0x06, fixup_cnt); /* Number of fixups. */
  42. NTFS_PUTU64(mft + 0x08, 0); /* Logical sequence number. */
  43. NTFS_PUTU16(mft + 0x10, seq_no); /* Sequence number. */
  44. NTFS_PUTU16(mft + 0x12, links); /* Hard link count. */
  45. NTFS_PUTU16(mft + 0x14, attr_ofs); /* Offset to attributes. */
  46. NTFS_PUTU16(mft + 0x16, flags); /* Flags: 1 = In use,
  47.   2 = Directory. */
  48. NTFS_PUTU32(mft + 0x18, attr_ofs + 8); /* Bytes in use. */
  49. NTFS_PUTU32(mft + 0x1c, rec_size); /* Total allocated size. */
  50. NTFS_PUTU64(mft + 0x20, 0); /* Base mft record. */
  51. NTFS_PUTU16(mft + 0x28, 0); /* Next attr instance. */
  52. NTFS_PUTU16(mft + fixup_ofs, 1); /* Fixup word. */
  53. NTFS_PUTU32(mft + attr_ofs, (__u32)-1); /* End of attributes marker. */
  54. }
  55. /*
  56.  * Search in an inode an attribute by type and name. 
  57.  * FIXME: Check that when attributes are inserted all attribute list
  58.  * attributes are expanded otherwise need to modify this function to deal
  59.  * with attribute lists. (AIA)
  60.  */
  61. ntfs_attribute *ntfs_find_attr(ntfs_inode *ino, int type, char *name)
  62. {
  63. int i;
  64. if (!ino) {
  65. ntfs_error("ntfs_find_attr: NO INODE!n");
  66. return 0;
  67. }
  68. for (i = 0; i < ino->attr_count; i++) {
  69. if (type < ino->attrs[i].type)
  70. return 0;
  71. if (type == ino->attrs[i].type) {
  72. if (!name) {
  73. if (!ino->attrs[i].name)
  74. return ino->attrs + i;
  75. } else if (ino->attrs[i].name &&
  76.    !ntfs_ua_strncmp(ino->attrs[i].name, name,
  77.     strlen(name)))
  78. return ino->attrs + i;
  79. }
  80. }
  81. return 0;
  82. }
  83. /*
  84.  * Insert all attributes from the record mftno of the MFT in the inode ino.
  85.  * If mftno is a base mft record we abort as soon as we find the attribute
  86.  * list, but only on the first pass. We will get called later when the attribute
  87.  * list attribute is being parsed so we need to distinguish the two cases.
  88.  * FIXME: We should be performing structural consistency checks. (AIA)
  89.  * Return 0 on success or -errno on error.
  90.  */
  91. static int ntfs_insert_mft_attributes(ntfs_inode* ino, char *mft, int mftno)
  92. {
  93. int i, error, type, len, present = 0;
  94. char *it;
  95. /* Check for duplicate extension record. */
  96. for(i = 0; i < ino->record_count; i++)
  97. if (ino->records[i] == mftno) {
  98. if (i)
  99. return 0;
  100. present = 1;
  101. break;
  102. }
  103. if (!present) {
  104. /* (re-)allocate space if necessary. */
  105. if (ino->record_count % 8 == 0) {
  106. int *new;
  107. new = ntfs_malloc((ino->record_count + 8) *
  108. sizeof(int));
  109. if (!new)
  110. return -ENOMEM;
  111. if (ino->records) {
  112. for (i = 0; i < ino->record_count; i++)
  113. new[i] = ino->records[i];
  114. ntfs_free(ino->records);
  115. }
  116. ino->records = new;
  117. }
  118. ino->records[ino->record_count] = mftno;
  119. ino->record_count++;
  120. }
  121. it = mft + NTFS_GETU16(mft + 0x14); /* mft->attrs_offset */
  122. do {
  123. type = NTFS_GETU32(it);
  124. len = NTFS_GETU32(it + 4);
  125. if (type != -1) {
  126. error = ntfs_insert_attribute(ino, it);
  127. if (error)
  128. return error;
  129. }
  130. /* If we have just processed the attribute list and this is
  131.  * the first time we are parsing this (base) mft record then we
  132.  * are done so that the attribute list gets parsed before the
  133.  * entries in the base mft record. Otherwise we run into
  134.  * problems with encountering attributes out of order and when
  135.  * this happens with different attribute extents we die. )-:
  136.  * This way we are ok as the attribute list is always sorted
  137.  * fully and correctly. (-: */
  138. if (type == 0x20 && !present)
  139. return 0;
  140. it += len;
  141. } while (type != -1); /* Attribute listing ends with type -1. */
  142. return 0;
  143. }
  144. /*
  145.  * Insert a single specific attribute from the record mftno of the MFT in the
  146.  * inode ino. We disregard the attribute list assuming we have already parsed
  147.  * it.
  148.  * FIXME: We should be performing structural consistency checks. (AIA)
  149.  * Return 0 on success or -errno on error.
  150.  */
  151. static int ntfs_insert_mft_attribute(ntfs_inode* ino, int mftno,
  152. ntfs_u8 *attr)
  153. {
  154. int i, error, present = 0;
  155. /* Check for duplicate extension record. */
  156. for(i = 0; i < ino->record_count; i++)
  157. if (ino->records[i] == mftno) {
  158. present = 1;
  159. break;
  160. }
  161. if (!present) {
  162. /* (re-)allocate space if necessary. */
  163. if (ino->record_count % 8 == 0) {
  164. int *new;
  165. new = ntfs_malloc((ino->record_count + 8) *
  166. sizeof(int));
  167. if (!new)
  168. return -ENOMEM;
  169. if (ino->records) {
  170. for (i = 0; i < ino->record_count; i++)
  171. new[i] = ino->records[i];
  172. ntfs_free(ino->records);
  173. }
  174. ino->records = new;
  175. }
  176. ino->records[ino->record_count] = mftno;
  177. ino->record_count++;
  178. }
  179. if (NTFS_GETU32(attr) == -1) {
  180. ntfs_debug(DEBUG_FILE3, "ntfs_insert_mft_attribute: attribute "
  181. "type is -1.n");
  182. return 0;
  183. }
  184. error = ntfs_insert_attribute(ino, attr);
  185. if (error)
  186. return error;
  187. return 0;
  188. }
  189. /* Read and insert all the attributes of an 'attribute list' attribute.
  190.  * Return the number of remaining bytes in *plen. */
  191. static int parse_attributes(ntfs_inode *ino, ntfs_u8 *alist, int *plen)
  192. {
  193. ntfs_u8 *mft, *attr;
  194. int mftno, l, error;
  195. int last_mft = -1;
  196. int len = *plen;
  197. int tries = 0;
  198. if (!ino->attr) {
  199. ntfs_error("parse_attributes: called on inode 0x%x without a "
  200. "loaded base mft record.n", ino->i_number);
  201. return -EINVAL;
  202. }
  203. mft = ntfs_malloc(ino->vol->mft_record_size);
  204. if (!mft)
  205. return -ENOMEM;
  206. while (len > 8) {
  207. l = NTFS_GETU16(alist + 4);
  208. if (l > len)
  209. break;
  210.         /* Process an attribute description. */
  211. mftno = NTFS_GETU32(alist + 0x10); 
  212. /* FIXME: The mft reference (alist + 0x10) is __s64.
  213. * - Not a problem unless we encounter a huge partition.
  214. * - Should be consistency checking the sequence numbers
  215. *   though! This should maybe happen in 
  216. *   ntfs_read_mft_record() itself and a hotfix could
  217. *   then occur there or the user notified to run
  218. *   ntfsck. (AIA) */
  219. if (mftno != ino->i_number && mftno != last_mft) {
  220. continue_after_loading_mft_data:
  221. last_mft = mftno;
  222. error = ntfs_read_mft_record(ino->vol, mftno, mft);
  223. if (error) {
  224. if (error == -EINVAL && !tries)
  225. goto force_load_mft_data;
  226. failed_reading_mft_data:
  227. ntfs_debug(DEBUG_FILE3, "parse_attributes: "
  228. "ntfs_read_mft_record(mftno = 0x%x) "
  229. "failedn", mftno);
  230. ntfs_free(mft);
  231. return error;
  232. }
  233. }
  234. attr = ntfs_find_attr_in_mft_rec(
  235. ino->vol, /* ntfs volume */
  236. mftno == ino->i_number ?/* mft record is: */
  237. ino->attr: /*   base record */
  238. mft, /*   extension record */
  239. NTFS_GETU32(alist + 0), /* type */
  240. (wchar_t*)(alist + alist[7]), /* name */
  241. alist[6],  /* name length */
  242. 1, /* ignore case */
  243. NTFS_GETU16(alist + 24) /* instance number */
  244. );
  245. if (!attr) {
  246. ntfs_error("parse_attributes: mft records 0x%x and/or "
  247.        "0x%x corrupt!n", ino->i_number, mftno);
  248. ntfs_free(mft);
  249. return -EINVAL; /* FIXME: Better error code? (AIA) */
  250. }
  251. error = ntfs_insert_mft_attribute(ino, mftno, attr);
  252. if (error) {
  253. ntfs_debug(DEBUG_FILE3, "parse_attributes: "
  254. "ntfs_insert_mft_attribute(mftno 0x%x, "
  255. "attribute type 0x%x) failedn", mftno,
  256. NTFS_GETU32(alist + 0));
  257. ntfs_free(mft);
  258. return error;
  259. }
  260. len -= l;
  261. alist += l;
  262. }
  263. ntfs_free(mft);
  264. *plen = len;
  265. return 0;
  266. force_load_mft_data:
  267. {
  268. ntfs_u8 *mft2, *attr2;
  269. int mftno2;
  270. int last_mft2 = last_mft;
  271. int len2 = len;
  272. int error2;
  273. int found2 = 0;
  274. ntfs_u8 *alist2 = alist;
  275. /*
  276.  * We only get here if $DATA wasn't found in $MFT which only happens
  277.  * on volume mount when $MFT has an attribute list and there are
  278.  * attributes before $DATA which are inside extent mft records. So
  279.  * we just skip forward to the $DATA attribute and read that. Then we
  280.  * restart which is safe as an attribute will not be inserted twice.
  281.  *
  282.  * This still will not fix the case where the attribute list is non-
  283.  * resident, larger than 1024 bytes, and the $DATA attribute list entry
  284.  * is not in the first 1024 bytes. FIXME: This should be implemented
  285.  * somehow! Perhaps by passing special error code up to
  286.  * ntfs_load_attributes() so it keeps going trying to get to $DATA
  287.  * regardless. Then it would have to restart just like we do here.
  288.  */
  289. mft2 = ntfs_malloc(ino->vol->mft_record_size);
  290. if (!mft2) {
  291. ntfs_free(mft);
  292. return -ENOMEM;
  293. }
  294. ntfs_memcpy(mft2, mft, ino->vol->mft_record_size);
  295. while (len2 > 8) {
  296. l = NTFS_GETU16(alist2 + 4);
  297. if (l > len2)
  298. break;
  299. if (NTFS_GETU32(alist2 + 0x0) < ino->vol->at_data) {
  300. len2 -= l;
  301. alist2 += l;
  302. continue;
  303. }
  304. if (NTFS_GETU32(alist2 + 0x0) > ino->vol->at_data) {
  305. if (found2)
  306. break;
  307. /* Uh-oh! It really isn't there! */
  308. ntfs_error("Either the $MFT is corrupt or, equally "
  309. "likely, the $MFT is too complex for "
  310. "the current driver to handle. Please "
  311. "email the ntfs maintainer that you "
  312. "saw this message. Thank you.n");
  313. goto failed_reading_mft_data;
  314. }
  315.         /* Process attribute description. */
  316. mftno2 = NTFS_GETU32(alist2 + 0x10); 
  317. if (mftno2 != ino->i_number && mftno2 != last_mft2) {
  318. last_mft2 = mftno2;
  319. error2 = ntfs_read_mft_record(ino->vol, mftno2, mft2);
  320. if (error2) {
  321. ntfs_debug(DEBUG_FILE3, "parse_attributes: "
  322. "ntfs_read_mft_record(mftno2 = 0x%x) "
  323. "failedn", mftno2);
  324. ntfs_free(mft2);
  325. goto failed_reading_mft_data;
  326. }
  327. }
  328. attr2 = ntfs_find_attr_in_mft_rec(
  329. ino->vol,  /* ntfs volume */
  330. mftno2 == ino->i_number ?/* mft record is: */
  331. ino->attr:  /*  base record */
  332. mft2,  /*  extension record */
  333. NTFS_GETU32(alist2 + 0), /* type */
  334. (wchar_t*)(alist2 + alist2[7]), /* name */
  335. alist2[6],   /* name length */
  336. 1,  /* ignore case */
  337. NTFS_GETU16(alist2 + 24) /* instance number */
  338. );
  339. if (!attr2) {
  340. ntfs_error("parse_attributes: mft records 0x%x and/or "
  341.        "0x%x corrupt!n", ino->i_number,
  342.        mftno2);
  343. ntfs_free(mft2);
  344. goto failed_reading_mft_data;
  345. }
  346. error2 = ntfs_insert_mft_attribute(ino, mftno2, attr2);
  347. if (error2) {
  348. ntfs_debug(DEBUG_FILE3, "parse_attributes: "
  349. "ntfs_insert_mft_attribute(mftno2 0x%x, "
  350. "attribute2 type 0x%x) failedn", mftno2,
  351. NTFS_GETU32(alist2 + 0));
  352. ntfs_free(mft2);
  353. goto failed_reading_mft_data;
  354. }
  355. len2 -= l;
  356. alist2 += l;
  357. found2 = 1;
  358. }
  359. ntfs_free(mft2);
  360. tries = 1;
  361. goto continue_after_loading_mft_data;
  362. }
  363. }
  364. static void ntfs_load_attributes(ntfs_inode *ino)
  365. {
  366. ntfs_attribute *alist;
  367. int datasize;
  368. int offset, len, delta;
  369. char *buf;
  370. ntfs_volume *vol = ino->vol;
  371. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x 1n", ino->i_number);
  372. if (ntfs_insert_mft_attributes(ino, ino->attr, ino->i_number))
  373. return;
  374. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x 2n", ino->i_number);
  375. alist = ntfs_find_attr(ino, vol->at_attribute_list, 0);
  376. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x 3n", ino->i_number);
  377. if (!alist)
  378. return;
  379. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x 4n", ino->i_number);
  380. datasize = alist->size;
  381. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x: alist->size = 0x%xn",
  382. ino->i_number, alist->size);
  383. if (alist->resident) {
  384. parse_attributes(ino, alist->d.data, &datasize);
  385. return;
  386. }
  387. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x 5n", ino->i_number);
  388. buf = ntfs_malloc(1024);
  389. if (!buf)    /* FIXME: Should be passing error code to caller. (AIA) */
  390. return;
  391. delta = 0;
  392. for (offset = 0; datasize; datasize -= len, offset += len) {
  393. ntfs_io io;
  394. io.fn_put = ntfs_put;
  395. io.fn_get = 0;
  396. io.param = buf + delta;
  397. len = 1024 - delta;
  398. if (len > datasize)
  399. len = datasize;
  400. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x: len = %in",
  401. ino->i_number, len);
  402. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x: delta = %in",
  403. ino->i_number, delta);
  404. io.size = len;
  405. if (ntfs_read_attr(ino, vol->at_attribute_list, 0, offset,
  406.    &io))
  407. ntfs_error("error in load_attributesn");
  408. delta += len;
  409. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x: after += len, "
  410. "delta = %in", ino->i_number, delta);
  411. parse_attributes(ino, buf, &delta);
  412. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x: after "
  413. "parse_attr, delta = %in", ino->i_number,
  414. delta);
  415. if (delta)
  416. /* Move remaining bytes to buffer start. */
  417. ntfs_memmove(buf, buf + len - delta, delta);
  418. }
  419. ntfs_debug(DEBUG_FILE2, "load_attributes 0x%x 6n", ino->i_number);
  420. ntfs_free(buf);
  421. }
  422. int ntfs_init_inode(ntfs_inode *ino, ntfs_volume *vol, int inum)
  423. {
  424. char *buf;
  425. int error;
  426. ntfs_debug(DEBUG_FILE1, "Initializing inode 0x%xn", inum);
  427. ino->i_number = inum;
  428. ino->vol = vol;
  429. ino->attr = buf = ntfs_malloc(vol->mft_record_size);
  430. if (!buf)
  431. return -ENOMEM;
  432. error = ntfs_read_mft_record(vol, inum, ino->attr);
  433. if (error) {
  434. ntfs_debug(DEBUG_OTHER, "Init inode: 0x%x failedn", inum);
  435. return error;
  436. }
  437. ntfs_debug(DEBUG_FILE2, "Init inode: got mft 0x%xn", inum);
  438. ino->sequence_number = NTFS_GETU16(buf + 0x10);
  439. ino->attr_count = 0;
  440. ino->record_count = 0;
  441. ino->records = 0;
  442. ino->attrs = 0;
  443. ntfs_load_attributes(ino);
  444. ntfs_debug(DEBUG_FILE2, "Init inode: done 0x%xn", inum);
  445. return 0;
  446. }
  447. void ntfs_clear_inode(ntfs_inode *ino)
  448. {
  449. int i;
  450. if (!ino->attr) {
  451. ntfs_error("ntfs_clear_inode: double freen");
  452. return;
  453. }
  454. ntfs_free(ino->attr);
  455. ino->attr = 0;
  456. ntfs_free(ino->records);
  457. ino->records = 0;
  458. for (i = 0; i < ino->attr_count; i++) {
  459. if (ino->attrs[i].name)
  460. ntfs_free(ino->attrs[i].name);
  461. if (ino->attrs[i].resident) {
  462. if (ino->attrs[i].d.data)
  463. ntfs_free(ino->attrs[i].d.data);
  464. } else {
  465. if (ino->attrs[i].d.r.runlist)
  466. ntfs_vfree(ino->attrs[i].d.r.runlist);
  467. }
  468. }
  469. ntfs_free(ino->attrs);
  470. ino->attrs = 0;
  471. }
  472. /* Check and fixup a MFT record. */
  473. int ntfs_check_mft_record(ntfs_volume *vol, char *record)
  474. {
  475. return ntfs_fixup_record(record, "FILE", vol->mft_record_size);
  476. }
  477. /* Return (in result) the value indicating the next available attribute 
  478.  * chunk number. Works for inodes w/o extension records only. */
  479. int ntfs_allocate_attr_number(ntfs_inode *ino, int *result)
  480. {
  481. if (ino->record_count != 1)
  482. return -EOPNOTSUPP;
  483. *result = NTFS_GETU16(ino->attr + 0x28);
  484. NTFS_PUTU16(ino->attr + 0x28, (*result) + 1);
  485. return 0;
  486. }
  487. /* Find the location of an attribute in the inode. A name of NULL indicates
  488.  * unnamed attributes. Return pointer to attribute or NULL if not found. */
  489. char *ntfs_get_attr(ntfs_inode *ino, int attr, char *name)
  490. {
  491. /* Location of first attribute. */
  492. char *it = ino->attr + NTFS_GETU16(ino->attr + 0x14);
  493. int type;
  494. int len;
  495. /* Only check for magic DWORD here, fixup should have happened before.*/
  496. if (!IS_MFT_RECORD(ino->attr))
  497. return 0;
  498. do {
  499. type = NTFS_GETU32(it);
  500. len = NTFS_GETU16(it + 4);
  501. /* We found the attribute type. Is the name correct, too? */
  502. if (type == attr) {
  503. int namelen = NTFS_GETU8(it + 9);
  504. char *name_it, *n = name;
  505. /* Match given name and attribute name if present.
  506.    Make sure attribute name is Unicode. */
  507. if (!name) {
  508. goto check_namelen;
  509. } else if (namelen) {
  510. for (name_it = it + NTFS_GETU16(it + 10);
  511.      namelen; n++, name_it += 2, namelen--)
  512. if (*name_it != *n || name_it[1])
  513. break;
  514. check_namelen:
  515. if (!namelen)
  516. break;
  517. }
  518. }
  519. it += len;
  520. } while (type != -1); /* List of attributes ends with type -1. */
  521. if (type == -1)
  522. return 0;
  523. return it;
  524. }
  525. __s64 ntfs_get_attr_size(ntfs_inode *ino, int type, char *name)
  526. {
  527. ntfs_attribute *attr = ntfs_find_attr(ino, type, name);
  528. if (!attr)
  529. return 0;
  530. return
  531. attr->size;
  532. }
  533. int ntfs_attr_is_resident(ntfs_inode *ino, int type, char *name)
  534. {
  535. ntfs_attribute *attr = ntfs_find_attr(ino, type, name);
  536. if (!attr)
  537. return 0;
  538. return attr->resident;
  539. }
  540. /*
  541.  * A run is coded as a type indicator, an unsigned length, and a signed cluster
  542.  * offset.
  543.  * . To save space, length and offset are fields of variable length. The low
  544.  *   nibble of the type indicates the width of the length :), the high nibble
  545.  *   the width of the offset.
  546.  * . The first offset is relative to cluster 0, later offsets are relative to
  547.  *   the previous cluster.
  548.  *
  549.  * This function decodes a run. Length is an output parameter, data and cluster
  550.  * are in/out parameters.
  551.  */
  552. int ntfs_decompress_run(unsigned char **data, int *length, 
  553. ntfs_cluster_t *cluster, int *ctype)
  554. {
  555. unsigned char type = *(*data)++;
  556. *ctype = 0;
  557. switch (type & 0xF) {
  558. case 1: 
  559. *length = NTFS_GETS8(*data);
  560. break;
  561. case 2: 
  562. *length = NTFS_GETS16(*data);
  563. break;
  564. case 3: 
  565. *length = NTFS_GETS24(*data);
  566. break;
  567.         case 4: 
  568. *length = NTFS_GETS32(*data);
  569. break;
  570.          /* Note: cases 5-8 are probably pointless to code, since how
  571.  * many runs > 4GB of length are there? At the most, cases 5
  572.  * and 6 are probably necessary, and would also require making
  573.  * length 64-bit throughout. */
  574. default:
  575. ntfs_error("Can't decode run type field 0x%xn", type);
  576. return -1;
  577. }
  578. // ntfs_debug(DEBUG_FILE3, "ntfs_decompress_run: length = 0x%xn",*length);
  579. if (*length < 0)
  580. {
  581. ntfs_error("Negative run length decodedn");
  582. return -1;
  583. }
  584. *data += (type & 0xF);
  585. switch (type & 0xF0) {
  586. case 0:
  587. *ctype = 2;
  588. break;
  589. case 0x10:
  590. *cluster += NTFS_GETS8(*data);
  591. break;
  592. case 0x20:
  593. *cluster += NTFS_GETS16(*data);
  594. break;
  595. case 0x30:
  596. *cluster += NTFS_GETS24(*data);
  597. break;
  598. case 0x40:
  599. *cluster += NTFS_GETS32(*data);
  600. break;
  601. #if 0 /* Keep for future, in case ntfs_cluster_t ever becomes 64bit. */
  602. case 0x50: 
  603. *cluster += NTFS_GETS40(*data);
  604. break;
  605. case 0x60: 
  606. *cluster += NTFS_GETS48(*data);
  607. break;
  608. case 0x70: 
  609. *cluster += NTFS_GETS56(*data);
  610. break;
  611. case 0x80: 
  612. *cluster += NTFS_GETS64(*data);
  613. break;
  614. #endif
  615. default:
  616. ntfs_error("Can't decode run type field 0x%xn", type);
  617. return -1;
  618. }
  619. // ntfs_debug(DEBUG_FILE3, "ntfs_decompress_run: cluster = 0x%xn",
  620. // *cluster);
  621. *data += (type >> 4);
  622. return 0;
  623. }
  624. static void dump_runlist(const ntfs_runlist *rl, const int rlen);
  625. /*
  626.  * FIXME: ntfs_readwrite_attr() has the effect of writing @dest to @offset of
  627.  * the attribute value of the attribute @attr in the in memory inode @ino.
  628.  * If the attribute value of @attr is non-resident the value's contents at
  629.  * @offset are actually written to disk (from @dest). The on disk mft record
  630.  * describing the non-resident attribute value is not updated!
  631.  * If the attribute value is resident then the value is written only in
  632.  * memory. The on disk mft record containing the value is not written to disk.
  633.  * A possible fix would be to call ntfs_update_inode() before returning. (AIA)
  634.  */
  635. /* Reads l bytes of the attribute (attr, name) of ino starting at offset on
  636.  * vol into buf. Returns the number of bytes read in the ntfs_io struct.
  637.  * Returns 0 on success, errno on failure */
  638. int ntfs_readwrite_attr(ntfs_inode *ino, ntfs_attribute *attr, __s64 offset,
  639. ntfs_io *dest)
  640. {
  641. int rnum, s_vcn, error, clustersizebits;
  642. ntfs_cluster_t cluster, s_cluster, vcn, len;
  643. __s64 l, chunk, copied;
  644. ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): %s 0x%x bytes at offset "
  645. "0x%Lx %s inode 0x%x, attr type 0x%x.n",
  646. dest->do_read ? "Read" : "Write", dest->size, offset,
  647. dest->do_read ? "from" : "to", ino->i_number,
  648. attr->type);
  649. l = dest->size;
  650. if (l == 0)
  651. return 0;
  652. if (dest->do_read) {
  653. /* If read _starts_ beyond end of stream, return nothing. */
  654. if (offset >= attr->size) {
  655. dest->size = 0;
  656. return 0;
  657. }
  658. /* If read _extends_ beyond end of stream, return as much
  659.  * initialised data as we have. */
  660. if (offset + l >= attr->size)
  661. l = dest->size = attr->size - offset;
  662. } else {
  663. /*
  664.  * If write extends beyond _allocated_ size, extend attribute,
  665.  * updating attr->allocated and attr->size in the process. (AIA)
  666.  */
  667. if ((!attr->resident && offset + l > attr->allocated) ||
  668. (attr->resident && offset + l > attr->size)) {
  669. error = ntfs_resize_attr(ino, attr, offset + l);
  670. if (error)
  671. return error;
  672. }
  673. if (!attr->resident) {
  674. /* Has amount of data increased? */
  675. if (offset + l > attr->size)
  676. attr->size = offset + l;
  677. /* Has amount of initialised data increased? */
  678. if (offset + l > attr->initialized) {
  679. /* FIXME: Clear the section between the old
  680.    * initialised length and the write start.
  681.  * (AIA) */
  682. attr->initialized = offset + l;
  683. }
  684. }
  685. }
  686. if (attr->resident) {
  687. if (dest->do_read)
  688. dest->fn_put(dest, (ntfs_u8*)attr->d.data + offset, l);
  689. else
  690. dest->fn_get((ntfs_u8*)attr->d.data + offset, dest, l);
  691. dest->size = l;
  692. return 0;
  693. }
  694. if (dest->do_read) {
  695. /* Read uninitialized data. */
  696. if (offset >= attr->initialized)
  697. return ntfs_read_zero(dest, l);
  698. if (offset + l > attr->initialized) {
  699. dest->size = chunk = attr->initialized - offset;
  700. error = ntfs_readwrite_attr(ino, attr, offset, dest);
  701. if (error || (dest->size != chunk && (error = -EIO, 1)))
  702. return error;
  703. dest->size += l - chunk;
  704. return ntfs_read_zero(dest, l - chunk);
  705. }
  706. if (attr->flags & ATTR_IS_COMPRESSED)
  707. return ntfs_read_compressed(ino, attr, offset, dest);
  708. } else {
  709. if (attr->flags & ATTR_IS_COMPRESSED)
  710. return ntfs_write_compressed(ino, attr, offset, dest);
  711. }
  712. vcn = 0;
  713. clustersizebits = ino->vol->cluster_size_bits;
  714. s_vcn = offset >> clustersizebits;
  715. for (rnum = 0; rnum < attr->d.r.len &&
  716. vcn + attr->d.r.runlist[rnum].len <= s_vcn; rnum++)
  717. vcn += attr->d.r.runlist[rnum].len;
  718. if (rnum == attr->d.r.len) {
  719. ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): EOPNOTSUPP: "
  720. "inode = 0x%x, rnum = %i, offset = 0x%Lx, vcn = 0x%x, "
  721. "s_vcn = 0x%x.n", ino->i_number, rnum, offset, vcn,
  722. s_vcn);
  723. dump_runlist(attr->d.r.runlist, attr->d.r.len);
  724. /*FIXME: Should extend runlist. */
  725. return -EOPNOTSUPP;
  726. }
  727. copied = 0;
  728. while (l) {
  729. s_vcn = offset >> clustersizebits;
  730. cluster = attr->d.r.runlist[rnum].lcn;
  731. len = attr->d.r.runlist[rnum].len;
  732. s_cluster = cluster + s_vcn - vcn;
  733. chunk = ((__s64)(vcn + len) << clustersizebits) - offset;
  734. if (chunk > l)
  735. chunk = l;
  736. dest->size = chunk;
  737. error = ntfs_getput_clusters(ino->vol, s_cluster, offset -
  738. ((__s64)s_vcn << clustersizebits), dest);
  739. if (error) {
  740. ntfs_error("Read/write error.n");
  741. dest->size = copied;
  742. return error;
  743. }
  744. l -= chunk;
  745. copied += chunk;
  746. offset += chunk;
  747. if (l && offset >= ((__s64)(vcn + len) << clustersizebits)) {
  748. rnum++;
  749. vcn += len;
  750. cluster = attr->d.r.runlist[rnum].lcn;
  751. len = attr->d.r.runlist[rnum].len;
  752. }
  753. }
  754. dest->size = copied;
  755. return 0;
  756. }
  757. int ntfs_read_attr(ntfs_inode *ino, int type, char *name, __s64 offset,
  758.    ntfs_io *buf)
  759. {
  760. ntfs_attribute *attr;
  761. buf->do_read = 1;
  762. attr = ntfs_find_attr(ino, type, name);
  763. if (!attr) {
  764. ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): attr 0x%x not found "
  765. "in inode 0x%xn", type, ino->i_number);
  766. return -EINVAL;
  767. }
  768. return ntfs_readwrite_attr(ino, attr, offset, buf);
  769. }
  770. int ntfs_write_attr(ntfs_inode *ino, int type, char *name, __s64 offset,
  771.     ntfs_io *buf)
  772. {
  773. ntfs_attribute *attr;
  774. buf->do_read = 0;
  775. attr = ntfs_find_attr(ino, type, name);
  776. if (!attr) {
  777. ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): attr 0x%x not found "
  778. "in inode 0x%xn", type, ino->i_number);
  779. return -EINVAL;
  780. }
  781. return ntfs_readwrite_attr(ino, attr, offset, buf);
  782. }
  783. /* -2 = error, -1 = hole, >= 0 means real disk cluster (lcn). */
  784. int ntfs_vcn_to_lcn(ntfs_inode *ino, int vcn)
  785. {
  786. int rnum;
  787. ntfs_attribute *data;
  788. data = ntfs_find_attr(ino, ino->vol->at_data, 0);
  789. if (!data || data->resident || data->flags & (ATTR_IS_COMPRESSED |
  790. ATTR_IS_ENCRYPTED))
  791. return -2;
  792. if (data->size <= (__s64)vcn << ino->vol->cluster_size_bits)
  793. return -2;
  794. if (data->initialized <= (__s64)vcn << ino->vol->cluster_size_bits)
  795. return -1;
  796. for (rnum = 0; rnum < data->d.r.len &&
  797. vcn >= data->d.r.runlist[rnum].len; rnum++)
  798. vcn -= data->d.r.runlist[rnum].len;
  799. if (data->d.r.runlist[rnum].lcn >= 0)
  800. return data->d.r.runlist[rnum].lcn + vcn;
  801. return data->d.r.runlist[rnum].lcn + vcn;
  802. }
  803. static int allocate_store(ntfs_volume *vol, ntfs_disk_inode *store, int count)
  804. {
  805. int i;
  806. if (store->count > count)
  807. return 0;
  808. if (store->size < count) {
  809. ntfs_mft_record *n = ntfs_malloc((count + 4) * 
  810.  sizeof(ntfs_mft_record));
  811. if (!n)
  812. return -ENOMEM;
  813. if (store->size) {
  814. for (i = 0; i < store->size; i++)
  815. n[i] = store->records[i];
  816. ntfs_free(store->records);
  817. }
  818. store->size = count + 4;
  819. store->records = n;
  820. }
  821. for (i = store->count; i < count; i++) {
  822. store->records[i].record = ntfs_malloc(vol->mft_record_size);
  823. if (!store->records[i].record)
  824. return -ENOMEM;
  825. store->count++;
  826. }
  827. return 0;
  828. }
  829. static void deallocate_store(ntfs_disk_inode* store)
  830. {
  831. int i;
  832. for (i = 0; i < store->count; i++)
  833. ntfs_free(store->records[i].record);
  834. ntfs_free(store->records);
  835. store->count = store->size = 0;
  836. store->records = 0;
  837. }
  838. /**
  839.  * layout_runs - compress runlist into mapping pairs array
  840.  * @attr: attribute containing the runlist to compress
  841.  * @rec: destination buffer to hold the mapping pairs array
  842.  * @offs: current position in @rec (in/out variable)
  843.  * @size: size of the buffer @rec
  844.  *
  845.  * layout_runs walks the runlist in @attr, compresses it and writes it out the
  846.  * resulting mapping pairs array into @rec (up to a maximum of @size bytes are
  847.  * written). On entry @offs is the offset in @rec at which to begin writing the
  848.  * mapping pairs array. On exit, it contains the offset in @rec of the first
  849.  * byte after the end of the mapping pairs array.
  850.  */
  851. static int layout_runs(ntfs_attribute *attr, char *rec, int *offs, int size)
  852. {
  853. int i, len, offset, coffs;
  854. /* ntfs_cluster_t MUST be signed! (AIA) */
  855. ntfs_cluster_t cluster, rclus;
  856. ntfs_runlist *rl = attr->d.r.runlist;
  857. cluster = 0;
  858. offset = *offs;
  859. for (i = 0; i < attr->d.r.len; i++) {
  860. /*
  861.  * We cheat with this check on the basis that lcn will never
  862.  * be less than -1 and the lcn delta will fit in signed
  863.  * 32-bits (ntfs_cluster_t). (AIA)
  864.  */
  865. if (rl[i].lcn < (ntfs_cluster_t)-1) {
  866. ntfs_error("layout_runs() encountered an out of bounds "
  867. "cluster delta, lcn = %i.n",
  868. rl[i].lcn);
  869. return -ERANGE;
  870. }
  871. rclus = rl[i].lcn - cluster;
  872. len = rl[i].len;
  873. rec[offset] = 0;
  874.   if (offset + 9 > size)
  875. return -E2BIG; /* It might still fit, but this
  876. * simplifies testing. */
  877. /*
  878.  * Run length is stored as signed number, so deal with it
  879.  * properly, i.e. observe that a negative number will have all
  880.  * its most significant bits set to 1 but we don't store that
  881.  * in the mapping pairs array. We store the smallest type of
  882.  * negative number required, thus in the first if we check
  883.  * whether len fits inside a signed byte and if so we store it
  884.  * as such, the next ifs check for a signed short, then a signed
  885.  * 24-bit and finally the full blown signed 32-bit. Same goes
  886.  * for rlus below. (AIA)
  887.  */
  888. if (len >= -0x80 && len <= 0x7f) {
  889. NTFS_PUTU8(rec + offset + 1, len & 0xff);
  890. coffs = 1;
  891.   } else if (len >= -0x8000 && len <= 0x7fff) {
  892. NTFS_PUTU16(rec + offset + 1, len & 0xffff);
  893. coffs = 2;
  894.   } else if (len >= -0x800000 && len <= 0x7fffff) {
  895. NTFS_PUTU24(rec + offset + 1, len & 0xffffff);
  896. coffs = 3;
  897. } else /* if (len >= -0x80000000LL && len <= 0x7fffffff */ {
  898. NTFS_PUTU32(rec + offset + 1, len);
  899. coffs = 4;
  900. } /* else ... FIXME: When len becomes 64-bit we need to extend
  901.    *       the else if () statements. (AIA) */
  902. *(rec + offset) |= coffs++;
  903. if (rl[i].lcn == (ntfs_cluster_t)-1) /* Compressed run. */
  904. /* Nothing */;
  905. else if (rclus >= -0x80 && rclus <= 0x7f) {
  906. *(rec + offset) |= 0x10;
  907. NTFS_PUTS8(rec + offset + coffs, rclus & 0xff);
  908. coffs += 1;
  909. } else if (rclus >= -0x8000 && rclus <= 0x7fff) {
  910. *(rec + offset) |= 0x20;
  911. NTFS_PUTS16(rec + offset + coffs, rclus & 0xffff);
  912. coffs += 2;
  913. } else if (rclus >= -0x800000 && rclus <= 0x7fffff) {
  914. *(rec + offset) |= 0x30;
  915. NTFS_PUTS24(rec + offset + coffs, rclus & 0xffffff);
  916. coffs += 3;
  917. } else /* if (rclus >= -0x80000000LL && rclus <= 0x7fffffff)*/ {
  918. *(rec + offset) |= 0x40;
  919. NTFS_PUTS32(rec + offset + coffs, rclus
  920. /* & 0xffffffffLL */);
  921. coffs += 4;
  922. } /* FIXME: When rclus becomes 64-bit.
  923. else if (rclus >= -0x8000000000 && rclus <= 0x7FFFFFFFFF) {
  924. *(rec + offset) |= 0x50;
  925. NTFS_PUTS40(rec + offset + coffs, rclus &
  926. 0xffffffffffLL);
  927. coffs += 5;
  928. } else if (rclus >= -0x800000000000 && 
  929. rclus <= 0x7FFFFFFFFFFF) {
  930. *(rec + offset) |= 0x60;
  931. NTFS_PUTS48(rec + offset + coffs, rclus &
  932. 0xffffffffffffLL);
  933. coffs += 6;
  934. } else if (rclus >= -0x80000000000000 && 
  935. rclus <= 0x7FFFFFFFFFFFFF) {
  936. *(rec + offset) |= 0x70;
  937. NTFS_PUTS56(rec + offset + coffs, rclus &
  938. 0xffffffffffffffLL);
  939. coffs += 7;
  940. } else {
  941. *(rec + offset) |= 0x80;
  942. NTFS_PUTS64(rec + offset + coffs, rclus);
  943. coffs += 8;
  944. } */
  945. offset += coffs;
  946. if (rl[i].lcn)
  947. cluster = rl[i].lcn;
  948. }
  949. if (offset >= size)
  950. return -E2BIG;
  951. /* Terminating null. */
  952. *(rec + offset++) = 0;
  953. *offs = offset;
  954. return 0;
  955. }
  956. static void count_runs(ntfs_attribute *attr, char *buf)
  957. {
  958. ntfs_u32 first, count, last, i;
  959. first = 0;
  960. for (i = 0, count = 0; i < attr->d.r.len; i++)
  961. count += attr->d.r.runlist[i].len;
  962. last = first + count - 1;
  963. NTFS_PUTU64(buf + 0x10, first);
  964. NTFS_PUTU64(buf + 0x18, last);
  965. /**
  966.  * layout_attr - convert in memory attribute to on disk attribute record
  967.  * @attr: in memory attribute to convert
  968.  * @buf: destination buffer for on disk attribute record
  969.  * @size: size of the destination buffer
  970.  * @psize: size of converted on disk attribute record (out variable)
  971.  *
  972.  * layout_attr() takes the attribute @attr and converts it into the appropriate
  973.  * on disk structure, writing it into @buf (up to @size bytes are written).
  974.  *
  975.  * On success we return 0 and set @*psize to the actual byte size of the on-
  976.  * disk attribute that was written into @buf.
  977.  */
  978. static int layout_attr(ntfs_attribute *attr, char *buf, int size, int *psize)
  979. {
  980. int nameoff, hdrsize, asize;
  981. if (attr->resident) {
  982. nameoff = 0x18;
  983. hdrsize = (nameoff + 2 * attr->namelen + 7) & ~7;
  984. asize = (hdrsize + attr->size + 7) & ~7;
  985. if (size < asize)
  986. return -E2BIG;
  987. NTFS_PUTU32(buf + 0x10, attr->size);
  988. NTFS_PUTU8(buf + 0x16, attr->indexed);
  989. NTFS_PUTU16(buf + 0x14, hdrsize);
  990. if (attr->size)
  991. ntfs_memcpy(buf + hdrsize, attr->d.data, attr->size);
  992. } else {
  993. int error;
  994. if (attr->flags & ATTR_IS_COMPRESSED)
  995.   nameoff = 0x48;
  996.   else
  997.   nameoff = 0x40;
  998.   hdrsize = (nameoff + 2 * attr->namelen + 7) & ~7;
  999.   if (size < hdrsize)
  1000.   return -E2BIG;
  1001.   /* Make asize point at the end of the attribute record header,
  1002.    i.e. at the beginning of the mapping pairs array. */
  1003.   asize = hdrsize;
  1004.   error = layout_runs(attr, buf, &asize, size);
  1005.   /* Now, asize points one byte beyond the end of the mapping
  1006.    pairs array. */
  1007. if (error)
  1008.   return error;
  1009.   /* The next attribute has to begin on 8-byte boundary. */
  1010. asize = (asize + 7) & ~7;
  1011. /* FIXME: fragments */
  1012. count_runs(attr, buf);
  1013. NTFS_PUTU16(buf + 0x20, hdrsize);
  1014. NTFS_PUTU16(buf + 0x22, attr->cengine);
  1015. NTFS_PUTU32(buf + 0x24, 0);
  1016. NTFS_PUTS64(buf + 0x28, attr->allocated);
  1017. NTFS_PUTS64(buf + 0x30, attr->size);
  1018. NTFS_PUTS64(buf + 0x38, attr->initialized);
  1019. if (attr->flags & ATTR_IS_COMPRESSED)
  1020. NTFS_PUTS64(buf + 0x40, attr->compsize);
  1021. }
  1022. NTFS_PUTU32(buf, attr->type);
  1023. NTFS_PUTU32(buf + 4, asize);
  1024. NTFS_PUTU8(buf + 8, attr->resident ? 0 : 1);
  1025. NTFS_PUTU8(buf + 9, attr->namelen);
  1026. NTFS_PUTU16(buf + 0xa, nameoff);
  1027. NTFS_PUTU16(buf + 0xc, attr->flags);
  1028. NTFS_PUTU16(buf + 0xe, attr->attrno);
  1029. if (attr->namelen)
  1030. ntfs_memcpy(buf + nameoff, attr->name, 2 * attr->namelen);
  1031. *psize = asize;
  1032. return 0;
  1033. }
  1034. /**
  1035.  * layout_inode - convert an in-memory inode into on disk mft record(s)
  1036.  * @ino: in memory inode to convert
  1037.  * @store: on disk inode, contain buffers for the on disk mft record(s)
  1038.  *
  1039.  * layout_inode takes the in memory inode @ino, converts it into a (sequence of)
  1040.  * mft record(s) and writes them to the appropriate buffers in the @store.
  1041.  *
  1042.  * Return 0 on success,
  1043.  * the required mft record count (>0) if the inode does not fit,
  1044.  * -ENOMEM if memory allocation problem, or
  1045.  * -EOPNOTSUP if beyond our capabilities.
  1046.  *
  1047.  * TODO: We at the moment do not support extension mft records. (AIA)
  1048.  */
  1049. int layout_inode(ntfs_inode *ino, ntfs_disk_inode *store)
  1050. {
  1051. int offset, i, size, psize, error, count, recno;
  1052. ntfs_attribute *attr;
  1053. unsigned char *rec;
  1054. error = allocate_store(ino->vol, store, ino->record_count);
  1055. if (error)
  1056. return error;
  1057. size = ino->vol->mft_record_size;
  1058.   count = i = 0;
  1059.   do {
  1060.   if (count < ino->record_count) {
  1061.   recno = ino->records[count];
  1062.   } else {
  1063.   error = allocate_store(ino->vol, store, count + 1);
  1064.   if (error)
  1065.   return error;
  1066.   recno = -1;
  1067. }
  1068. /*
  1069.  * FIXME: We need to support extension records properly.
  1070.  * At the moment they wouldn't work. Probably would "just" get
  1071.  * corrupted if we write to them... (AIA)
  1072.  */
  1073.   store->records[count].recno = recno;
  1074.   rec = store->records[count].record;
  1075.   count++;
  1076.   /* Copy mft record header. */
  1077.   offset = NTFS_GETU16(ino->attr + 0x14); /* attrs_offset */
  1078. ntfs_memcpy(rec, ino->attr, offset);
  1079.   /* Copy attributes. */
  1080.   while (i < ino->attr_count) {
  1081.   attr = ino->attrs + i;
  1082.   error = layout_attr(attr, rec + offset,
  1083. size - offset - 8, &psize);
  1084.   if (error == -E2BIG && offset != NTFS_GETU16(ino->attr
  1085. + 0x14))
  1086.   break;
  1087.   if (error)
  1088.   return error;
  1089.   offset += psize;
  1090.   i++;
  1091.   }
  1092.   /* Terminating attribute. */
  1093. NTFS_PUTU32(rec + offset, 0xFFFFFFFF);
  1094. offset += 4;
  1095. NTFS_PUTU32(rec + offset, 0);
  1096. offset += 4;
  1097. NTFS_PUTU32(rec + 0x18, offset);
  1098. } while (i < ino->attr_count || count < ino->record_count);
  1099. return count - ino->record_count;
  1100. }
  1101. /*
  1102.  * FIXME: ntfs_update_inode() calls layout_inode() to create the mft record on
  1103.  * disk structure corresponding to the inode @ino. After that, ntfs_write_attr()
  1104.  * is called to write out the created mft record to disk.
  1105.  * We shouldn't need to re-layout every single time we are updating an mft
  1106.  * record. No wonder the ntfs driver is slow like hell. (AIA)
  1107.  */
  1108. int ntfs_update_inode(ntfs_inode *ino)
  1109. {
  1110. int error, i;
  1111. ntfs_disk_inode store;
  1112. ntfs_io io;
  1113. ntfs_bzero(&store, sizeof(store));
  1114. error = layout_inode(ino, &store);
  1115. if (error == -E2BIG) {
  1116. i = ntfs_split_indexroot(ino);
  1117. if (i != -ENOTDIR) {
  1118. if (!i)
  1119. i = layout_inode(ino, &store);
  1120. error = i;
  1121. }
  1122. }
  1123. if (error == -E2BIG) {
  1124. error = ntfs_attr_allnonresident(ino);
  1125. if (!error)
  1126. error = layout_inode(ino, &store);
  1127. }
  1128. if (error > 0) {
  1129. /* FIXME: Introduce extension records. */
  1130. error = -E2BIG;
  1131. }
  1132. if (error) {
  1133. if (error == -E2BIG)
  1134. ntfs_error("Cannot handle saving inode 0x%x.n",
  1135.    ino->i_number);
  1136. deallocate_store(&store);
  1137. return error;
  1138. }
  1139. io.fn_get = ntfs_get;
  1140. io.fn_put = 0;
  1141. for (i = 0; i < store.count; i++) {
  1142. error = ntfs_insert_fixups(store.records[i].record,
  1143. ino->vol->mft_record_size);
  1144. if (error) {
  1145. printk(KERN_ALERT "NTFS: ntfs_update_inode() caught "
  1146. "corrupt %s mtf record ntfs record "
  1147. "header. Refusing to write corrupt "
  1148. "data to disk. Unmount and run chkdsk "
  1149. "immediately!n", i ? "extension":
  1150. "base");
  1151. deallocate_store(&store);
  1152. return -EIO;
  1153. }
  1154. io.param = store.records[i].record;
  1155. io.size = ino->vol->mft_record_size;
  1156. error = ntfs_write_attr(ino->vol->mft_ino, ino->vol->at_data,
  1157. 0, (__s64)store.records[i].recno <<
  1158. ino->vol->mft_record_size_bits, &io);
  1159. if (error || io.size != ino->vol->mft_record_size) {
  1160. /* Big trouble, partially written file. */
  1161. ntfs_error("Please unmount: Write error in inode "
  1162. "0x%xn", ino->i_number);
  1163. deallocate_store(&store);
  1164. return error ? error : -EIO;
  1165. }
  1166. }
  1167. deallocate_store(&store);
  1168. return 0;
  1169. }
  1170. void ntfs_decompress(unsigned char *dest, unsigned char *src, ntfs_size_t l)
  1171. {
  1172. int head, comp;
  1173. int copied = 0;
  1174. unsigned char *stop;
  1175. int bits;
  1176. int tag = 0;
  1177. int clear_pos;
  1178. while (1) {
  1179. head = NTFS_GETU16(src) & 0xFFF;
  1180. /* High bit indicates that compression was performed. */
  1181. comp = NTFS_GETU16(src) & 0x8000;
  1182. src += 2;
  1183. stop = src + head;
  1184. bits = 0;
  1185. clear_pos = 0;
  1186. if (head == 0)
  1187. /* Block is not used. */
  1188. return;/* FIXME: copied */
  1189. if (!comp) { /* uncompressible */
  1190. ntfs_memcpy(dest, src, 0x1000);
  1191. dest += 0x1000;
  1192. copied += 0x1000;
  1193. src += 0x1000;
  1194. if (l == copied)
  1195. return;
  1196. continue;
  1197. }
  1198. while (src <= stop) {
  1199. if (clear_pos > 4096) {
  1200. ntfs_error("Error 1 in decompressn");
  1201. return;
  1202. }
  1203. if (!bits) {
  1204. tag = NTFS_GETU8(src);
  1205. bits = 8;
  1206. src++;
  1207. if (src > stop)
  1208. break;
  1209. }
  1210. if (tag & 1) {
  1211. int i, len, delta, code, lmask, dshift;
  1212. code = NTFS_GETU16(src);
  1213. src += 2;
  1214. if (!clear_pos) {
  1215. ntfs_error("Error 2 in decompressn");
  1216. return;
  1217. }
  1218. for (i = clear_pos - 1, lmask = 0xFFF,
  1219.      dshift = 12; i >= 0x10; i >>= 1) {
  1220. lmask >>= 1;
  1221. dshift--;
  1222. }
  1223. delta = code >> dshift;
  1224. len = (code & lmask) + 3;
  1225. for (i = 0; i < len; i++) {
  1226. dest[clear_pos] = dest[clear_pos - 
  1227.     delta - 1];
  1228. clear_pos++;
  1229. copied++;
  1230. if (copied==l)
  1231. return;
  1232. }
  1233. } else {
  1234. dest[clear_pos++] = NTFS_GETU8(src);
  1235. src++;
  1236. copied++;
  1237. if (copied==l)
  1238. return;
  1239. }
  1240. tag >>= 1;
  1241. bits--;
  1242. }
  1243. dest += clear_pos;
  1244. }
  1245. }
  1246. /*
  1247.  * NOTE: Neither of the ntfs_*_bit functions are atomic! But we don't need
  1248.  * them atomic at present as we never operate on shared/cached bitmaps.
  1249.  */
  1250. static __inline__ int ntfs_test_bit(unsigned char *byte, const int bit)
  1251. {
  1252. return byte[bit >> 3] & (1 << (bit & 7)) ? 1 : 0;
  1253. }
  1254. static __inline__ void ntfs_set_bit(unsigned char *byte, const int bit)
  1255. {
  1256. byte[bit >> 3] |= 1 << (bit & 7);
  1257. }
  1258. static __inline__ void ntfs_clear_bit(unsigned char *byte, const int bit)
  1259. {
  1260. byte[bit >> 3] &= ~(1 << (bit & 7));
  1261. }
  1262. static __inline__ int ntfs_test_and_clear_bit(unsigned char *byte,
  1263. const int bit)
  1264. {
  1265. unsigned char *ptr = byte + (bit >> 3);
  1266. int b = 1 << (bit & 7);
  1267. int oldbit = *ptr & b ? 1 : 0;
  1268. *ptr &= ~b;
  1269. return oldbit;
  1270. }
  1271. static void dump_runlist(const ntfs_runlist *rl, const int rlen)
  1272. {
  1273. #ifdef DEBUG
  1274. int i;
  1275. ntfs_cluster_t ct;
  1276. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rlen = %i.n", rlen);
  1277. ntfs_debug(DEBUG_OTHER, "VCN        LCN        Run lengthn");
  1278. for (i = 0, ct = 0; i < rlen; ct += rl[i++].len) {
  1279. if (rl[i].lcn == (ntfs_cluster_t)-1)
  1280. ntfs_debug(DEBUG_OTHER, "0x%-8x LCN_HOLE   0x%-8x "
  1281. "(%s)n", ct, rl[i].len, rl[i].len ?
  1282. "sparse run" : "run list end");
  1283. else
  1284. ntfs_debug(DEBUG_OTHER, "0x%-8x 0x%-8x 0x%-8x%sn", ct,
  1285. rl[i].lcn, rl[i].len, rl[i].len &&
  1286. i + 1 < rlen ? "" : " (run list end)");
  1287. if (!rl[i].len)
  1288. break;
  1289. }
  1290. #endif
  1291. }
  1292. /**
  1293.  * splice_runlists - splice two run lists into one
  1294.  * @rl1: pointer to address of first run list
  1295.  * @r1len: number of elementfs in first run list
  1296.  * @rl2: pointer to second run list
  1297.  * @r2len: number of elements in second run list
  1298.  *
  1299.  * Append the run list @rl2 to the run list *@rl1 and return the result in
  1300.  * *@rl1 and *@r1len.
  1301.  *
  1302.  * Return 0 on success or -errno on error, in which case *@rl1 and *@r1len are
  1303.  * left untouched.
  1304.  *
  1305.  * The only possible error code at the moment is -ENOMEM and only happens if
  1306.  * there is insufficient memory to allocate the new run list (only happens
  1307.  * when size of (rl1 + rl2) > allocated size of rl1).
  1308.  */
  1309. int splice_runlists(ntfs_runlist **rl1, int *r1len, const ntfs_runlist *rl2,
  1310. int r2len)
  1311. {
  1312. ntfs_runlist *rl;
  1313. int rlen, rl_size, rl2_pos;
  1314. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Entering with *r1len = %i, "
  1315. "r2len = %i.n", *r1len, r2len);
  1316. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Dumping 1st runlist.n");
  1317. if (*rl1)
  1318. dump_runlist(*rl1, *r1len);
  1319. else
  1320. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Not present.n");
  1321. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Dumping 2nd runlist.n");
  1322. dump_runlist(rl2, r2len);
  1323. rlen = *r1len + r2len + 1;
  1324. rl_size = (rlen * sizeof(ntfs_runlist) + PAGE_SIZE - 1) &
  1325. PAGE_MASK;
  1326. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rlen = %i, rl_size = %i.n",
  1327. rlen, rl_size);
  1328. /* Do we have enough space? */
  1329. if (rl_size <= ((*r1len * sizeof(ntfs_runlist) + PAGE_SIZE - 1) &
  1330. PAGE_MASK)) {
  1331. /* Have enough space already. */
  1332. rl = *rl1;
  1333. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Have enough space "
  1334. "already.n");
  1335. } else {
  1336. /* Need more space. Reallocate. */
  1337. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Need more space.n");
  1338. rl = ntfs_vmalloc(rlen << sizeof(ntfs_runlist));
  1339. if (!rl)
  1340. return -ENOMEM;
  1341. /* Copy over rl1. */
  1342. ntfs_memcpy(rl, *rl1, *r1len * sizeof(ntfs_runlist));
  1343. ntfs_vfree(*rl1);
  1344. *rl1 = rl;
  1345. }
  1346. /* Reuse rl_size as the current position index into rl. */
  1347. rl_size = *r1len - 1;
  1348. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rl_size = %i.n");
  1349. /* Coalesce neighbouring elements, if present. */
  1350. rl2_pos = 0;
  1351. if (rl[rl_size].lcn + rl[rl_size].len == rl2[rl2_pos].lcn) {
  1352. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Coalescing adjacent "
  1353. "runs.n");
  1354. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: "
  1355. "rl[rl_size].len = %i.n", rl[rl_size].len);
  1356. rl[rl_size].len += rl2[rl2_pos].len;
  1357. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: "
  1358. "rl[rl_size].len = %i.n", rl[rl_size].len);
  1359. rl2_pos++;
  1360. r2len--;
  1361. rlen--;
  1362. }
  1363. rl_size++;
  1364. /* Copy over rl2. */
  1365. ntfs_memcpy(rl + rl_size, rl2 + rl2_pos, r2len * sizeof(ntfs_runlist));
  1366. rlen--;
  1367. rl[rlen].lcn = (ntfs_cluster_t)-1;
  1368. rl[rlen].len = (ntfs_cluster_t)0;
  1369. *r1len = rlen;
  1370. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Dumping result runlist.n");
  1371. dump_runlist(*rl1, *r1len);
  1372. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning with *r1len = "
  1373. "%i.n", rlen);
  1374. return 0;
  1375. }
  1376. /**
  1377.  * ntfs_alloc_mft_record - allocate an mft record
  1378.  * @vol: volume to allocate an mft record on
  1379.  * @result: the mft record number allocated
  1380.  *
  1381.  * Allocate a new mft record on disk. Return 0 on success or -ERRNO on error.
  1382.  * On success, *@result contains the allocated mft record number. On error,
  1383.  * *@result is -1UL.
  1384.  *
  1385.  * Note, this function doesn't actually set the mft record to be in use. This
  1386.  * is done by the caller, which at the moment is only ntfs_alloc_inode().
  1387.  *
  1388.  * To find a free mft record, we scan the mft bitmap for a zero bit. To
  1389.  * optimize this we start scanning at the place where we last stopped and we
  1390.  * perform wrap around when we reach the end. Note, we do not try to allocate
  1391.  * mft records below number 24 because numbers 0 to 15 are the defined system
  1392.  * files anyway and 16 to 24 are special in that they are used for storing
  1393.  * extension mft records for $MFT's $DATA attribute. This is required to avoid
  1394.  * the possibility of creating a run list with a circular dependence which once
  1395.  * written to disk can never be read in again. Windows will only use records
  1396.  * 16 to 24 for normal files if the volume is completely out of space. We never
  1397.  * use them which means that when the volume is really out of space we cannot
  1398.  * create any more files while Windows can still create up to 8 small files. We
  1399.  * can start doing this at some later time, doesn't matter much for now.
  1400.  *
  1401.  * When scanning the mft bitmap, we only search up to the last allocated mft
  1402.  * record. If there are no free records left in the range 24 to number of
  1403.  * allocated mft records, then we extend the mft data in order to create free
  1404.  * mft records. We extend the allocated size of $MFT/$DATA by 16 records at a
  1405.  * time or one cluster, if cluster size is above 16kiB. If there isn't
  1406.  * sufficient space to do this, we try to extend by a single mft record or one
  1407.  * cluster, if cluster size is above mft record size, but we only do this if
  1408.  * there is enough free space, which we know from the values returned by the
  1409.  * failed cluster allocation function when we tried to do the first allocation.
  1410.  *
  1411.  * No matter how many mft records we allocate, we initialize only the first
  1412.  * allocated mft record (incrementing mft data size and initialized size) and
  1413.  * return its number to the caller in @*result, unless there are less than 24
  1414.  * mft records, in which case we allocate and initialize mft records until we
  1415.  * reach record 24 which we consider as the first free mft record for use by
  1416.  * normal files.
  1417.  *
  1418.  * If during any stage we overflow the initialized data in the mft bitmap, we
  1419.  * extend the initialized size (and data size) by 8 bytes, allocating another
  1420.  * cluster if required. The bitmap data size has to be at least equal to the
  1421.  * number of mft records in the mft, but it can be bigger, in which case the
  1422.  * superflous bits are padded with zeroes.
  1423.  *
  1424.  * Thus, when we return successfully (return value 0), we will have:
  1425.  * - initialized / extended the mft bitmap if necessary,
  1426.  * - initialized / extended the mft data if necessary,
  1427.  * - set the bit corresponding to the mft record being allocated in the
  1428.  *   mft bitmap, and we will
  1429.  * - return the mft record number in @*result.
  1430.  *
  1431.  * On error (return value below zero), nothing will have changed. If we had
  1432.  * changed anything before the error occured, we will have reverted back to
  1433.  * the starting state before returning to the caller. Thus, except for bugs,
  1434.  * we should always leave the volume in a consitents state when returning from
  1435.  * this function. NOTE: Small exception to this is that we set the bit in the
  1436.  * mft bitmap but we do not mark the mft record in use, which is inconsistent.
  1437.  * However, the caller will immediately add the wanted attributes to the mft
  1438.  * record, set it in use and write it out to disk, so there should be no
  1439.  * problem.
  1440.  *
  1441.  * Note, this function cannot make use of most of the normal functions, like
  1442.  * for example for attribute resizing, etc, because when the run list overflows
  1443.  * the base mft record and an attribute list is used, it is very important
  1444.  * that the extension mft records used to store the $DATA attribute of $MFT
  1445.  * can be reached without having to read the information contained inside
  1446.  * them, as this would make it impossible to find them in the first place
  1447.  * after the volume is dismounted. $MFT/$BITMAP probably doesn't need to
  1448.  * follow this rule because the bitmap is not essential for finding the mft
  1449.  * records, but on the other hand, handling the bitmap in this special way
  1450.  * would make life easier because otherwise there might be circular invocations
  1451.  * of functions when reading the bitmap but if we are careful, we should be
  1452.  * able to avoid all problems.
  1453.  *
  1454.  * FIXME: Don't forget $MftMirr, though this probably belongs in
  1455.  *   ntfs_update_inode() (or even deeper). (AIA)
  1456.  *
  1457.  * FIXME: Want finer grained locking. (AIA)
  1458.  */
  1459. static int ntfs_alloc_mft_record(ntfs_volume *vol, unsigned long *result)
  1460. {
  1461. unsigned long nr_mft_records, buf_size, buf_pos, pass_start, pass_end;
  1462. unsigned long last_read_pos, mft_rec_size, bit, l;
  1463. ntfs_attribute *data, *bmp;
  1464. __u8 *buf, *byte, pass, b, have_allocated_mftbmp = 0;
  1465. int rlen, rl_size = 0, r2len, rl2_size, old_data_rlen, err = 0;
  1466. ntfs_runlist *rl, *rl2;
  1467. ntfs_cluster_t lcn = 0, old_data_len;
  1468. ntfs_io io;
  1469. __s64 ll, old_data_allocated, old_data_initialized, old_data_size;
  1470. *result = -1UL;
  1471. /* Allocate a buffer and setup the io structure. */
  1472. buf = (__u8*)__get_free_page(GFP_NOFS);
  1473. if (!buf)
  1474. return -ENOMEM;
  1475. lock_kernel();
  1476. /* Get the $DATA and $BITMAP attributes of $MFT. */
  1477. data = ntfs_find_attr(vol->mft_ino, vol->at_data, 0);
  1478. bmp = ntfs_find_attr(vol->mft_ino, vol->at_bitmap, 0);
  1479. if (!data || !bmp) {
  1480. err = -EINVAL;
  1481. goto err_ret;
  1482. }
  1483. /* Determine the number of allocated mft records in the mft. */
  1484. pass_end = nr_mft_records = data->allocated >>
  1485. vol->mft_record_size_bits;
  1486. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): nr_mft_records = %lu.n",
  1487. nr_mft_records);
  1488. /* Make sure we don't overflow the bitmap. */
  1489. l = bmp->initialized << 3;
  1490. if (l < nr_mft_records)
  1491. // FIXME: It might be a good idea to extend the bitmap instead.
  1492. pass_end = l;
  1493. pass = 1;
  1494. buf_pos = vol->mft_data_pos;
  1495. if (buf_pos >= pass_end) {
  1496. buf_pos = 24UL;
  1497. pass = 2;
  1498. }
  1499. pass_start = buf_pos;
  1500. rl = bmp->d.r.runlist;
  1501. rlen = bmp->d.r.len - 1;
  1502. lcn = rl[rlen].lcn + rl[rlen].len;
  1503. io.fn_put = ntfs_put;
  1504. io.fn_get = ntfs_get;
  1505. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Starting bitmap search.n");
  1506. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): pass = %i, pass_start = %lu, "
  1507. "pass_end = %lu.n", pass, pass_start, pass_end);
  1508. byte = NULL; // FIXME: For debugging only.
  1509. /* Loop until a free mft record is found. */
  1510. io.size = (nr_mft_records >> 3) & ~PAGE_MASK;
  1511. for (;; io.size = PAGE_SIZE) {
  1512. io.param = buf;
  1513. io.do_read = 1;
  1514. last_read_pos = buf_pos >> 3;
  1515. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: "
  1516. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1517. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1518. bmp->size, bmp->initialized);
  1519. err = ntfs_readwrite_attr(vol->mft_ino, bmp, last_read_pos,
  1520. &io);
  1521. if (err)
  1522. goto err_ret;
  1523. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Read %lu bytes.n",
  1524. (unsigned long)io.size);
  1525. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: "
  1526. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1527. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1528. bmp->size, bmp->initialized);
  1529. if (!io.size)
  1530. goto pass_done;
  1531. buf_size = io.size << 3;
  1532. bit = buf_pos & 7UL;
  1533. buf_pos &= ~7UL;
  1534. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before loop: "
  1535. "buf_size = %lu, buf_pos = %lu, bit = %lu, "
  1536. "*byte = 0x%x, b = %u.n",
  1537. buf_size, buf_pos, bit, byte ? *byte : -1, b);
  1538. for (; bit < buf_size && bit + buf_pos < pass_end;
  1539. bit &= ~7UL, bit += 8UL) {
  1540. byte = buf + (bit >> 3);
  1541. if (*byte == 0xff)
  1542. continue;
  1543. b = ffz((unsigned long)*byte);
  1544. if (b < (__u8)8 && b >= (bit & 7UL)) {
  1545. bit = b + (bit & ~7UL) + buf_pos;
  1546. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1547. "Found free rec in for loop. "
  1548. "bit = %lun", bit);
  1549. goto found_free_rec;
  1550. }
  1551. }
  1552. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After loop: "
  1553. "buf_size = %lu, buf_pos = %lu, bit = %lu, "
  1554. "*byte = 0x%x, b = %u.n",
  1555. buf_size, buf_pos, bit, byte ? *byte : -1, b);
  1556. buf_pos += buf_size;
  1557. if (buf_pos < pass_end)
  1558. continue;
  1559. pass_done: /* Finished with the current pass. */
  1560. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At pass_done.n");
  1561. if (pass == 1) {
  1562. /*
  1563.  * Now do pass 2, scanning the first part of the zone
  1564.  * we omitted in pass 1.
  1565.  */
  1566. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Done pass "
  1567. "1.n");
  1568. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Pass = 2.n");
  1569. pass = 2;
  1570. pass_end = pass_start;
  1571. buf_pos = pass_start = 24UL;
  1572. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): pass = %i, "
  1573. "pass_start = %lu, pass_end = %lu.n",
  1574. pass, pass_start, pass_end);
  1575. continue;
  1576. } /* pass == 2 */
  1577. /* No free records left. */
  1578. if (bmp->initialized << 3 > nr_mft_records &&
  1579. bmp->initialized > 3) {
  1580. /*
  1581.  * The mft bitmap is already bigger but the space is
  1582.  * not covered by mft records, this implies that the
  1583.  * next records are all free, so we already have found
  1584.  * a free record.
  1585.  */
  1586. bit = nr_mft_records;
  1587. if (bit < 24UL)
  1588. bit = 24UL;
  1589. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Found free "
  1590. "record bit (#1) = 0x%lx.n", bit);
  1591. goto found_free_rec;
  1592. }
  1593. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Done pass 2.n");
  1594. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: "
  1595. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1596. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1597. bmp->size, bmp->initialized);
  1598. /* Need to extend the mft bitmap. */
  1599. if (bmp->initialized + 8LL > bmp->allocated) {
  1600. ntfs_io io2;
  1601. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Initialized "
  1602. "> allocated.n");
  1603. /* Need to extend bitmap by one more cluster. */
  1604. rl = bmp->d.r.runlist;
  1605. rlen = bmp->d.r.len - 1;
  1606. lcn = rl[rlen].lcn + rl[rlen].len;
  1607. io2.fn_put = ntfs_put;
  1608. io2.fn_get = ntfs_get;
  1609. io2.param = &b;
  1610. io2.size = 1;
  1611. io2.do_read = 1;
  1612. err = ntfs_readwrite_attr(vol->bitmap, data, lcn >> 3,
  1613. &io2);
  1614. if (err)
  1615. goto err_ret;
  1616. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Read %lu "
  1617. "bytes.n", (unsigned long)io2.size);
  1618. if (io2.size == 1 && b != 0xff) {
  1619. __u8 tb = 1 << (lcn & (ntfs_cluster_t)7);
  1620. if (!(b & tb)) {
  1621. /* Next cluster is free. Allocate it. */
  1622. b |= tb;
  1623. io2.param = &b;
  1624. io2.do_read = 0;
  1625. err = ntfs_readwrite_attr(vol->bitmap,
  1626. data, lcn >> 3, &io2);
  1627. if (err || io.size != 1) {
  1628. if (!err)
  1629. err = -EIO;
  1630. goto err_ret;
  1631. }
  1632. append_mftbmp_simple: rl[rlen].len++;
  1633. have_allocated_mftbmp |= 1;
  1634. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  1635. "(): Appending one "
  1636. "cluster to mftbmp.n");
  1637. }
  1638. }
  1639. if (!have_allocated_mftbmp) {
  1640. /* Allocate a cluster from the DATA_ZONE. */
  1641. ntfs_cluster_t lcn2 = lcn;
  1642. ntfs_cluster_t count = 1;
  1643. err = ntfs_allocate_clusters(vol, &lcn2,
  1644. &count, &rl2, &r2len,
  1645. DATA_ZONE);
  1646. if (err)
  1647. goto err_ret;
  1648. if (count != 1 || lcn2 <= 0) {
  1649. if (count > 0) {
  1650. rl2_dealloc_err_out: if (ntfs_deallocate_clusters(
  1651. vol, rl2, r2len))
  1652. ntfs_error(__FUNCTION__
  1653. "(): Cluster "
  1654. "deallocation in error "
  1655. "code path failed! You "
  1656. "should run chkdsk.n");
  1657. }
  1658. ntfs_vfree(rl2);
  1659. if (!err)
  1660. err = -EINVAL;
  1661. goto err_ret;
  1662. }
  1663. if (lcn2 == lcn) {
  1664. ntfs_vfree(rl2);
  1665. goto append_mftbmp_simple;
  1666. }
  1667. /* We need to append a new run. */
  1668. rl_size = (rlen * sizeof(ntfs_runlist) +
  1669. PAGE_SIZE - 1) & PAGE_MASK;
  1670. /* Reallocate memory if necessary. */
  1671. if ((rlen + 2) * sizeof(ntfs_runlist) >=
  1672. rl_size) {
  1673. ntfs_runlist *rlt;
  1674. rl_size += PAGE_SIZE;
  1675. rlt = ntfs_vmalloc(rl_size);
  1676. if (!rlt) {
  1677. err = -ENOMEM;
  1678. goto rl2_dealloc_err_out;
  1679. }
  1680. ntfs_memcpy(rlt, rl, rl_size -
  1681. PAGE_SIZE);
  1682. ntfs_vfree(rl);
  1683. bmp->d.r.runlist = rl = rlt;
  1684. }
  1685. ntfs_vfree(rl2);
  1686. rl[rlen].lcn = lcn = lcn2;
  1687. rl[rlen].len = count;
  1688. bmp->d.r.len = ++rlen;
  1689. have_allocated_mftbmp |= 2;
  1690. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1691. "Adding run to mftbmp. "
  1692. "LCN = %i, len = %in", lcn,
  1693. count);
  1694. }
  1695. /*
  1696.  * We now have extended the mft bitmap allocated size
  1697.  * by one cluster. Reflect this in the attribute.
  1698.  */
  1699. bmp->allocated += (__s64)vol->cluster_size;
  1700. }
  1701. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: "
  1702. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1703. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1704. bmp->size, bmp->initialized);
  1705. /* We now have sufficient allocated space. */
  1706. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Now have sufficient "
  1707. "allocated space in mftbmp.n");
  1708. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: "
  1709. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1710. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1711. bmp->size, bmp->initialized);
  1712. buf_pos = bmp->initialized;
  1713. bmp->initialized += 8LL;
  1714. if (bmp->initialized > bmp->size)
  1715. bmp->size = bmp->initialized;
  1716. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: "
  1717. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1718. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1719. bmp->size, bmp->initialized);
  1720. have_allocated_mftbmp |= 4;
  1721. /* Update the mft bitmap attribute value. */
  1722. memset(buf, 0, 8);
  1723. io.param = buf;
  1724. io.size = 8;
  1725. io.do_read = 0;
  1726. err = ntfs_readwrite_attr(vol->mft_ino, bmp, buf_pos, &io);
  1727. if (err || io.size != 8) {
  1728. if (!err)
  1729. err = -EIO;
  1730. goto shrink_mftbmp_err_ret;
  1731. }
  1732. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote extended "
  1733. "mftbmp bytes %lu.n", (unsigned long)io.size);
  1734. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After write: "
  1735. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1736. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1737. bmp->size, bmp->initialized);
  1738. bit = buf_pos << 3;
  1739. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Found free record "
  1740. "bit (#2) = 0x%lx.n", bit);
  1741. goto found_free_rec;
  1742. }
  1743. found_free_rec:
  1744. /* bit is the found free mft record. Allocate it in the mft bitmap. */
  1745. vol->mft_data_pos = bit;
  1746. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At found_free_rec.n");
  1747. io.param = buf;
  1748. io.size = 1;
  1749. io.do_read = 1;
  1750. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before update: "
  1751. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1752. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1753. bmp->size, bmp->initialized);
  1754. err = ntfs_readwrite_attr(vol->mft_ino, bmp, bit >> 3, &io);
  1755. if (err || io.size != 1) {
  1756. if (!err)
  1757. err = -EIO;
  1758. goto shrink_mftbmp_err_ret;
  1759. }
  1760. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Read %lu bytes.n",
  1761. (unsigned long)io.size);
  1762. #ifdef DEBUG
  1763. /* Check our bit is really zero! */
  1764. if (*buf & (1 << (bit & 7)))
  1765. BUG();
  1766. #endif
  1767. *buf |= 1 << (bit & 7);
  1768. io.param = buf;
  1769. io.do_read = 0;
  1770. err = ntfs_readwrite_attr(vol->mft_ino, bmp, bit >> 3, &io);
  1771. if (err || io.size != 1) {
  1772. if (!err)
  1773. err = -EIO;
  1774. goto shrink_mftbmp_err_ret;
  1775. }
  1776. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote %lu bytes.n",
  1777. (unsigned long)io.size);
  1778. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After update: "
  1779. "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, "
  1780. "bmp->initialized = 0x%Lx.n", bmp->allocated,
  1781. bmp->size, bmp->initialized);
  1782. /* The mft bitmap is now uptodate. Deal with mft data attribute now. */
  1783. ll = (__s64)(bit + 1) << vol->mft_record_size_bits;
  1784. if (ll <= data->initialized) {
  1785. /* The allocated record is already initialized. We are done! */
  1786. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated mft record "
  1787. "already initialized!n");
  1788. goto done_ret;
  1789. }
  1790. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated mft record needs "
  1791. "to be initialized.n");
  1792. /* The mft record is outside the initialized data. */
  1793. mft_rec_size = (unsigned long)vol->mft_record_size;
  1794. /* Preserve old values for undo purposes. */
  1795. old_data_allocated = data->allocated;
  1796. old_data_rlen = data->d.r.len - 1;
  1797. old_data_len = data->d.r.runlist[old_data_rlen].len;
  1798. /*
  1799.  * If necessary, extend the mft until it covers the allocated record.
  1800.  * The loop is only actually used when a freshly formatted volume is
  1801.  * first written to. But it optimizes away nicely in the common case.
  1802.  */
  1803. while (ll > data->allocated) {
  1804. ntfs_cluster_t lcn2, nr_lcn2, nr, min_nr;
  1805. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Extending mft "
  1806. "data allocation, data->allocated = 0x%Lx, "
  1807. "data->size = 0x%Lx, data->initialized = "
  1808. "0x%Lx.n", data->allocated, data->size,
  1809. data->initialized);
  1810. /* Minimum allocation is one mft record worth of clusters. */
  1811. if (mft_rec_size <= vol->cluster_size)
  1812. min_nr = (ntfs_cluster_t)1;
  1813. else
  1814. min_nr = mft_rec_size >> vol->cluster_size_bits;
  1815. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): min_nr = %i.n",
  1816. min_nr);
  1817. /* Allocate 16 mft records worth of clusters. */
  1818. nr = mft_rec_size << 4 >> vol->cluster_size_bits;
  1819. if (!nr)
  1820. nr = (ntfs_cluster_t)1;
  1821. /* Determine the preferred allocation location. */
  1822. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): nr = %i.n", nr);
  1823. rl2 = data->d.r.runlist;
  1824. r2len = data->d.r.len;
  1825. lcn2 = rl2[r2len - 1].lcn + rl2[r2len - 1].len;
  1826. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rl2[r2len - 1].lcn "
  1827. "= %i, .len = %i.n", rl2[r2len - 1].lcn,
  1828. rl2[r2len - 1].len);
  1829. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): lcn2 = %i, r2len = "
  1830. "%i.n", lcn2, r2len);
  1831. retry_mft_data_allocation:
  1832. nr_lcn2 = nr;
  1833. err = ntfs_allocate_clusters(vol, &lcn2, &nr_lcn2, &rl2,
  1834. &r2len, MFT_ZONE);
  1835. #ifdef DEBUG
  1836. if (!err && nr_lcn2 < min_nr)
  1837. /* Allocated less than minimum needed. Weird! */
  1838. BUG();
  1839. #endif
  1840. if (err) {
  1841. /*
  1842.  * If there isn't enough space to do the wanted
  1843.  * allocation, but there is enough space to do a
  1844.  * minimal allocation, then try that, unless the wanted
  1845.  * allocation was already the minimal allocation.
  1846.  */
  1847. if (err == -ENOSPC && nr > min_nr &&
  1848. nr_lcn2 >= min_nr) {
  1849. nr = min_nr;
  1850. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1851. "Retrying mft data "
  1852. "allocation, nr = min_nr = %i"
  1853. ".n", nr);
  1854. goto retry_mft_data_allocation;
  1855. }
  1856. goto undo_mftbmp_alloc_err_ret;
  1857. }
  1858. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated %i "
  1859. "clusters starting at LCN %i.n", nr_lcn2,
  1860. lcn2);
  1861. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated "
  1862. "runlist:n");
  1863. dump_runlist(rl2, r2len);
  1864. /* Append rl2 to the mft data attribute's run list. */
  1865. err = splice_runlists(&data->d.r.runlist, (int*)&data->d.r.len,
  1866. rl2, r2len);
  1867. if (err) {
  1868. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1869. "splice_runlists failed with error "
  1870. "code %i.n", -err);
  1871. goto undo_partial_data_alloc_err_ret;
  1872. }
  1873. /* Reflect the allocated clusters in the mft allocated data. */
  1874. data->allocated += nr_lcn2 << vol->cluster_size_bits;
  1875. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After extending mft "
  1876. "data allocation, data->allocated = 0x%Lx, "
  1877. "data->size = 0x%Lx, data->initialized = "
  1878. "0x%Lx.n", data->allocated, data->size,
  1879. data->initialized);
  1880. }
  1881. /* Prepare a formatted (empty) mft record. */
  1882. memset(buf, 0, mft_rec_size);
  1883. ntfs_fill_mft_header(buf, mft_rec_size, 0, 0, 0);
  1884. err = ntfs_insert_fixups(buf, mft_rec_size);
  1885. if (err)
  1886. goto undo_data_alloc_err_ret;
  1887. /*
  1888.  * Extend mft data initialized size to reach the allocated mft record
  1889.  * and write the formatted mft record buffer to each mft record being
  1890.  * initialized. Note, that ntfs_readwrite_attr extends both
  1891.  * data->initialized and data->size, so no need for us to touch them.
  1892.  */
  1893. old_data_initialized = data->initialized;
  1894. old_data_size = data->size;
  1895. while (ll > data->initialized) {
  1896. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Initializing mft "
  1897. "record 0x%Lx.n",
  1898. data->initialized >> vol->mft_record_size_bits);
  1899. io.param = buf;
  1900. io.size = mft_rec_size;
  1901. io.do_read = 0;
  1902. err = ntfs_readwrite_attr(vol->mft_ino, data,
  1903. data->initialized, &io);
  1904. if (err || io.size != mft_rec_size) {
  1905. if (!err)
  1906. err = -EIO;
  1907. goto undo_data_init_err_ret;
  1908. }
  1909. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote %i bytes to "
  1910. "mft data.n", io.size);
  1911. }
  1912. /* Update the VFS inode size as well. */
  1913. VFS_I(vol->mft_ino)->i_size = data->size;
  1914. #ifdef DEBUG
  1915. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After mft record "
  1916. "initialization: data->allocated = 0x%Lx, data->size "
  1917. "= 0x%Lx, data->initialized = 0x%Lx.n",
  1918. data->allocated, data->size, data->initialized);
  1919. /* Sanity checks. */
  1920. if (data->size > data->allocated || data->size < data->initialized ||
  1921. data->initialized > data->allocated)
  1922. BUG();
  1923. #endif
  1924. done_ret:
  1925. /* Return the number of the allocated mft record. */
  1926. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_ret. *result = bit = "
  1927. "0x%lx.n", bit);
  1928. *result = bit;
  1929. vol->mft_data_pos = bit + 1;
  1930. err_ret:
  1931. unlock_kernel();
  1932. free_page((unsigned long)buf);
  1933. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Syncing inode $MFT.n");
  1934. if (ntfs_update_inode(vol->mft_ino))
  1935. ntfs_error(__FUNCTION__ "(): Failed to sync inode $MFT. "
  1936. "Continuing anyway.n");
  1937. if (!err) {
  1938. ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): Done. Allocated mft "
  1939. "record number *result = 0x%lx.n", *result);
  1940. return 0;
  1941. }
  1942. if (err != -ENOSPC)
  1943. ntfs_error(__FUNCTION__ "(): Failed to allocate an mft "
  1944. "record. Returning error code %i.n", -err);
  1945. else
  1946. ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): Failed to allocate "
  1947. "an mft record due to lack of free space.n");
  1948. return err;
  1949. undo_data_init_err_ret:
  1950. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At "
  1951. "undo_data_init_err_ret.n");
  1952. data->initialized = old_data_initialized;
  1953. data->size = old_data_size;
  1954. undo_data_alloc_err_ret:
  1955. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At undo_data_alloc_err_ret."
  1956. "n");
  1957. data->allocated = old_data_allocated;
  1958. undo_partial_data_alloc_err_ret:
  1959. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At "
  1960. "undo_partial_data_alloc_err_ret.n");
  1961. /* Deallocate the clusters. */
  1962. if (ntfs_deallocate_clusters(vol, rl2, r2len))
  1963. ntfs_error(__FUNCTION__ "(): Error deallocating clusters in "
  1964. "error code path. You should run chkdsk.n");
  1965. ntfs_vfree(rl2);
  1966. /* Revert the run list back to what it was before. */
  1967. r2len = data->d.r.len;
  1968. rl2 = data->d.r.runlist;
  1969. rl2[old_data_rlen++].len = old_data_len;
  1970. rl2[old_data_rlen].lcn = (ntfs_cluster_t)-1;
  1971. rl2[old_data_rlen].len = (ntfs_cluster_t)0;
  1972. data->d.r.len = old_data_rlen;
  1973. rl2_size = ((old_data_rlen + 1) * sizeof(ntfs_runlist) + PAGE_SIZE -
  1974. 1) & PAGE_MASK;
  1975. /* Reallocate memory freeing any extra memory allocated. */
  1976. if (rl2_size < ((r2len * sizeof(ntfs_runlist) + PAGE_SIZE - 1) &
  1977. PAGE_MASK)) {
  1978. rl2 = ntfs_vmalloc(rl2_size);
  1979. if (rl2) {
  1980. ntfs_memcpy(rl2, data->d.r.runlist, rl2_size);
  1981. ntfs_vfree(data->d.r.runlist);
  1982. data->d.r.runlist = rl2;
  1983. } else
  1984. ntfs_error(__FUNCTION__ "(): Error reallocating "
  1985. "memory in error code path. This "
  1986. "should be harmless.n");
  1987. }
  1988. undo_mftbmp_alloc_err_ret:
  1989. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At "
  1990. "undo_mftbmp_alloc_err_ret.n");
  1991. /* Deallocate the allocated bit in the mft bitmap. */
  1992. io.param = buf;
  1993. io.size = 1;
  1994. io.do_read = 1;
  1995. err = ntfs_readwrite_attr(vol->mft_ino, bmp, bit >> 3, &io);
  1996. if (!err && io.size == 1) {
  1997. *buf &= ~(1 << (bit & 7));
  1998. io.param = buf;
  1999. io.do_read = 0;
  2000. err = ntfs_readwrite_attr(vol->mft_ino, bmp, bit >> 3, &io);
  2001. }
  2002. if (err || io.size != 1) {
  2003. if (!err)
  2004. err = -EIO;
  2005. ntfs_error(__FUNCTION__ "(): Error deallocating mft record in "
  2006. "error code path. You should run chkdsk.n");
  2007. }
  2008. shrink_mftbmp_err_ret:
  2009. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At shrink_mftbmp_err_ret.n");
  2010. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): have_allocated_mftbmp = "
  2011. "%i.n", have_allocated_mftbmp);
  2012. if (!have_allocated_mftbmp)
  2013. goto err_ret;
  2014. /* Shrink the mftbmp back to previous size. */
  2015. if (bmp->size == bmp->initialized)
  2016. bmp->size -= 8LL;
  2017. bmp->initialized -= 8LL;
  2018. have_allocated_mftbmp &= ~4;
  2019. /* If no allocation occured then we are done. */
  2020. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): have_allocated_mftbmp = "
  2021. "%i.n", have_allocated_mftbmp);
  2022. if (!have_allocated_mftbmp)
  2023. goto err_ret;
  2024. /* Deallocate the allocated cluster. */
  2025. bmp->allocated -= (__s64)vol->cluster_size;
  2026. if (ntfs_deallocate_cluster_run(vol, lcn, (ntfs_cluster_t)1))
  2027. ntfs_error(__FUNCTION__ "(): Error deallocating cluster in "
  2028. "error code path. You should run chkdsk.n");
  2029. switch (have_allocated_mftbmp & 3) {
  2030. case 1:
  2031. /* Delete the last lcn from the last run of mftbmp. */
  2032. rl[rlen - 1].len--;
  2033. break;
  2034. case 2:
  2035. /* Delete the last run of mftbmp. */
  2036. bmp->d.r.len = --rlen;
  2037. /* Reallocate memory if necessary. */
  2038. if ((rlen + 1) * sizeof(ntfs_runlist) <= rl_size - PAGE_SIZE) {
  2039. ntfs_runlist *rlt;
  2040. rl_size -= PAGE_SIZE;
  2041. rlt = ntfs_vmalloc(rl_size);
  2042. if (rlt) {
  2043. ntfs_memcpy(rlt, rl, rl_size);
  2044. ntfs_vfree(rl);
  2045. bmp->d.r.runlist = rl = rlt;
  2046. } else
  2047. ntfs_error(__FUNCTION__ "(): Error "
  2048. "reallocating memory in error "
  2049. "code path. This should be "
  2050. "harmless.n");
  2051. }
  2052. bmp->d.r.runlist[bmp->d.r.len].lcn = (ntfs_cluster_t)-1;
  2053. bmp->d.r.runlist[bmp->d.r.len].len = (ntfs_cluster_t)0;
  2054. break;
  2055. default:
  2056. BUG();
  2057. }
  2058. goto err_ret;
  2059. }
  2060. /* We need 0x48 bytes in total. */
  2061. static int add_standard_information(ntfs_inode *ino)
  2062. {
  2063. ntfs_time64_t now;
  2064. char data[0x30];
  2065. char *position = data;
  2066. ntfs_attribute *si;
  2067. now = ntfs_now();
  2068. NTFS_PUTU64(position + 0x00, now); /* File creation */
  2069. NTFS_PUTU64(position + 0x08, now); /* Last modification */
  2070. NTFS_PUTU64(position + 0x10, now); /* Last mod for MFT */
  2071. NTFS_PUTU64(position + 0x18, now); /* Last access */
  2072. NTFS_PUTU64(position + 0x20, 0); /* MSDOS file perms */
  2073. NTFS_PUTU64(position + 0x28, 0); /* unknown */
  2074. return ntfs_create_attr(ino, ino->vol->at_standard_information, 0,
  2075. data, sizeof(data), &si);
  2076. }
  2077. static int add_filename(ntfs_inode *ino, ntfs_inode *dir, 
  2078. const unsigned char *filename, int length, ntfs_u32 flags)
  2079. {
  2080. unsigned char *position;
  2081. unsigned int size;
  2082. ntfs_time64_t now;
  2083. int count, error;
  2084. unsigned char* data;
  2085. ntfs_attribute *fn;
  2086. /* Work out the size. */
  2087. size = 0x42 + 2 * length;
  2088. data = ntfs_malloc(size);
  2089. if (!data)
  2090. return -ENOMEM;
  2091. /* Search for a position. */
  2092. position = data;
  2093. NTFS_PUTINUM(position, dir); /* Inode num of dir */
  2094. now = ntfs_now();
  2095. NTFS_PUTU64(position + 0x08, now); /* File creation */
  2096. NTFS_PUTU64(position + 0x10, now); /* Last modification */
  2097. NTFS_PUTU64(position + 0x18, now); /* Last mod for MFT */
  2098. NTFS_PUTU64(position + 0x20, now); /* Last access */
  2099. /* FIXME: Get the following two sizes by finding the data attribute
  2100.  * in ino->attr and copying the corresponding fields from there.
  2101.  * If no data present then set to zero. In current implementation
  2102.  * add_data is called after add_filename so zero is correct on
  2103.  * creation. Need to change when we have hard links / support different
  2104.  * filename namespaces. (AIA) */
  2105. NTFS_PUTS64(position + 0x28, 0); /* Allocated size */
  2106. NTFS_PUTS64(position + 0x30, 0); /* Data size */
  2107. NTFS_PUTU32(position + 0x38, flags); /* File flags */
  2108. NTFS_PUTU32(position + 0x3c, 0); /* We don't use these
  2109.  * features yet. */
  2110. NTFS_PUTU8(position + 0x40, length); /* Filename length */
  2111. NTFS_PUTU8(position + 0x41, 0); /* Only long name */
  2112. /* FIXME: This is madness. We are defining the POSIX namespace
  2113.  * for the filename here which can mean that the file will be
  2114.  * invisible when in Windows NT/2k! )-: (AIA) */
  2115. position += 0x42;
  2116. for (count = 0; count < length; count++) {
  2117. NTFS_PUTU16(position + 2 * count, filename[count]);
  2118. }
  2119. error = ntfs_create_attr(ino, ino->vol->at_file_name, 0, data, size,
  2120.  &fn);
  2121. if (!error)
  2122. error = ntfs_dir_add(dir, ino, fn);
  2123. ntfs_free(data);
  2124. return error;
  2125. }
  2126. int add_security(ntfs_inode* ino, ntfs_inode* dir)
  2127. {
  2128. int error;
  2129. char *buf;
  2130. int size;
  2131. ntfs_attribute* attr;
  2132. ntfs_io io;
  2133. ntfs_attribute *se;
  2134. attr = ntfs_find_attr(dir, ino->vol->at_security_descriptor, 0);
  2135. if (!attr)
  2136. return -EOPNOTSUPP; /* Need security in directory. */
  2137. size = attr->size;
  2138. if (size > 512)
  2139. return -EOPNOTSUPP;
  2140. buf = ntfs_malloc(size);
  2141. if (!buf)
  2142. return -ENOMEM;
  2143. io.fn_get = ntfs_get;
  2144. io.fn_put = ntfs_put;
  2145. io.param = buf;
  2146. io.size = size;
  2147. error = ntfs_read_attr(dir, ino->vol->at_security_descriptor, 0, 0,&io);
  2148. if (!error && io.size != size)
  2149. ntfs_error("wrong size in add_securityn");
  2150. if (error) {
  2151. ntfs_free(buf);
  2152. return error;
  2153. }
  2154. /* FIXME: Consider ACL inheritance. */
  2155. error = ntfs_create_attr(ino, ino->vol->at_security_descriptor,
  2156.  0, buf, size, &se);
  2157. ntfs_free(buf);
  2158. return error;
  2159. }
  2160. static int add_data(ntfs_inode* ino, unsigned char *data, int length)
  2161. {
  2162. ntfs_attribute *da;
  2163. return ntfs_create_attr(ino, ino->vol->at_data, 0, data, length, &da);
  2164. }
  2165. /*
  2166.  * We _could_ use 'dir' to help optimise inode allocation.
  2167.  *
  2168.  * FIXME: Need to undo what we do in ntfs_alloc_mft_record if we get an error
  2169.  * further on in ntfs_alloc_inode. Either fold the two functions to allow
  2170.  * proper undo or just deallocate the record from the mft bitmap. (AIA)
  2171.  */
  2172. int ntfs_alloc_inode(ntfs_inode *dir, ntfs_inode *result, const char *filename,
  2173. int namelen, ntfs_u32 flags)
  2174. {
  2175. ntfs_volume *vol = dir->vol;
  2176. int err;
  2177. ntfs_u8 buffer[2];
  2178. ntfs_io io;
  2179. err = ntfs_alloc_mft_record(vol, &(result->i_number));
  2180. if (err) {
  2181. if (err == -ENOSPC)
  2182. ntfs_error(__FUNCTION__ "(): No free inodes.n");
  2183. return err;
  2184. }
  2185. /* Get the sequence number. */
  2186. io.fn_put = ntfs_put;
  2187. io.fn_get = ntfs_get;
  2188. io.param = buffer;
  2189. io.size = 2;
  2190. err = ntfs_read_attr(vol->mft_ino, vol->at_data, 0, 
  2191. ((__s64)result->i_number << vol->mft_record_size_bits)
  2192. + 0x10, &io);
  2193. // FIXME: We are leaving the MFT in inconsistent state! (AIA)
  2194. if (err)
  2195. return err;
  2196. /* Increment the sequence number skipping zero. */
  2197. result->sequence_number = (NTFS_GETU16(buffer) + 1) & 0xffff;
  2198. if (!result->sequence_number)
  2199. result->sequence_number++;
  2200. result->vol = vol;
  2201. result->attr_count = 0;
  2202. result->attrs = 0;
  2203. result->record_count = 1;
  2204. result->records = ntfs_calloc(8 * sizeof(int));
  2205. if (!result->records)
  2206. goto mem_err_out;
  2207. result->records[0] = result->i_number;
  2208. result->attr = ntfs_calloc(vol->mft_record_size);
  2209. if (!result->attr) {
  2210. ntfs_free(result->records);
  2211. result->records = NULL;
  2212. goto mem_err_out;
  2213. }
  2214. ntfs_fill_mft_header(result->attr, vol->mft_record_size,
  2215. result->sequence_number, 1, 1);
  2216. err = add_standard_information(result);
  2217. if (!err)
  2218. err = add_filename(result, dir, filename, namelen, flags);
  2219. if (!err)
  2220. err = add_security(result, dir);
  2221. // FIXME: We are leaving the MFT in inconsistent state on error! (AIA)
  2222. return err;
  2223. mem_err_out:
  2224. // FIXME: We are leaving the MFT in inconsistent state! (AIA)
  2225. result->record_count = 0;
  2226. result->attr = NULL;
  2227. return -ENOMEM;
  2228. }
  2229. int ntfs_alloc_file(ntfs_inode *dir, ntfs_inode *result, char *filename,
  2230. int namelen)
  2231. {
  2232. int err;
  2233. err = ntfs_alloc_inode(dir, result, filename, namelen, 0);
  2234. if (!err)
  2235. err = add_data(result, 0, 0);
  2236. return err;
  2237. }