File: /usr/src/linux/fs/ntfs/super.c

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      */
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      */
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     
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     
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     
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... */
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     
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     
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      */
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     
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      */
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      */
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, __FUNCTION__ "(): Entering with *location = "
643     			"0x%x, *count = 0x%x, zone = %s_ZONE.\n", *location,
644     			*count, zone == DATA_ZONE ? "DATA" : "MFT");
645     	buf = (char*)__get_free_page(GFP_NOFS);
646     	if (!buf) {
647     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning "
648     				"-ENOMEM.\n");
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, __FUNCTION__ "(): *count <= 0, "
725     				"returning -EINVAL.\n");
726     		err = -EINVAL;
727     		goto err_ret;
728     	}
729     	while (1) {
730     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): 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     				done_zones, search_zone, pass, zone_start,
736     				zone_end, initial_location, buf_pos, rlpos,
737     				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, __FUNCTION__ "(): last_read_pos = "
744     				"0x%x.\n", last_read_pos);
745     		err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos,
746     				&io);
747     		if (err) {
748     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
749     					"ntfs_read_attr failed with error "
750     					"code %i, going to err_ret.\n", -err);
751     			goto err_ret;
752     		}
753     		if (!io.size) {
754     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): !io.size, "
755     					"going to zone_pass_done.\n");
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, __FUNCTION__ "(): Before inner while "
763     				"loop: buf_size = 0x%x, lcn = 0x%x, buf_pos = "
764     				"0x%x, need_writeback = %i.\n", buf_size, lcn,
765     				buf_pos, need_writeback);
766     		while (lcn < buf_size && lcn + buf_pos < zone_end) {
767     			byte = buf + (lcn >> 3);
768     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): In inner "
769     					"while loop: buf_size = 0x%x, lcn = "
770     					"0x%x, buf_pos = 0x%x, need_writeback "
771     					"= %i, byte ofs = 0x%x, *byte = "
772     					"0x%x.\n", buf_size, lcn, buf_pos,
773     					need_writeback, lcn >> 3, *byte);
774     			/* Skip full bytes. */
775     			if (*byte == 0xff) {
776     				lcn += 8;
777     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
778     						"continuing while loop 1.\n");
779     				continue;
780     			}
781     			bit = 1 << (lcn & 7);
782     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): bit = %i.\n",
783     					bit);
784     			/* If the bit is already set, go onto the next one. */
785     			if (*byte & bit) {
786     				lcn++;
787     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
788     						"continuing while loop 2.\n");
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, __FUNCTION__ "(): *byte = "
796     					"0x%x, need_writeback = %i.\n", *byte,
797     					need_writeback);
798     			/* Reallocate memory if necessary. */
799     			if ((rlpos + 2) * sizeof(ntfs_runlist) >= rlsize) {
800     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
801     						"Reallocating space.\n");
802     				/* Setup first free bit return value. */
803     				if (!rl2) {
804     					*location = lcn + buf_pos;
805     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
806     							"(): *location = "
807     							"0x%x.\n", *location);
808     				}
809     				rlsize += PAGE_SIZE;
810     				rlt = ntfs_vmalloc(rlsize);
811     				if (!rlt) {
812     					err = -ENOMEM;
813     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
814     							"(): Failed to "
815     							"allocate memory, "
816     							"returning -ENOMEM, "
817     							"going to "
818     							"wb_err_ret.\n");
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, __FUNCTION__ "(): "
828     						"Reallocated memory, rlsize = "
829     						"0x%x.\n", rlsize);
830     			}
831     			/*
832     			 * Coalesce with previous run if adjacent LCNs.
833     			 * Otherwise, append a new run.
834     			 */
835     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Adding run "
836     					"(lcn 0x%x, len 0x%x), prev_lcn = "
837     					"0x%x, lcn = 0x%x, buf_pos = 0x%x, "
838     					"prev_run_len = 0x%x, rlpos = %i.\n",
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, __FUNCTION__ "(): "
843     						"Coalescing to run (lcn 0x%x, "
844     						"len 0x%x).\n",
845     						rl2[rlpos - 1].lcn,
846     						rl2[rlpos - 1].len);
847     				rl2[rlpos - 1].len = ++prev_run_len;
848     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
849     						"Run now (lcn 0x%x, len 0x%x), "
850     						"prev_run_len = 0x%x.\n",
851     						rl2[rlpos - 1].lcn,
852     						rl2[rlpos - 1].len,
853     						prev_run_len);
854     			} else {
855     				if (rlpos)
856     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
857     							"(): Adding new run, "
858     							"(previous run lcn "
859     							"0x%x, len 0x%x).\n",
860     							rl2[rlpos - 1].lcn,
861     							rl2[rlpos - 1].len);
862     				else
863     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
864     							"(): Adding new run, "
865     							"is first run.\n");
866     				rl2[rlpos].lcn = prev_lcn = lcn + buf_pos;
867     				rl2[rlpos].len = prev_run_len =
868     						(ntfs_cluster_t)1;
869     				
870     				rlpos++;
871     			}
872     			/* Done? */
873     			if (!--clusters) {
874     				ntfs_cluster_t tc;
875     				/*
876     				 * Update the current zone position. Positions
877     				 * of already scanned zones have been updated
878     				 * during the respective zone switches.
879     				 */
880     				tc = lcn + buf_pos + 1;
881     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
882     						"Done. Updating current zone "
883     						"position, tc = 0x%x, "
884     						"search_zone = %i.\n", tc,
885     						search_zone);
886     				switch (search_zone) {
887     				case 1:
888     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
889     							"(): Before checks, "
890     							"vol->mft_zone_pos = "
891     							"0x%x.\n",
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, __FUNCTION__
905     							"(): After checks, "
906     							"vol->mft_zone_pos = "
907     							"0x%x.\n",
908     							vol->mft_zone_pos);
909     					break;
910     				case 2:
911     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
912     							"(): Before checks, "
913     							"vol->data1_zone_pos = "
914     							"0x%x.\n",
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, __FUNCTION__
925     							"(): After checks, "
926     							"vol->data1_zone_pos = "
927     							"0x%x.\n",
928     							vol->data1_zone_pos);
929     					break;
930     				case 4:
931     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
932     							"(): Before checks, "
933     							"vol->data2_zone_pos = "
934     							"0x%x.\n",
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, __FUNCTION__
944     							"(): After checks, "
945     							"vol->data2_zone_pos = "
946     							"0x%x.\n",
947     							vol->data2_zone_pos);
948     					break;
949     				default:
950     					BUG();
951     				}
952     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
953     						"Going to done_ret.\n");
954     				goto done_ret;
955     			}
956     			lcn++;
957     		}
958     		buf_pos += buf_size;
959     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After inner while "
960     				"loop: buf_size = 0x%x, lcn = 0x%x, buf_pos = "
961     				"0x%x, need_writeback = %i.\n", buf_size, lcn,
962     				buf_pos, need_writeback);
963     		if (need_writeback) {
964     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing "
965     					"back.\n");
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(__FUNCTION__ "(): Bitmap writeback "
973     						"failed in read next buffer "
974     						"code path with error code "
975     						"%i.\n", -err);
976     				goto err_ret;
977     			}
978     		}
979     		if (buf_pos < zone_end) {
980     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing "
981     					"outer while loop, buf_pos = 0x%x, "
982     					"zone_end = 0x%x.\n", buf_pos,
983     					zone_end);
984     			continue;
985     		}
986     zone_pass_done:	/* Finished with the current zone pass. */
987     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At zone_pass_done, "
988     				"pass = %i.\n", 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, __FUNCTION__ "(): Continuing "
1014     					"outer while loop, pass = 2, "
1015     					"zone_start = 0x%x, zone_end = 0x%x, "
1016     					"buf_pos = 0x%x.\n");
1017     			continue;
1018     		} /* pass == 2 */
1019     done_zones_check:
1020     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_zones_check, "
1021     				"search_zone = %i, done_zones before = 0x%x, "
1022     				"done_zones after = 0x%x.\n",
1023     				search_zone, done_zones, done_zones |
1024     				search_zone);
1025     		done_zones |= search_zone;
1026     		if (done_zones < 7) {
1027     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Switching "
1028     					"zone.\n");
1029     			/* Now switch to the next zone we haven't done yet. */
1030     			pass = 1;
1031     			switch (search_zone) {
1032     			case 1:
1033     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
1034     						"Switching from mft zone to "
1035     						"data1 zone.\n");
1036     				/* Update mft zone position. */
1037     				if (rlpos) {
1038     					ntfs_cluster_t tc;
1039     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
1040     							"(): Before checks, "
1041     							"vol->mft_zone_pos = "
1042     							"0x%x.\n",
1043     							vol->mft_zone_pos);
1044     					tc = rl2[rlpos - 1].lcn +
1045     							rl2[rlpos - 1].len;
1046     					if (tc >= vol->mft_zone_end) {
1047     						vol->mft_zone_pos =
1048     								vol->mft_lcn;
1049     						if (!vol->mft_zone_end)
1050     							vol->mft_zone_pos =
1051     							     (ntfs_cluster_t)0;
1052     					} else if ((initial_location >=
1053     							vol->mft_zone_pos ||
1054     							tc > vol->mft_zone_pos)
1055     							&& tc >= vol->mft_lcn)
1056     						vol->mft_zone_pos = tc;
1057     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
1058     							"(): After checks, "
1059     							"vol->mft_zone_pos = "
1060     							"0x%x.\n",
1061     							vol->mft_zone_pos);
1062     				}
1063     				/* Switch from mft zone to data1 zone. */
1064     switch_to_data1_zone:		search_zone = 2;
1065     				zone_start = initial_location =
1066     						vol->data1_zone_pos;
1067     				zone_end = vol->nr_clusters;
1068     				if (zone_start == vol->mft_zone_end)
1069     					pass = 2;
1070     				if (zone_start >= zone_end) {
1071     					vol->data1_zone_pos = zone_start =
1072     							vol->mft_zone_end;
1073     					pass = 2;
1074     				}
1075     				break;
1076     			case 2:
1077     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
1078     						"Switching from data1 zone to "
1079     						"data2 zone.\n");
1080     				/* Update data1 zone position. */
1081     				if (rlpos) {
1082     					ntfs_cluster_t tc;
1083     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
1084     							"(): Before checks, "
1085     							"vol->data1_zone_pos = "
1086     							"0x%x.\n",
1087     							vol->data1_zone_pos);
1088     					tc = rl2[rlpos - 1].lcn +
1089     							rl2[rlpos - 1].len;
1090     					if (tc >= vol->nr_clusters)
1091     						vol->data1_zone_pos =
1092     							     vol->mft_zone_end;
1093     					else if ((initial_location >=
1094     						    vol->data1_zone_pos ||
1095     						    tc > vol->data1_zone_pos)
1096     						    && tc >= vol->mft_zone_end)
1097     						vol->data1_zone_pos = tc;
1098     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
1099     							"(): After checks, "
1100     							"vol->data1_zone_pos = "
1101     							"0x%x.\n",
1102     							vol->data1_zone_pos);
1103     				}
1104     				/* Switch from data1 zone to data2 zone. */
1105     				search_zone = 4;
1106     				zone_start = initial_location =
1107     						vol->data2_zone_pos;
1108     				zone_end = vol->mft_zone_start;
1109     				if (!zone_start)
1110     					pass = 2;
1111     				if (zone_start >= zone_end) {
1112     					vol->data2_zone_pos = zone_start =
1113     							initial_location =
1114     							(ntfs_cluster_t)0;
1115     					pass = 2;
1116     				}
1117     				break;
1118     			case 4:
1119     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
1120     						"Switching from data2 zone to "
1121     						"data1 zone.\n");
1122     				/* Update data2 zone position. */
1123     				if (rlpos) {
1124     					ntfs_cluster_t tc;
1125     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
1126     							"(): Before checks, "
1127     							"vol->data2_zone_pos = "
1128     							"0x%x.\n",
1129     							vol->data2_zone_pos);
1130     					tc = rl2[rlpos - 1].lcn +
1131     							rl2[rlpos - 1].len;
1132     					if (tc >= vol->mft_zone_start)
1133     						vol->data2_zone_pos =
1134     							     (ntfs_cluster_t)0;
1135     					else if (initial_location >=
1136     						      vol->data2_zone_pos ||
1137     						      tc > vol->data2_zone_pos)
1138     						vol->data2_zone_pos = tc;
1139     					ntfs_debug(DEBUG_OTHER, __FUNCTION__
1140     							"(): After checks, "
1141     							"vol->data2_zone_pos = "
1142     							"0x%x.\n",
1143     							vol->data2_zone_pos);
1144     				}
1145     				/* Switch from data2 zone to data1 zone. */
1146     				goto switch_to_data1_zone; /* See above. */
1147     			default:
1148     				BUG();
1149     			}
1150     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After zone "
1151     					"switch, search_zone = %i, pass = %i, "
1152     					"initial_location = 0x%x, zone_start "
1153     					"= 0x%x, zone_end = 0x%x.\n",
1154     					search_zone, pass, initial_location,
1155     					zone_start, zone_end);
1156     			buf_pos = zone_start;
1157     			if (zone_start == zone_end) {
1158     				ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): "
1159     						"Empty zone, going to "
1160     						"done_zones_check.\n");
1161     				/* Empty zone. Don't bother searching it. */
1162     				goto done_zones_check;
1163     			}
1164     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing "
1165     					"outer while loop.\n");
1166     			continue;
1167     		} /* done_zones == 7 */
1168     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): All zones are "
1169     				"finished.\n");
1170     		/*
1171     		 * All zones are finished! If DATA_ZONE, shrink mft zone. If
1172     		 * MFT_ZONE, we have really run out of space.
1173     		 */
1174     		mft_zone_size = vol->mft_zone_end - vol->mft_zone_start;
1175     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): vol->mft_zone_start "
1176     				"= 0x%x, vol->mft_zone_end = 0x%x, "
1177     				"mft_zone_size = 0x%x.\n", vol->mft_zone_start,
1178     				vol->mft_zone_end, mft_zone_size);
1179     		if (zone == MFT_ZONE || mft_zone_size <= (ntfs_cluster_t)0) {
1180     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): No free "
1181     					"clusters left, returning -ENOSPC, "
1182     					"going to fail_ret.\n");
1183     			/* Really no more space left on device. */
1184     			err = -ENOSPC;
1185     			goto fail_ret;
1186     		} /* zone == DATA_ZONE && mft_zone_size > 0 */
1187     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Shrinking mft "
1188     				"zone.\n");
1189     		zone_end = vol->mft_zone_end;
1190     		mft_zone_size >>= 1;
1191     		if (mft_zone_size > (ntfs_cluster_t)0)
1192     			vol->mft_zone_end = vol->mft_zone_start + mft_zone_size;
1193     		else /* mft zone and data2 zone no longer exist. */
1194     			vol->data2_zone_pos = vol->mft_zone_start =
1195     					vol->mft_zone_end = (ntfs_cluster_t)0;
1196     		if (vol->mft_zone_pos >= vol->mft_zone_end) {
1197     			vol->mft_zone_pos = vol->mft_lcn;
1198     			if (!vol->mft_zone_end)
1199     				vol->mft_zone_pos = (ntfs_cluster_t)0;
1200     		}
1201     		buf_pos = zone_start = initial_location =
1202     				vol->data1_zone_pos = vol->mft_zone_end;
1203     		search_zone = 2;
1204     		pass = 2;
1205     		done_zones &= ~2;
1206     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After shrinking mft "
1207     				"zone, mft_zone_size = 0x%x, "
1208     				"vol->mft_zone_start = 0x%x, vol->mft_zone_end "
1209     				"= 0x%x, vol->mft_zone_pos = 0x%x, search_zone "
1210     				"= 2, pass = 2, dones_zones = 0x%x, zone_start "
1211     				"= 0x%x, zone_end = 0x%x, vol->data1_zone_pos "
1212     				"= 0x%x, continuing outer while loop.\n",
1213     				mft_zone_size, vol->mft_zone_start,
1214     				vol->mft_zone_end, vol->mft_zone_pos,
1215     				search_zone, pass, done_zones, zone_start,
1216     				zone_end, vol->data1_zone_pos);
1217     	}
1218     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After outer while loop.\n");
1219     done_ret:
1220     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_ret.\n");
1221     	rl2[rlpos].lcn = (ntfs_cluster_t)-1;
1222     	rl2[rlpos].len = (ntfs_cluster_t)0;
1223     	*rl = rl2;
1224     	*rl_len = rlpos;
1225     	if (need_writeback) {
1226     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing back.\n");
1227     		need_writeback = 0;
1228     		io.param = buf;
1229     		io.do_read = 0;
1230     		err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos,
1231     				&io);
1232     		if (err) {
1233     			ntfs_error(__FUNCTION__ "(): Bitmap writeback failed "
1234     					"in done code path with error code "
1235     					"%i.\n", -err);
1236     			goto err_ret;
1237     		}
1238     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote 0x%Lx bytes.\n",
1239     				io.size);
1240     	}
1241     done_fail_ret:
1242     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_fail_ret (follows "
1243     			"done_ret).\n");
1244     	unlock_kernel();
1245     	free_page((unsigned long)buf);
1246     	if (err)
1247     		ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): Failed to allocate "
1248     				"clusters. Returning with error code %i.\n",
1249     				-err);
1250     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Syncing $Bitmap inode.\n");
1251     	if (ntfs_update_inode(vol->bitmap))
1252     		ntfs_error(__FUNCTION__ "(): Failed to sync inode $Bitmap. "
1253     				"Continuing anyway.\n");
1254     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning with code %i.\n",
1255     			err);
1256     	return err;
1257     fail_ret:
1258     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At fail_ret.\n");
1259     	if (rl2) {
1260     		if (err == -ENOSPC) {
1261     			/* Return first free lcn and count of free clusters. */
1262     			*location = rl2[0].lcn;
1263     			*count -= clusters;
1264     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): err = "
1265     					"-ENOSPC, *location = 0x%x, *count = "
1266     					"0x%x.\n", *location, *count);
1267     		}
1268     		/* Deallocate all allocated clusters. */
1269     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Deallocating "
1270     				"allocated clusters.\n");
1271     		ntfs_deallocate_clusters(vol, rl2, rlpos);
1272     		/* Free the runlist. */
1273     		ntfs_vfree(rl2);
1274     	} else {
1275     		if (err == -ENOSPC) {
1276     			/* Nothing free at all. */
1277     			*location = vol->data1_zone_pos; /* Irrelevant... */
1278     			*count = 0;
1279     			ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): No space "
1280     					"left at all, err = -ENOSPC, *location "
1281     					"= 0x%x, *count = 0.\n", *location);
1282     		}
1283     	}
1284     	*rl = NULL;
1285     	*rl_len = 0;
1286     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): *rl = NULL, *rl_len = 0, "
1287     			"going to done_fail_ret.\n");
1288     	goto done_fail_ret;
1289     wb_err_ret:
1290     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At wb_err_ret.\n");
1291     	if (need_writeback) {
1292     		int __err;
1293     		ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing back.\n");
1294     		io.param = buf;
1295     		io.do_read = 0;
1296     		__err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos,
1297     				&io);
1298     		if (__err)
1299     			ntfs_error(__FUNCTION__ "(): Bitmap writeback failed "
1300     					"in error code path with error code "
1301     					"%i.\n", -__err);
1302     		need_writeback = 0;
1303     	}
1304     err_ret:
1305     	ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At err_ret, *location = -1, "
1306     			"*count = 0, going to fail_ret.\n");
1307     	*location = -1;
1308     	*count = 0;
1309     	goto fail_ret;
1310     }
1311     
1312     /*
1313      * IMPORTANT: Caller has to hold big kernel lock or the race monster will come
1314      * to get you! (-;
1315      * TODO: Need our own lock for bitmap accesses but BKL is more secure for now,
1316      * considering we might not have covered all places with a lock yet. In that
1317      * case the BKL offers a one way exclusion which is better than no exclusion
1318      * at all... (AIA)
1319      */
1320     static int ntfs_clear_bitrange(ntfs_inode *bitmap,
1321     		const ntfs_cluster_t start_bit, const ntfs_cluster_t count)
1322     {
1323     	ntfs_cluster_t buf_size, bit, nr_bits = count;
1324     	unsigned char *buf, *byte;
1325     	int err;
1326     	ntfs_io io;
1327     
1328     	io.fn_put = ntfs_put;
1329     	io.fn_get = ntfs_get;
1330     	/* Calculate the required buffer size in bytes. */
1331     	buf_size = (ntfs_cluster_t)((start_bit & 7) + nr_bits + 7) >> 3;
1332     	if (buf_size <= (ntfs_cluster_t)(64 * 1024))
1333     		buf = ntfs_malloc(buf_size);
1334     	else
1335     		buf = ntfs_vmalloc(buf_size);
1336     	if (!buf)
1337     		return -ENOMEM;
1338     	/* Read the bitmap from the data attribute. */
1339     	io.param = byte = buf;
1340     	io.size = buf_size;
1341     	err = ntfs_read_attr(bitmap, bitmap->vol->at_data, 0, start_bit >> 3,
1342     			&io);
1343     	if (err || io.size != buf_size)
1344     		goto err_out;
1345     	/* Now clear the bits in the read bitmap. */
1346     	bit = start_bit & 7;
1347     	while (bit && nr_bits) { /* Process first partial byte, if present. */
1348     		*byte &= ~(1 << bit++);
1349     		nr_bits--;
1350     		bit &= 7;
1351     		if (!bit)
1352     			byte++;
1353     	}
1354     	while (nr_bits >= 8) { /* Process full bytes. */
1355     		*byte = 0;
1356     		nr_bits -= 8;
1357     		byte++;
1358     	}
1359     	bit = 0;
1360     	while (nr_bits) { /* Process last partial byte, if present. */
1361     		*byte &= ~(1 << bit);
1362     		nr_bits--;
1363     		bit++;
1364     	}
1365     	/* Write the modified bitmap back to disk. */
1366     	io.param = buf;
1367     	io.size = buf_size;
1368     	err = ntfs_write_attr(bitmap, bitmap->vol->at_data, 0, start_bit >> 3,
1369     			&io);
1370     err_out:
1371     	if (buf_size <= (ntfs_cluster_t)(64 * 1024))
1372     		ntfs_free(buf);
1373     	else
1374     		ntfs_vfree(buf);
1375     	if (!err && io.size != buf_size)
1376     		err = -EIO;
1377     	return err;
1378     }
1379     
1380     /*
1381      * See comments for lack of zone adjustments below in the description of the
1382      * function ntfs_deallocate_clusters().
1383      */
1384     int ntfs_deallocate_cluster_run(const ntfs_volume *vol,
1385     		const ntfs_cluster_t lcn, const ntfs_cluster_t len)
1386     {
1387     	int err;
1388     
1389     	lock_kernel();
1390     	err = ntfs_clear_bitrange(vol->bitmap, lcn, len);
1391     	unlock_kernel();
1392     	return err;
1393     }
1394     
1395     /*
1396      * This is inefficient, but logically trivial, so will do for now. Note, we
1397      * do not touch the mft nor the data zones here because we want to minimize
1398      * recycling of clusters to enhance the chances of data being undeleteable.
1399      * Also we don't want the overhead. Instead we do one additional sweep of the
1400      * current data zone during cluster allocation to check for freed clusters.
1401      */
1402     int ntfs_deallocate_clusters(const ntfs_volume *vol, const ntfs_runlist *rl,
1403     		const int rl_len)
1404     {
1405     	int i, err;
1406     
1407     	lock_kernel();
1408     	for (i = err = 0; i < rl_len && !err; i++)
1409     		err = ntfs_clear_bitrange(vol->bitmap, rl[i].lcn, rl[i].len);
1410     	unlock_kernel();
1411     	return err;
1412     }
1413     
1414