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