1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <linux/buffer_head.h>
23#include <linux/fs.h>
24#include <linux/mm.h>
25#include <linux/mount.h>
26#include <linux/mutex.h>
27#include <linux/pagemap.h>
28#include <linux/quotaops.h>
29#include <linux/slab.h>
30
31#include "aops.h"
32#include "attrib.h"
33#include "bitmap.h"
34#include "dir.h"
35#include "debug.h"
36#include "inode.h"
37#include "lcnalloc.h"
38#include "malloc.h"
39#include "mft.h"
40#include "time.h"
41#include "ntfs.h"
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59int ntfs_test_inode(struct inode *vi, ntfs_attr *na)
60{
61 ntfs_inode *ni;
62
63 if (vi->i_ino != na->mft_no)
64 return 0;
65 ni = NTFS_I(vi);
66
67 if (likely(!NInoAttr(ni))) {
68
69 if (unlikely(na->type != AT_UNUSED))
70 return 0;
71 } else {
72
73 if (ni->type != na->type)
74 return 0;
75 if (ni->name_len != na->name_len)
76 return 0;
77 if (na->name_len && memcmp(ni->name, na->name,
78 na->name_len * sizeof(ntfschar)))
79 return 0;
80 }
81
82 return 1;
83}
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103static int ntfs_init_locked_inode(struct inode *vi, ntfs_attr *na)
104{
105 ntfs_inode *ni = NTFS_I(vi);
106
107 vi->i_ino = na->mft_no;
108
109 ni->type = na->type;
110 if (na->type == AT_INDEX_ALLOCATION)
111 NInoSetMstProtected(ni);
112
113 ni->name = na->name;
114 ni->name_len = na->name_len;
115
116
117 if (likely(na->type == AT_UNUSED)) {
118 BUG_ON(na->name);
119 BUG_ON(na->name_len);
120 return 0;
121 }
122
123
124 NInoSetAttr(ni);
125
126
127
128
129
130
131
132
133 if (na->name_len && na->name != I30) {
134 unsigned int i;
135
136 BUG_ON(!na->name);
137 i = na->name_len * sizeof(ntfschar);
138 ni->name = kmalloc(i + sizeof(ntfschar), GFP_ATOMIC);
139 if (!ni->name)
140 return -ENOMEM;
141 memcpy(ni->name, na->name, i);
142 ni->name[na->name_len] = 0;
143 }
144 return 0;
145}
146
147typedef int (*set_t)(struct inode *, void *);
148static int ntfs_read_locked_inode(struct inode *vi);
149static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi);
150static int ntfs_read_locked_index_inode(struct inode *base_vi,
151 struct inode *vi);
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no)
170{
171 struct inode *vi;
172 int err;
173 ntfs_attr na;
174
175 na.mft_no = mft_no;
176 na.type = AT_UNUSED;
177 na.name = NULL;
178 na.name_len = 0;
179
180 vi = iget5_locked(sb, mft_no, (test_t)ntfs_test_inode,
181 (set_t)ntfs_init_locked_inode, &na);
182 if (unlikely(!vi))
183 return ERR_PTR(-ENOMEM);
184
185 err = 0;
186
187
188 if (vi->i_state & I_NEW) {
189 err = ntfs_read_locked_inode(vi);
190 unlock_new_inode(vi);
191 }
192
193
194
195
196 if (unlikely(err == -ENOMEM)) {
197 iput(vi);
198 vi = ERR_PTR(err);
199 }
200 return vi;
201}
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type,
227 ntfschar *name, u32 name_len)
228{
229 struct inode *vi;
230 int err;
231 ntfs_attr na;
232
233
234 BUG_ON(type == AT_INDEX_ALLOCATION);
235
236 na.mft_no = base_vi->i_ino;
237 na.type = type;
238 na.name = name;
239 na.name_len = name_len;
240
241 vi = iget5_locked(base_vi->i_sb, na.mft_no, (test_t)ntfs_test_inode,
242 (set_t)ntfs_init_locked_inode, &na);
243 if (unlikely(!vi))
244 return ERR_PTR(-ENOMEM);
245
246 err = 0;
247
248
249 if (vi->i_state & I_NEW) {
250 err = ntfs_read_locked_attr_inode(base_vi, vi);
251 unlock_new_inode(vi);
252 }
253
254
255
256
257
258 if (unlikely(err)) {
259 iput(vi);
260 vi = ERR_PTR(err);
261 }
262 return vi;
263}
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name,
285 u32 name_len)
286{
287 struct inode *vi;
288 int err;
289 ntfs_attr na;
290
291 na.mft_no = base_vi->i_ino;
292 na.type = AT_INDEX_ALLOCATION;
293 na.name = name;
294 na.name_len = name_len;
295
296 vi = iget5_locked(base_vi->i_sb, na.mft_no, (test_t)ntfs_test_inode,
297 (set_t)ntfs_init_locked_inode, &na);
298 if (unlikely(!vi))
299 return ERR_PTR(-ENOMEM);
300
301 err = 0;
302
303
304 if (vi->i_state & I_NEW) {
305 err = ntfs_read_locked_index_inode(base_vi, vi);
306 unlock_new_inode(vi);
307 }
308
309
310
311
312
313 if (unlikely(err)) {
314 iput(vi);
315 vi = ERR_PTR(err);
316 }
317 return vi;
318}
319
320struct inode *ntfs_alloc_big_inode(struct super_block *sb)
321{
322 ntfs_inode *ni;
323
324 ntfs_debug("Entering.");
325 ni = kmem_cache_alloc(ntfs_big_inode_cache, GFP_NOFS);
326 if (likely(ni != NULL)) {
327 ni->state = 0;
328 return VFS_I(ni);
329 }
330 ntfs_error(sb, "Allocation of NTFS big inode structure failed.");
331 return NULL;
332}
333
334void ntfs_destroy_big_inode(struct inode *inode)
335{
336 ntfs_inode *ni = NTFS_I(inode);
337
338 ntfs_debug("Entering.");
339 BUG_ON(ni->page);
340 if (!atomic_dec_and_test(&ni->count))
341 BUG();
342 kmem_cache_free(ntfs_big_inode_cache, NTFS_I(inode));
343}
344
345static inline ntfs_inode *ntfs_alloc_extent_inode(void)
346{
347 ntfs_inode *ni;
348
349 ntfs_debug("Entering.");
350 ni = kmem_cache_alloc(ntfs_inode_cache, GFP_NOFS);
351 if (likely(ni != NULL)) {
352 ni->state = 0;
353 return ni;
354 }
355 ntfs_error(NULL, "Allocation of NTFS inode structure failed.");
356 return NULL;
357}
358
359static void ntfs_destroy_extent_inode(ntfs_inode *ni)
360{
361 ntfs_debug("Entering.");
362 BUG_ON(ni->page);
363 if (!atomic_dec_and_test(&ni->count))
364 BUG();
365 kmem_cache_free(ntfs_inode_cache, ni);
366}
367
368
369
370
371
372static struct lock_class_key attr_list_rl_lock_class;
373
374
375
376
377
378
379
380
381
382
383
384
385
386void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni)
387{
388 ntfs_debug("Entering.");
389 rwlock_init(&ni->size_lock);
390 ni->initialized_size = ni->allocated_size = 0;
391 ni->seq_no = 0;
392 atomic_set(&ni->count, 1);
393 ni->vol = NTFS_SB(sb);
394 ntfs_init_runlist(&ni->runlist);
395 mutex_init(&ni->mrec_lock);
396 ni->page = NULL;
397 ni->page_ofs = 0;
398 ni->attr_list_size = 0;
399 ni->attr_list = NULL;
400 ntfs_init_runlist(&ni->attr_list_rl);
401 lockdep_set_class(&ni->attr_list_rl.lock,
402 &attr_list_rl_lock_class);
403 ni->itype.index.block_size = 0;
404 ni->itype.index.vcn_size = 0;
405 ni->itype.index.collation_rule = 0;
406 ni->itype.index.block_size_bits = 0;
407 ni->itype.index.vcn_size_bits = 0;
408 mutex_init(&ni->extent_lock);
409 ni->nr_extents = 0;
410 ni->ext.base_ntfs_ino = NULL;
411}
412
413
414
415
416
417
418static struct lock_class_key extent_inode_mrec_lock_key;
419
420inline ntfs_inode *ntfs_new_extent_inode(struct super_block *sb,
421 unsigned long mft_no)
422{
423 ntfs_inode *ni = ntfs_alloc_extent_inode();
424
425 ntfs_debug("Entering.");
426 if (likely(ni != NULL)) {
427 __ntfs_init_inode(sb, ni);
428 lockdep_set_class(&ni->mrec_lock, &extent_inode_mrec_lock_key);
429 ni->mft_no = mft_no;
430 ni->type = AT_UNUSED;
431 ni->name = NULL;
432 ni->name_len = 0;
433 }
434 return ni;
435}
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450static int ntfs_is_extended_system_file(ntfs_attr_search_ctx *ctx)
451{
452 int nr_links, err;
453
454
455 ntfs_attr_reinit_search_ctx(ctx);
456
457
458 nr_links = le16_to_cpu(ctx->mrec->link_count);
459
460
461 while (!(err = ntfs_attr_lookup(AT_FILE_NAME, NULL, 0, 0, 0, NULL, 0,
462 ctx))) {
463 FILE_NAME_ATTR *file_name_attr;
464 ATTR_RECORD *attr = ctx->attr;
465 u8 *p, *p2;
466
467 nr_links--;
468
469
470
471
472 p = (u8*)attr + le32_to_cpu(attr->length);
473 if (p < (u8*)ctx->mrec || (u8*)p > (u8*)ctx->mrec +
474 le32_to_cpu(ctx->mrec->bytes_in_use)) {
475err_corrupt_attr:
476 ntfs_error(ctx->ntfs_ino->vol->sb, "Corrupt file name "
477 "attribute. You should run chkdsk.");
478 return -EIO;
479 }
480 if (attr->non_resident) {
481 ntfs_error(ctx->ntfs_ino->vol->sb, "Non-resident file "
482 "name. You should run chkdsk.");
483 return -EIO;
484 }
485 if (attr->flags) {
486 ntfs_error(ctx->ntfs_ino->vol->sb, "File name with "
487 "invalid flags. You should run "
488 "chkdsk.");
489 return -EIO;
490 }
491 if (!(attr->data.resident.flags & RESIDENT_ATTR_IS_INDEXED)) {
492 ntfs_error(ctx->ntfs_ino->vol->sb, "Unindexed file "
493 "name. You should run chkdsk.");
494 return -EIO;
495 }
496 file_name_attr = (FILE_NAME_ATTR*)((u8*)attr +
497 le16_to_cpu(attr->data.resident.value_offset));
498 p2 = (u8*)attr + le32_to_cpu(attr->data.resident.value_length);
499 if (p2 < (u8*)attr || p2 > p)
500 goto err_corrupt_attr;
501
502 if (MREF_LE(file_name_attr->parent_directory) == FILE_Extend)
503 return 1;
504 }
505 if (unlikely(err != -ENOENT))
506 return err;
507 if (unlikely(nr_links)) {
508 ntfs_error(ctx->ntfs_ino->vol->sb, "Inode hard link count "
509 "doesn't match number of name attributes. You "
510 "should run chkdsk.");
511 return -EIO;
512 }
513 return 0;
514}
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542static int ntfs_read_locked_inode(struct inode *vi)
543{
544 ntfs_volume *vol = NTFS_SB(vi->i_sb);
545 ntfs_inode *ni;
546 struct inode *bvi;
547 MFT_RECORD *m;
548 ATTR_RECORD *a;
549 STANDARD_INFORMATION *si;
550 ntfs_attr_search_ctx *ctx;
551 int err = 0;
552
553 ntfs_debug("Entering for i_ino 0x%lx.", vi->i_ino);
554
555
556
557
558
559
560
561 vi->i_version = 1;
562
563 vi->i_uid = vol->uid;
564 vi->i_gid = vol->gid;
565 vi->i_mode = 0;
566
567
568
569
570
571 if (vi->i_ino != FILE_MFT)
572 ntfs_init_big_inode(vi);
573 ni = NTFS_I(vi);
574
575 m = map_mft_record(ni);
576 if (IS_ERR(m)) {
577 err = PTR_ERR(m);
578 goto err_out;
579 }
580 ctx = ntfs_attr_get_search_ctx(ni, m);
581 if (!ctx) {
582 err = -ENOMEM;
583 goto unm_err_out;
584 }
585
586 if (!(m->flags & MFT_RECORD_IN_USE)) {
587 ntfs_error(vi->i_sb, "Inode is not in use!");
588 goto unm_err_out;
589 }
590 if (m->base_mft_record) {
591 ntfs_error(vi->i_sb, "Inode is an extent inode!");
592 goto unm_err_out;
593 }
594
595
596 vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number);
597
598
599
600
601
602
603
604
605
606
607 vi->i_nlink = le16_to_cpu(m->link_count);
608
609
610
611
612
613
614
615
616 vi->i_mode |= S_IRWXUGO;
617
618 if (IS_RDONLY(vi))
619 vi->i_mode &= ~S_IWUGO;
620 if (m->flags & MFT_RECORD_IS_DIRECTORY) {
621 vi->i_mode |= S_IFDIR;
622
623
624
625
626 vi->i_mode &= ~vol->dmask;
627
628 if (vi->i_nlink > 1)
629 vi->i_nlink = 1;
630 } else {
631 vi->i_mode |= S_IFREG;
632
633 vi->i_mode &= ~vol->fmask;
634 }
635
636
637
638
639
640
641 err = ntfs_attr_lookup(AT_STANDARD_INFORMATION, NULL, 0, 0, 0, NULL, 0,
642 ctx);
643 if (unlikely(err)) {
644 if (err == -ENOENT) {
645
646
647
648
649
650 ntfs_error(vi->i_sb, "$STANDARD_INFORMATION attribute "
651 "is missing.");
652 }
653 goto unm_err_out;
654 }
655 a = ctx->attr;
656
657 si = (STANDARD_INFORMATION*)((u8*)a +
658 le16_to_cpu(a->data.resident.value_offset));
659
660
661
662
663
664
665
666
667
668
669
670 vi->i_mtime = ntfs2utc(si->last_data_change_time);
671
672
673
674
675
676 vi->i_ctime = ntfs2utc(si->last_mft_change_time);
677
678
679
680
681 vi->i_atime = ntfs2utc(si->last_access_time);
682
683
684 ntfs_attr_reinit_search_ctx(ctx);
685 err = ntfs_attr_lookup(AT_ATTRIBUTE_LIST, NULL, 0, 0, 0, NULL, 0, ctx);
686 if (err) {
687 if (unlikely(err != -ENOENT)) {
688 ntfs_error(vi->i_sb, "Failed to lookup attribute list "
689 "attribute.");
690 goto unm_err_out;
691 }
692 } else {
693 if (vi->i_ino == FILE_MFT)
694 goto skip_attr_list_load;
695 ntfs_debug("Attribute list found in inode 0x%lx.", vi->i_ino);
696 NInoSetAttrList(ni);
697 a = ctx->attr;
698 if (a->flags & ATTR_COMPRESSION_MASK) {
699 ntfs_error(vi->i_sb, "Attribute list attribute is "
700 "compressed.");
701 goto unm_err_out;
702 }
703 if (a->flags & ATTR_IS_ENCRYPTED ||
704 a->flags & ATTR_IS_SPARSE) {
705 if (a->non_resident) {
706 ntfs_error(vi->i_sb, "Non-resident attribute "
707 "list attribute is encrypted/"
708 "sparse.");
709 goto unm_err_out;
710 }
711 ntfs_warning(vi->i_sb, "Resident attribute list "
712 "attribute in inode 0x%lx is marked "
713 "encrypted/sparse which is not true. "
714 "However, Windows allows this and "
715 "chkdsk does not detect or correct it "
716 "so we will just ignore the invalid "
717 "flags and pretend they are not set.",
718 vi->i_ino);
719 }
720
721 ni->attr_list_size = (u32)ntfs_attr_size(a);
722 ni->attr_list = ntfs_malloc_nofs(ni->attr_list_size);
723 if (!ni->attr_list) {
724 ntfs_error(vi->i_sb, "Not enough memory to allocate "
725 "buffer for attribute list.");
726 err = -ENOMEM;
727 goto unm_err_out;
728 }
729 if (a->non_resident) {
730 NInoSetAttrListNonResident(ni);
731 if (a->data.non_resident.lowest_vcn) {
732 ntfs_error(vi->i_sb, "Attribute list has non "
733 "zero lowest_vcn.");
734 goto unm_err_out;
735 }
736
737
738
739
740 ni->attr_list_rl.rl = ntfs_mapping_pairs_decompress(vol,
741 a, NULL);
742 if (IS_ERR(ni->attr_list_rl.rl)) {
743 err = PTR_ERR(ni->attr_list_rl.rl);
744 ni->attr_list_rl.rl = NULL;
745 ntfs_error(vi->i_sb, "Mapping pairs "
746 "decompression failed.");
747 goto unm_err_out;
748 }
749
750 if ((err = load_attribute_list(vol, &ni->attr_list_rl,
751 ni->attr_list, ni->attr_list_size,
752 sle64_to_cpu(a->data.non_resident.
753 initialized_size)))) {
754 ntfs_error(vi->i_sb, "Failed to load "
755 "attribute list attribute.");
756 goto unm_err_out;
757 }
758 } else {
759 if ((u8*)a + le16_to_cpu(a->data.resident.value_offset)
760 + le32_to_cpu(
761 a->data.resident.value_length) >
762 (u8*)ctx->mrec + vol->mft_record_size) {
763 ntfs_error(vi->i_sb, "Corrupt attribute list "
764 "in inode.");
765 goto unm_err_out;
766 }
767
768 memcpy(ni->attr_list, (u8*)a + le16_to_cpu(
769 a->data.resident.value_offset),
770 le32_to_cpu(
771 a->data.resident.value_length));
772 }
773 }
774skip_attr_list_load:
775
776
777
778
779 if (S_ISDIR(vi->i_mode)) {
780 loff_t bvi_size;
781 ntfs_inode *bni;
782 INDEX_ROOT *ir;
783 u8 *ir_end, *index_end;
784
785
786 ntfs_attr_reinit_search_ctx(ctx);
787 err = ntfs_attr_lookup(AT_INDEX_ROOT, I30, 4, CASE_SENSITIVE,
788 0, NULL, 0, ctx);
789 if (unlikely(err)) {
790 if (err == -ENOENT) {
791
792
793
794 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute "
795 "is missing.");
796 }
797 goto unm_err_out;
798 }
799 a = ctx->attr;
800
801 if (unlikely(a->non_resident)) {
802 ntfs_error(vol->sb, "$INDEX_ROOT attribute is not "
803 "resident.");
804 goto unm_err_out;
805 }
806
807 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
808 le16_to_cpu(a->data.resident.value_offset)))) {
809 ntfs_error(vol->sb, "$INDEX_ROOT attribute name is "
810 "placed after the attribute value.");
811 goto unm_err_out;
812 }
813
814
815
816
817
818
819 if (a->flags & ATTR_COMPRESSION_MASK)
820 NInoSetCompressed(ni);
821 if (a->flags & ATTR_IS_ENCRYPTED) {
822 if (a->flags & ATTR_COMPRESSION_MASK) {
823 ntfs_error(vi->i_sb, "Found encrypted and "
824 "compressed attribute.");
825 goto unm_err_out;
826 }
827 NInoSetEncrypted(ni);
828 }
829 if (a->flags & ATTR_IS_SPARSE)
830 NInoSetSparse(ni);
831 ir = (INDEX_ROOT*)((u8*)a +
832 le16_to_cpu(a->data.resident.value_offset));
833 ir_end = (u8*)ir + le32_to_cpu(a->data.resident.value_length);
834 if (ir_end > (u8*)ctx->mrec + vol->mft_record_size) {
835 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is "
836 "corrupt.");
837 goto unm_err_out;
838 }
839 index_end = (u8*)&ir->index +
840 le32_to_cpu(ir->index.index_length);
841 if (index_end > ir_end) {
842 ntfs_error(vi->i_sb, "Directory index is corrupt.");
843 goto unm_err_out;
844 }
845 if (ir->type != AT_FILE_NAME) {
846 ntfs_error(vi->i_sb, "Indexed attribute is not "
847 "$FILE_NAME.");
848 goto unm_err_out;
849 }
850 if (ir->collation_rule != COLLATION_FILE_NAME) {
851 ntfs_error(vi->i_sb, "Index collation rule is not "
852 "COLLATION_FILE_NAME.");
853 goto unm_err_out;
854 }
855 ni->itype.index.collation_rule = ir->collation_rule;
856 ni->itype.index.block_size = le32_to_cpu(ir->index_block_size);
857 if (ni->itype.index.block_size &
858 (ni->itype.index.block_size - 1)) {
859 ntfs_error(vi->i_sb, "Index block size (%u) is not a "
860 "power of two.",
861 ni->itype.index.block_size);
862 goto unm_err_out;
863 }
864 if (ni->itype.index.block_size > PAGE_CACHE_SIZE) {
865 ntfs_error(vi->i_sb, "Index block size (%u) > "
866 "PAGE_CACHE_SIZE (%ld) is not "
867 "supported. Sorry.",
868 ni->itype.index.block_size,
869 PAGE_CACHE_SIZE);
870 err = -EOPNOTSUPP;
871 goto unm_err_out;
872 }
873 if (ni->itype.index.block_size < NTFS_BLOCK_SIZE) {
874 ntfs_error(vi->i_sb, "Index block size (%u) < "
875 "NTFS_BLOCK_SIZE (%i) is not "
876 "supported. Sorry.",
877 ni->itype.index.block_size,
878 NTFS_BLOCK_SIZE);
879 err = -EOPNOTSUPP;
880 goto unm_err_out;
881 }
882 ni->itype.index.block_size_bits =
883 ffs(ni->itype.index.block_size) - 1;
884
885 if (vol->cluster_size <= ni->itype.index.block_size) {
886 ni->itype.index.vcn_size = vol->cluster_size;
887 ni->itype.index.vcn_size_bits = vol->cluster_size_bits;
888 } else {
889 ni->itype.index.vcn_size = vol->sector_size;
890 ni->itype.index.vcn_size_bits = vol->sector_size_bits;
891 }
892
893
894 NInoSetMstProtected(ni);
895 ni->type = AT_INDEX_ALLOCATION;
896 ni->name = I30;
897 ni->name_len = 4;
898
899 if (!(ir->index.flags & LARGE_INDEX)) {
900
901 vi->i_size = ni->initialized_size =
902 ni->allocated_size = 0;
903
904 ntfs_attr_put_search_ctx(ctx);
905 unmap_mft_record(ni);
906 m = NULL;
907 ctx = NULL;
908 goto skip_large_dir_stuff;
909 }
910 NInoSetIndexAllocPresent(ni);
911
912 ntfs_attr_reinit_search_ctx(ctx);
913 err = ntfs_attr_lookup(AT_INDEX_ALLOCATION, I30, 4,
914 CASE_SENSITIVE, 0, NULL, 0, ctx);
915 if (unlikely(err)) {
916 if (err == -ENOENT)
917 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION "
918 "attribute is not present but "
919 "$INDEX_ROOT indicated it is.");
920 else
921 ntfs_error(vi->i_sb, "Failed to lookup "
922 "$INDEX_ALLOCATION "
923 "attribute.");
924 goto unm_err_out;
925 }
926 a = ctx->attr;
927 if (!a->non_resident) {
928 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
929 "is resident.");
930 goto unm_err_out;
931 }
932
933
934
935
936 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
937 le16_to_cpu(
938 a->data.non_resident.mapping_pairs_offset)))) {
939 ntfs_error(vol->sb, "$INDEX_ALLOCATION attribute name "
940 "is placed after the mapping pairs "
941 "array.");
942 goto unm_err_out;
943 }
944 if (a->flags & ATTR_IS_ENCRYPTED) {
945 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
946 "is encrypted.");
947 goto unm_err_out;
948 }
949 if (a->flags & ATTR_IS_SPARSE) {
950 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
951 "is sparse.");
952 goto unm_err_out;
953 }
954 if (a->flags & ATTR_COMPRESSION_MASK) {
955 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
956 "is compressed.");
957 goto unm_err_out;
958 }
959 if (a->data.non_resident.lowest_vcn) {
960 ntfs_error(vi->i_sb, "First extent of "
961 "$INDEX_ALLOCATION attribute has non "
962 "zero lowest_vcn.");
963 goto unm_err_out;
964 }
965 vi->i_size = sle64_to_cpu(a->data.non_resident.data_size);
966 ni->initialized_size = sle64_to_cpu(
967 a->data.non_resident.initialized_size);
968 ni->allocated_size = sle64_to_cpu(
969 a->data.non_resident.allocated_size);
970
971
972
973
974 ntfs_attr_put_search_ctx(ctx);
975 unmap_mft_record(ni);
976 m = NULL;
977 ctx = NULL;
978
979 bvi = ntfs_attr_iget(vi, AT_BITMAP, I30, 4);
980 if (IS_ERR(bvi)) {
981 ntfs_error(vi->i_sb, "Failed to get bitmap attribute.");
982 err = PTR_ERR(bvi);
983 goto unm_err_out;
984 }
985 bni = NTFS_I(bvi);
986 if (NInoCompressed(bni) || NInoEncrypted(bni) ||
987 NInoSparse(bni)) {
988 ntfs_error(vi->i_sb, "$BITMAP attribute is compressed "
989 "and/or encrypted and/or sparse.");
990 goto iput_unm_err_out;
991 }
992
993 bvi_size = i_size_read(bvi);
994 if ((bvi_size << 3) < (vi->i_size >>
995 ni->itype.index.block_size_bits)) {
996 ntfs_error(vi->i_sb, "Index bitmap too small (0x%llx) "
997 "for index allocation (0x%llx).",
998 bvi_size << 3, vi->i_size);
999 goto iput_unm_err_out;
1000 }
1001
1002 iput(bvi);
1003skip_large_dir_stuff:
1004
1005 vi->i_op = &ntfs_dir_inode_ops;
1006 vi->i_fop = &ntfs_dir_ops;
1007 } else {
1008
1009 ntfs_attr_reinit_search_ctx(ctx);
1010
1011
1012 ni->type = AT_DATA;
1013 ni->name = NULL;
1014 ni->name_len = 0;
1015
1016
1017 err = ntfs_attr_lookup(AT_DATA, NULL, 0, 0, 0, NULL, 0, ctx);
1018 if (unlikely(err)) {
1019 vi->i_size = ni->initialized_size =
1020 ni->allocated_size = 0;
1021 if (err != -ENOENT) {
1022 ntfs_error(vi->i_sb, "Failed to lookup $DATA "
1023 "attribute.");
1024 goto unm_err_out;
1025 }
1026
1027
1028
1029
1030 if (vi->i_ino == FILE_Secure)
1031 goto no_data_attr_special_case;
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041 if (ntfs_is_extended_system_file(ctx) > 0)
1042 goto no_data_attr_special_case;
1043
1044
1045 ntfs_error(vi->i_sb, "$DATA attribute is missing.");
1046 goto unm_err_out;
1047 }
1048 a = ctx->attr;
1049
1050 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) {
1051 if (a->flags & ATTR_COMPRESSION_MASK) {
1052 NInoSetCompressed(ni);
1053 if (vol->cluster_size > 4096) {
1054 ntfs_error(vi->i_sb, "Found "
1055 "compressed data but "
1056 "compression is "
1057 "disabled due to "
1058 "cluster size (%i) > "
1059 "4kiB.",
1060 vol->cluster_size);
1061 goto unm_err_out;
1062 }
1063 if ((a->flags & ATTR_COMPRESSION_MASK)
1064 != ATTR_IS_COMPRESSED) {
1065 ntfs_error(vi->i_sb, "Found unknown "
1066 "compression method "
1067 "or corrupt file.");
1068 goto unm_err_out;
1069 }
1070 }
1071 if (a->flags & ATTR_IS_SPARSE)
1072 NInoSetSparse(ni);
1073 }
1074 if (a->flags & ATTR_IS_ENCRYPTED) {
1075 if (NInoCompressed(ni)) {
1076 ntfs_error(vi->i_sb, "Found encrypted and "
1077 "compressed data.");
1078 goto unm_err_out;
1079 }
1080 NInoSetEncrypted(ni);
1081 }
1082 if (a->non_resident) {
1083 NInoSetNonResident(ni);
1084 if (NInoCompressed(ni) || NInoSparse(ni)) {
1085 if (NInoCompressed(ni) && a->data.non_resident.
1086 compression_unit != 4) {
1087 ntfs_error(vi->i_sb, "Found "
1088 "non-standard "
1089 "compression unit (%u "
1090 "instead of 4). "
1091 "Cannot handle this.",
1092 a->data.non_resident.
1093 compression_unit);
1094 err = -EOPNOTSUPP;
1095 goto unm_err_out;
1096 }
1097 if (a->data.non_resident.compression_unit) {
1098 ni->itype.compressed.block_size = 1U <<
1099 (a->data.non_resident.
1100 compression_unit +
1101 vol->cluster_size_bits);
1102 ni->itype.compressed.block_size_bits =
1103 ffs(ni->itype.
1104 compressed.
1105 block_size) - 1;
1106 ni->itype.compressed.block_clusters =
1107 1U << a->data.
1108 non_resident.
1109 compression_unit;
1110 } else {
1111 ni->itype.compressed.block_size = 0;
1112 ni->itype.compressed.block_size_bits =
1113 0;
1114 ni->itype.compressed.block_clusters =
1115 0;
1116 }
1117 ni->itype.compressed.size = sle64_to_cpu(
1118 a->data.non_resident.
1119 compressed_size);
1120 }
1121 if (a->data.non_resident.lowest_vcn) {
1122 ntfs_error(vi->i_sb, "First extent of $DATA "
1123 "attribute has non zero "
1124 "lowest_vcn.");
1125 goto unm_err_out;
1126 }
1127 vi->i_size = sle64_to_cpu(
1128 a->data.non_resident.data_size);
1129 ni->initialized_size = sle64_to_cpu(
1130 a->data.non_resident.initialized_size);
1131 ni->allocated_size = sle64_to_cpu(
1132 a->data.non_resident.allocated_size);
1133 } else {
1134 vi->i_size = ni->initialized_size = le32_to_cpu(
1135 a->data.resident.value_length);
1136 ni->allocated_size = le32_to_cpu(a->length) -
1137 le16_to_cpu(
1138 a->data.resident.value_offset);
1139 if (vi->i_size > ni->allocated_size) {
1140 ntfs_error(vi->i_sb, "Resident data attribute "
1141 "is corrupt (size exceeds "
1142 "allocation).");
1143 goto unm_err_out;
1144 }
1145 }
1146no_data_attr_special_case:
1147
1148 ntfs_attr_put_search_ctx(ctx);
1149 unmap_mft_record(ni);
1150 m = NULL;
1151 ctx = NULL;
1152
1153 vi->i_op = &ntfs_file_inode_ops;
1154 vi->i_fop = &ntfs_file_ops;
1155 }
1156 if (NInoMstProtected(ni))
1157 vi->i_mapping->a_ops = &ntfs_mst_aops;
1158 else
1159 vi->i_mapping->a_ops = &ntfs_aops;
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 if (S_ISREG(vi->i_mode) && (NInoCompressed(ni) || NInoSparse(ni)))
1172 vi->i_blocks = ni->itype.compressed.size >> 9;
1173 else
1174 vi->i_blocks = ni->allocated_size >> 9;
1175 ntfs_debug("Done.");
1176 return 0;
1177iput_unm_err_out:
1178 iput(bvi);
1179unm_err_out:
1180 if (!err)
1181 err = -EIO;
1182 if (ctx)
1183 ntfs_attr_put_search_ctx(ctx);
1184 if (m)
1185 unmap_mft_record(ni);
1186err_out:
1187 ntfs_error(vol->sb, "Failed with error code %i. Marking corrupt "
1188 "inode 0x%lx as bad. Run chkdsk.", err, vi->i_ino);
1189 make_bad_inode(vi);
1190 if (err != -EOPNOTSUPP && err != -ENOMEM)
1191 NVolSetErrors(vol);
1192 return err;
1193}
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
1218{
1219 ntfs_volume *vol = NTFS_SB(vi->i_sb);
1220 ntfs_inode *ni, *base_ni;
1221 MFT_RECORD *m;
1222 ATTR_RECORD *a;
1223 ntfs_attr_search_ctx *ctx;
1224 int err = 0;
1225
1226 ntfs_debug("Entering for i_ino 0x%lx.", vi->i_ino);
1227
1228 ntfs_init_big_inode(vi);
1229
1230 ni = NTFS_I(vi);
1231 base_ni = NTFS_I(base_vi);
1232
1233
1234 vi->i_version = base_vi->i_version;
1235 vi->i_uid = base_vi->i_uid;
1236 vi->i_gid = base_vi->i_gid;
1237 vi->i_nlink = base_vi->i_nlink;
1238 vi->i_mtime = base_vi->i_mtime;
1239 vi->i_ctime = base_vi->i_ctime;
1240 vi->i_atime = base_vi->i_atime;
1241 vi->i_generation = ni->seq_no = base_ni->seq_no;
1242
1243
1244 vi->i_mode = base_vi->i_mode & ~S_IFMT;
1245
1246 m = map_mft_record(base_ni);
1247 if (IS_ERR(m)) {
1248 err = PTR_ERR(m);
1249 goto err_out;
1250 }
1251 ctx = ntfs_attr_get_search_ctx(base_ni, m);
1252 if (!ctx) {
1253 err = -ENOMEM;
1254 goto unm_err_out;
1255 }
1256
1257 err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
1258 CASE_SENSITIVE, 0, NULL, 0, ctx);
1259 if (unlikely(err))
1260 goto unm_err_out;
1261 a = ctx->attr;
1262 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) {
1263 if (a->flags & ATTR_COMPRESSION_MASK) {
1264 NInoSetCompressed(ni);
1265 if ((ni->type != AT_DATA) || (ni->type == AT_DATA &&
1266 ni->name_len)) {
1267 ntfs_error(vi->i_sb, "Found compressed "
1268 "non-data or named data "
1269 "attribute. Please report "
1270 "you saw this message to "
1271 "linux-ntfs-dev@lists."
1272 "sourceforge.net");
1273 goto unm_err_out;
1274 }
1275 if (vol->cluster_size > 4096) {
1276 ntfs_error(vi->i_sb, "Found compressed "
1277 "attribute but compression is "
1278 "disabled due to cluster size "
1279 "(%i) > 4kiB.",
1280 vol->cluster_size);
1281 goto unm_err_out;
1282 }
1283 if ((a->flags & ATTR_COMPRESSION_MASK) !=
1284 ATTR_IS_COMPRESSED) {
1285 ntfs_error(vi->i_sb, "Found unknown "
1286 "compression method.");
1287 goto unm_err_out;
1288 }
1289 }
1290
1291
1292
1293
1294 if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) {
1295 ntfs_error(vi->i_sb, "Found mst protected attribute "
1296 "but the attribute is %s. Please "
1297 "report you saw this message to "
1298 "linux-ntfs-dev@lists.sourceforge.net",
1299 NInoCompressed(ni) ? "compressed" :
1300 "sparse");
1301 goto unm_err_out;
1302 }
1303 if (a->flags & ATTR_IS_SPARSE)
1304 NInoSetSparse(ni);
1305 }
1306 if (a->flags & ATTR_IS_ENCRYPTED) {
1307 if (NInoCompressed(ni)) {
1308 ntfs_error(vi->i_sb, "Found encrypted and compressed "
1309 "data.");
1310 goto unm_err_out;
1311 }
1312
1313
1314
1315
1316 if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) {
1317 ntfs_error(vi->i_sb, "Found mst protected attribute "
1318 "but the attribute is encrypted. "
1319 "Please report you saw this message "
1320 "to linux-ntfs-dev@lists.sourceforge."
1321 "net");
1322 goto unm_err_out;
1323 }
1324 if (ni->type != AT_DATA) {
1325 ntfs_error(vi->i_sb, "Found encrypted non-data "
1326 "attribute.");
1327 goto unm_err_out;
1328 }
1329 NInoSetEncrypted(ni);
1330 }
1331 if (!a->non_resident) {
1332
1333 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1334 le16_to_cpu(a->data.resident.value_offset)))) {
1335 ntfs_error(vol->sb, "Attribute name is placed after "
1336 "the attribute value.");
1337 goto unm_err_out;
1338 }
1339 if (NInoMstProtected(ni)) {
1340 ntfs_error(vi->i_sb, "Found mst protected attribute "
1341 "but the attribute is resident. "
1342 "Please report you saw this message to "
1343 "linux-ntfs-dev@lists.sourceforge.net");
1344 goto unm_err_out;
1345 }
1346 vi->i_size = ni->initialized_size = le32_to_cpu(
1347 a->data.resident.value_length);
1348 ni->allocated_size = le32_to_cpu(a->length) -
1349 le16_to_cpu(a->data.resident.value_offset);
1350 if (vi->i_size > ni->allocated_size) {
1351 ntfs_error(vi->i_sb, "Resident attribute is corrupt "
1352 "(size exceeds allocation).");
1353 goto unm_err_out;
1354 }
1355 } else {
1356 NInoSetNonResident(ni);
1357
1358
1359
1360
1361 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1362 le16_to_cpu(
1363 a->data.non_resident.mapping_pairs_offset)))) {
1364 ntfs_error(vol->sb, "Attribute name is placed after "
1365 "the mapping pairs array.");
1366 goto unm_err_out;
1367 }
1368 if (NInoCompressed(ni) || NInoSparse(ni)) {
1369 if (NInoCompressed(ni) && a->data.non_resident.
1370 compression_unit != 4) {
1371 ntfs_error(vi->i_sb, "Found non-standard "
1372 "compression unit (%u instead "
1373 "of 4). Cannot handle this.",
1374 a->data.non_resident.
1375 compression_unit);
1376 err = -EOPNOTSUPP;
1377 goto unm_err_out;
1378 }
1379 if (a->data.non_resident.compression_unit) {
1380 ni->itype.compressed.block_size = 1U <<
1381 (a->data.non_resident.
1382 compression_unit +
1383 vol->cluster_size_bits);
1384 ni->itype.compressed.block_size_bits =
1385 ffs(ni->itype.compressed.
1386 block_size) - 1;
1387 ni->itype.compressed.block_clusters = 1U <<
1388 a->data.non_resident.
1389 compression_unit;
1390 } else {
1391 ni->itype.compressed.block_size = 0;
1392 ni->itype.compressed.block_size_bits = 0;
1393 ni->itype.compressed.block_clusters = 0;
1394 }
1395 ni->itype.compressed.size = sle64_to_cpu(
1396 a->data.non_resident.compressed_size);
1397 }
1398 if (a->data.non_resident.lowest_vcn) {
1399 ntfs_error(vi->i_sb, "First extent of attribute has "
1400 "non-zero lowest_vcn.");
1401 goto unm_err_out;
1402 }
1403 vi->i_size = sle64_to_cpu(a->data.non_resident.data_size);
1404 ni->initialized_size = sle64_to_cpu(
1405 a->data.non_resident.initialized_size);
1406 ni->allocated_size = sle64_to_cpu(
1407 a->data.non_resident.allocated_size);
1408 }
1409
1410 vi->i_op = NULL;
1411 vi->i_fop = NULL;
1412 if (NInoMstProtected(ni))
1413 vi->i_mapping->a_ops = &ntfs_mst_aops;
1414 else
1415 vi->i_mapping->a_ops = &ntfs_aops;
1416 if ((NInoCompressed(ni) || NInoSparse(ni)) && ni->type != AT_INDEX_ROOT)
1417 vi->i_blocks = ni->itype.compressed.size >> 9;
1418 else
1419 vi->i_blocks = ni->allocated_size >> 9;
1420
1421
1422
1423
1424 igrab(base_vi);
1425 ni->ext.base_ntfs_ino = base_ni;
1426 ni->nr_extents = -1;
1427
1428 ntfs_attr_put_search_ctx(ctx);
1429 unmap_mft_record(base_ni);
1430
1431 ntfs_debug("Done.");
1432 return 0;
1433
1434unm_err_out:
1435 if (!err)
1436 err = -EIO;
1437 if (ctx)
1438 ntfs_attr_put_search_ctx(ctx);
1439 unmap_mft_record(base_ni);
1440err_out:
1441 ntfs_error(vol->sb, "Failed with error code %i while reading attribute "
1442 "inode (mft_no 0x%lx, type 0x%x, name_len %i). "
1443 "Marking corrupt inode and base inode 0x%lx as bad. "
1444 "Run chkdsk.", err, vi->i_ino, ni->type, ni->name_len,
1445 base_vi->i_ino);
1446 make_bad_inode(vi);
1447 if (err != -ENOMEM)
1448 NVolSetErrors(vol);
1449 return err;
1450}
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485static int ntfs_read_locked_index_inode(struct inode *base_vi, struct inode *vi)
1486{
1487 loff_t bvi_size;
1488 ntfs_volume *vol = NTFS_SB(vi->i_sb);
1489 ntfs_inode *ni, *base_ni, *bni;
1490 struct inode *bvi;
1491 MFT_RECORD *m;
1492 ATTR_RECORD *a;
1493 ntfs_attr_search_ctx *ctx;
1494 INDEX_ROOT *ir;
1495 u8 *ir_end, *index_end;
1496 int err = 0;
1497
1498 ntfs_debug("Entering for i_ino 0x%lx.", vi->i_ino);
1499 ntfs_init_big_inode(vi);
1500 ni = NTFS_I(vi);
1501 base_ni = NTFS_I(base_vi);
1502
1503 vi->i_version = base_vi->i_version;
1504 vi->i_uid = base_vi->i_uid;
1505 vi->i_gid = base_vi->i_gid;
1506 vi->i_nlink = base_vi->i_nlink;
1507 vi->i_mtime = base_vi->i_mtime;
1508 vi->i_ctime = base_vi->i_ctime;
1509 vi->i_atime = base_vi->i_atime;
1510 vi->i_generation = ni->seq_no = base_ni->seq_no;
1511
1512 vi->i_mode = base_vi->i_mode & ~S_IFMT;
1513
1514 m = map_mft_record(base_ni);
1515 if (IS_ERR(m)) {
1516 err = PTR_ERR(m);
1517 goto err_out;
1518 }
1519 ctx = ntfs_attr_get_search_ctx(base_ni, m);
1520 if (!ctx) {
1521 err = -ENOMEM;
1522 goto unm_err_out;
1523 }
1524
1525 err = ntfs_attr_lookup(AT_INDEX_ROOT, ni->name, ni->name_len,
1526 CASE_SENSITIVE, 0, NULL, 0, ctx);
1527 if (unlikely(err)) {
1528 if (err == -ENOENT)
1529 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is "
1530 "missing.");
1531 goto unm_err_out;
1532 }
1533 a = ctx->attr;
1534
1535 if (unlikely(a->non_resident)) {
1536 ntfs_error(vol->sb, "$INDEX_ROOT attribute is not resident.");
1537 goto unm_err_out;
1538 }
1539
1540 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1541 le16_to_cpu(a->data.resident.value_offset)))) {
1542 ntfs_error(vol->sb, "$INDEX_ROOT attribute name is placed "
1543 "after the attribute value.");
1544 goto unm_err_out;
1545 }
1546
1547
1548
1549
1550 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_ENCRYPTED |
1551 ATTR_IS_SPARSE)) {
1552 ntfs_error(vi->i_sb, "Found compressed/encrypted/sparse index "
1553 "root attribute.");
1554 goto unm_err_out;
1555 }
1556 ir = (INDEX_ROOT*)((u8*)a + le16_to_cpu(a->data.resident.value_offset));
1557 ir_end = (u8*)ir + le32_to_cpu(a->data.resident.value_length);
1558 if (ir_end > (u8*)ctx->mrec + vol->mft_record_size) {
1559 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is corrupt.");
1560 goto unm_err_out;
1561 }
1562 index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
1563 if (index_end > ir_end) {
1564 ntfs_error(vi->i_sb, "Index is corrupt.");
1565 goto unm_err_out;
1566 }
1567 if (ir->type) {
1568 ntfs_error(vi->i_sb, "Index type is not 0 (type is 0x%x).",
1569 le32_to_cpu(ir->type));
1570 goto unm_err_out;
1571 }
1572 ni->itype.index.collation_rule = ir->collation_rule;
1573 ntfs_debug("Index collation rule is 0x%x.",
1574 le32_to_cpu(ir->collation_rule));
1575 ni->itype.index.block_size = le32_to_cpu(ir->index_block_size);
1576 if (ni->itype.index.block_size & (ni->itype.index.block_size - 1)) {
1577 ntfs_error(vi->i_sb, "Index block size (%u) is not a power of "
1578 "two.", ni->itype.index.block_size);
1579 goto unm_err_out;
1580 }
1581 if (ni->itype.index.block_size > PAGE_CACHE_SIZE) {
1582 ntfs_error(vi->i_sb, "Index block size (%u) > PAGE_CACHE_SIZE "
1583 "(%ld) is not supported. Sorry.",
1584 ni->itype.index.block_size, PAGE_CACHE_SIZE);
1585 err = -EOPNOTSUPP;
1586 goto unm_err_out;
1587 }
1588 if (ni->itype.index.block_size < NTFS_BLOCK_SIZE) {
1589 ntfs_error(vi->i_sb, "Index block size (%u) < NTFS_BLOCK_SIZE "
1590 "(%i) is not supported. Sorry.",
1591 ni->itype.index.block_size, NTFS_BLOCK_SIZE);
1592 err = -EOPNOTSUPP;
1593 goto unm_err_out;
1594 }
1595 ni->itype.index.block_size_bits = ffs(ni->itype.index.block_size) - 1;
1596
1597 if (vol->cluster_size <= ni->itype.index.block_size) {
1598 ni->itype.index.vcn_size = vol->cluster_size;
1599 ni->itype.index.vcn_size_bits = vol->cluster_size_bits;
1600 } else {
1601 ni->itype.index.vcn_size = vol->sector_size;
1602 ni->itype.index.vcn_size_bits = vol->sector_size_bits;
1603 }
1604
1605 if (!(ir->index.flags & LARGE_INDEX)) {
1606
1607 vi->i_size = ni->initialized_size = ni->allocated_size = 0;
1608
1609 ntfs_attr_put_search_ctx(ctx);
1610 unmap_mft_record(base_ni);
1611 m = NULL;
1612 ctx = NULL;
1613 goto skip_large_index_stuff;
1614 }
1615 NInoSetIndexAllocPresent(ni);
1616
1617 ntfs_attr_reinit_search_ctx(ctx);
1618 err = ntfs_attr_lookup(AT_INDEX_ALLOCATION, ni->name, ni->name_len,
1619 CASE_SENSITIVE, 0, NULL, 0, ctx);
1620 if (unlikely(err)) {
1621 if (err == -ENOENT)
1622 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1623 "not present but $INDEX_ROOT "
1624 "indicated it is.");
1625 else
1626 ntfs_error(vi->i_sb, "Failed to lookup "
1627 "$INDEX_ALLOCATION attribute.");
1628 goto unm_err_out;
1629 }
1630 a = ctx->attr;
1631 if (!a->non_resident) {
1632 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1633 "resident.");
1634 goto unm_err_out;
1635 }
1636
1637
1638
1639 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1640 le16_to_cpu(
1641 a->data.non_resident.mapping_pairs_offset)))) {
1642 ntfs_error(vol->sb, "$INDEX_ALLOCATION attribute name is "
1643 "placed after the mapping pairs array.");
1644 goto unm_err_out;
1645 }
1646 if (a->flags & ATTR_IS_ENCRYPTED) {
1647 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1648 "encrypted.");
1649 goto unm_err_out;
1650 }
1651 if (a->flags & ATTR_IS_SPARSE) {
1652 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is sparse.");
1653 goto unm_err_out;
1654 }
1655 if (a->flags & ATTR_COMPRESSION_MASK) {
1656 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1657 "compressed.");
1658 goto unm_err_out;
1659 }
1660 if (a->data.non_resident.lowest_vcn) {
1661 ntfs_error(vi->i_sb, "First extent of $INDEX_ALLOCATION "
1662 "attribute has non zero lowest_vcn.");
1663 goto unm_err_out;
1664 }
1665 vi->i_size = sle64_to_cpu(a->data.non_resident.data_size);
1666 ni->initialized_size = sle64_to_cpu(
1667 a->data.non_resident.initialized_size);
1668 ni->allocated_size = sle64_to_cpu(a->data.non_resident.allocated_size);
1669
1670
1671
1672
1673 ntfs_attr_put_search_ctx(ctx);
1674 unmap_mft_record(base_ni);
1675 m = NULL;
1676 ctx = NULL;
1677
1678 bvi = ntfs_attr_iget(base_vi, AT_BITMAP, ni->name, ni->name_len);
1679 if (IS_ERR(bvi)) {
1680 ntfs_error(vi->i_sb, "Failed to get bitmap attribute.");
1681 err = PTR_ERR(bvi);
1682 goto unm_err_out;
1683 }
1684 bni = NTFS_I(bvi);
1685 if (NInoCompressed(bni) || NInoEncrypted(bni) ||
1686 NInoSparse(bni)) {
1687 ntfs_error(vi->i_sb, "$BITMAP attribute is compressed and/or "
1688 "encrypted and/or sparse.");
1689 goto iput_unm_err_out;
1690 }
1691
1692 bvi_size = i_size_read(bvi);
1693 if ((bvi_size << 3) < (vi->i_size >> ni->itype.index.block_size_bits)) {
1694 ntfs_error(vi->i_sb, "Index bitmap too small (0x%llx) for "
1695 "index allocation (0x%llx).", bvi_size << 3,
1696 vi->i_size);
1697 goto iput_unm_err_out;
1698 }
1699 iput(bvi);
1700skip_large_index_stuff:
1701
1702 vi->i_op = NULL;
1703 vi->i_fop = NULL;
1704 vi->i_mapping->a_ops = &ntfs_mst_aops;
1705 vi->i_blocks = ni->allocated_size >> 9;
1706
1707
1708
1709
1710 igrab(base_vi);
1711 ni->ext.base_ntfs_ino = base_ni;
1712 ni->nr_extents = -1;
1713
1714 ntfs_debug("Done.");
1715 return 0;
1716iput_unm_err_out:
1717 iput(bvi);
1718unm_err_out:
1719 if (!err)
1720 err = -EIO;
1721 if (ctx)
1722 ntfs_attr_put_search_ctx(ctx);
1723 if (m)
1724 unmap_mft_record(base_ni);
1725err_out:
1726 ntfs_error(vi->i_sb, "Failed with error code %i while reading index "
1727 "inode (mft_no 0x%lx, name_len %i.", err, vi->i_ino,
1728 ni->name_len);
1729 make_bad_inode(vi);
1730 if (err != -EOPNOTSUPP && err != -ENOMEM)
1731 NVolSetErrors(vol);
1732 return err;
1733}
1734
1735
1736
1737
1738
1739
1740
1741
1742static struct lock_class_key mft_ni_runlist_lock_key, mft_ni_mrec_lock_key;
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770int ntfs_read_inode_mount(struct inode *vi)
1771{
1772 VCN next_vcn, last_vcn, highest_vcn;
1773 s64 block;
1774 struct super_block *sb = vi->i_sb;
1775 ntfs_volume *vol = NTFS_SB(sb);
1776 struct buffer_head *bh;
1777 ntfs_inode *ni;
1778 MFT_RECORD *m = NULL;
1779 ATTR_RECORD *a;
1780 ntfs_attr_search_ctx *ctx;
1781 unsigned int i, nr_blocks;
1782 int err;
1783
1784 ntfs_debug("Entering.");
1785
1786
1787 ntfs_init_big_inode(vi);
1788
1789 ni = NTFS_I(vi);
1790
1791
1792 NInoSetNonResident(ni);
1793 NInoSetMstProtected(ni);
1794 NInoSetSparseDisabled(ni);
1795 ni->type = AT_DATA;
1796 ni->name = NULL;
1797 ni->name_len = 0;
1798
1799
1800
1801
1802 ni->itype.index.block_size = vol->mft_record_size;
1803 ni->itype.index.block_size_bits = vol->mft_record_size_bits;
1804
1805
1806 vol->mft_ino = vi;
1807
1808
1809 if (vol->mft_record_size > 64 * 1024) {
1810 ntfs_error(sb, "Unsupported mft record size %i (max 64kiB).",
1811 vol->mft_record_size);
1812 goto err_out;
1813 }
1814 i = vol->mft_record_size;
1815 if (i < sb->s_blocksize)
1816 i = sb->s_blocksize;
1817 m = (MFT_RECORD*)ntfs_malloc_nofs(i);
1818 if (!m) {
1819 ntfs_error(sb, "Failed to allocate buffer for $MFT record 0.");
1820 goto err_out;
1821 }
1822
1823
1824 block = vol->mft_lcn << vol->cluster_size_bits >>
1825 sb->s_blocksize_bits;
1826 nr_blocks = vol->mft_record_size >> sb->s_blocksize_bits;
1827 if (!nr_blocks)
1828 nr_blocks = 1;
1829
1830
1831 for (i = 0; i < nr_blocks; i++) {
1832 bh = sb_bread(sb, block++);
1833 if (!bh) {
1834 ntfs_error(sb, "Device read failed.");
1835 goto err_out;
1836 }
1837 memcpy((char*)m + (i << sb->s_blocksize_bits), bh->b_data,
1838 sb->s_blocksize);
1839 brelse(bh);
1840 }
1841
1842
1843 if (post_read_mst_fixup((NTFS_RECORD*)m, vol->mft_record_size)) {
1844
1845 ntfs_error(sb, "MST fixup failed. $MFT is corrupt.");
1846 goto err_out;
1847 }
1848
1849
1850 vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number);
1851
1852
1853 vi->i_mapping->a_ops = &ntfs_mst_aops;
1854
1855 ctx = ntfs_attr_get_search_ctx(ni, m);
1856 if (!ctx) {
1857 err = -ENOMEM;
1858 goto err_out;
1859 }
1860
1861
1862 err = ntfs_attr_lookup(AT_ATTRIBUTE_LIST, NULL, 0, 0, 0, NULL, 0, ctx);
1863 if (err) {
1864 if (unlikely(err != -ENOENT)) {
1865 ntfs_error(sb, "Failed to lookup attribute list "
1866 "attribute. You should run chkdsk.");
1867 goto put_err_out;
1868 }
1869 } else {
1870 ATTR_LIST_ENTRY *al_entry, *next_al_entry;
1871 u8 *al_end;
1872 static const char *es = " Not allowed. $MFT is corrupt. "
1873 "You should run chkdsk.";
1874
1875 ntfs_debug("Attribute list attribute found in $MFT.");
1876 NInoSetAttrList(ni);
1877 a = ctx->attr;
1878 if (a->flags & ATTR_COMPRESSION_MASK) {
1879 ntfs_error(sb, "Attribute list attribute is "
1880 "compressed.%s", es);
1881 goto put_err_out;
1882 }
1883 if (a->flags & ATTR_IS_ENCRYPTED ||
1884 a->flags & ATTR_IS_SPARSE) {
1885 if (a->non_resident) {
1886 ntfs_error(sb, "Non-resident attribute list "
1887 "attribute is encrypted/"
1888 "sparse.%s", es);
1889 goto put_err_out;
1890 }
1891 ntfs_warning(sb, "Resident attribute list attribute "
1892 "in $MFT system file is marked "
1893 "encrypted/sparse which is not true. "
1894 "However, Windows allows this and "
1895 "chkdsk does not detect or correct it "
1896 "so we will just ignore the invalid "
1897 "flags and pretend they are not set.");
1898 }
1899
1900 ni->attr_list_size = (u32)ntfs_attr_size(a);
1901 ni->attr_list = ntfs_malloc_nofs(ni->attr_list_size);
1902 if (!ni->attr_list) {
1903 ntfs_error(sb, "Not enough memory to allocate buffer "
1904 "for attribute list.");
1905 goto put_err_out;
1906 }
1907 if (a->non_resident) {
1908 NInoSetAttrListNonResident(ni);
1909 if (a->data.non_resident.lowest_vcn) {
1910 ntfs_error(sb, "Attribute list has non zero "
1911 "lowest_vcn. $MFT is corrupt. "
1912 "You should run chkdsk.");
1913 goto put_err_out;
1914 }
1915
1916 ni->attr_list_rl.rl = ntfs_mapping_pairs_decompress(vol,
1917 a, NULL);
1918 if (IS_ERR(ni->attr_list_rl.rl)) {
1919 err = PTR_ERR(ni->attr_list_rl.rl);
1920 ni->attr_list_rl.rl = NULL;
1921 ntfs_error(sb, "Mapping pairs decompression "
1922 "failed with error code %i.",
1923 -err);
1924 goto put_err_out;
1925 }
1926
1927 if ((err = load_attribute_list(vol, &ni->attr_list_rl,
1928 ni->attr_list, ni->attr_list_size,
1929 sle64_to_cpu(a->data.
1930 non_resident.initialized_size)))) {
1931 ntfs_error(sb, "Failed to load attribute list "
1932 "attribute with error code %i.",
1933 -err);
1934 goto put_err_out;
1935 }
1936 } else {
1937 if ((u8*)a + le16_to_cpu(
1938 a->data.resident.value_offset) +
1939 le32_to_cpu(
1940 a->data.resident.value_length) >
1941 (u8*)ctx->mrec + vol->mft_record_size) {
1942 ntfs_error(sb, "Corrupt attribute list "
1943 "attribute.");
1944 goto put_err_out;
1945 }
1946
1947 memcpy(ni->attr_list, (u8*)a + le16_to_cpu(
1948 a->data.resident.value_offset),
1949 le32_to_cpu(
1950 a->data.resident.value_length));
1951 }
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964 al_entry = (ATTR_LIST_ENTRY*)ni->attr_list;
1965 al_end = (u8*)al_entry + ni->attr_list_size;
1966 for (;; al_entry = next_al_entry) {
1967
1968 if ((u8*)al_entry < ni->attr_list ||
1969 (u8*)al_entry > al_end)
1970 goto em_put_err_out;
1971
1972 if ((u8*)al_entry == al_end)
1973 goto em_put_err_out;
1974 if (!al_entry->length)
1975 goto em_put_err_out;
1976 if ((u8*)al_entry + 6 > al_end || (u8*)al_entry +
1977 le16_to_cpu(al_entry->length) > al_end)
1978 goto em_put_err_out;
1979 next_al_entry = (ATTR_LIST_ENTRY*)((u8*)al_entry +
1980 le16_to_cpu(al_entry->length));
1981 if (le32_to_cpu(al_entry->type) >
1982 const_le32_to_cpu(AT_DATA))
1983 goto em_put_err_out;
1984 if (AT_DATA != al_entry->type)
1985 continue;
1986
1987 if (al_entry->name_length)
1988 goto em_put_err_out;
1989
1990 if (al_entry->lowest_vcn)
1991 goto em_put_err_out;
1992
1993 if (MREF_LE(al_entry->mft_reference) != vi->i_ino) {
1994
1995 ntfs_error(sb, "BUG: The first $DATA extent "
1996 "of $MFT is not in the base "
1997 "mft record. Please report "
1998 "you saw this message to "
1999 "linux-ntfs-dev@lists."
2000 "sourceforge.net");
2001 goto put_err_out;
2002 } else {
2003
2004 if (MSEQNO_LE(al_entry->mft_reference) !=
2005 ni->seq_no)
2006 goto em_put_err_out;
2007
2008 break;
2009 }
2010 }
2011 }
2012
2013 ntfs_attr_reinit_search_ctx(ctx);
2014
2015
2016 a = NULL;
2017 next_vcn = last_vcn = highest_vcn = 0;
2018 while (!(err = ntfs_attr_lookup(AT_DATA, NULL, 0, 0, next_vcn, NULL, 0,
2019 ctx))) {
2020 runlist_element *nrl;
2021
2022
2023 a = ctx->attr;
2024
2025 if (!a->non_resident) {
2026 ntfs_error(sb, "$MFT must be non-resident but a "
2027 "resident extent was found. $MFT is "
2028 "corrupt. Run chkdsk.");
2029 goto put_err_out;
2030 }
2031
2032 if (a->flags & ATTR_COMPRESSION_MASK ||
2033 a->flags & ATTR_IS_ENCRYPTED ||
2034 a->flags & ATTR_IS_SPARSE) {
2035 ntfs_error(sb, "$MFT must be uncompressed, "
2036 "non-sparse, and unencrypted but a "
2037 "compressed/sparse/encrypted extent "
2038 "was found. $MFT is corrupt. Run "
2039 "chkdsk.");
2040 goto put_err_out;
2041 }
2042
2043
2044
2045
2046
2047
2048 nrl = ntfs_mapping_pairs_decompress(vol, a, ni->runlist.rl);
2049 if (IS_ERR(nrl)) {
2050 ntfs_error(sb, "ntfs_mapping_pairs_decompress() "
2051 "failed with error code %ld. $MFT is "
2052 "corrupt.", PTR_ERR(nrl));
2053 goto put_err_out;
2054 }
2055 ni->runlist.rl = nrl;
2056
2057
2058 if (!next_vcn) {
2059 if (a->data.non_resident.lowest_vcn) {
2060 ntfs_error(sb, "First extent of $DATA "
2061 "attribute has non zero "
2062 "lowest_vcn. $MFT is corrupt. "
2063 "You should run chkdsk.");
2064 goto put_err_out;
2065 }
2066
2067 last_vcn = sle64_to_cpu(
2068 a->data.non_resident.allocated_size)
2069 >> vol->cluster_size_bits;
2070
2071 vi->i_size = sle64_to_cpu(
2072 a->data.non_resident.data_size);
2073 ni->initialized_size = sle64_to_cpu(
2074 a->data.non_resident.initialized_size);
2075 ni->allocated_size = sle64_to_cpu(
2076 a->data.non_resident.allocated_size);
2077
2078
2079
2080
2081 if ((vi->i_size >> vol->mft_record_size_bits) >=
2082 (1ULL << 32)) {
2083 ntfs_error(sb, "$MFT is too big! Aborting.");
2084 goto put_err_out;
2085 }
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105 ntfs_read_locked_inode(vi);
2106 if (is_bad_inode(vi)) {
2107 ntfs_error(sb, "ntfs_read_inode() of $MFT "
2108 "failed. BUG or corrupt $MFT. "
2109 "Run chkdsk and if no errors "
2110 "are found, please report you "
2111 "saw this message to "
2112 "linux-ntfs-dev@lists."
2113 "sourceforge.net");
2114 ntfs_attr_put_search_ctx(ctx);
2115
2116 ntfs_free(m);
2117 return -1;
2118 }
2119
2120
2121
2122
2123
2124 vi->i_uid = vi->i_gid = 0;
2125
2126 vi->i_mode = S_IFREG;
2127
2128 vi->i_op = &ntfs_empty_inode_ops;
2129 vi->i_fop = &ntfs_empty_file_ops;
2130 }
2131
2132
2133 highest_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn);
2134 next_vcn = highest_vcn + 1;
2135
2136
2137 if (next_vcn <= 0)
2138 break;
2139
2140
2141 if (next_vcn < sle64_to_cpu(
2142 a->data.non_resident.lowest_vcn)) {
2143 ntfs_error(sb, "$MFT has corrupt attribute list "
2144 "attribute. Run chkdsk.");
2145 goto put_err_out;
2146 }
2147 }
2148 if (err != -ENOENT) {
2149 ntfs_error(sb, "Failed to lookup $MFT/$DATA attribute extent. "
2150 "$MFT is corrupt. Run chkdsk.");
2151 goto put_err_out;
2152 }
2153 if (!a) {
2154 ntfs_error(sb, "$MFT/$DATA attribute not found. $MFT is "
2155 "corrupt. Run chkdsk.");
2156 goto put_err_out;
2157 }
2158 if (highest_vcn && highest_vcn != last_vcn - 1) {
2159 ntfs_error(sb, "Failed to load the complete runlist for "
2160 "$MFT/$DATA. Driver bug or corrupt $MFT. "
2161 "Run chkdsk.");
2162 ntfs_debug("highest_vcn = 0x%llx, last_vcn - 1 = 0x%llx",
2163 (unsigned long long)highest_vcn,
2164 (unsigned long long)last_vcn - 1);
2165 goto put_err_out;
2166 }
2167 ntfs_attr_put_search_ctx(ctx);
2168 ntfs_debug("Done.");
2169 ntfs_free(m);
2170
2171
2172
2173
2174
2175 lockdep_set_class(&ni->runlist.lock, &mft_ni_runlist_lock_key);
2176 lockdep_set_class(&ni->mrec_lock, &mft_ni_mrec_lock_key);
2177
2178 return 0;
2179
2180em_put_err_out:
2181 ntfs_error(sb, "Couldn't find first extent of $DATA attribute in "
2182 "attribute list. $MFT is corrupt. Run chkdsk.");
2183put_err_out:
2184 ntfs_attr_put_search_ctx(ctx);
2185err_out:
2186 ntfs_error(sb, "Failed. Marking inode as bad.");
2187 make_bad_inode(vi);
2188 ntfs_free(m);
2189 return -1;
2190}
2191
2192static void __ntfs_clear_inode(ntfs_inode *ni)
2193{
2194
2195 down_write(&ni->runlist.lock);
2196 if (ni->runlist.rl) {
2197 ntfs_free(ni->runlist.rl);
2198 ni->runlist.rl = NULL;
2199 }
2200 up_write(&ni->runlist.lock);
2201
2202 if (ni->attr_list) {
2203 ntfs_free(ni->attr_list);
2204 ni->attr_list = NULL;
2205 }
2206
2207 down_write(&ni->attr_list_rl.lock);
2208 if (ni->attr_list_rl.rl) {
2209 ntfs_free(ni->attr_list_rl.rl);
2210 ni->attr_list_rl.rl = NULL;
2211 }
2212 up_write(&ni->attr_list_rl.lock);
2213
2214 if (ni->name_len && ni->name != I30) {
2215
2216 BUG_ON(!ni->name);
2217 kfree(ni->name);
2218 }
2219}
2220
2221void ntfs_clear_extent_inode(ntfs_inode *ni)
2222{
2223 ntfs_debug("Entering for inode 0x%lx.", ni->mft_no);
2224
2225 BUG_ON(NInoAttr(ni));
2226 BUG_ON(ni->nr_extents != -1);
2227
2228#ifdef NTFS_RW
2229 if (NInoDirty(ni)) {
2230 if (!is_bad_inode(VFS_I(ni->ext.base_ntfs_ino)))
2231 ntfs_error(ni->vol->sb, "Clearing dirty extent inode! "
2232 "Losing data! This is a BUG!!!");
2233
2234 }
2235#endif
2236
2237 __ntfs_clear_inode(ni);
2238
2239
2240 ntfs_destroy_extent_inode(ni);
2241}
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253void ntfs_clear_big_inode(struct inode *vi)
2254{
2255 ntfs_inode *ni = NTFS_I(vi);
2256
2257#ifdef NTFS_RW
2258 if (NInoDirty(ni)) {
2259 bool was_bad = (is_bad_inode(vi));
2260
2261
2262 ntfs_commit_inode(vi);
2263
2264 if (!was_bad && (is_bad_inode(vi) || NInoDirty(ni))) {
2265 ntfs_error(vi->i_sb, "Failed to commit dirty inode "
2266 "0x%lx. Losing data!", vi->i_ino);
2267
2268 }
2269 }
2270#endif
2271
2272
2273 if (ni->nr_extents > 0) {
2274 int i;
2275
2276 for (i = 0; i < ni->nr_extents; i++)
2277 ntfs_clear_extent_inode(ni->ext.extent_ntfs_inos[i]);
2278 kfree(ni->ext.extent_ntfs_inos);
2279 }
2280
2281 __ntfs_clear_inode(ni);
2282
2283 if (NInoAttr(ni)) {
2284
2285 if (ni->nr_extents == -1) {
2286 iput(VFS_I(ni->ext.base_ntfs_ino));
2287 ni->nr_extents = 0;
2288 ni->ext.base_ntfs_ino = NULL;
2289 }
2290 }
2291 return;
2292}
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304int ntfs_show_options(struct seq_file *sf, struct vfsmount *mnt)
2305{
2306 ntfs_volume *vol = NTFS_SB(mnt->mnt_sb);
2307 int i;
2308
2309 seq_printf(sf, ",uid=%i", vol->uid);
2310 seq_printf(sf, ",gid=%i", vol->gid);
2311 if (vol->fmask == vol->dmask)
2312 seq_printf(sf, ",umask=0%o", vol->fmask);
2313 else {
2314 seq_printf(sf, ",fmask=0%o", vol->fmask);
2315 seq_printf(sf, ",dmask=0%o", vol->dmask);
2316 }
2317 seq_printf(sf, ",nls=%s", vol->nls_map->charset);
2318 if (NVolCaseSensitive(vol))
2319 seq_printf(sf, ",case_sensitive");
2320 if (NVolShowSystemFiles(vol))
2321 seq_printf(sf, ",show_sys_files");
2322 if (!NVolSparseEnabled(vol))
2323 seq_printf(sf, ",disable_sparse");
2324 for (i = 0; on_errors_arr[i].val; i++) {
2325 if (on_errors_arr[i].val & vol->on_errors)
2326 seq_printf(sf, ",errors=%s", on_errors_arr[i].str);
2327 }
2328 seq_printf(sf, ",mft_zone_multiplier=%i", vol->mft_zone_multiplier);
2329 return 0;
2330}
2331
2332#ifdef NTFS_RW
2333
2334static const char *es = " Leaving inconsistent metadata. Unmount and run "
2335 "chkdsk.";
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360int ntfs_truncate(struct inode *vi)
2361{
2362 s64 new_size, old_size, nr_freed, new_alloc_size, old_alloc_size;
2363 VCN highest_vcn;
2364 unsigned long flags;
2365 ntfs_inode *base_ni, *ni = NTFS_I(vi);
2366 ntfs_volume *vol = ni->vol;
2367 ntfs_attr_search_ctx *ctx;
2368 MFT_RECORD *m;
2369 ATTR_RECORD *a;
2370 const char *te = " Leaving file length out of sync with i_size.";
2371 int err, mp_size, size_change, alloc_change;
2372 u32 attr_len;
2373
2374 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
2375 BUG_ON(NInoAttr(ni));
2376 BUG_ON(S_ISDIR(vi->i_mode));
2377 BUG_ON(NInoMstProtected(ni));
2378 BUG_ON(ni->nr_extents < 0);
2379retry_truncate:
2380
2381
2382
2383
2384 down_write(&ni->runlist.lock);
2385 if (!NInoAttr(ni))
2386 base_ni = ni;
2387 else
2388 base_ni = ni->ext.base_ntfs_ino;
2389 m = map_mft_record(base_ni);
2390 if (IS_ERR(m)) {
2391 err = PTR_ERR(m);
2392 ntfs_error(vi->i_sb, "Failed to map mft record for inode 0x%lx "
2393 "(error code %d).%s", vi->i_ino, err, te);
2394 ctx = NULL;
2395 m = NULL;
2396 goto old_bad_out;
2397 }
2398 ctx = ntfs_attr_get_search_ctx(base_ni, m);
2399 if (unlikely(!ctx)) {
2400 ntfs_error(vi->i_sb, "Failed to allocate a search context for "
2401 "inode 0x%lx (not enough memory).%s",
2402 vi->i_ino, te);
2403 err = -ENOMEM;
2404 goto old_bad_out;
2405 }
2406 err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
2407 CASE_SENSITIVE, 0, NULL, 0, ctx);
2408 if (unlikely(err)) {
2409 if (err == -ENOENT) {
2410 ntfs_error(vi->i_sb, "Open attribute is missing from "
2411 "mft record. Inode 0x%lx is corrupt. "
2412 "Run chkdsk.%s", vi->i_ino, te);
2413 err = -EIO;
2414 } else
2415 ntfs_error(vi->i_sb, "Failed to lookup attribute in "
2416 "inode 0x%lx (error code %d).%s",
2417 vi->i_ino, err, te);
2418 goto old_bad_out;
2419 }
2420 m = ctx->mrec;
2421 a = ctx->attr;
2422
2423
2424
2425 new_size = i_size_read(vi);
2426
2427 old_size = ntfs_attr_size(a);
2428
2429 if (NInoNonResident(ni))
2430 new_alloc_size = (new_size + vol->cluster_size - 1) &
2431 ~(s64)vol->cluster_size_mask;
2432 else
2433 new_alloc_size = (new_size + 7) & ~7;
2434
2435 read_lock_irqsave(&ni->size_lock, flags);
2436 old_alloc_size = ni->allocated_size;
2437 read_unlock_irqrestore(&ni->size_lock, flags);
2438
2439
2440
2441
2442 size_change = -1;
2443 if (new_size - old_size >= 0) {
2444 size_change = 1;
2445 if (new_size == old_size)
2446 size_change = 0;
2447 }
2448
2449 alloc_change = -1;
2450 if (new_alloc_size - old_alloc_size >= 0) {
2451 alloc_change = 1;
2452 if (new_alloc_size == old_alloc_size)
2453 alloc_change = 0;
2454 }
2455
2456
2457
2458
2459 if (!size_change && !alloc_change)
2460 goto unm_done;
2461
2462 if (size_change) {
2463 err = ntfs_attr_size_bounds_check(vol, ni->type, new_size);
2464 if (unlikely(err)) {
2465 if (err == -ERANGE) {
2466 ntfs_error(vol->sb, "Truncate would cause the "
2467 "inode 0x%lx to %simum size "
2468 "for its attribute type "
2469 "(0x%x). Aborting truncate.",
2470 vi->i_ino,
2471 new_size > old_size ? "exceed "
2472 "the max" : "go under the min",
2473 le32_to_cpu(ni->type));
2474 err = -EFBIG;
2475 } else {
2476 ntfs_error(vol->sb, "Inode 0x%lx has unknown "
2477 "attribute type 0x%x. "
2478 "Aborting truncate.",
2479 vi->i_ino,
2480 le32_to_cpu(ni->type));
2481 err = -EIO;
2482 }
2483
2484 i_size_write(vi, old_size);
2485 goto err_out;
2486 }
2487 }
2488 if (NInoCompressed(ni) || NInoEncrypted(ni)) {
2489 ntfs_warning(vi->i_sb, "Changes in inode size are not "
2490 "supported yet for %s files, ignoring.",
2491 NInoCompressed(ni) ? "compressed" :
2492 "encrypted");
2493 err = -EOPNOTSUPP;
2494 goto bad_out;
2495 }
2496 if (a->non_resident)
2497 goto do_non_resident_truncate;
2498 BUG_ON(NInoNonResident(ni));
2499
2500 if (new_size < vol->mft_record_size &&
2501 !ntfs_resident_attr_value_resize(m, a, new_size)) {
2502
2503 flush_dcache_mft_record_page(ctx->ntfs_ino);
2504 mark_mft_record_dirty(ctx->ntfs_ino);
2505 write_lock_irqsave(&ni->size_lock, flags);
2506
2507 ni->allocated_size = le32_to_cpu(a->length) -
2508 le16_to_cpu(a->data.resident.value_offset);
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537 ni->initialized_size = new_size;
2538 write_unlock_irqrestore(&ni->size_lock, flags);
2539 goto unm_done;
2540 }
2541
2542 BUG_ON(size_change < 0);
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552 ntfs_attr_put_search_ctx(ctx);
2553 unmap_mft_record(base_ni);
2554 up_write(&ni->runlist.lock);
2555
2556
2557
2558
2559 err = ntfs_attr_make_non_resident(ni, old_size);
2560 if (likely(!err))
2561 goto retry_truncate;
2562
2563
2564
2565
2566
2567 if (unlikely(err != -EPERM && err != -ENOSPC)) {
2568 ntfs_error(vol->sb, "Cannot truncate inode 0x%lx, attribute "
2569 "type 0x%x, because the conversion from "
2570 "resident to non-resident attribute failed "
2571 "with error code %i.", vi->i_ino,
2572 (unsigned)le32_to_cpu(ni->type), err);
2573 if (err != -ENOMEM)
2574 err = -EIO;
2575 goto conv_err_out;
2576 }
2577
2578 if (err == -ENOSPC)
2579 ntfs_error(vol->sb, "Not enough space in the mft record/on "
2580 "disk for the non-resident attribute value. "
2581 "This case is not implemented yet.");
2582 else
2583 ntfs_error(vol->sb, "This attribute type may not be "
2584 "non-resident. This case is not implemented "
2585 "yet.");
2586 err = -EOPNOTSUPP;
2587 goto conv_err_out;
2588#if 0
2589
2590 if (!err)
2591 goto do_resident_extend;
2592
2593
2594
2595
2596
2597
2598 if (ni->type == AT_ATTRIBUTE_LIST ||
2599 ni->type == AT_STANDARD_INFORMATION) {
2600
2601
2602 err = -EOPNOTSUPP;
2603 if (!err)
2604 goto do_resident_extend;
2605 goto err_out;
2606 }
2607
2608
2609
2610 err = -EOPNOTSUPP;
2611 if (!err)
2612 goto do_resident_extend;
2613
2614 goto err_out;
2615#endif
2616do_non_resident_truncate:
2617 BUG_ON(!NInoNonResident(ni));
2618 if (alloc_change < 0) {
2619 highest_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn);
2620 if (highest_vcn > 0 &&
2621 old_alloc_size >> vol->cluster_size_bits >
2622 highest_vcn + 1) {
2623
2624
2625
2626
2627 ntfs_error(vol->sb, "Cannot truncate inode 0x%lx, "
2628 "attribute type 0x%x, because the "
2629 "attribute is highly fragmented (it "
2630 "consists of multiple extents) and "
2631 "this case is not implemented yet.",
2632 vi->i_ino,
2633 (unsigned)le32_to_cpu(ni->type));
2634 err = -EOPNOTSUPP;
2635 goto bad_out;
2636 }
2637 }
2638
2639
2640
2641
2642 if (size_change < 0) {
2643
2644
2645
2646 write_lock_irqsave(&ni->size_lock, flags);
2647 if (new_size < ni->initialized_size) {
2648 ni->initialized_size = new_size;
2649 a->data.non_resident.initialized_size =
2650 cpu_to_sle64(new_size);
2651 }
2652 a->data.non_resident.data_size = cpu_to_sle64(new_size);
2653 write_unlock_irqrestore(&ni->size_lock, flags);
2654 flush_dcache_mft_record_page(ctx->ntfs_ino);
2655 mark_mft_record_dirty(ctx->ntfs_ino);
2656
2657 if (!alloc_change)
2658 goto unm_done;
2659
2660
2661
2662
2663 BUG_ON(alloc_change > 0);
2664 } else {
2665
2666
2667
2668
2669 if (alloc_change > 0) {
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685 ntfs_attr_put_search_ctx(ctx);
2686 unmap_mft_record(base_ni);
2687 up_write(&ni->runlist.lock);
2688 err = ntfs_attr_extend_allocation(ni, new_size,
2689 size_change > 0 ? new_size : -1, -1);
2690
2691
2692
2693
2694 goto done;
2695 }
2696 if (!alloc_change)
2697 goto alloc_done;
2698 }
2699
2700
2701 nr_freed = ntfs_cluster_free(ni, new_alloc_size >>
2702 vol->cluster_size_bits, -1, ctx);
2703 m = ctx->mrec;
2704 a = ctx->attr;
2705 if (unlikely(nr_freed < 0)) {
2706 ntfs_error(vol->sb, "Failed to release cluster(s) (error code "
2707 "%lli). Unmount and run chkdsk to recover "
2708 "the lost cluster(s).", (long long)nr_freed);
2709 NVolSetErrors(vol);
2710 nr_freed = 0;
2711 }
2712
2713 err = ntfs_rl_truncate_nolock(vol, &ni->runlist,
2714 new_alloc_size >> vol->cluster_size_bits);
2715
2716
2717
2718
2719
2720
2721 if (unlikely(err || IS_ERR(m))) {
2722 ntfs_error(vol->sb, "Failed to %s (error code %li).%s",
2723 IS_ERR(m) ?
2724 "restore attribute search context" :
2725 "truncate attribute runlist",
2726 IS_ERR(m) ? PTR_ERR(m) : err, es);
2727 err = -EIO;
2728 goto bad_out;
2729 }
2730
2731 mp_size = ntfs_get_size_for_mapping_pairs(vol, ni->runlist.rl, 0, -1);
2732 if (unlikely(mp_size <= 0)) {
2733 ntfs_error(vol->sb, "Cannot shrink allocation of inode 0x%lx, "
2734 "attribute type 0x%x, because determining the "
2735 "size for the mapping pairs failed with error "
2736 "code %i.%s", vi->i_ino,
2737 (unsigned)le32_to_cpu(ni->type), mp_size, es);
2738 err = -EIO;
2739 goto bad_out;
2740 }
2741
2742
2743
2744
2745
2746 attr_len = le32_to_cpu(a->length);
2747 err = ntfs_attr_record_resize(m, a, mp_size +
2748 le16_to_cpu(a->data.non_resident.mapping_pairs_offset));
2749 BUG_ON(err);
2750
2751
2752
2753 err = ntfs_mapping_pairs_build(vol, (u8*)a +
2754 le16_to_cpu(a->data.non_resident.mapping_pairs_offset),
2755 mp_size, ni->runlist.rl, 0, -1, NULL);
2756 if (unlikely(err)) {
2757 ntfs_error(vol->sb, "Cannot shrink allocation of inode 0x%lx, "
2758 "attribute type 0x%x, because building the "
2759 "mapping pairs failed with error code %i.%s",
2760 vi->i_ino, (unsigned)le32_to_cpu(ni->type),
2761 err, es);
2762 err = -EIO;
2763 goto bad_out;
2764 }
2765
2766 a->data.non_resident.highest_vcn = cpu_to_sle64((new_alloc_size >>
2767 vol->cluster_size_bits) - 1);
2768 write_lock_irqsave(&ni->size_lock, flags);
2769 ni->allocated_size = new_alloc_size;
2770 a->data.non_resident.allocated_size = cpu_to_sle64(new_alloc_size);
2771 if (NInoSparse(ni) || NInoCompressed(ni)) {
2772 if (nr_freed) {
2773 ni->itype.compressed.size -= nr_freed <<
2774 vol->cluster_size_bits;
2775 BUG_ON(ni->itype.compressed.size < 0);
2776 a->data.non_resident.compressed_size = cpu_to_sle64(
2777 ni->itype.compressed.size);
2778 vi->i_blocks = ni->itype.compressed.size >> 9;
2779 }
2780 } else
2781 vi->i_blocks = new_alloc_size >> 9;
2782 write_unlock_irqrestore(&ni->size_lock, flags);
2783
2784
2785
2786
2787
2788
2789
2790
2791alloc_done:
2792
2793
2794
2795
2796 if (size_change > 0)
2797 a->data.non_resident.data_size = cpu_to_sle64(new_size);
2798
2799 flush_dcache_mft_record_page(ctx->ntfs_ino);
2800 mark_mft_record_dirty(ctx->ntfs_ino);
2801unm_done:
2802 ntfs_attr_put_search_ctx(ctx);
2803 unmap_mft_record(base_ni);
2804 up_write(&ni->runlist.lock);
2805done:
2806
2807
2808
2809
2810
2811
2812 if (!IS_NOCMTIME(VFS_I(base_ni)) && !IS_RDONLY(VFS_I(base_ni))) {
2813 struct timespec now = current_fs_time(VFS_I(base_ni)->i_sb);
2814 int sync_it = 0;
2815
2816 if (!timespec_equal(&VFS_I(base_ni)->i_mtime, &now) ||
2817 !timespec_equal(&VFS_I(base_ni)->i_ctime, &now))
2818 sync_it = 1;
2819 VFS_I(base_ni)->i_mtime = now;
2820 VFS_I(base_ni)->i_ctime = now;
2821
2822 if (sync_it)
2823 mark_inode_dirty_sync(VFS_I(base_ni));
2824 }
2825
2826 if (likely(!err)) {
2827 NInoClearTruncateFailed(ni);
2828 ntfs_debug("Done.");
2829 }
2830 return err;
2831old_bad_out:
2832 old_size = -1;
2833bad_out:
2834 if (err != -ENOMEM && err != -EOPNOTSUPP)
2835 NVolSetErrors(vol);
2836 if (err != -EOPNOTSUPP)
2837 NInoSetTruncateFailed(ni);
2838 else if (old_size >= 0)
2839 i_size_write(vi, old_size);
2840err_out:
2841 if (ctx)
2842 ntfs_attr_put_search_ctx(ctx);
2843 if (m)
2844 unmap_mft_record(base_ni);
2845 up_write(&ni->runlist.lock);
2846out:
2847 ntfs_debug("Failed. Returning error code %i.", err);
2848 return err;
2849conv_err_out:
2850 if (err != -ENOMEM && err != -EOPNOTSUPP)
2851 NVolSetErrors(vol);
2852 if (err != -EOPNOTSUPP)
2853 NInoSetTruncateFailed(ni);
2854 else
2855 i_size_write(vi, old_size);
2856 goto out;
2857}
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867void ntfs_truncate_vfs(struct inode *vi) {
2868 ntfs_truncate(vi);
2869}
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
2890{
2891 struct inode *vi = dentry->d_inode;
2892 int err;
2893 unsigned int ia_valid = attr->ia_valid;
2894
2895 err = inode_change_ok(vi, attr);
2896 if (err)
2897 goto out;
2898
2899 if (ia_valid & (ATTR_UID | ATTR_GID | ATTR_MODE)) {
2900 ntfs_warning(vi->i_sb, "Changes in user/group/mode are not "
2901 "supported yet, ignoring.");
2902 err = -EOPNOTSUPP;
2903 goto out;
2904 }
2905 if (ia_valid & ATTR_SIZE) {
2906 if (attr->ia_size != i_size_read(vi)) {
2907 ntfs_inode *ni = NTFS_I(vi);
2908
2909
2910
2911
2912 if (NInoCompressed(ni) || NInoEncrypted(ni)) {
2913 ntfs_warning(vi->i_sb, "Changes in inode size "
2914 "are not supported yet for "
2915 "%s files, ignoring.",
2916 NInoCompressed(ni) ?
2917 "compressed" : "encrypted");
2918 err = -EOPNOTSUPP;
2919 } else
2920 err = vmtruncate(vi, attr->ia_size);
2921 if (err || ia_valid == ATTR_SIZE)
2922 goto out;
2923 } else {
2924
2925
2926
2927
2928 ia_valid |= ATTR_MTIME | ATTR_CTIME;
2929 }
2930 }
2931 if (ia_valid & ATTR_ATIME)
2932 vi->i_atime = timespec_trunc(attr->ia_atime,
2933 vi->i_sb->s_time_gran);
2934 if (ia_valid & ATTR_MTIME)
2935 vi->i_mtime = timespec_trunc(attr->ia_mtime,
2936 vi->i_sb->s_time_gran);
2937 if (ia_valid & ATTR_CTIME)
2938 vi->i_ctime = timespec_trunc(attr->ia_ctime,
2939 vi->i_sb->s_time_gran);
2940 mark_inode_dirty(vi);
2941out:
2942 return err;
2943}
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963int ntfs_write_inode(struct inode *vi, int sync)
2964{
2965 sle64 nt;
2966 ntfs_inode *ni = NTFS_I(vi);
2967 ntfs_attr_search_ctx *ctx;
2968 MFT_RECORD *m;
2969 STANDARD_INFORMATION *si;
2970 int err = 0;
2971 bool modified = false;
2972
2973 ntfs_debug("Entering for %sinode 0x%lx.", NInoAttr(ni) ? "attr " : "",
2974 vi->i_ino);
2975
2976
2977
2978
2979
2980 if (NInoAttr(ni)) {
2981 NInoClearDirty(ni);
2982 ntfs_debug("Done.");
2983 return 0;
2984 }
2985
2986 m = map_mft_record(ni);
2987 if (IS_ERR(m)) {
2988 err = PTR_ERR(m);
2989 goto err_out;
2990 }
2991
2992 ctx = ntfs_attr_get_search_ctx(ni, m);
2993 if (unlikely(!ctx)) {
2994 err = -ENOMEM;
2995 goto unm_err_out;
2996 }
2997 err = ntfs_attr_lookup(AT_STANDARD_INFORMATION, NULL, 0,
2998 CASE_SENSITIVE, 0, NULL, 0, ctx);
2999 if (unlikely(err)) {
3000 ntfs_attr_put_search_ctx(ctx);
3001 goto unm_err_out;
3002 }
3003 si = (STANDARD_INFORMATION*)((u8*)ctx->attr +
3004 le16_to_cpu(ctx->attr->data.resident.value_offset));
3005
3006 nt = utc2ntfs(vi->i_mtime);
3007 if (si->last_data_change_time != nt) {
3008 ntfs_debug("Updating mtime for inode 0x%lx: old = 0x%llx, "
3009 "new = 0x%llx", vi->i_ino, (long long)
3010 sle64_to_cpu(si->last_data_change_time),
3011 (long long)sle64_to_cpu(nt));
3012 si->last_data_change_time = nt;
3013 modified = true;
3014 }
3015 nt = utc2ntfs(vi->i_ctime);
3016 if (si->last_mft_change_time != nt) {
3017 ntfs_debug("Updating ctime for inode 0x%lx: old = 0x%llx, "
3018 "new = 0x%llx", vi->i_ino, (long long)
3019 sle64_to_cpu(si->last_mft_change_time),
3020 (long long)sle64_to_cpu(nt));
3021 si->last_mft_change_time = nt;
3022 modified = true;
3023 }
3024 nt = utc2ntfs(vi->i_atime);
3025 if (si->last_access_time != nt) {
3026 ntfs_debug("Updating atime for inode 0x%lx: old = 0x%llx, "
3027 "new = 0x%llx", vi->i_ino,
3028 (long long)sle64_to_cpu(si->last_access_time),
3029 (long long)sle64_to_cpu(nt));
3030 si->last_access_time = nt;
3031 modified = true;
3032 }
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049 if (modified) {
3050 flush_dcache_mft_record_page(ctx->ntfs_ino);
3051 if (!NInoTestSetDirty(ctx->ntfs_ino))
3052 mark_ntfs_record_dirty(ctx->ntfs_ino->page,
3053 ctx->ntfs_ino->page_ofs);
3054 }
3055 ntfs_attr_put_search_ctx(ctx);
3056
3057 if (NInoDirty(ni))
3058 err = write_mft_record(ni, m, sync);
3059
3060 mutex_lock(&ni->extent_lock);
3061 if (ni->nr_extents > 0) {
3062 ntfs_inode **extent_nis = ni->ext.extent_ntfs_inos;
3063 int i;
3064
3065 ntfs_debug("Writing %i extent inodes.", ni->nr_extents);
3066 for (i = 0; i < ni->nr_extents; i++) {
3067 ntfs_inode *tni = extent_nis[i];
3068
3069 if (NInoDirty(tni)) {
3070 MFT_RECORD *tm = map_mft_record(tni);
3071 int ret;
3072
3073 if (IS_ERR(tm)) {
3074 if (!err || err == -ENOMEM)
3075 err = PTR_ERR(tm);
3076 continue;
3077 }
3078 ret = write_mft_record(tni, tm, sync);
3079 unmap_mft_record(tni);
3080 if (unlikely(ret)) {
3081 if (!err || err == -ENOMEM)
3082 err = ret;
3083 }
3084 }
3085 }
3086 }
3087 mutex_unlock(&ni->extent_lock);
3088 unmap_mft_record(ni);
3089 if (unlikely(err))
3090 goto err_out;
3091 ntfs_debug("Done.");
3092 return 0;
3093unm_err_out:
3094 unmap_mft_record(ni);
3095err_out:
3096 if (err == -ENOMEM) {
3097 ntfs_warning(vi->i_sb, "Not enough memory to write inode. "
3098 "Marking the inode dirty again, so the VFS "
3099 "retries later.");
3100 mark_inode_dirty(vi);
3101 } else {
3102 ntfs_error(vi->i_sb, "Failed (error %i): Run chkdsk.", -err);
3103 NVolSetErrors(ni->vol);
3104 }
3105 return err;
3106}
3107
3108#endif
3109