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 if (NInoMstProtected(ni))
1410 vi->i_mapping->a_ops = &ntfs_mst_aops;
1411 else
1412 vi->i_mapping->a_ops = &ntfs_aops;
1413 if ((NInoCompressed(ni) || NInoSparse(ni)) && ni->type != AT_INDEX_ROOT)
1414 vi->i_blocks = ni->itype.compressed.size >> 9;
1415 else
1416 vi->i_blocks = ni->allocated_size >> 9;
1417
1418
1419
1420
1421 igrab(base_vi);
1422 ni->ext.base_ntfs_ino = base_ni;
1423 ni->nr_extents = -1;
1424
1425 ntfs_attr_put_search_ctx(ctx);
1426 unmap_mft_record(base_ni);
1427
1428 ntfs_debug("Done.");
1429 return 0;
1430
1431unm_err_out:
1432 if (!err)
1433 err = -EIO;
1434 if (ctx)
1435 ntfs_attr_put_search_ctx(ctx);
1436 unmap_mft_record(base_ni);
1437err_out:
1438 ntfs_error(vol->sb, "Failed with error code %i while reading attribute "
1439 "inode (mft_no 0x%lx, type 0x%x, name_len %i). "
1440 "Marking corrupt inode and base inode 0x%lx as bad. "
1441 "Run chkdsk.", err, vi->i_ino, ni->type, ni->name_len,
1442 base_vi->i_ino);
1443 make_bad_inode(vi);
1444 if (err != -ENOMEM)
1445 NVolSetErrors(vol);
1446 return err;
1447}
1448
1449
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
1482static int ntfs_read_locked_index_inode(struct inode *base_vi, struct inode *vi)
1483{
1484 loff_t bvi_size;
1485 ntfs_volume *vol = NTFS_SB(vi->i_sb);
1486 ntfs_inode *ni, *base_ni, *bni;
1487 struct inode *bvi;
1488 MFT_RECORD *m;
1489 ATTR_RECORD *a;
1490 ntfs_attr_search_ctx *ctx;
1491 INDEX_ROOT *ir;
1492 u8 *ir_end, *index_end;
1493 int err = 0;
1494
1495 ntfs_debug("Entering for i_ino 0x%lx.", vi->i_ino);
1496 ntfs_init_big_inode(vi);
1497 ni = NTFS_I(vi);
1498 base_ni = NTFS_I(base_vi);
1499
1500 vi->i_version = base_vi->i_version;
1501 vi->i_uid = base_vi->i_uid;
1502 vi->i_gid = base_vi->i_gid;
1503 vi->i_nlink = base_vi->i_nlink;
1504 vi->i_mtime = base_vi->i_mtime;
1505 vi->i_ctime = base_vi->i_ctime;
1506 vi->i_atime = base_vi->i_atime;
1507 vi->i_generation = ni->seq_no = base_ni->seq_no;
1508
1509 vi->i_mode = base_vi->i_mode & ~S_IFMT;
1510
1511 m = map_mft_record(base_ni);
1512 if (IS_ERR(m)) {
1513 err = PTR_ERR(m);
1514 goto err_out;
1515 }
1516 ctx = ntfs_attr_get_search_ctx(base_ni, m);
1517 if (!ctx) {
1518 err = -ENOMEM;
1519 goto unm_err_out;
1520 }
1521
1522 err = ntfs_attr_lookup(AT_INDEX_ROOT, ni->name, ni->name_len,
1523 CASE_SENSITIVE, 0, NULL, 0, ctx);
1524 if (unlikely(err)) {
1525 if (err == -ENOENT)
1526 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is "
1527 "missing.");
1528 goto unm_err_out;
1529 }
1530 a = ctx->attr;
1531
1532 if (unlikely(a->non_resident)) {
1533 ntfs_error(vol->sb, "$INDEX_ROOT attribute is not resident.");
1534 goto unm_err_out;
1535 }
1536
1537 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1538 le16_to_cpu(a->data.resident.value_offset)))) {
1539 ntfs_error(vol->sb, "$INDEX_ROOT attribute name is placed "
1540 "after the attribute value.");
1541 goto unm_err_out;
1542 }
1543
1544
1545
1546
1547 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_ENCRYPTED |
1548 ATTR_IS_SPARSE)) {
1549 ntfs_error(vi->i_sb, "Found compressed/encrypted/sparse index "
1550 "root attribute.");
1551 goto unm_err_out;
1552 }
1553 ir = (INDEX_ROOT*)((u8*)a + le16_to_cpu(a->data.resident.value_offset));
1554 ir_end = (u8*)ir + le32_to_cpu(a->data.resident.value_length);
1555 if (ir_end > (u8*)ctx->mrec + vol->mft_record_size) {
1556 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is corrupt.");
1557 goto unm_err_out;
1558 }
1559 index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
1560 if (index_end > ir_end) {
1561 ntfs_error(vi->i_sb, "Index is corrupt.");
1562 goto unm_err_out;
1563 }
1564 if (ir->type) {
1565 ntfs_error(vi->i_sb, "Index type is not 0 (type is 0x%x).",
1566 le32_to_cpu(ir->type));
1567 goto unm_err_out;
1568 }
1569 ni->itype.index.collation_rule = ir->collation_rule;
1570 ntfs_debug("Index collation rule is 0x%x.",
1571 le32_to_cpu(ir->collation_rule));
1572 ni->itype.index.block_size = le32_to_cpu(ir->index_block_size);
1573 if (ni->itype.index.block_size & (ni->itype.index.block_size - 1)) {
1574 ntfs_error(vi->i_sb, "Index block size (%u) is not a power of "
1575 "two.", ni->itype.index.block_size);
1576 goto unm_err_out;
1577 }
1578 if (ni->itype.index.block_size > PAGE_CACHE_SIZE) {
1579 ntfs_error(vi->i_sb, "Index block size (%u) > PAGE_CACHE_SIZE "
1580 "(%ld) is not supported. Sorry.",
1581 ni->itype.index.block_size, PAGE_CACHE_SIZE);
1582 err = -EOPNOTSUPP;
1583 goto unm_err_out;
1584 }
1585 if (ni->itype.index.block_size < NTFS_BLOCK_SIZE) {
1586 ntfs_error(vi->i_sb, "Index block size (%u) < NTFS_BLOCK_SIZE "
1587 "(%i) is not supported. Sorry.",
1588 ni->itype.index.block_size, NTFS_BLOCK_SIZE);
1589 err = -EOPNOTSUPP;
1590 goto unm_err_out;
1591 }
1592 ni->itype.index.block_size_bits = ffs(ni->itype.index.block_size) - 1;
1593
1594 if (vol->cluster_size <= ni->itype.index.block_size) {
1595 ni->itype.index.vcn_size = vol->cluster_size;
1596 ni->itype.index.vcn_size_bits = vol->cluster_size_bits;
1597 } else {
1598 ni->itype.index.vcn_size = vol->sector_size;
1599 ni->itype.index.vcn_size_bits = vol->sector_size_bits;
1600 }
1601
1602 if (!(ir->index.flags & LARGE_INDEX)) {
1603
1604 vi->i_size = ni->initialized_size = ni->allocated_size = 0;
1605
1606 ntfs_attr_put_search_ctx(ctx);
1607 unmap_mft_record(base_ni);
1608 m = NULL;
1609 ctx = NULL;
1610 goto skip_large_index_stuff;
1611 }
1612 NInoSetIndexAllocPresent(ni);
1613
1614 ntfs_attr_reinit_search_ctx(ctx);
1615 err = ntfs_attr_lookup(AT_INDEX_ALLOCATION, ni->name, ni->name_len,
1616 CASE_SENSITIVE, 0, NULL, 0, ctx);
1617 if (unlikely(err)) {
1618 if (err == -ENOENT)
1619 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1620 "not present but $INDEX_ROOT "
1621 "indicated it is.");
1622 else
1623 ntfs_error(vi->i_sb, "Failed to lookup "
1624 "$INDEX_ALLOCATION attribute.");
1625 goto unm_err_out;
1626 }
1627 a = ctx->attr;
1628 if (!a->non_resident) {
1629 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1630 "resident.");
1631 goto unm_err_out;
1632 }
1633
1634
1635
1636 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1637 le16_to_cpu(
1638 a->data.non_resident.mapping_pairs_offset)))) {
1639 ntfs_error(vol->sb, "$INDEX_ALLOCATION attribute name is "
1640 "placed after the mapping pairs array.");
1641 goto unm_err_out;
1642 }
1643 if (a->flags & ATTR_IS_ENCRYPTED) {
1644 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1645 "encrypted.");
1646 goto unm_err_out;
1647 }
1648 if (a->flags & ATTR_IS_SPARSE) {
1649 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is sparse.");
1650 goto unm_err_out;
1651 }
1652 if (a->flags & ATTR_COMPRESSION_MASK) {
1653 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1654 "compressed.");
1655 goto unm_err_out;
1656 }
1657 if (a->data.non_resident.lowest_vcn) {
1658 ntfs_error(vi->i_sb, "First extent of $INDEX_ALLOCATION "
1659 "attribute has non zero lowest_vcn.");
1660 goto unm_err_out;
1661 }
1662 vi->i_size = sle64_to_cpu(a->data.non_resident.data_size);
1663 ni->initialized_size = sle64_to_cpu(
1664 a->data.non_resident.initialized_size);
1665 ni->allocated_size = sle64_to_cpu(a->data.non_resident.allocated_size);
1666
1667
1668
1669
1670 ntfs_attr_put_search_ctx(ctx);
1671 unmap_mft_record(base_ni);
1672 m = NULL;
1673 ctx = NULL;
1674
1675 bvi = ntfs_attr_iget(base_vi, AT_BITMAP, ni->name, ni->name_len);
1676 if (IS_ERR(bvi)) {
1677 ntfs_error(vi->i_sb, "Failed to get bitmap attribute.");
1678 err = PTR_ERR(bvi);
1679 goto unm_err_out;
1680 }
1681 bni = NTFS_I(bvi);
1682 if (NInoCompressed(bni) || NInoEncrypted(bni) ||
1683 NInoSparse(bni)) {
1684 ntfs_error(vi->i_sb, "$BITMAP attribute is compressed and/or "
1685 "encrypted and/or sparse.");
1686 goto iput_unm_err_out;
1687 }
1688
1689 bvi_size = i_size_read(bvi);
1690 if ((bvi_size << 3) < (vi->i_size >> ni->itype.index.block_size_bits)) {
1691 ntfs_error(vi->i_sb, "Index bitmap too small (0x%llx) for "
1692 "index allocation (0x%llx).", bvi_size << 3,
1693 vi->i_size);
1694 goto iput_unm_err_out;
1695 }
1696 iput(bvi);
1697skip_large_index_stuff:
1698
1699 vi->i_op = NULL;
1700 vi->i_fop = NULL;
1701 vi->i_mapping->a_ops = &ntfs_mst_aops;
1702 vi->i_blocks = ni->allocated_size >> 9;
1703
1704
1705
1706
1707 igrab(base_vi);
1708 ni->ext.base_ntfs_ino = base_ni;
1709 ni->nr_extents = -1;
1710
1711 ntfs_debug("Done.");
1712 return 0;
1713iput_unm_err_out:
1714 iput(bvi);
1715unm_err_out:
1716 if (!err)
1717 err = -EIO;
1718 if (ctx)
1719 ntfs_attr_put_search_ctx(ctx);
1720 if (m)
1721 unmap_mft_record(base_ni);
1722err_out:
1723 ntfs_error(vi->i_sb, "Failed with error code %i while reading index "
1724 "inode (mft_no 0x%lx, name_len %i.", err, vi->i_ino,
1725 ni->name_len);
1726 make_bad_inode(vi);
1727 if (err != -EOPNOTSUPP && err != -ENOMEM)
1728 NVolSetErrors(vol);
1729 return err;
1730}
1731
1732
1733
1734
1735
1736
1737
1738
1739static struct lock_class_key mft_ni_runlist_lock_key, mft_ni_mrec_lock_key;
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767int ntfs_read_inode_mount(struct inode *vi)
1768{
1769 VCN next_vcn, last_vcn, highest_vcn;
1770 s64 block;
1771 struct super_block *sb = vi->i_sb;
1772 ntfs_volume *vol = NTFS_SB(sb);
1773 struct buffer_head *bh;
1774 ntfs_inode *ni;
1775 MFT_RECORD *m = NULL;
1776 ATTR_RECORD *a;
1777 ntfs_attr_search_ctx *ctx;
1778 unsigned int i, nr_blocks;
1779 int err;
1780
1781 ntfs_debug("Entering.");
1782
1783
1784 ntfs_init_big_inode(vi);
1785
1786 ni = NTFS_I(vi);
1787
1788
1789 NInoSetNonResident(ni);
1790 NInoSetMstProtected(ni);
1791 NInoSetSparseDisabled(ni);
1792 ni->type = AT_DATA;
1793 ni->name = NULL;
1794 ni->name_len = 0;
1795
1796
1797
1798
1799 ni->itype.index.block_size = vol->mft_record_size;
1800 ni->itype.index.block_size_bits = vol->mft_record_size_bits;
1801
1802
1803 vol->mft_ino = vi;
1804
1805
1806 if (vol->mft_record_size > 64 * 1024) {
1807 ntfs_error(sb, "Unsupported mft record size %i (max 64kiB).",
1808 vol->mft_record_size);
1809 goto err_out;
1810 }
1811 i = vol->mft_record_size;
1812 if (i < sb->s_blocksize)
1813 i = sb->s_blocksize;
1814 m = (MFT_RECORD*)ntfs_malloc_nofs(i);
1815 if (!m) {
1816 ntfs_error(sb, "Failed to allocate buffer for $MFT record 0.");
1817 goto err_out;
1818 }
1819
1820
1821 block = vol->mft_lcn << vol->cluster_size_bits >>
1822 sb->s_blocksize_bits;
1823 nr_blocks = vol->mft_record_size >> sb->s_blocksize_bits;
1824 if (!nr_blocks)
1825 nr_blocks = 1;
1826
1827
1828 for (i = 0; i < nr_blocks; i++) {
1829 bh = sb_bread(sb, block++);
1830 if (!bh) {
1831 ntfs_error(sb, "Device read failed.");
1832 goto err_out;
1833 }
1834 memcpy((char*)m + (i << sb->s_blocksize_bits), bh->b_data,
1835 sb->s_blocksize);
1836 brelse(bh);
1837 }
1838
1839
1840 if (post_read_mst_fixup((NTFS_RECORD*)m, vol->mft_record_size)) {
1841
1842 ntfs_error(sb, "MST fixup failed. $MFT is corrupt.");
1843 goto err_out;
1844 }
1845
1846
1847 vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number);
1848
1849
1850 vi->i_mapping->a_ops = &ntfs_mst_aops;
1851
1852 ctx = ntfs_attr_get_search_ctx(ni, m);
1853 if (!ctx) {
1854 err = -ENOMEM;
1855 goto err_out;
1856 }
1857
1858
1859 err = ntfs_attr_lookup(AT_ATTRIBUTE_LIST, NULL, 0, 0, 0, NULL, 0, ctx);
1860 if (err) {
1861 if (unlikely(err != -ENOENT)) {
1862 ntfs_error(sb, "Failed to lookup attribute list "
1863 "attribute. You should run chkdsk.");
1864 goto put_err_out;
1865 }
1866 } else {
1867 ATTR_LIST_ENTRY *al_entry, *next_al_entry;
1868 u8 *al_end;
1869 static const char *es = " Not allowed. $MFT is corrupt. "
1870 "You should run chkdsk.";
1871
1872 ntfs_debug("Attribute list attribute found in $MFT.");
1873 NInoSetAttrList(ni);
1874 a = ctx->attr;
1875 if (a->flags & ATTR_COMPRESSION_MASK) {
1876 ntfs_error(sb, "Attribute list attribute is "
1877 "compressed.%s", es);
1878 goto put_err_out;
1879 }
1880 if (a->flags & ATTR_IS_ENCRYPTED ||
1881 a->flags & ATTR_IS_SPARSE) {
1882 if (a->non_resident) {
1883 ntfs_error(sb, "Non-resident attribute list "
1884 "attribute is encrypted/"
1885 "sparse.%s", es);
1886 goto put_err_out;
1887 }
1888 ntfs_warning(sb, "Resident attribute list attribute "
1889 "in $MFT system file is marked "
1890 "encrypted/sparse which is not true. "
1891 "However, Windows allows this and "
1892 "chkdsk does not detect or correct it "
1893 "so we will just ignore the invalid "
1894 "flags and pretend they are not set.");
1895 }
1896
1897 ni->attr_list_size = (u32)ntfs_attr_size(a);
1898 ni->attr_list = ntfs_malloc_nofs(ni->attr_list_size);
1899 if (!ni->attr_list) {
1900 ntfs_error(sb, "Not enough memory to allocate buffer "
1901 "for attribute list.");
1902 goto put_err_out;
1903 }
1904 if (a->non_resident) {
1905 NInoSetAttrListNonResident(ni);
1906 if (a->data.non_resident.lowest_vcn) {
1907 ntfs_error(sb, "Attribute list has non zero "
1908 "lowest_vcn. $MFT is corrupt. "
1909 "You should run chkdsk.");
1910 goto put_err_out;
1911 }
1912
1913 ni->attr_list_rl.rl = ntfs_mapping_pairs_decompress(vol,
1914 a, NULL);
1915 if (IS_ERR(ni->attr_list_rl.rl)) {
1916 err = PTR_ERR(ni->attr_list_rl.rl);
1917 ni->attr_list_rl.rl = NULL;
1918 ntfs_error(sb, "Mapping pairs decompression "
1919 "failed with error code %i.",
1920 -err);
1921 goto put_err_out;
1922 }
1923
1924 if ((err = load_attribute_list(vol, &ni->attr_list_rl,
1925 ni->attr_list, ni->attr_list_size,
1926 sle64_to_cpu(a->data.
1927 non_resident.initialized_size)))) {
1928 ntfs_error(sb, "Failed to load attribute list "
1929 "attribute with error code %i.",
1930 -err);
1931 goto put_err_out;
1932 }
1933 } else {
1934 if ((u8*)a + le16_to_cpu(
1935 a->data.resident.value_offset) +
1936 le32_to_cpu(
1937 a->data.resident.value_length) >
1938 (u8*)ctx->mrec + vol->mft_record_size) {
1939 ntfs_error(sb, "Corrupt attribute list "
1940 "attribute.");
1941 goto put_err_out;
1942 }
1943
1944 memcpy(ni->attr_list, (u8*)a + le16_to_cpu(
1945 a->data.resident.value_offset),
1946 le32_to_cpu(
1947 a->data.resident.value_length));
1948 }
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961 al_entry = (ATTR_LIST_ENTRY*)ni->attr_list;
1962 al_end = (u8*)al_entry + ni->attr_list_size;
1963 for (;; al_entry = next_al_entry) {
1964
1965 if ((u8*)al_entry < ni->attr_list ||
1966 (u8*)al_entry > al_end)
1967 goto em_put_err_out;
1968
1969 if ((u8*)al_entry == al_end)
1970 goto em_put_err_out;
1971 if (!al_entry->length)
1972 goto em_put_err_out;
1973 if ((u8*)al_entry + 6 > al_end || (u8*)al_entry +
1974 le16_to_cpu(al_entry->length) > al_end)
1975 goto em_put_err_out;
1976 next_al_entry = (ATTR_LIST_ENTRY*)((u8*)al_entry +
1977 le16_to_cpu(al_entry->length));
1978 if (le32_to_cpu(al_entry->type) >
1979 const_le32_to_cpu(AT_DATA))
1980 goto em_put_err_out;
1981 if (AT_DATA != al_entry->type)
1982 continue;
1983
1984 if (al_entry->name_length)
1985 goto em_put_err_out;
1986
1987 if (al_entry->lowest_vcn)
1988 goto em_put_err_out;
1989
1990 if (MREF_LE(al_entry->mft_reference) != vi->i_ino) {
1991
1992 ntfs_error(sb, "BUG: The first $DATA extent "
1993 "of $MFT is not in the base "
1994 "mft record. Please report "
1995 "you saw this message to "
1996 "linux-ntfs-dev@lists."
1997 "sourceforge.net");
1998 goto put_err_out;
1999 } else {
2000
2001 if (MSEQNO_LE(al_entry->mft_reference) !=
2002 ni->seq_no)
2003 goto em_put_err_out;
2004
2005 break;
2006 }
2007 }
2008 }
2009
2010 ntfs_attr_reinit_search_ctx(ctx);
2011
2012
2013 a = NULL;
2014 next_vcn = last_vcn = highest_vcn = 0;
2015 while (!(err = ntfs_attr_lookup(AT_DATA, NULL, 0, 0, next_vcn, NULL, 0,
2016 ctx))) {
2017 runlist_element *nrl;
2018
2019
2020 a = ctx->attr;
2021
2022 if (!a->non_resident) {
2023 ntfs_error(sb, "$MFT must be non-resident but a "
2024 "resident extent was found. $MFT is "
2025 "corrupt. Run chkdsk.");
2026 goto put_err_out;
2027 }
2028
2029 if (a->flags & ATTR_COMPRESSION_MASK ||
2030 a->flags & ATTR_IS_ENCRYPTED ||
2031 a->flags & ATTR_IS_SPARSE) {
2032 ntfs_error(sb, "$MFT must be uncompressed, "
2033 "non-sparse, and unencrypted but a "
2034 "compressed/sparse/encrypted extent "
2035 "was found. $MFT is corrupt. Run "
2036 "chkdsk.");
2037 goto put_err_out;
2038 }
2039
2040
2041
2042
2043
2044
2045 nrl = ntfs_mapping_pairs_decompress(vol, a, ni->runlist.rl);
2046 if (IS_ERR(nrl)) {
2047 ntfs_error(sb, "ntfs_mapping_pairs_decompress() "
2048 "failed with error code %ld. $MFT is "
2049 "corrupt.", PTR_ERR(nrl));
2050 goto put_err_out;
2051 }
2052 ni->runlist.rl = nrl;
2053
2054
2055 if (!next_vcn) {
2056 if (a->data.non_resident.lowest_vcn) {
2057 ntfs_error(sb, "First extent of $DATA "
2058 "attribute has non zero "
2059 "lowest_vcn. $MFT is corrupt. "
2060 "You should run chkdsk.");
2061 goto put_err_out;
2062 }
2063
2064 last_vcn = sle64_to_cpu(
2065 a->data.non_resident.allocated_size)
2066 >> vol->cluster_size_bits;
2067
2068 vi->i_size = sle64_to_cpu(
2069 a->data.non_resident.data_size);
2070 ni->initialized_size = sle64_to_cpu(
2071 a->data.non_resident.initialized_size);
2072 ni->allocated_size = sle64_to_cpu(
2073 a->data.non_resident.allocated_size);
2074
2075
2076
2077
2078 if ((vi->i_size >> vol->mft_record_size_bits) >=
2079 (1ULL << 32)) {
2080 ntfs_error(sb, "$MFT is too big! Aborting.");
2081 goto put_err_out;
2082 }
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102 ntfs_read_locked_inode(vi);
2103 if (is_bad_inode(vi)) {
2104 ntfs_error(sb, "ntfs_read_inode() of $MFT "
2105 "failed. BUG or corrupt $MFT. "
2106 "Run chkdsk and if no errors "
2107 "are found, please report you "
2108 "saw this message to "
2109 "linux-ntfs-dev@lists."
2110 "sourceforge.net");
2111 ntfs_attr_put_search_ctx(ctx);
2112
2113 ntfs_free(m);
2114 return -1;
2115 }
2116
2117
2118
2119
2120
2121 vi->i_uid = vi->i_gid = 0;
2122
2123 vi->i_mode = S_IFREG;
2124
2125 vi->i_op = &ntfs_empty_inode_ops;
2126 vi->i_fop = &ntfs_empty_file_ops;
2127 }
2128
2129
2130 highest_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn);
2131 next_vcn = highest_vcn + 1;
2132
2133
2134 if (next_vcn <= 0)
2135 break;
2136
2137
2138 if (next_vcn < sle64_to_cpu(
2139 a->data.non_resident.lowest_vcn)) {
2140 ntfs_error(sb, "$MFT has corrupt attribute list "
2141 "attribute. Run chkdsk.");
2142 goto put_err_out;
2143 }
2144 }
2145 if (err != -ENOENT) {
2146 ntfs_error(sb, "Failed to lookup $MFT/$DATA attribute extent. "
2147 "$MFT is corrupt. Run chkdsk.");
2148 goto put_err_out;
2149 }
2150 if (!a) {
2151 ntfs_error(sb, "$MFT/$DATA attribute not found. $MFT is "
2152 "corrupt. Run chkdsk.");
2153 goto put_err_out;
2154 }
2155 if (highest_vcn && highest_vcn != last_vcn - 1) {
2156 ntfs_error(sb, "Failed to load the complete runlist for "
2157 "$MFT/$DATA. Driver bug or corrupt $MFT. "
2158 "Run chkdsk.");
2159 ntfs_debug("highest_vcn = 0x%llx, last_vcn - 1 = 0x%llx",
2160 (unsigned long long)highest_vcn,
2161 (unsigned long long)last_vcn - 1);
2162 goto put_err_out;
2163 }
2164 ntfs_attr_put_search_ctx(ctx);
2165 ntfs_debug("Done.");
2166 ntfs_free(m);
2167
2168
2169
2170
2171
2172 lockdep_set_class(&ni->runlist.lock, &mft_ni_runlist_lock_key);
2173 lockdep_set_class(&ni->mrec_lock, &mft_ni_mrec_lock_key);
2174
2175 return 0;
2176
2177em_put_err_out:
2178 ntfs_error(sb, "Couldn't find first extent of $DATA attribute in "
2179 "attribute list. $MFT is corrupt. Run chkdsk.");
2180put_err_out:
2181 ntfs_attr_put_search_ctx(ctx);
2182err_out:
2183 ntfs_error(sb, "Failed. Marking inode as bad.");
2184 make_bad_inode(vi);
2185 ntfs_free(m);
2186 return -1;
2187}
2188
2189static void __ntfs_clear_inode(ntfs_inode *ni)
2190{
2191
2192 down_write(&ni->runlist.lock);
2193 if (ni->runlist.rl) {
2194 ntfs_free(ni->runlist.rl);
2195 ni->runlist.rl = NULL;
2196 }
2197 up_write(&ni->runlist.lock);
2198
2199 if (ni->attr_list) {
2200 ntfs_free(ni->attr_list);
2201 ni->attr_list = NULL;
2202 }
2203
2204 down_write(&ni->attr_list_rl.lock);
2205 if (ni->attr_list_rl.rl) {
2206 ntfs_free(ni->attr_list_rl.rl);
2207 ni->attr_list_rl.rl = NULL;
2208 }
2209 up_write(&ni->attr_list_rl.lock);
2210
2211 if (ni->name_len && ni->name != I30) {
2212
2213 BUG_ON(!ni->name);
2214 kfree(ni->name);
2215 }
2216}
2217
2218void ntfs_clear_extent_inode(ntfs_inode *ni)
2219{
2220 ntfs_debug("Entering for inode 0x%lx.", ni->mft_no);
2221
2222 BUG_ON(NInoAttr(ni));
2223 BUG_ON(ni->nr_extents != -1);
2224
2225#ifdef NTFS_RW
2226 if (NInoDirty(ni)) {
2227 if (!is_bad_inode(VFS_I(ni->ext.base_ntfs_ino)))
2228 ntfs_error(ni->vol->sb, "Clearing dirty extent inode! "
2229 "Losing data! This is a BUG!!!");
2230
2231 }
2232#endif
2233
2234 __ntfs_clear_inode(ni);
2235
2236
2237 ntfs_destroy_extent_inode(ni);
2238}
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250void ntfs_clear_big_inode(struct inode *vi)
2251{
2252 ntfs_inode *ni = NTFS_I(vi);
2253
2254#ifdef NTFS_RW
2255 if (NInoDirty(ni)) {
2256 bool was_bad = (is_bad_inode(vi));
2257
2258
2259 ntfs_commit_inode(vi);
2260
2261 if (!was_bad && (is_bad_inode(vi) || NInoDirty(ni))) {
2262 ntfs_error(vi->i_sb, "Failed to commit dirty inode "
2263 "0x%lx. Losing data!", vi->i_ino);
2264
2265 }
2266 }
2267#endif
2268
2269
2270 if (ni->nr_extents > 0) {
2271 int i;
2272
2273 for (i = 0; i < ni->nr_extents; i++)
2274 ntfs_clear_extent_inode(ni->ext.extent_ntfs_inos[i]);
2275 kfree(ni->ext.extent_ntfs_inos);
2276 }
2277
2278 __ntfs_clear_inode(ni);
2279
2280 if (NInoAttr(ni)) {
2281
2282 if (ni->nr_extents == -1) {
2283 iput(VFS_I(ni->ext.base_ntfs_ino));
2284 ni->nr_extents = 0;
2285 ni->ext.base_ntfs_ino = NULL;
2286 }
2287 }
2288 return;
2289}
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301int ntfs_show_options(struct seq_file *sf, struct vfsmount *mnt)
2302{
2303 ntfs_volume *vol = NTFS_SB(mnt->mnt_sb);
2304 int i;
2305
2306 seq_printf(sf, ",uid=%i", vol->uid);
2307 seq_printf(sf, ",gid=%i", vol->gid);
2308 if (vol->fmask == vol->dmask)
2309 seq_printf(sf, ",umask=0%o", vol->fmask);
2310 else {
2311 seq_printf(sf, ",fmask=0%o", vol->fmask);
2312 seq_printf(sf, ",dmask=0%o", vol->dmask);
2313 }
2314 seq_printf(sf, ",nls=%s", vol->nls_map->charset);
2315 if (NVolCaseSensitive(vol))
2316 seq_printf(sf, ",case_sensitive");
2317 if (NVolShowSystemFiles(vol))
2318 seq_printf(sf, ",show_sys_files");
2319 if (!NVolSparseEnabled(vol))
2320 seq_printf(sf, ",disable_sparse");
2321 for (i = 0; on_errors_arr[i].val; i++) {
2322 if (on_errors_arr[i].val & vol->on_errors)
2323 seq_printf(sf, ",errors=%s", on_errors_arr[i].str);
2324 }
2325 seq_printf(sf, ",mft_zone_multiplier=%i", vol->mft_zone_multiplier);
2326 return 0;
2327}
2328
2329#ifdef NTFS_RW
2330
2331static const char *es = " Leaving inconsistent metadata. Unmount and run "
2332 "chkdsk.";
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357int ntfs_truncate(struct inode *vi)
2358{
2359 s64 new_size, old_size, nr_freed, new_alloc_size, old_alloc_size;
2360 VCN highest_vcn;
2361 unsigned long flags;
2362 ntfs_inode *base_ni, *ni = NTFS_I(vi);
2363 ntfs_volume *vol = ni->vol;
2364 ntfs_attr_search_ctx *ctx;
2365 MFT_RECORD *m;
2366 ATTR_RECORD *a;
2367 const char *te = " Leaving file length out of sync with i_size.";
2368 int err, mp_size, size_change, alloc_change;
2369 u32 attr_len;
2370
2371 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
2372 BUG_ON(NInoAttr(ni));
2373 BUG_ON(S_ISDIR(vi->i_mode));
2374 BUG_ON(NInoMstProtected(ni));
2375 BUG_ON(ni->nr_extents < 0);
2376retry_truncate:
2377
2378
2379
2380
2381 down_write(&ni->runlist.lock);
2382 if (!NInoAttr(ni))
2383 base_ni = ni;
2384 else
2385 base_ni = ni->ext.base_ntfs_ino;
2386 m = map_mft_record(base_ni);
2387 if (IS_ERR(m)) {
2388 err = PTR_ERR(m);
2389 ntfs_error(vi->i_sb, "Failed to map mft record for inode 0x%lx "
2390 "(error code %d).%s", vi->i_ino, err, te);
2391 ctx = NULL;
2392 m = NULL;
2393 goto old_bad_out;
2394 }
2395 ctx = ntfs_attr_get_search_ctx(base_ni, m);
2396 if (unlikely(!ctx)) {
2397 ntfs_error(vi->i_sb, "Failed to allocate a search context for "
2398 "inode 0x%lx (not enough memory).%s",
2399 vi->i_ino, te);
2400 err = -ENOMEM;
2401 goto old_bad_out;
2402 }
2403 err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
2404 CASE_SENSITIVE, 0, NULL, 0, ctx);
2405 if (unlikely(err)) {
2406 if (err == -ENOENT) {
2407 ntfs_error(vi->i_sb, "Open attribute is missing from "
2408 "mft record. Inode 0x%lx is corrupt. "
2409 "Run chkdsk.%s", vi->i_ino, te);
2410 err = -EIO;
2411 } else
2412 ntfs_error(vi->i_sb, "Failed to lookup attribute in "
2413 "inode 0x%lx (error code %d).%s",
2414 vi->i_ino, err, te);
2415 goto old_bad_out;
2416 }
2417 m = ctx->mrec;
2418 a = ctx->attr;
2419
2420
2421
2422 new_size = i_size_read(vi);
2423
2424 old_size = ntfs_attr_size(a);
2425
2426 if (NInoNonResident(ni))
2427 new_alloc_size = (new_size + vol->cluster_size - 1) &
2428 ~(s64)vol->cluster_size_mask;
2429 else
2430 new_alloc_size = (new_size + 7) & ~7;
2431
2432 read_lock_irqsave(&ni->size_lock, flags);
2433 old_alloc_size = ni->allocated_size;
2434 read_unlock_irqrestore(&ni->size_lock, flags);
2435
2436
2437
2438
2439 size_change = -1;
2440 if (new_size - old_size >= 0) {
2441 size_change = 1;
2442 if (new_size == old_size)
2443 size_change = 0;
2444 }
2445
2446 alloc_change = -1;
2447 if (new_alloc_size - old_alloc_size >= 0) {
2448 alloc_change = 1;
2449 if (new_alloc_size == old_alloc_size)
2450 alloc_change = 0;
2451 }
2452
2453
2454
2455
2456 if (!size_change && !alloc_change)
2457 goto unm_done;
2458
2459 if (size_change) {
2460 err = ntfs_attr_size_bounds_check(vol, ni->type, new_size);
2461 if (unlikely(err)) {
2462 if (err == -ERANGE) {
2463 ntfs_error(vol->sb, "Truncate would cause the "
2464 "inode 0x%lx to %simum size "
2465 "for its attribute type "
2466 "(0x%x). Aborting truncate.",
2467 vi->i_ino,
2468 new_size > old_size ? "exceed "
2469 "the max" : "go under the min",
2470 le32_to_cpu(ni->type));
2471 err = -EFBIG;
2472 } else {
2473 ntfs_error(vol->sb, "Inode 0x%lx has unknown "
2474 "attribute type 0x%x. "
2475 "Aborting truncate.",
2476 vi->i_ino,
2477 le32_to_cpu(ni->type));
2478 err = -EIO;
2479 }
2480
2481 i_size_write(vi, old_size);
2482 goto err_out;
2483 }
2484 }
2485 if (NInoCompressed(ni) || NInoEncrypted(ni)) {
2486 ntfs_warning(vi->i_sb, "Changes in inode size are not "
2487 "supported yet for %s files, ignoring.",
2488 NInoCompressed(ni) ? "compressed" :
2489 "encrypted");
2490 err = -EOPNOTSUPP;
2491 goto bad_out;
2492 }
2493 if (a->non_resident)
2494 goto do_non_resident_truncate;
2495 BUG_ON(NInoNonResident(ni));
2496
2497 if (new_size < vol->mft_record_size &&
2498 !ntfs_resident_attr_value_resize(m, a, new_size)) {
2499
2500 flush_dcache_mft_record_page(ctx->ntfs_ino);
2501 mark_mft_record_dirty(ctx->ntfs_ino);
2502 write_lock_irqsave(&ni->size_lock, flags);
2503
2504 ni->allocated_size = le32_to_cpu(a->length) -
2505 le16_to_cpu(a->data.resident.value_offset);
2506
2507
2508
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 ni->initialized_size = new_size;
2535 write_unlock_irqrestore(&ni->size_lock, flags);
2536 goto unm_done;
2537 }
2538
2539 BUG_ON(size_change < 0);
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549 ntfs_attr_put_search_ctx(ctx);
2550 unmap_mft_record(base_ni);
2551 up_write(&ni->runlist.lock);
2552
2553
2554
2555
2556 err = ntfs_attr_make_non_resident(ni, old_size);
2557 if (likely(!err))
2558 goto retry_truncate;
2559
2560
2561
2562
2563
2564 if (unlikely(err != -EPERM && err != -ENOSPC)) {
2565 ntfs_error(vol->sb, "Cannot truncate inode 0x%lx, attribute "
2566 "type 0x%x, because the conversion from "
2567 "resident to non-resident attribute failed "
2568 "with error code %i.", vi->i_ino,
2569 (unsigned)le32_to_cpu(ni->type), err);
2570 if (err != -ENOMEM)
2571 err = -EIO;
2572 goto conv_err_out;
2573 }
2574
2575 if (err == -ENOSPC)
2576 ntfs_error(vol->sb, "Not enough space in the mft record/on "
2577 "disk for the non-resident attribute value. "
2578 "This case is not implemented yet.");
2579 else
2580 ntfs_error(vol->sb, "This attribute type may not be "
2581 "non-resident. This case is not implemented "
2582 "yet.");
2583 err = -EOPNOTSUPP;
2584 goto conv_err_out;
2585#if 0
2586
2587 if (!err)
2588 goto do_resident_extend;
2589
2590
2591
2592
2593
2594
2595 if (ni->type == AT_ATTRIBUTE_LIST ||
2596 ni->type == AT_STANDARD_INFORMATION) {
2597
2598
2599 err = -EOPNOTSUPP;
2600 if (!err)
2601 goto do_resident_extend;
2602 goto err_out;
2603 }
2604
2605
2606
2607 err = -EOPNOTSUPP;
2608 if (!err)
2609 goto do_resident_extend;
2610
2611 goto err_out;
2612#endif
2613do_non_resident_truncate:
2614 BUG_ON(!NInoNonResident(ni));
2615 if (alloc_change < 0) {
2616 highest_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn);
2617 if (highest_vcn > 0 &&
2618 old_alloc_size >> vol->cluster_size_bits >
2619 highest_vcn + 1) {
2620
2621
2622
2623
2624 ntfs_error(vol->sb, "Cannot truncate inode 0x%lx, "
2625 "attribute type 0x%x, because the "
2626 "attribute is highly fragmented (it "
2627 "consists of multiple extents) and "
2628 "this case is not implemented yet.",
2629 vi->i_ino,
2630 (unsigned)le32_to_cpu(ni->type));
2631 err = -EOPNOTSUPP;
2632 goto bad_out;
2633 }
2634 }
2635
2636
2637
2638
2639 if (size_change < 0) {
2640
2641
2642
2643 write_lock_irqsave(&ni->size_lock, flags);
2644 if (new_size < ni->initialized_size) {
2645 ni->initialized_size = new_size;
2646 a->data.non_resident.initialized_size =
2647 cpu_to_sle64(new_size);
2648 }
2649 a->data.non_resident.data_size = cpu_to_sle64(new_size);
2650 write_unlock_irqrestore(&ni->size_lock, flags);
2651 flush_dcache_mft_record_page(ctx->ntfs_ino);
2652 mark_mft_record_dirty(ctx->ntfs_ino);
2653
2654 if (!alloc_change)
2655 goto unm_done;
2656
2657
2658
2659
2660 BUG_ON(alloc_change > 0);
2661 } else {
2662
2663
2664
2665
2666 if (alloc_change > 0) {
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682 ntfs_attr_put_search_ctx(ctx);
2683 unmap_mft_record(base_ni);
2684 up_write(&ni->runlist.lock);
2685 err = ntfs_attr_extend_allocation(ni, new_size,
2686 size_change > 0 ? new_size : -1, -1);
2687
2688
2689
2690
2691 goto done;
2692 }
2693 if (!alloc_change)
2694 goto alloc_done;
2695 }
2696
2697
2698 nr_freed = ntfs_cluster_free(ni, new_alloc_size >>
2699 vol->cluster_size_bits, -1, ctx);
2700 m = ctx->mrec;
2701 a = ctx->attr;
2702 if (unlikely(nr_freed < 0)) {
2703 ntfs_error(vol->sb, "Failed to release cluster(s) (error code "
2704 "%lli). Unmount and run chkdsk to recover "
2705 "the lost cluster(s).", (long long)nr_freed);
2706 NVolSetErrors(vol);
2707 nr_freed = 0;
2708 }
2709
2710 err = ntfs_rl_truncate_nolock(vol, &ni->runlist,
2711 new_alloc_size >> vol->cluster_size_bits);
2712
2713
2714
2715
2716
2717
2718 if (unlikely(err || IS_ERR(m))) {
2719 ntfs_error(vol->sb, "Failed to %s (error code %li).%s",
2720 IS_ERR(m) ?
2721 "restore attribute search context" :
2722 "truncate attribute runlist",
2723 IS_ERR(m) ? PTR_ERR(m) : err, es);
2724 err = -EIO;
2725 goto bad_out;
2726 }
2727
2728 mp_size = ntfs_get_size_for_mapping_pairs(vol, ni->runlist.rl, 0, -1);
2729 if (unlikely(mp_size <= 0)) {
2730 ntfs_error(vol->sb, "Cannot shrink allocation of inode 0x%lx, "
2731 "attribute type 0x%x, because determining the "
2732 "size for the mapping pairs failed with error "
2733 "code %i.%s", vi->i_ino,
2734 (unsigned)le32_to_cpu(ni->type), mp_size, es);
2735 err = -EIO;
2736 goto bad_out;
2737 }
2738
2739
2740
2741
2742
2743 attr_len = le32_to_cpu(a->length);
2744 err = ntfs_attr_record_resize(m, a, mp_size +
2745 le16_to_cpu(a->data.non_resident.mapping_pairs_offset));
2746 BUG_ON(err);
2747
2748
2749
2750 err = ntfs_mapping_pairs_build(vol, (u8*)a +
2751 le16_to_cpu(a->data.non_resident.mapping_pairs_offset),
2752 mp_size, ni->runlist.rl, 0, -1, NULL);
2753 if (unlikely(err)) {
2754 ntfs_error(vol->sb, "Cannot shrink allocation of inode 0x%lx, "
2755 "attribute type 0x%x, because building the "
2756 "mapping pairs failed with error code %i.%s",
2757 vi->i_ino, (unsigned)le32_to_cpu(ni->type),
2758 err, es);
2759 err = -EIO;
2760 goto bad_out;
2761 }
2762
2763 a->data.non_resident.highest_vcn = cpu_to_sle64((new_alloc_size >>
2764 vol->cluster_size_bits) - 1);
2765 write_lock_irqsave(&ni->size_lock, flags);
2766 ni->allocated_size = new_alloc_size;
2767 a->data.non_resident.allocated_size = cpu_to_sle64(new_alloc_size);
2768 if (NInoSparse(ni) || NInoCompressed(ni)) {
2769 if (nr_freed) {
2770 ni->itype.compressed.size -= nr_freed <<
2771 vol->cluster_size_bits;
2772 BUG_ON(ni->itype.compressed.size < 0);
2773 a->data.non_resident.compressed_size = cpu_to_sle64(
2774 ni->itype.compressed.size);
2775 vi->i_blocks = ni->itype.compressed.size >> 9;
2776 }
2777 } else
2778 vi->i_blocks = new_alloc_size >> 9;
2779 write_unlock_irqrestore(&ni->size_lock, flags);
2780
2781
2782
2783
2784
2785
2786
2787
2788alloc_done:
2789
2790
2791
2792
2793 if (size_change > 0)
2794 a->data.non_resident.data_size = cpu_to_sle64(new_size);
2795
2796 flush_dcache_mft_record_page(ctx->ntfs_ino);
2797 mark_mft_record_dirty(ctx->ntfs_ino);
2798unm_done:
2799 ntfs_attr_put_search_ctx(ctx);
2800 unmap_mft_record(base_ni);
2801 up_write(&ni->runlist.lock);
2802done:
2803
2804
2805
2806
2807
2808
2809 if (!IS_NOCMTIME(VFS_I(base_ni)) && !IS_RDONLY(VFS_I(base_ni))) {
2810 struct timespec now = current_fs_time(VFS_I(base_ni)->i_sb);
2811 int sync_it = 0;
2812
2813 if (!timespec_equal(&VFS_I(base_ni)->i_mtime, &now) ||
2814 !timespec_equal(&VFS_I(base_ni)->i_ctime, &now))
2815 sync_it = 1;
2816 VFS_I(base_ni)->i_mtime = now;
2817 VFS_I(base_ni)->i_ctime = now;
2818
2819 if (sync_it)
2820 mark_inode_dirty_sync(VFS_I(base_ni));
2821 }
2822
2823 if (likely(!err)) {
2824 NInoClearTruncateFailed(ni);
2825 ntfs_debug("Done.");
2826 }
2827 return err;
2828old_bad_out:
2829 old_size = -1;
2830bad_out:
2831 if (err != -ENOMEM && err != -EOPNOTSUPP)
2832 NVolSetErrors(vol);
2833 if (err != -EOPNOTSUPP)
2834 NInoSetTruncateFailed(ni);
2835 else if (old_size >= 0)
2836 i_size_write(vi, old_size);
2837err_out:
2838 if (ctx)
2839 ntfs_attr_put_search_ctx(ctx);
2840 if (m)
2841 unmap_mft_record(base_ni);
2842 up_write(&ni->runlist.lock);
2843out:
2844 ntfs_debug("Failed. Returning error code %i.", err);
2845 return err;
2846conv_err_out:
2847 if (err != -ENOMEM && err != -EOPNOTSUPP)
2848 NVolSetErrors(vol);
2849 if (err != -EOPNOTSUPP)
2850 NInoSetTruncateFailed(ni);
2851 else
2852 i_size_write(vi, old_size);
2853 goto out;
2854}
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864void ntfs_truncate_vfs(struct inode *vi) {
2865 ntfs_truncate(vi);
2866}
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
2887{
2888 struct inode *vi = dentry->d_inode;
2889 int err;
2890 unsigned int ia_valid = attr->ia_valid;
2891
2892 err = inode_change_ok(vi, attr);
2893 if (err)
2894 goto out;
2895
2896 if (ia_valid & (ATTR_UID | ATTR_GID | ATTR_MODE)) {
2897 ntfs_warning(vi->i_sb, "Changes in user/group/mode are not "
2898 "supported yet, ignoring.");
2899 err = -EOPNOTSUPP;
2900 goto out;
2901 }
2902 if (ia_valid & ATTR_SIZE) {
2903 if (attr->ia_size != i_size_read(vi)) {
2904 ntfs_inode *ni = NTFS_I(vi);
2905
2906
2907
2908
2909 if (NInoCompressed(ni) || NInoEncrypted(ni)) {
2910 ntfs_warning(vi->i_sb, "Changes in inode size "
2911 "are not supported yet for "
2912 "%s files, ignoring.",
2913 NInoCompressed(ni) ?
2914 "compressed" : "encrypted");
2915 err = -EOPNOTSUPP;
2916 } else
2917 err = vmtruncate(vi, attr->ia_size);
2918 if (err || ia_valid == ATTR_SIZE)
2919 goto out;
2920 } else {
2921
2922
2923
2924
2925 ia_valid |= ATTR_MTIME | ATTR_CTIME;
2926 }
2927 }
2928 if (ia_valid & ATTR_ATIME)
2929 vi->i_atime = timespec_trunc(attr->ia_atime,
2930 vi->i_sb->s_time_gran);
2931 if (ia_valid & ATTR_MTIME)
2932 vi->i_mtime = timespec_trunc(attr->ia_mtime,
2933 vi->i_sb->s_time_gran);
2934 if (ia_valid & ATTR_CTIME)
2935 vi->i_ctime = timespec_trunc(attr->ia_ctime,
2936 vi->i_sb->s_time_gran);
2937 mark_inode_dirty(vi);
2938out:
2939 return err;
2940}
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960int ntfs_write_inode(struct inode *vi, int sync)
2961{
2962 sle64 nt;
2963 ntfs_inode *ni = NTFS_I(vi);
2964 ntfs_attr_search_ctx *ctx;
2965 MFT_RECORD *m;
2966 STANDARD_INFORMATION *si;
2967 int err = 0;
2968 bool modified = false;
2969
2970 ntfs_debug("Entering for %sinode 0x%lx.", NInoAttr(ni) ? "attr " : "",
2971 vi->i_ino);
2972
2973
2974
2975
2976
2977 if (NInoAttr(ni)) {
2978 NInoClearDirty(ni);
2979 ntfs_debug("Done.");
2980 return 0;
2981 }
2982
2983 m = map_mft_record(ni);
2984 if (IS_ERR(m)) {
2985 err = PTR_ERR(m);
2986 goto err_out;
2987 }
2988
2989 ctx = ntfs_attr_get_search_ctx(ni, m);
2990 if (unlikely(!ctx)) {
2991 err = -ENOMEM;
2992 goto unm_err_out;
2993 }
2994 err = ntfs_attr_lookup(AT_STANDARD_INFORMATION, NULL, 0,
2995 CASE_SENSITIVE, 0, NULL, 0, ctx);
2996 if (unlikely(err)) {
2997 ntfs_attr_put_search_ctx(ctx);
2998 goto unm_err_out;
2999 }
3000 si = (STANDARD_INFORMATION*)((u8*)ctx->attr +
3001 le16_to_cpu(ctx->attr->data.resident.value_offset));
3002
3003 nt = utc2ntfs(vi->i_mtime);
3004 if (si->last_data_change_time != nt) {
3005 ntfs_debug("Updating mtime for inode 0x%lx: old = 0x%llx, "
3006 "new = 0x%llx", vi->i_ino, (long long)
3007 sle64_to_cpu(si->last_data_change_time),
3008 (long long)sle64_to_cpu(nt));
3009 si->last_data_change_time = nt;
3010 modified = true;
3011 }
3012 nt = utc2ntfs(vi->i_ctime);
3013 if (si->last_mft_change_time != nt) {
3014 ntfs_debug("Updating ctime for inode 0x%lx: old = 0x%llx, "
3015 "new = 0x%llx", vi->i_ino, (long long)
3016 sle64_to_cpu(si->last_mft_change_time),
3017 (long long)sle64_to_cpu(nt));
3018 si->last_mft_change_time = nt;
3019 modified = true;
3020 }
3021 nt = utc2ntfs(vi->i_atime);
3022 if (si->last_access_time != nt) {
3023 ntfs_debug("Updating atime for inode 0x%lx: old = 0x%llx, "
3024 "new = 0x%llx", vi->i_ino,
3025 (long long)sle64_to_cpu(si->last_access_time),
3026 (long long)sle64_to_cpu(nt));
3027 si->last_access_time = nt;
3028 modified = true;
3029 }
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046 if (modified) {
3047 flush_dcache_mft_record_page(ctx->ntfs_ino);
3048 if (!NInoTestSetDirty(ctx->ntfs_ino))
3049 mark_ntfs_record_dirty(ctx->ntfs_ino->page,
3050 ctx->ntfs_ino->page_ofs);
3051 }
3052 ntfs_attr_put_search_ctx(ctx);
3053
3054 if (NInoDirty(ni))
3055 err = write_mft_record(ni, m, sync);
3056
3057 mutex_lock(&ni->extent_lock);
3058 if (ni->nr_extents > 0) {
3059 ntfs_inode **extent_nis = ni->ext.extent_ntfs_inos;
3060 int i;
3061
3062 ntfs_debug("Writing %i extent inodes.", ni->nr_extents);
3063 for (i = 0; i < ni->nr_extents; i++) {
3064 ntfs_inode *tni = extent_nis[i];
3065
3066 if (NInoDirty(tni)) {
3067 MFT_RECORD *tm = map_mft_record(tni);
3068 int ret;
3069
3070 if (IS_ERR(tm)) {
3071 if (!err || err == -ENOMEM)
3072 err = PTR_ERR(tm);
3073 continue;
3074 }
3075 ret = write_mft_record(tni, tm, sync);
3076 unmap_mft_record(tni);
3077 if (unlikely(ret)) {
3078 if (!err || err == -ENOMEM)
3079 err = ret;
3080 }
3081 }
3082 }
3083 }
3084 mutex_unlock(&ni->extent_lock);
3085 unmap_mft_record(ni);
3086 if (unlikely(err))
3087 goto err_out;
3088 ntfs_debug("Done.");
3089 return 0;
3090unm_err_out:
3091 unmap_mft_record(ni);
3092err_out:
3093 if (err == -ENOMEM) {
3094 ntfs_warning(vi->i_sb, "Not enough memory to write inode. "
3095 "Marking the inode dirty again, so the VFS "
3096 "retries later.");
3097 mark_inode_dirty(vi);
3098 } else {
3099 ntfs_error(vi->i_sb, "Failed (error %i): Run chkdsk.", -err);
3100 NVolSetErrors(ni->vol);
3101 }
3102 return err;
3103}
3104
3105#endif
3106