super.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:45k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * super.c
  3.  *
  4.  * Copyright (C) 1995-1997, 1999 Martin von L鰓is
  5.  * Copyright (C) 1996-1997 R間is Duchesne
  6.  * Copyright (C) 1999 Steve Dodd
  7.  * Copyright (C) 2000-2001 Anton Altparmakov (AIA)
  8.  */
  9. #include <linux/ntfs_fs.h>
  10. #include <linux/errno.h>
  11. #include <linux/bitops.h>
  12. #include <linux/module.h>
  13. #include "ntfstypes.h"
  14. #include "struct.h"
  15. #include "super.h"
  16. #include "macros.h"
  17. #include "inode.h"
  18. #include "support.h"
  19. #include "util.h"
  20. #include <linux/smp_lock.h>
  21. /* All important structures in NTFS use 2 consistency checks:
  22.  * . a magic structure identifier (FILE, INDX, RSTR, RCRD...)
  23.  * . a fixup technique : the last word of each sector (called a fixup) of a
  24.  *   structure's record should end with the word at offset <n> of the first
  25.  *   sector, and if it is the case, must be replaced with the words following
  26.  *   <n>. The value of <n> and the number of fixups is taken from the fields
  27.  *   at the offsets 4 and 6. Note that the sector size is defined as
  28.  *   NTFS_SECTOR_SIZE and not as the hardware sector size (this is concordant
  29.  *   with what the Windows NTFS driver does).
  30.  *
  31.  * This function performs these 2 checks, and _fails_ if:
  32.  * . the input size is invalid
  33.  * . the fixup header is invalid
  34.  * . the size does not match the number of sectors
  35.  * . the magic identifier is wrong
  36.  * . a fixup is invalid
  37.  */
  38. int ntfs_fixup_record(char *record, char *magic, int size)
  39. {
  40. int start, count, offset;
  41. ntfs_u16 fixup;
  42. if (!IS_MAGIC(record, magic))
  43. return 0;
  44. start = NTFS_GETU16(record + 4);
  45. count = NTFS_GETU16(record + 6) - 1;
  46. if (size & (NTFS_SECTOR_SIZE - 1) || start & 1 ||
  47. start + count * 2 > size || size >> 9 != count) {
  48. if (size <= 0)
  49. printk(KERN_ERR "NTFS: BUG: ntfs_fixup_record() got "
  50. "zero size! Please report this to "
  51. "linux-ntfs-dev@lists.sf.netn");
  52. return 0;
  53. }
  54. fixup = NTFS_GETU16(record + start);
  55. start += 2;
  56. offset = NTFS_SECTOR_SIZE - 2;
  57. while (count--) {
  58. if (NTFS_GETU16(record + offset) != fixup)
  59. return 0;
  60. NTFS_PUTU16(record + offset, NTFS_GETU16(record + start));
  61. start += 2;
  62. offset += NTFS_SECTOR_SIZE;
  63. }
  64. return 1;
  65. }
  66. /*
  67.  * Get vital informations about the ntfs partition from the boot sector.
  68.  * Return 0 on success or -1 on error.
  69.  */
  70. int ntfs_init_volume(ntfs_volume *vol, char *boot)
  71. {
  72. int sectors_per_cluster_bits;
  73. __s64 ll;
  74. ntfs_cluster_t mft_zone_size, tc;
  75. /* System defined default values, in case we don't load $AttrDef. */
  76. vol->at_standard_information = 0x10;
  77. vol->at_attribute_list = 0x20;
  78. vol->at_file_name = 0x30;
  79. vol->at_volume_version = 0x40;
  80. vol->at_security_descriptor = 0x50;
  81. vol->at_volume_name = 0x60;
  82. vol->at_volume_information = 0x70;
  83. vol->at_data = 0x80;
  84. vol->at_index_root = 0x90;
  85. vol->at_index_allocation = 0xA0;
  86. vol->at_bitmap = 0xB0;
  87. vol->at_symlink = 0xC0;
  88. /* Sector size. */
  89. vol->sector_size = NTFS_GETU16(boot + 0xB);
  90. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->sector_size = 0x%xn",
  91. vol->sector_size);
  92. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: sectors_per_cluster = "
  93. "0x%xn", NTFS_GETU8(boot + 0xD));
  94. sectors_per_cluster_bits = ffs(NTFS_GETU8(boot + 0xD)) - 1;
  95. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: sectors_per_cluster_bits "
  96. "= 0x%xn", sectors_per_cluster_bits); 
  97. vol->mft_clusters_per_record = NTFS_GETS8(boot + 0x40);
  98. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->mft_clusters_per_record"
  99. " = 0x%xn", vol->mft_clusters_per_record); 
  100. vol->index_clusters_per_record = NTFS_GETS8(boot + 0x44);
  101. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: "
  102. "vol->index_clusters_per_record = 0x%xn",
  103. vol->index_clusters_per_record); 
  104. vol->cluster_size = vol->sector_size << sectors_per_cluster_bits;
  105. vol->cluster_size_bits = ffs(vol->cluster_size) - 1;
  106. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->cluster_size = 0x%xn",
  107. vol->cluster_size); 
  108. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->cluster_size_bits = "
  109. "0x%xn", vol->cluster_size_bits); 
  110. if (vol->mft_clusters_per_record > 0)
  111. vol->mft_record_size = vol->cluster_size <<
  112. (ffs(vol->mft_clusters_per_record) - 1);
  113. else
  114. /*
  115.  * When mft_record_size < cluster_size, mft_clusters_per_record
  116.  * = -log2(mft_record_size) bytes. mft_record_size normaly is
  117.  * 1024 bytes, which is encoded as 0xF6 (-10 in decimal).
  118.  */
  119. vol->mft_record_size = 1 << -vol->mft_clusters_per_record;
  120. vol->mft_record_size_bits = ffs(vol->mft_record_size) - 1;
  121. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->mft_record_size = 0x%x"
  122. "n", vol->mft_record_size); 
  123. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->mft_record_size_bits = "
  124. "0x%xn", vol->mft_record_size_bits); 
  125. if (vol->index_clusters_per_record > 0)
  126. vol->index_record_size = vol->cluster_size <<
  127. (ffs(vol->index_clusters_per_record) - 1);
  128. else
  129. /*
  130.  * When index_record_size < cluster_size,
  131.  * index_clusters_per_record = -log2(index_record_size) bytes.
  132.  * index_record_size normaly equals 4096 bytes, which is
  133.  * encoded as 0xF4 (-12 in decimal).
  134.  */
  135. vol->index_record_size = 1 << -vol->index_clusters_per_record;
  136. vol->index_record_size_bits = ffs(vol->index_record_size) - 1;
  137. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->index_record_size = "
  138. "0x%xn", vol->index_record_size);
  139. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->index_record_size_bits "
  140. "= 0x%xn", vol->index_record_size_bits);
  141. /*
  142.  * Get the size of the volume in clusters (ofs 0x28 is nr_sectors) and
  143.  * check for 64-bit-ness. Windows currently only uses 32 bits to save
  144.  * the clusters so we do the same as it is much faster on 32-bit CPUs.
  145.  */
  146. ll = NTFS_GETS64(boot + 0x28) >> sectors_per_cluster_bits;
  147. if (ll >= (__s64)1 << 31) {
  148. ntfs_error("Cannot handle 64-bit clusters. Please inform "
  149. "linux-ntfs-dev@lists.sf.net that you got this "
  150. "error.n");
  151. return -1;
  152. }
  153. vol->nr_clusters = (ntfs_cluster_t)ll;
  154. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->nr_clusters = 0x%xn",
  155. vol->nr_clusters);
  156. vol->mft_lcn = (ntfs_cluster_t)NTFS_GETS64(boot + 0x30);
  157. vol->mft_mirr_lcn = (ntfs_cluster_t)NTFS_GETS64(boot + 0x38);
  158. /* Determine MFT zone size. */
  159. mft_zone_size = vol->nr_clusters;
  160. switch (vol->mft_zone_multiplier) {  /* % of volume size in clusters */
  161. case 4:
  162. mft_zone_size >>= 1; /* 50%   */
  163. break;
  164. case 3:
  165. mft_zone_size = mft_zone_size * 3 >> 3; /* 37.5% */
  166. break;
  167. case 2:
  168. mft_zone_size >>= 2; /* 25%   */
  169. break;
  170. /* case 1: */
  171. default:
  172. mft_zone_size >>= 3; /* 12.5% */
  173. break;
  174. }
  175. /* Setup mft zone. */
  176. vol->mft_zone_start = vol->mft_zone_pos = vol->mft_lcn;
  177. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->mft_zone_pos = %xn",
  178. vol->mft_zone_pos);
  179. /*
  180.  * Calculate the mft_lcn for an unmodified NTFS volume (see mkntfs
  181.  * source) and if the actual mft_lcn is in the expected place or even
  182.  * further to the front of the volume, extend the mft_zone to cover the
  183.  * beginning of the volume as well. This is in order to protect the
  184.  * area reserved for the mft bitmap as well within the mft_zone itself.
  185.  * On non-standard volumes we don't protect it as well as the overhead
  186.  * would be higher than the speed increase we would get by doing it.
  187.  */
  188. tc = (8192 + 2 * vol->cluster_size - 1) / vol->cluster_size;
  189. if (tc * vol->cluster_size < 16 * 1024)
  190. tc = (16 * 1024 + vol->cluster_size - 1) / vol->cluster_size;
  191. if (vol->mft_zone_start <= tc)
  192. vol->mft_zone_start = (ntfs_cluster_t)0;
  193. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->mft_zone_start = %xn",
  194. vol->mft_zone_start);
  195. /*
  196.  * Need to cap the mft zone on non-standard volumes so that it does
  197.  * not point outside the boundaries of the volume, we do this by
  198.  * halving the zone size until we are inside the volume.
  199.  */
  200. vol->mft_zone_end = vol->mft_lcn + mft_zone_size;
  201. while (vol->mft_zone_end >= vol->nr_clusters) {
  202. mft_zone_size >>= 1;
  203. vol->mft_zone_end = vol->mft_lcn + mft_zone_size;
  204. }
  205. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->mft_zone_end = %xn",
  206. vol->mft_zone_end);
  207. /*
  208.  * Set the current position within each data zone to the start of the
  209.  * respective zone.
  210.  */
  211. vol->data1_zone_pos = vol->mft_zone_end;
  212. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->data1_zone_pos = %xn",
  213. vol->data1_zone_pos);
  214. vol->data2_zone_pos = (ntfs_cluster_t)0;
  215. ntfs_debug(DEBUG_FILE3, "ntfs_init_volume: vol->data2_zone_pos = %xn",
  216. vol->data2_zone_pos);
  217. /* Set the mft data allocation position to mft record 24. */
  218. vol->mft_data_pos = 24UL;
  219. /* This will be initialized later. */
  220. vol->upcase = 0;
  221. vol->upcase_length = 0;
  222. vol->mft_ino = 0;
  223. return 0;
  224. }
  225. static void ntfs_init_upcase(ntfs_inode *upcase)
  226. {
  227. ntfs_io io;
  228. #define UPCASE_LENGTH  256
  229. upcase->vol->upcase = ntfs_malloc(UPCASE_LENGTH << 1);
  230. if (!upcase->vol->upcase)
  231. return;
  232. io.fn_put = ntfs_put;
  233. io.fn_get = 0;
  234. io.param = (char*)upcase->vol->upcase;
  235. io.size = UPCASE_LENGTH << 1;
  236. ntfs_read_attr(upcase, upcase->vol->at_data, 0, 0, &io);
  237. upcase->vol->upcase_length = io.size >> 1;
  238. }
  239. static int process_attrdef(ntfs_inode* attrdef, ntfs_u8* def)
  240. {
  241. int type = NTFS_GETU32(def+0x80);
  242. int check_type = 0;
  243. ntfs_volume *vol = attrdef->vol;
  244. ntfs_u16* name = (ntfs_u16*)def;
  245. if (!type) {
  246. ntfs_debug(DEBUG_OTHER, "process_atrdef: finished processing "
  247. "and returning 1n");
  248. return 1;
  249. }
  250. if (ntfs_ua_strncmp(name, "$STANDARD_INFORMATION", 64) == 0) {
  251. vol->at_standard_information = type;
  252. check_type = 0x10;
  253. } else if (ntfs_ua_strncmp(name, "$ATTRIBUTE_LIST", 64) == 0) {
  254. vol->at_attribute_list = type;
  255. check_type = 0x20;
  256. } else if (ntfs_ua_strncmp(name, "$FILE_NAME", 64) == 0) {
  257. vol->at_file_name = type;
  258. check_type = 0x30;
  259. } else if (ntfs_ua_strncmp(name, "$VOLUME_VERSION", 64) == 0) {
  260. vol->at_volume_version = type;
  261. check_type = 0x40;
  262. } else if (ntfs_ua_strncmp(name, "$SECURITY_DESCRIPTOR", 64) == 0) {
  263. vol->at_security_descriptor = type;
  264. check_type = 0x50;
  265. } else if (ntfs_ua_strncmp(name, "$VOLUME_NAME", 64) == 0) {
  266. vol->at_volume_name = type;
  267. check_type = 0x60;
  268. } else if (ntfs_ua_strncmp(name, "$VOLUME_INFORMATION", 64) == 0) {
  269. vol->at_volume_information = type;
  270. check_type = 0x70;
  271. } else if (ntfs_ua_strncmp(name, "$DATA", 64) == 0) {
  272. vol->at_data = type;
  273. check_type = 0x80;
  274. } else if (ntfs_ua_strncmp(name, "$INDEX_ROOT", 64) == 0) {
  275. vol->at_index_root = type;
  276. check_type = 0x90;
  277. } else if (ntfs_ua_strncmp(name, "$INDEX_ALLOCATION", 64) == 0) {
  278. vol->at_index_allocation = type;
  279. check_type = 0xA0;
  280. } else if (ntfs_ua_strncmp(name, "$BITMAP", 64) == 0) {
  281. vol->at_bitmap = type;
  282. check_type = 0xB0;
  283. } else if (ntfs_ua_strncmp(name, "$SYMBOLIC_LINK", 64) == 0 ||
  284.  ntfs_ua_strncmp(name, "$REPARSE_POINT", 64) == 0) {
  285. vol->at_symlink = type;
  286. check_type = 0xC0;
  287. }
  288. if (check_type && check_type != type) {
  289. ntfs_error("process_attrdef: unexpected type 0x%x for 0x%xn",
  290. type, check_type);
  291. return -EINVAL;
  292. }
  293. ntfs_debug(DEBUG_OTHER, "process_attrdef: found %s attribute of type "
  294. "0x%xn", check_type ? "known" : "unknown", type);
  295. return 0;
  296. }
  297. int ntfs_init_attrdef(ntfs_inode* attrdef)
  298. {
  299. ntfs_u8 *buf;
  300. ntfs_io io;
  301. __s64 offset;
  302. unsigned i;
  303. int error;
  304. ntfs_attribute *data;
  305. ntfs_debug(DEBUG_BSD, "Entered ntfs_init_attrdef()n");
  306. buf = ntfs_malloc(4050); /* 90*45 */
  307. if (!buf)
  308. return -ENOMEM;
  309. io.fn_put = ntfs_put;
  310. io.fn_get = ntfs_get;
  311. io.do_read = 1;
  312. offset = 0;
  313. data = ntfs_find_attr(attrdef, attrdef->vol->at_data, 0);
  314. ntfs_debug(DEBUG_BSD, "In ntfs_init_attrdef() after call to "
  315. "ntfs_find_attr.n");
  316. if (!data) {
  317. ntfs_free(buf);
  318. return -EINVAL;
  319. }
  320. do {
  321. io.param = buf;
  322. io.size = 4050;
  323. ntfs_debug(DEBUG_BSD, "In ntfs_init_attrdef() going to call "
  324. "ntfs_readwrite_attr.n");
  325. error = ntfs_readwrite_attr(attrdef, data, offset, &io);
  326. ntfs_debug(DEBUG_BSD, "In ntfs_init_attrdef() after call to "
  327. "ntfs_readwrite_attr.n");
  328. for (i = 0; !error && i <= io.size - 0xA0; i += 0xA0) {
  329. ntfs_debug(DEBUG_BSD, "In ntfs_init_attrdef() going "
  330. "to call process_attrdef.n");
  331. error = process_attrdef(attrdef, buf + i);
  332. ntfs_debug(DEBUG_BSD, "In ntfs_init_attrdef() after "
  333. "call to process_attrdef.n");
  334. }
  335. offset += 4096;
  336. } while (!error && io.size);
  337. ntfs_debug(DEBUG_BSD, "Exiting ntfs_init_attrdef()n");
  338. ntfs_free(buf);
  339. return error == 1 ? 0 : error;
  340. }
  341. /* ntfs_get_version will determine the NTFS version of the volume and will
  342.  * return the version in a BCD format, with the MSB being the major version
  343.  * number and the LSB the minor one. Otherwise return <0 on error.
  344.  * Example: version 3.1 will be returned as 0x0301. This has the obvious
  345.  * limitation of not coping with version numbers above 0x80 but that shouldn't
  346.  * be a problem... */
  347. int ntfs_get_version(ntfs_inode* volume)
  348. {
  349. ntfs_attribute *volinfo;
  350. volinfo = ntfs_find_attr(volume, volume->vol->at_volume_information, 0);
  351. if (!volinfo) 
  352. return -EINVAL;
  353. if (!volinfo->resident) {
  354. ntfs_error("Volume information attribute is not resident!n");
  355. return -EINVAL;
  356. }
  357. return ((ntfs_u8*)volinfo->d.data)[8] << 8 | 
  358.        ((ntfs_u8*)volinfo->d.data)[9];
  359. }
  360. int ntfs_load_special_files(ntfs_volume *vol)
  361. {
  362. int error;
  363. ntfs_inode upcase, attrdef, volume;
  364. vol->mft_ino = (ntfs_inode*)ntfs_calloc(sizeof(ntfs_inode));
  365. vol->mftmirr = (ntfs_inode*)ntfs_calloc(sizeof(ntfs_inode));
  366. vol->bitmap = (ntfs_inode*)ntfs_calloc(sizeof(ntfs_inode));
  367. vol->ino_flags = 4 | 2 | 1;
  368. error = -ENOMEM;
  369. ntfs_debug(DEBUG_BSD, "Going to load MFTn");
  370. if (!vol->mft_ino || (error = ntfs_init_inode(vol->mft_ino, vol,
  371. FILE_Mft))) {
  372. ntfs_error("Problem loading MFTn");
  373. return error;
  374. }
  375. ntfs_debug(DEBUG_BSD, "Going to load MIRRn");
  376. if ((error = ntfs_init_inode(vol->mftmirr, vol, FILE_MftMirr))) {
  377. ntfs_error("Problem %d loading MFTMirrn", error);
  378. return error;
  379. }
  380. ntfs_debug(DEBUG_BSD, "Going to load BITMAPn");
  381. if ((error = ntfs_init_inode(vol->bitmap, vol, FILE_BitMap))) {
  382. ntfs_error("Problem loading Bitmapn");
  383. return error;
  384. }
  385. ntfs_debug(DEBUG_BSD, "Going to load UPCASEn");
  386. error = ntfs_init_inode(&upcase, vol, FILE_UpCase);
  387. if (error)
  388. return error;
  389. ntfs_init_upcase(&upcase);
  390. ntfs_clear_inode(&upcase);
  391. ntfs_debug(DEBUG_BSD, "Going to load ATTRDEFn");
  392. error = ntfs_init_inode(&attrdef, vol, FILE_AttrDef);
  393. if (error)
  394. return error;
  395. error = ntfs_init_attrdef(&attrdef);
  396. ntfs_clear_inode(&attrdef);
  397. if (error)
  398. return error;
  399. /* Check for NTFS version and if Win2k version (ie. 3.0+) do not allow
  400.  * write access since the driver write support is broken. */
  401. ntfs_debug(DEBUG_BSD, "Going to load VOLUMEn");
  402. error = ntfs_init_inode(&volume, vol, FILE_Volume);
  403. if (error)
  404. return error;
  405. if ((error = ntfs_get_version(&volume)) >= 0x0300 &&
  406.     !(NTFS_SB(vol)->s_flags & MS_RDONLY)) {
  407. NTFS_SB(vol)->s_flags |= MS_RDONLY;
  408. ntfs_error("Warning! NTFS volume version is Win2k+: Mounting "
  409.    "read-onlyn");
  410. }
  411. ntfs_clear_inode(&volume);
  412. if (error < 0)
  413. return error;
  414. ntfs_debug(DEBUG_BSD, "NTFS volume is v%d.%dn", error >> 8,
  415. error & 0xff);
  416. return 0;
  417. }
  418. int ntfs_release_volume(ntfs_volume *vol)
  419. {
  420. if (((vol->ino_flags & 1) == 1) && vol->mft_ino) {
  421. ntfs_clear_inode(vol->mft_ino);
  422. ntfs_free(vol->mft_ino);
  423. vol->mft_ino = 0;
  424. }
  425. if (((vol->ino_flags & 2) == 2) && vol->mftmirr) {
  426. ntfs_clear_inode(vol->mftmirr);
  427. ntfs_free(vol->mftmirr);
  428. vol->mftmirr = 0;
  429. }
  430. if (((vol->ino_flags & 4) == 4) && vol->bitmap) {
  431. ntfs_clear_inode(vol->bitmap);
  432. ntfs_free(vol->bitmap);
  433. vol->bitmap = 0;
  434. }
  435. ntfs_free(vol->mft);
  436. ntfs_free(vol->upcase);
  437. return 0;
  438. }
  439. /*
  440.  * Writes the volume size (units of clusters) into vol_size.
  441.  * Returns 0 if successful or error.
  442.  */
  443. int ntfs_get_volumesize(ntfs_volume *vol, ntfs_s64 *vol_size)
  444. {
  445. ntfs_io io;
  446. char *cluster0;
  447. if (!vol_size)
  448. return -EFAULT;
  449. cluster0 = ntfs_malloc(vol->cluster_size);
  450. if (!cluster0)
  451. return -ENOMEM;
  452. io.fn_put = ntfs_put;
  453. io.fn_get = ntfs_get;
  454. io.param = cluster0;
  455. io.do_read = 1;
  456. io.size = vol->cluster_size;
  457. ntfs_getput_clusters(vol, 0, 0, &io);
  458. *vol_size = NTFS_GETU64(cluster0 + 0x28) >>
  459. (ffs(NTFS_GETU8(cluster0 + 0xD)) - 1);
  460. ntfs_free(cluster0);
  461. return 0;
  462. }
  463. static int nc[16]={4,3,3,2,3,2,2,1,3,2,2,1,2,1,1,0};
  464. int ntfs_get_free_cluster_count(ntfs_inode *bitmap)
  465. {
  466. ntfs_io io;
  467. int offset, error, clusters;
  468. unsigned char *bits = ntfs_malloc(2048);
  469. if (!bits)
  470. return -ENOMEM;
  471. offset = clusters = 0;
  472. io.fn_put = ntfs_put;
  473. io.fn_get = ntfs_get;
  474. while (1) {
  475. register int i;
  476. io.param = bits;
  477. io.size = 2048;
  478. error = ntfs_read_attr(bitmap, bitmap->vol->at_data, 0, offset,
  479. &io);
  480. if (error || io.size == 0)
  481. break;
  482. /* I never thought I would do loop unrolling some day */
  483. for (i = 0; i < io.size - 8; ) {
  484. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  485. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  486. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  487. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  488. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  489. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  490. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  491. clusters+=nc[bits[i]>>4];clusters+=nc[bits[i++] & 0xF];
  492. }
  493. while (i < io.size) {
  494. clusters += nc[bits[i] >> 4];
  495. clusters += nc[bits[i++] & 0xF];
  496. }
  497. offset += io.size;
  498. }
  499. ntfs_free(bits);
  500. return clusters;
  501. }
  502. /*
  503.  * Insert the fixups for the record. The number and location of the fixes
  504.  * is obtained from the record header but we double check with @rec_size and
  505.  * use that as the upper boundary, if necessary overwriting the count value in
  506.  * the record header.
  507.  *
  508.  * We return 0 on success or -1 if fixup header indicated the beginning of the
  509.  * update sequence array to be beyond the valid limit.
  510.  */
  511. int ntfs_insert_fixups(unsigned char *rec, int rec_size)
  512. {
  513. int first;
  514. int count;
  515. int offset = -2;
  516. ntfs_u16 fix;
  517. first = NTFS_GETU16(rec + 4);
  518. count = (rec_size >> NTFS_SECTOR_BITS) + 1;
  519. if (first + count * 2 > NTFS_SECTOR_SIZE - 2) {
  520. printk(KERN_CRIT "NTFS: ntfs_insert_fixups() detected corrupt "
  521. "NTFS record update sequence array position. - "
  522. "Cannot hotfix.n");
  523. return -1;
  524. }
  525. if (count != NTFS_GETU16(rec + 6)) {
  526. printk(KERN_ERR "NTFS: ntfs_insert_fixups() detected corrupt "
  527. "NTFS record update sequence array size. - "
  528. "Applying hotfix.n");
  529. NTFS_PUTU16(rec + 6, count);
  530. }
  531. fix = (NTFS_GETU16(rec + first) + 1) & 0xffff;
  532. if (fix == 0xffff || !fix)
  533. fix = 1;
  534. NTFS_PUTU16(rec + first, fix);
  535. count--;
  536. while (count--) {
  537. first += 2;
  538. offset += NTFS_SECTOR_SIZE;
  539. NTFS_PUTU16(rec + first, NTFS_GETU16(rec + offset));
  540. NTFS_PUTU16(rec + offset, fix);
  541. }
  542. return 0;
  543. }
  544. /**
  545.  * ntfs_allocate_clusters - allocate logical clusters on an ntfs volume
  546.  * @vol: volume on which to allocate clusters
  547.  * @location: preferred location for first allocated cluster
  548.  * @count: number of clusters to allocate
  549.  * @rl: address of pointer in which to return the allocated run list
  550.  * @rl_len: the number of elements returned in @*rl
  551.  *
  552.  * Allocate @*count clusters (LCNs), preferably beginning at @*location in the
  553.  * bitmap of the volume @vol. If @*location is -1, it does not matter where the
  554.  * clusters are. @rl is the address of a ntfs_runlist pointer which this
  555.  * function will allocate and fill with the runlist of the allocated clusters.
  556.  * It is the callers responsibility to ntfs_vfree() @*rl after she is finished
  557.  * with it. If the function was not successful, @*rl will be set to NULL.
  558.  * @*rl_len will contain the number of ntfs_runlist elements in @*rl or 0 if
  559.  * @*rl is NULL.
  560.  *
  561.  * Return 0 on success, or -errno on error. On success, @*location and @*count
  562.  * say what was really allocated. On -ENOSPC, @*location and @*count say what
  563.  * could have been allocated. If nothing could be allocated or a different
  564.  * error occured, @*location = -1 and @*count = 0.
  565.  *
  566.  * There are two data zones. First is the area between the end of the mft zone
  567.  * and the end of the volume, and second is the area between the start of the
  568.  * volume and the start of the mft zone. On unmodified/standard volumes, the
  569.  * second mft zone doesn't exist due to the mft zone being expanded to cover
  570.  * the start of volume in order to reserve space for the mft bitmap attribute.
  571.  *
  572.  * This is not the prettiest function but the complexity stems from the need of
  573.  * implementing the mft vs data zoned approach and from the fact that we have
  574.  * access to the lcn bitmap in portions of PAGE_SIZE bytes at a time, so we
  575.  * need to cope with crossing over boundaries of two pages. Further, the fact
  576.  * that the allocator allows for caller supplied hints as to the location of
  577.  * where allocation should begin and the fact that the allocator keeps track of
  578.  * where in the data zones the next natural allocation should occur, contribute
  579.  * to the complexity of the function. But it should all be worthwhile, because
  580.  * this allocator should: 1) be a full implementation of the MFT zone approach
  581.  * used by Windows, 2) cause reduction in fragmentation as much as possible,
  582.  * and 3) be speedy in allocations (the code is not optimized for speed, but
  583.  * the algorithm is, so further speed improvements are probably possible).
  584.  *
  585.  * FIXME: Really need finer-grained locking but this will do for the moment. I
  586.  * just want to kill all races and have a working allocator. When that is done,
  587.  * we can beautify... (AIA)
  588.  * 
  589.  * FIXME: We should be monitoring cluster allocation and increment the MFT zone
  590.  * size dynamically but this is something for the future. We will just cause
  591.  * heavier fragmentation by not doing it and I am not even sure Windows would
  592.  * grow the MFT zone dynamically, so might even be correct not doing this. The
  593.  * overhead in doing dynamic MFT zone expansion would be very large and unlikely
  594.  * worth the effort. (AIA)
  595.  *
  596.  * TODO: I have added in double the required zone position pointer wrap around
  597.  * logic which can be optimized to having only one of the two logic sets.
  598.  * However, having the double logic will work fine, but if we have only one of
  599.  * the sets and we get it wrong somewhere, then we get into trouble, so
  600.  * removing the duplicate logic requires _very_ careful consideration of _all_
  601.  * possible code paths. So at least for now, I am leaving the double logic -
  602.  * better safe than sorry... (AIA)
  603.  */
  604. int ntfs_allocate_clusters(ntfs_volume *vol, ntfs_cluster_t *location,
  605. ntfs_cluster_t *count, ntfs_runlist **rl, int *rl_len,
  606. const NTFS_CLUSTER_ALLOCATION_ZONES zone)
  607. {
  608. ntfs_runlist *rl2 = NULL, *rlt;
  609. ntfs_attribute *data;
  610. ntfs_cluster_t buf_pos, zone_start, zone_end, mft_zone_size;
  611. ntfs_cluster_t lcn, last_read_pos, prev_lcn = (ntfs_cluster_t)0;
  612. ntfs_cluster_t initial_location, prev_run_len = (ntfs_cluster_t)0;
  613. ntfs_cluster_t clusters = (ntfs_cluster_t)0;
  614. unsigned char *buf, *byte, bit, search_zone, done_zones;
  615. unsigned char pass, need_writeback;
  616. int rlpos = 0, rlsize, buf_size, err = 0;
  617. ntfs_io io;
  618. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Entering with *location = "
  619. "0x%x, *count = 0x%x, zone = %s_ZONE.n", *location,
  620. *count, zone == DATA_ZONE ? "DATA" : "MFT");
  621. buf = (char*)__get_free_page(GFP_NOFS);
  622. if (!buf) {
  623. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning "
  624. "-ENOMEM.n");
  625. return -ENOMEM;
  626. }
  627. io.fn_put = ntfs_put;
  628. io.fn_get = ntfs_get;
  629. lock_kernel();
  630. /* Get the $DATA attribute of $Bitmap. */
  631. data = ntfs_find_attr(vol->bitmap, vol->at_data, 0);
  632. if (!data) {
  633. err = -EINVAL;
  634. goto err_ret;
  635. }
  636. /*
  637.  * If no specific location was requested, use the current data zone
  638.  * position, otherwise use the requested location but make sure it lies
  639.  * outside the mft zone. Also set done_zones to 0 (no zones done) and
  640.  * pass depending on whether we are starting inside a zone (1) or
  641.  * at the beginning of a zone (2). If requesting from the MFT_ZONE, then
  642.  * we either start at the current position within the mft zone or at the
  643.  * specified position and if the latter is out of bounds then we start
  644.  * at the beginning of the MFT_ZONE.
  645.  */
  646. done_zones = 0;
  647. pass = 1;
  648. /*
  649.  * zone_start and zone_end are the current search range. search_zone
  650.  * is 1 for mft zone, 2 for data zone 1 (end of mft zone till end of
  651.  * volume) and 4 for data zone 2 (start of volume till start of mft
  652.  * zone).
  653.  */
  654. zone_start = *location;
  655. if (zone_start < 0) {
  656. if (zone == DATA_ZONE)
  657. zone_start = vol->data1_zone_pos;
  658. else
  659. zone_start = vol->mft_zone_pos;
  660. if (!zone_start)
  661. /*
  662.  * Zone starts at beginning of volume which means a
  663.  * single pass is sufficient.
  664.  */
  665. pass = 2;
  666. } else if (zone_start >= vol->mft_zone_start && zone_start <
  667. vol->mft_zone_end && zone == DATA_ZONE) {
  668. zone_start = vol->mft_zone_end;
  669. pass = 2;
  670. } else if ((zone_start < vol->mft_zone_start || zone_start >=
  671. vol->mft_zone_end) && zone == MFT_ZONE) {
  672. zone_start = vol->mft_lcn;
  673. if (!vol->mft_zone_end)
  674. zone_start = (ntfs_cluster_t)0;
  675. pass = 2;
  676. }
  677. if (zone == DATA_ZONE) {
  678. /* Skip searching the mft zone. */
  679. done_zones |= 1;
  680. if (zone_start >= vol->mft_zone_end) {
  681. zone_end = vol->nr_clusters;
  682. search_zone = 2;
  683. } else {
  684. zone_end = vol->mft_zone_start;
  685. search_zone = 4;
  686. }
  687. } else /* if (zone == MFT_ZONE) */ {
  688. zone_end = vol->mft_zone_end;
  689. search_zone = 1;
  690. }
  691. /*
  692.  * buf_pos is the current bit position inside the bitmap. We use
  693.  * initial_location to determine whether or not to do a zone switch.
  694.  */
  695. buf_pos = initial_location = zone_start;
  696. /* Loop until all clusters are allocated, i.e. clusters == 0. */
  697. clusters = *count;
  698. rlpos = rlsize = 0;
  699. if (*count <= 0) {
  700. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): *count <= 0, "
  701. "returning -EINVAL.n");
  702. err = -EINVAL;
  703. goto err_ret;
  704. }
  705. while (1) {
  706. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Start of outer while "
  707. "loop: done_zones = 0x%x, search_zone = %i, "
  708. "pass = %i, zone_start = 0x%x, zone_end = "
  709. "0x%x, initial_location = 0x%x, buf_pos = "
  710. "0x%x, rlpos = %i, rlsize = %i.n",
  711. done_zones, search_zone, pass, zone_start,
  712. zone_end, initial_location, buf_pos, rlpos,
  713. rlsize);
  714. /* Loop until we run out of free clusters. */
  715. io.param = buf;
  716. io.size = PAGE_SIZE;
  717. io.do_read = 1;
  718. last_read_pos = buf_pos >> 3;
  719. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): last_read_pos = "
  720. "0x%x.n", last_read_pos);
  721. err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos,
  722. &io);
  723. if (err) {
  724. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  725. "ntfs_read_attr failed with error "
  726. "code %i, going to err_ret.n", -err);
  727. goto err_ret;
  728. }
  729. if (!io.size) {
  730. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): !io.size, "
  731. "going to zone_pass_done.n");
  732. goto zone_pass_done;
  733. }
  734. buf_size = io.size << 3;
  735. lcn = buf_pos & 7;
  736. buf_pos &= ~7;
  737. need_writeback = 0;
  738. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before inner while "
  739. "loop: buf_size = 0x%x, lcn = 0x%x, buf_pos = "
  740. "0x%x, need_writeback = %i.n", buf_size, lcn,
  741. buf_pos, need_writeback);
  742. while (lcn < buf_size && lcn + buf_pos < zone_end) {
  743. byte = buf + (lcn >> 3);
  744. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): In inner "
  745. "while loop: buf_size = 0x%x, lcn = "
  746. "0x%x, buf_pos = 0x%x, need_writeback "
  747. "= %i, byte ofs = 0x%x, *byte = "
  748. "0x%x.n", buf_size, lcn, buf_pos,
  749. need_writeback, lcn >> 3, *byte);
  750. /* Skip full bytes. */
  751. if (*byte == 0xff) {
  752. lcn += 8;
  753. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  754. "continuing while loop 1.n");
  755. continue;
  756. }
  757. bit = 1 << (lcn & 7);
  758. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): bit = %i.n",
  759. bit);
  760. /* If the bit is already set, go onto the next one. */
  761. if (*byte & bit) {
  762. lcn++;
  763. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  764. "continuing while loop 2.n");
  765. continue;
  766. }
  767. /* Allocate the bitmap bit. */
  768. *byte |= bit;
  769. /* We need to write this bitmap buffer back to disk! */
  770. need_writeback = 1;
  771. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): *byte = "
  772. "0x%x, need_writeback = %i.n", *byte,
  773. need_writeback);
  774. /* Reallocate memory if necessary. */
  775. if ((rlpos + 2) * sizeof(ntfs_runlist) >= rlsize) {
  776. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  777. "Reallocating space.n");
  778. /* Setup first free bit return value. */
  779. if (!rl2) {
  780. *location = lcn + buf_pos;
  781. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  782. "(): *location = "
  783. "0x%x.n", *location);
  784. }
  785. rlsize += PAGE_SIZE;
  786. rlt = ntfs_vmalloc(rlsize);
  787. if (!rlt) {
  788. err = -ENOMEM;
  789. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  790. "(): Failed to "
  791. "allocate memory, "
  792. "returning -ENOMEM, "
  793. "going to "
  794. "wb_err_ret.n");
  795. goto wb_err_ret;
  796. }
  797. if (rl2) {
  798. ntfs_memcpy(rlt, rl2, rlsize -
  799. PAGE_SIZE);
  800. ntfs_vfree(rl2);
  801. }
  802. rl2 = rlt;
  803. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  804. "Reallocated memory, rlsize = "
  805. "0x%x.n", rlsize);
  806. }
  807. /*
  808.  * Coalesce with previous run if adjacent LCNs.
  809.  * Otherwise, append a new run.
  810.  */
  811. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Adding run "
  812. "(lcn 0x%x, len 0x%x), prev_lcn = "
  813. "0x%x, lcn = 0x%x, buf_pos = 0x%x, "
  814. "prev_run_len = 0x%x, rlpos = %i.n",
  815. lcn + buf_pos, 1, prev_lcn, lcn,
  816. buf_pos, prev_run_len, rlpos);
  817. if (prev_lcn == lcn + buf_pos - prev_run_len && rlpos) {
  818. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  819. "Coalescing to run (lcn 0x%x, "
  820. "len 0x%x).n",
  821. rl2[rlpos - 1].lcn,
  822. rl2[rlpos - 1].len);
  823. rl2[rlpos - 1].len = ++prev_run_len;
  824. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  825. "Run now (lcn 0x%x, len 0x%x), "
  826. "prev_run_len = 0x%x.n",
  827. rl2[rlpos - 1].lcn,
  828. rl2[rlpos - 1].len,
  829. prev_run_len);
  830. } else {
  831. if (rlpos)
  832. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  833. "(): Adding new run, "
  834. "(previous run lcn "
  835. "0x%x, len 0x%x).n",
  836. rl2[rlpos - 1].lcn,
  837. rl2[rlpos - 1].len);
  838. else
  839. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  840. "(): Adding new run, "
  841. "is first run.n");
  842. rl2[rlpos].lcn = prev_lcn = lcn + buf_pos;
  843. rl2[rlpos].len = prev_run_len =
  844. (ntfs_cluster_t)1;
  845. rlpos++;
  846. }
  847. /* Done? */
  848. if (!--clusters) {
  849. ntfs_cluster_t tc;
  850. /*
  851.  * Update the current zone position. Positions
  852.  * of already scanned zones have been updated
  853.  * during the respective zone switches.
  854.  */
  855. tc = lcn + buf_pos + 1;
  856. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  857. "Done. Updating current zone "
  858. "position, tc = 0x%x, "
  859. "search_zone = %i.n", tc,
  860. search_zone);
  861. switch (search_zone) {
  862. case 1:
  863. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  864. "(): Before checks, "
  865. "vol->mft_zone_pos = "
  866. "0x%x.n",
  867. vol->mft_zone_pos);
  868. if (tc >= vol->mft_zone_end) {
  869. vol->mft_zone_pos =
  870. vol->mft_lcn;
  871. if (!vol->mft_zone_end)
  872. vol->mft_zone_pos =
  873.      (ntfs_cluster_t)0;
  874. } else if ((initial_location >=
  875. vol->mft_zone_pos ||
  876. tc > vol->mft_zone_pos)
  877. && tc >= vol->mft_lcn)
  878. vol->mft_zone_pos = tc;
  879. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  880. "(): After checks, "
  881. "vol->mft_zone_pos = "
  882. "0x%x.n",
  883. vol->mft_zone_pos);
  884. break;
  885. case 2:
  886. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  887. "(): Before checks, "
  888. "vol->data1_zone_pos = "
  889. "0x%x.n",
  890. vol->data1_zone_pos);
  891. if (tc >= vol->nr_clusters)
  892. vol->data1_zone_pos =
  893.      vol->mft_zone_end;
  894. else if ((initial_location >=
  895.     vol->data1_zone_pos ||
  896.     tc > vol->data1_zone_pos)
  897.     && tc >= vol->mft_zone_end)
  898. vol->data1_zone_pos = tc;
  899. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  900. "(): After checks, "
  901. "vol->data1_zone_pos = "
  902. "0x%x.n",
  903. vol->data1_zone_pos);
  904. break;
  905. case 4:
  906. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  907. "(): Before checks, "
  908. "vol->data2_zone_pos = "
  909. "0x%x.n",
  910. vol->data2_zone_pos);
  911. if (tc >= vol->mft_zone_start)
  912. vol->data2_zone_pos =
  913. (ntfs_cluster_t)0;
  914. else if (initial_location >=
  915.       vol->data2_zone_pos ||
  916.       tc > vol->data2_zone_pos)
  917. vol->data2_zone_pos = tc;
  918. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  919. "(): After checks, "
  920. "vol->data2_zone_pos = "
  921. "0x%x.n",
  922. vol->data2_zone_pos);
  923. break;
  924. default:
  925. BUG();
  926. }
  927. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  928. "Going to done_ret.n");
  929. goto done_ret;
  930. }
  931. lcn++;
  932. }
  933. buf_pos += buf_size;
  934. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After inner while "
  935. "loop: buf_size = 0x%x, lcn = 0x%x, buf_pos = "
  936. "0x%x, need_writeback = %i.n", buf_size, lcn,
  937. buf_pos, need_writeback);
  938. if (need_writeback) {
  939. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing "
  940. "back.n");
  941. need_writeback = 0;
  942. io.param = buf;
  943. io.do_read = 0;
  944. err = ntfs_readwrite_attr(vol->bitmap, data,
  945. last_read_pos, &io);
  946. if (err) {
  947. ntfs_error(__FUNCTION__ "(): Bitmap writeback "
  948. "failed in read next buffer "
  949. "code path with error code "
  950. "%i.n", -err);
  951. goto err_ret;
  952. }
  953. }
  954. if (buf_pos < zone_end) {
  955. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing "
  956. "outer while loop, buf_pos = 0x%x, "
  957. "zone_end = 0x%x.n", buf_pos,
  958. zone_end);
  959. continue;
  960. }
  961. zone_pass_done: /* Finished with the current zone pass. */
  962. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At zone_pass_done, "
  963. "pass = %i.n", pass);
  964. if (pass == 1) {
  965. /*
  966.  * Now do pass 2, scanning the first part of the zone
  967.  * we omitted in pass 1.
  968.  */
  969. pass = 2;
  970. zone_end = zone_start;
  971. switch (search_zone) {
  972. case 1: /* mft_zone */
  973. zone_start = vol->mft_zone_start;
  974. break;
  975. case 2: /* data1_zone */
  976. zone_start = vol->mft_zone_end;
  977. break;
  978. case 4: /* data2_zone */
  979. zone_start = (ntfs_cluster_t)0;
  980. break;
  981. default:
  982. BUG();
  983. }
  984. /* Sanity check. */
  985. if (zone_end < zone_start)
  986. zone_end = zone_start;
  987. buf_pos = zone_start;
  988. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing "
  989. "outer while loop, pass = 2, "
  990. "zone_start = 0x%x, zone_end = 0x%x, "
  991. "buf_pos = 0x%x.n");
  992. continue;
  993. } /* pass == 2 */
  994. done_zones_check:
  995. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_zones_check, "
  996. "search_zone = %i, done_zones before = 0x%x, "
  997. "done_zones after = 0x%x.n",
  998. search_zone, done_zones, done_zones |
  999. search_zone);
  1000. done_zones |= search_zone;
  1001. if (done_zones < 7) {
  1002. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Switching "
  1003. "zone.n");
  1004. /* Now switch to the next zone we haven't done yet. */
  1005. pass = 1;
  1006. switch (search_zone) {
  1007. case 1:
  1008. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1009. "Switching from mft zone to "
  1010. "data1 zone.n");
  1011. /* Update mft zone position. */
  1012. if (rlpos) {
  1013. ntfs_cluster_t tc;
  1014. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  1015. "(): Before checks, "
  1016. "vol->mft_zone_pos = "
  1017. "0x%x.n",
  1018. vol->mft_zone_pos);
  1019. tc = rl2[rlpos - 1].lcn +
  1020. rl2[rlpos - 1].len;
  1021. if (tc >= vol->mft_zone_end) {
  1022. vol->mft_zone_pos =
  1023. vol->mft_lcn;
  1024. if (!vol->mft_zone_end)
  1025. vol->mft_zone_pos =
  1026.      (ntfs_cluster_t)0;
  1027. } else if ((initial_location >=
  1028. vol->mft_zone_pos ||
  1029. tc > vol->mft_zone_pos)
  1030. && tc >= vol->mft_lcn)
  1031. vol->mft_zone_pos = tc;
  1032. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  1033. "(): After checks, "
  1034. "vol->mft_zone_pos = "
  1035. "0x%x.n",
  1036. vol->mft_zone_pos);
  1037. }
  1038. /* Switch from mft zone to data1 zone. */
  1039. switch_to_data1_zone: search_zone = 2;
  1040. zone_start = initial_location =
  1041. vol->data1_zone_pos;
  1042. zone_end = vol->nr_clusters;
  1043. if (zone_start == vol->mft_zone_end)
  1044. pass = 2;
  1045. if (zone_start >= zone_end) {
  1046. vol->data1_zone_pos = zone_start =
  1047. vol->mft_zone_end;
  1048. pass = 2;
  1049. }
  1050. break;
  1051. case 2:
  1052. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1053. "Switching from data1 zone to "
  1054. "data2 zone.n");
  1055. /* Update data1 zone position. */
  1056. if (rlpos) {
  1057. ntfs_cluster_t tc;
  1058. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  1059. "(): Before checks, "
  1060. "vol->data1_zone_pos = "
  1061. "0x%x.n",
  1062. vol->data1_zone_pos);
  1063. tc = rl2[rlpos - 1].lcn +
  1064. rl2[rlpos - 1].len;
  1065. if (tc >= vol->nr_clusters)
  1066. vol->data1_zone_pos =
  1067.      vol->mft_zone_end;
  1068. else if ((initial_location >=
  1069.     vol->data1_zone_pos ||
  1070.     tc > vol->data1_zone_pos)
  1071.     && tc >= vol->mft_zone_end)
  1072. vol->data1_zone_pos = tc;
  1073. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  1074. "(): After checks, "
  1075. "vol->data1_zone_pos = "
  1076. "0x%x.n",
  1077. vol->data1_zone_pos);
  1078. }
  1079. /* Switch from data1 zone to data2 zone. */
  1080. search_zone = 4;
  1081. zone_start = initial_location =
  1082. vol->data2_zone_pos;
  1083. zone_end = vol->mft_zone_start;
  1084. if (!zone_start)
  1085. pass = 2;
  1086. if (zone_start >= zone_end) {
  1087. vol->data2_zone_pos = zone_start =
  1088. initial_location =
  1089. (ntfs_cluster_t)0;
  1090. pass = 2;
  1091. }
  1092. break;
  1093. case 4:
  1094. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1095. "Switching from data2 zone to "
  1096. "data1 zone.n");
  1097. /* Update data2 zone position. */
  1098. if (rlpos) {
  1099. ntfs_cluster_t tc;
  1100. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  1101. "(): Before checks, "
  1102. "vol->data2_zone_pos = "
  1103. "0x%x.n",
  1104. vol->data2_zone_pos);
  1105. tc = rl2[rlpos - 1].lcn +
  1106. rl2[rlpos - 1].len;
  1107. if (tc >= vol->mft_zone_start)
  1108. vol->data2_zone_pos =
  1109.      (ntfs_cluster_t)0;
  1110. else if (initial_location >=
  1111.       vol->data2_zone_pos ||
  1112.       tc > vol->data2_zone_pos)
  1113. vol->data2_zone_pos = tc;
  1114. ntfs_debug(DEBUG_OTHER, __FUNCTION__
  1115. "(): After checks, "
  1116. "vol->data2_zone_pos = "
  1117. "0x%x.n",
  1118. vol->data2_zone_pos);
  1119. }
  1120. /* Switch from data2 zone to data1 zone. */
  1121. goto switch_to_data1_zone; /* See above. */
  1122. default:
  1123. BUG();
  1124. }
  1125. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After zone "
  1126. "switch, search_zone = %i, pass = %i, "
  1127. "initial_location = 0x%x, zone_start "
  1128. "= 0x%x, zone_end = 0x%x.n",
  1129. search_zone, pass, initial_location,
  1130. zone_start, zone_end);
  1131. buf_pos = zone_start;
  1132. if (zone_start == zone_end) {
  1133. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
  1134. "Empty zone, going to "
  1135. "done_zones_check.n");
  1136. /* Empty zone. Don't bother searching it. */
  1137. goto done_zones_check;
  1138. }
  1139. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing "
  1140. "outer while loop.n");
  1141. continue;
  1142. } /* done_zones == 7 */
  1143. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): All zones are "
  1144. "finished.n");
  1145. /*
  1146.  * All zones are finished! If DATA_ZONE, shrink mft zone. If
  1147.  * MFT_ZONE, we have really run out of space.
  1148.  */
  1149. mft_zone_size = vol->mft_zone_end - vol->mft_zone_start;
  1150. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): vol->mft_zone_start "
  1151. "= 0x%x, vol->mft_zone_end = 0x%x, "
  1152. "mft_zone_size = 0x%x.n", vol->mft_zone_start,
  1153. vol->mft_zone_end, mft_zone_size);
  1154. if (zone == MFT_ZONE || mft_zone_size <= (ntfs_cluster_t)0) {
  1155. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): No free "
  1156. "clusters left, returning -ENOSPC, "
  1157. "going to fail_ret.n");
  1158. /* Really no more space left on device. */
  1159. err = -ENOSPC;
  1160. goto fail_ret;
  1161. } /* zone == DATA_ZONE && mft_zone_size > 0 */
  1162. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Shrinking mft "
  1163. "zone.n");
  1164. zone_end = vol->mft_zone_end;
  1165. mft_zone_size >>= 1;
  1166. if (mft_zone_size > (ntfs_cluster_t)0)
  1167. vol->mft_zone_end = vol->mft_zone_start + mft_zone_size;
  1168. else /* mft zone and data2 zone no longer exist. */
  1169. vol->data2_zone_pos = vol->mft_zone_start =
  1170. vol->mft_zone_end = (ntfs_cluster_t)0;
  1171. if (vol->mft_zone_pos >= vol->mft_zone_end) {
  1172. vol->mft_zone_pos = vol->mft_lcn;
  1173. if (!vol->mft_zone_end)
  1174. vol->mft_zone_pos = (ntfs_cluster_t)0;
  1175. }
  1176. buf_pos = zone_start = initial_location =
  1177. vol->data1_zone_pos = vol->mft_zone_end;
  1178. search_zone = 2;
  1179. pass = 2;
  1180. done_zones &= ~2;
  1181. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After shrinking mft "
  1182. "zone, mft_zone_size = 0x%x, "
  1183. "vol->mft_zone_start = 0x%x, vol->mft_zone_end "
  1184. "= 0x%x, vol->mft_zone_pos = 0x%x, search_zone "
  1185. "= 2, pass = 2, dones_zones = 0x%x, zone_start "
  1186. "= 0x%x, zone_end = 0x%x, vol->data1_zone_pos "
  1187. "= 0x%x, continuing outer while loop.n",
  1188. mft_zone_size, vol->mft_zone_start,
  1189. vol->mft_zone_end, vol->mft_zone_pos,
  1190. search_zone, pass, done_zones, zone_start,
  1191. zone_end, vol->data1_zone_pos);
  1192. }
  1193. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After outer while loop.n");
  1194. done_ret:
  1195. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_ret.n");
  1196. rl2[rlpos].lcn = (ntfs_cluster_t)-1;
  1197. rl2[rlpos].len = (ntfs_cluster_t)0;
  1198. *rl = rl2;
  1199. *rl_len = rlpos;
  1200. if (need_writeback) {
  1201. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing back.n");
  1202. need_writeback = 0;
  1203. io.param = buf;
  1204. io.do_read = 0;
  1205. err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos,
  1206. &io);
  1207. if (err) {
  1208. ntfs_error(__FUNCTION__ "(): Bitmap writeback failed "
  1209. "in done code path with error code "
  1210. "%i.n", -err);
  1211. goto err_ret;
  1212. }
  1213. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote 0x%Lx bytes.n",
  1214. io.size);
  1215. }
  1216. done_fail_ret:
  1217. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_fail_ret (follows "
  1218. "done_ret).n");
  1219. unlock_kernel();
  1220. free_page((unsigned long)buf);
  1221. if (err)
  1222. ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): Failed to allocate "
  1223. "clusters. Returning with error code %i.n",
  1224. -err);
  1225. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Syncing $Bitmap inode.n");
  1226. if (ntfs_update_inode(vol->bitmap))
  1227. ntfs_error(__FUNCTION__ "(): Failed to sync inode $Bitmap. "
  1228. "Continuing anyway.n");
  1229. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning with code %i.n",
  1230. err);
  1231. return err;
  1232. fail_ret:
  1233. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At fail_ret.n");
  1234. if (rl2) {
  1235. if (err == -ENOSPC) {
  1236. /* Return first free lcn and count of free clusters. */
  1237. *location = rl2[0].lcn;
  1238. *count -= clusters;
  1239. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): err = "
  1240. "-ENOSPC, *location = 0x%x, *count = "
  1241. "0x%x.n", *location, *count);
  1242. }
  1243. /* Deallocate all allocated clusters. */
  1244. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Deallocating "
  1245. "allocated clusters.n");
  1246. ntfs_deallocate_clusters(vol, rl2, rlpos);
  1247. /* Free the runlist. */
  1248. ntfs_vfree(rl2);
  1249. } else {
  1250. if (err == -ENOSPC) {
  1251. /* Nothing free at all. */
  1252. *location = vol->data1_zone_pos; /* Irrelevant... */
  1253. *count = 0;
  1254. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): No space "
  1255. "left at all, err = -ENOSPC, *location "
  1256. "= 0x%x, *count = 0.n", *location);
  1257. }
  1258. }
  1259. *rl = NULL;
  1260. *rl_len = 0;
  1261. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): *rl = NULL, *rl_len = 0, "
  1262. "going to done_fail_ret.n");
  1263. goto done_fail_ret;
  1264. wb_err_ret:
  1265. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At wb_err_ret.n");
  1266. if (need_writeback) {
  1267. int __err;
  1268. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing back.n");
  1269. io.param = buf;
  1270. io.do_read = 0;
  1271. __err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos,
  1272. &io);
  1273. if (__err)
  1274. ntfs_error(__FUNCTION__ "(): Bitmap writeback failed "
  1275. "in error code path with error code "
  1276. "%i.n", -__err);
  1277. need_writeback = 0;
  1278. }
  1279. err_ret:
  1280. ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At err_ret, *location = -1, "
  1281. "*count = 0, going to fail_ret.n");
  1282. *location = -1;
  1283. *count = 0;
  1284. goto fail_ret;
  1285. }
  1286. /*
  1287.  * IMPORTANT: Caller has to hold big kernel lock or the race monster will come
  1288.  * to get you! (-;
  1289.  * TODO: Need our own lock for bitmap accesses but BKL is more secure for now,
  1290.  * considering we might not have covered all places with a lock yet. In that
  1291.  * case the BKL offers a one way exclusion which is better than no exclusion
  1292.  * at all... (AIA)
  1293.  */
  1294. static int ntfs_clear_bitrange(ntfs_inode *bitmap,
  1295. const ntfs_cluster_t start_bit, const ntfs_cluster_t count)
  1296. {
  1297. ntfs_cluster_t buf_size, bit, nr_bits = count;
  1298. unsigned char *buf, *byte;
  1299. int err;
  1300. ntfs_io io;
  1301. io.fn_put = ntfs_put;
  1302. io.fn_get = ntfs_get;
  1303. /* Calculate the required buffer size in bytes. */
  1304. buf_size = (ntfs_cluster_t)((start_bit & 7) + nr_bits + 7) >> 3;
  1305. if (buf_size <= (ntfs_cluster_t)(64 * 1024))
  1306. buf = ntfs_malloc(buf_size);
  1307. else
  1308. buf = ntfs_vmalloc(buf_size);
  1309. if (!buf)
  1310. return -ENOMEM;
  1311. /* Read the bitmap from the data attribute. */
  1312. io.param = byte = buf;
  1313. io.size = buf_size;
  1314. err = ntfs_read_attr(bitmap, bitmap->vol->at_data, 0, start_bit >> 3,
  1315. &io);
  1316. if (err || io.size != buf_size)
  1317. goto err_out;
  1318. /* Now clear the bits in the read bitmap. */
  1319. bit = start_bit & 7;
  1320. while (bit && nr_bits) { /* Process first partial byte, if present. */
  1321. *byte &= ~(1 << bit++);
  1322. nr_bits--;
  1323. bit &= 7;
  1324. if (!bit)
  1325. byte++;
  1326. }
  1327. while (nr_bits >= 8) { /* Process full bytes. */
  1328. *byte = 0;
  1329. nr_bits -= 8;
  1330. byte++;
  1331. }
  1332. bit = 0;
  1333. while (nr_bits) { /* Process last partial byte, if present. */
  1334. *byte &= ~(1 << bit);
  1335. nr_bits--;
  1336. bit++;
  1337. }
  1338. /* Write the modified bitmap back to disk. */
  1339. io.param = buf;
  1340. io.size = buf_size;
  1341. err = ntfs_write_attr(bitmap, bitmap->vol->at_data, 0, start_bit >> 3,
  1342. &io);
  1343. err_out:
  1344. if (buf_size <= (ntfs_cluster_t)(64 * 1024))
  1345. ntfs_free(buf);
  1346. else
  1347. ntfs_vfree(buf);
  1348. if (!err && io.size != buf_size)
  1349. err = -EIO;
  1350. return err;
  1351. }
  1352. /*
  1353.  * See comments for lack of zone adjustments below in the description of the
  1354.  * function ntfs_deallocate_clusters().
  1355.  */
  1356. int ntfs_deallocate_cluster_run(const ntfs_volume *vol,
  1357. const ntfs_cluster_t lcn, const ntfs_cluster_t len)
  1358. {
  1359. int err;
  1360. lock_kernel();
  1361. err = ntfs_clear_bitrange(vol->bitmap, lcn, len);
  1362. unlock_kernel();
  1363. return err;
  1364. }
  1365. /*
  1366.  * This is inefficient, but logically trivial, so will do for now. Note, we
  1367.  * do not touch the mft nor the data zones here because we want to minimize
  1368.  * recycling of clusters to enhance the chances of data being undeleteable.
  1369.  * Also we don't want the overhead. Instead we do one additional sweep of the
  1370.  * current data zone during cluster allocation to check for freed clusters.
  1371.  */
  1372. int ntfs_deallocate_clusters(const ntfs_volume *vol, const ntfs_runlist *rl,
  1373. const int rl_len)
  1374. {
  1375. int i, err;
  1376. lock_kernel();
  1377. for (i = err = 0; i < rl_len && !err; i++)
  1378. err = ntfs_clear_bitrange(vol->bitmap, rl[i].lcn, rl[i].len);
  1379. unlock_kernel();
  1380. return err;
  1381. }