0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/buffer_head.h>
0009 #include <linux/fs.h>
0010 #include <linux/mm.h>
0011 #include <linux/mount.h>
0012 #include <linux/mutex.h>
0013 #include <linux/pagemap.h>
0014 #include <linux/quotaops.h>
0015 #include <linux/slab.h>
0016 #include <linux/log2.h>
0017
0018 #include "aops.h"
0019 #include "attrib.h"
0020 #include "bitmap.h"
0021 #include "dir.h"
0022 #include "debug.h"
0023 #include "inode.h"
0024 #include "lcnalloc.h"
0025 #include "malloc.h"
0026 #include "mft.h"
0027 #include "time.h"
0028 #include "ntfs.h"
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 int ntfs_test_inode(struct inode *vi, void *data)
0047 {
0048 ntfs_attr *na = (ntfs_attr *)data;
0049 ntfs_inode *ni;
0050
0051 if (vi->i_ino != na->mft_no)
0052 return 0;
0053 ni = NTFS_I(vi);
0054
0055 if (likely(!NInoAttr(ni))) {
0056
0057 if (unlikely(na->type != AT_UNUSED))
0058 return 0;
0059 } else {
0060
0061 if (ni->type != na->type)
0062 return 0;
0063 if (ni->name_len != na->name_len)
0064 return 0;
0065 if (na->name_len && memcmp(ni->name, na->name,
0066 na->name_len * sizeof(ntfschar)))
0067 return 0;
0068 }
0069
0070 return 1;
0071 }
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 static int ntfs_init_locked_inode(struct inode *vi, void *data)
0092 {
0093 ntfs_attr *na = (ntfs_attr *)data;
0094 ntfs_inode *ni = NTFS_I(vi);
0095
0096 vi->i_ino = na->mft_no;
0097
0098 ni->type = na->type;
0099 if (na->type == AT_INDEX_ALLOCATION)
0100 NInoSetMstProtected(ni);
0101
0102 ni->name = na->name;
0103 ni->name_len = na->name_len;
0104
0105
0106 if (likely(na->type == AT_UNUSED)) {
0107 BUG_ON(na->name);
0108 BUG_ON(na->name_len);
0109 return 0;
0110 }
0111
0112
0113 NInoSetAttr(ni);
0114
0115
0116
0117
0118
0119
0120
0121
0122 if (na->name_len && na->name != I30) {
0123 unsigned int i;
0124
0125 BUG_ON(!na->name);
0126 i = na->name_len * sizeof(ntfschar);
0127 ni->name = kmalloc(i + sizeof(ntfschar), GFP_ATOMIC);
0128 if (!ni->name)
0129 return -ENOMEM;
0130 memcpy(ni->name, na->name, i);
0131 ni->name[na->name_len] = 0;
0132 }
0133 return 0;
0134 }
0135
0136 static int ntfs_read_locked_inode(struct inode *vi);
0137 static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi);
0138 static int ntfs_read_locked_index_inode(struct inode *base_vi,
0139 struct inode *vi);
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no)
0158 {
0159 struct inode *vi;
0160 int err;
0161 ntfs_attr na;
0162
0163 na.mft_no = mft_no;
0164 na.type = AT_UNUSED;
0165 na.name = NULL;
0166 na.name_len = 0;
0167
0168 vi = iget5_locked(sb, mft_no, ntfs_test_inode,
0169 ntfs_init_locked_inode, &na);
0170 if (unlikely(!vi))
0171 return ERR_PTR(-ENOMEM);
0172
0173 err = 0;
0174
0175
0176 if (vi->i_state & I_NEW) {
0177 err = ntfs_read_locked_inode(vi);
0178 unlock_new_inode(vi);
0179 }
0180
0181
0182
0183
0184 if (unlikely(err == -ENOMEM)) {
0185 iput(vi);
0186 vi = ERR_PTR(err);
0187 }
0188 return vi;
0189 }
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type,
0215 ntfschar *name, u32 name_len)
0216 {
0217 struct inode *vi;
0218 int err;
0219 ntfs_attr na;
0220
0221
0222 BUG_ON(type == AT_INDEX_ALLOCATION);
0223
0224 na.mft_no = base_vi->i_ino;
0225 na.type = type;
0226 na.name = name;
0227 na.name_len = name_len;
0228
0229 vi = iget5_locked(base_vi->i_sb, na.mft_no, ntfs_test_inode,
0230 ntfs_init_locked_inode, &na);
0231 if (unlikely(!vi))
0232 return ERR_PTR(-ENOMEM);
0233
0234 err = 0;
0235
0236
0237 if (vi->i_state & I_NEW) {
0238 err = ntfs_read_locked_attr_inode(base_vi, vi);
0239 unlock_new_inode(vi);
0240 }
0241
0242
0243
0244
0245
0246 if (unlikely(err)) {
0247 iput(vi);
0248 vi = ERR_PTR(err);
0249 }
0250 return vi;
0251 }
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272 struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name,
0273 u32 name_len)
0274 {
0275 struct inode *vi;
0276 int err;
0277 ntfs_attr na;
0278
0279 na.mft_no = base_vi->i_ino;
0280 na.type = AT_INDEX_ALLOCATION;
0281 na.name = name;
0282 na.name_len = name_len;
0283
0284 vi = iget5_locked(base_vi->i_sb, na.mft_no, ntfs_test_inode,
0285 ntfs_init_locked_inode, &na);
0286 if (unlikely(!vi))
0287 return ERR_PTR(-ENOMEM);
0288
0289 err = 0;
0290
0291
0292 if (vi->i_state & I_NEW) {
0293 err = ntfs_read_locked_index_inode(base_vi, vi);
0294 unlock_new_inode(vi);
0295 }
0296
0297
0298
0299
0300
0301 if (unlikely(err)) {
0302 iput(vi);
0303 vi = ERR_PTR(err);
0304 }
0305 return vi;
0306 }
0307
0308 struct inode *ntfs_alloc_big_inode(struct super_block *sb)
0309 {
0310 ntfs_inode *ni;
0311
0312 ntfs_debug("Entering.");
0313 ni = alloc_inode_sb(sb, ntfs_big_inode_cache, GFP_NOFS);
0314 if (likely(ni != NULL)) {
0315 ni->state = 0;
0316 return VFS_I(ni);
0317 }
0318 ntfs_error(sb, "Allocation of NTFS big inode structure failed.");
0319 return NULL;
0320 }
0321
0322 void ntfs_free_big_inode(struct inode *inode)
0323 {
0324 kmem_cache_free(ntfs_big_inode_cache, NTFS_I(inode));
0325 }
0326
0327 static inline ntfs_inode *ntfs_alloc_extent_inode(void)
0328 {
0329 ntfs_inode *ni;
0330
0331 ntfs_debug("Entering.");
0332 ni = kmem_cache_alloc(ntfs_inode_cache, GFP_NOFS);
0333 if (likely(ni != NULL)) {
0334 ni->state = 0;
0335 return ni;
0336 }
0337 ntfs_error(NULL, "Allocation of NTFS inode structure failed.");
0338 return NULL;
0339 }
0340
0341 static void ntfs_destroy_extent_inode(ntfs_inode *ni)
0342 {
0343 ntfs_debug("Entering.");
0344 BUG_ON(ni->page);
0345 if (!atomic_dec_and_test(&ni->count))
0346 BUG();
0347 kmem_cache_free(ntfs_inode_cache, ni);
0348 }
0349
0350
0351
0352
0353
0354 static struct lock_class_key attr_list_rl_lock_class;
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368 void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni)
0369 {
0370 ntfs_debug("Entering.");
0371 rwlock_init(&ni->size_lock);
0372 ni->initialized_size = ni->allocated_size = 0;
0373 ni->seq_no = 0;
0374 atomic_set(&ni->count, 1);
0375 ni->vol = NTFS_SB(sb);
0376 ntfs_init_runlist(&ni->runlist);
0377 mutex_init(&ni->mrec_lock);
0378 ni->page = NULL;
0379 ni->page_ofs = 0;
0380 ni->attr_list_size = 0;
0381 ni->attr_list = NULL;
0382 ntfs_init_runlist(&ni->attr_list_rl);
0383 lockdep_set_class(&ni->attr_list_rl.lock,
0384 &attr_list_rl_lock_class);
0385 ni->itype.index.block_size = 0;
0386 ni->itype.index.vcn_size = 0;
0387 ni->itype.index.collation_rule = 0;
0388 ni->itype.index.block_size_bits = 0;
0389 ni->itype.index.vcn_size_bits = 0;
0390 mutex_init(&ni->extent_lock);
0391 ni->nr_extents = 0;
0392 ni->ext.base_ntfs_ino = NULL;
0393 }
0394
0395
0396
0397
0398
0399
0400 static struct lock_class_key extent_inode_mrec_lock_key;
0401
0402 inline ntfs_inode *ntfs_new_extent_inode(struct super_block *sb,
0403 unsigned long mft_no)
0404 {
0405 ntfs_inode *ni = ntfs_alloc_extent_inode();
0406
0407 ntfs_debug("Entering.");
0408 if (likely(ni != NULL)) {
0409 __ntfs_init_inode(sb, ni);
0410 lockdep_set_class(&ni->mrec_lock, &extent_inode_mrec_lock_key);
0411 ni->mft_no = mft_no;
0412 ni->type = AT_UNUSED;
0413 ni->name = NULL;
0414 ni->name_len = 0;
0415 }
0416 return ni;
0417 }
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432 static int ntfs_is_extended_system_file(ntfs_attr_search_ctx *ctx)
0433 {
0434 int nr_links, err;
0435
0436
0437 ntfs_attr_reinit_search_ctx(ctx);
0438
0439
0440 nr_links = le16_to_cpu(ctx->mrec->link_count);
0441
0442
0443 while (!(err = ntfs_attr_lookup(AT_FILE_NAME, NULL, 0, 0, 0, NULL, 0,
0444 ctx))) {
0445 FILE_NAME_ATTR *file_name_attr;
0446 ATTR_RECORD *attr = ctx->attr;
0447 u8 *p, *p2;
0448
0449 nr_links--;
0450
0451
0452
0453
0454 p = (u8*)attr + le32_to_cpu(attr->length);
0455 if (p < (u8*)ctx->mrec || (u8*)p > (u8*)ctx->mrec +
0456 le32_to_cpu(ctx->mrec->bytes_in_use)) {
0457 err_corrupt_attr:
0458 ntfs_error(ctx->ntfs_ino->vol->sb, "Corrupt file name "
0459 "attribute. You should run chkdsk.");
0460 return -EIO;
0461 }
0462 if (attr->non_resident) {
0463 ntfs_error(ctx->ntfs_ino->vol->sb, "Non-resident file "
0464 "name. You should run chkdsk.");
0465 return -EIO;
0466 }
0467 if (attr->flags) {
0468 ntfs_error(ctx->ntfs_ino->vol->sb, "File name with "
0469 "invalid flags. You should run "
0470 "chkdsk.");
0471 return -EIO;
0472 }
0473 if (!(attr->data.resident.flags & RESIDENT_ATTR_IS_INDEXED)) {
0474 ntfs_error(ctx->ntfs_ino->vol->sb, "Unindexed file "
0475 "name. You should run chkdsk.");
0476 return -EIO;
0477 }
0478 file_name_attr = (FILE_NAME_ATTR*)((u8*)attr +
0479 le16_to_cpu(attr->data.resident.value_offset));
0480 p2 = (u8 *)file_name_attr + le32_to_cpu(attr->data.resident.value_length);
0481 if (p2 < (u8*)attr || p2 > p)
0482 goto err_corrupt_attr;
0483
0484 if (MREF_LE(file_name_attr->parent_directory) == FILE_Extend)
0485 return 1;
0486 }
0487 if (unlikely(err != -ENOENT))
0488 return err;
0489 if (unlikely(nr_links)) {
0490 ntfs_error(ctx->ntfs_ino->vol->sb, "Inode hard link count "
0491 "doesn't match number of name attributes. You "
0492 "should run chkdsk.");
0493 return -EIO;
0494 }
0495 return 0;
0496 }
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524 static int ntfs_read_locked_inode(struct inode *vi)
0525 {
0526 ntfs_volume *vol = NTFS_SB(vi->i_sb);
0527 ntfs_inode *ni;
0528 struct inode *bvi;
0529 MFT_RECORD *m;
0530 ATTR_RECORD *a;
0531 STANDARD_INFORMATION *si;
0532 ntfs_attr_search_ctx *ctx;
0533 int err = 0;
0534
0535 ntfs_debug("Entering for i_ino 0x%lx.", vi->i_ino);
0536
0537
0538 vi->i_uid = vol->uid;
0539 vi->i_gid = vol->gid;
0540 vi->i_mode = 0;
0541
0542
0543
0544
0545
0546 if (vi->i_ino != FILE_MFT)
0547 ntfs_init_big_inode(vi);
0548 ni = NTFS_I(vi);
0549
0550 m = map_mft_record(ni);
0551 if (IS_ERR(m)) {
0552 err = PTR_ERR(m);
0553 goto err_out;
0554 }
0555 ctx = ntfs_attr_get_search_ctx(ni, m);
0556 if (!ctx) {
0557 err = -ENOMEM;
0558 goto unm_err_out;
0559 }
0560
0561 if (!(m->flags & MFT_RECORD_IN_USE)) {
0562 ntfs_error(vi->i_sb, "Inode is not in use!");
0563 goto unm_err_out;
0564 }
0565 if (m->base_mft_record) {
0566 ntfs_error(vi->i_sb, "Inode is an extent inode!");
0567 goto unm_err_out;
0568 }
0569
0570
0571 vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number);
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582 set_nlink(vi, le16_to_cpu(m->link_count));
0583
0584
0585
0586
0587
0588
0589
0590
0591 vi->i_mode |= S_IRWXUGO;
0592
0593 if (IS_RDONLY(vi))
0594 vi->i_mode &= ~S_IWUGO;
0595 if (m->flags & MFT_RECORD_IS_DIRECTORY) {
0596 vi->i_mode |= S_IFDIR;
0597
0598
0599
0600
0601 vi->i_mode &= ~vol->dmask;
0602
0603 if (vi->i_nlink > 1)
0604 set_nlink(vi, 1);
0605 } else {
0606 vi->i_mode |= S_IFREG;
0607
0608 vi->i_mode &= ~vol->fmask;
0609 }
0610
0611
0612
0613
0614
0615
0616 err = ntfs_attr_lookup(AT_STANDARD_INFORMATION, NULL, 0, 0, 0, NULL, 0,
0617 ctx);
0618 if (unlikely(err)) {
0619 if (err == -ENOENT) {
0620
0621
0622
0623
0624
0625 ntfs_error(vi->i_sb, "$STANDARD_INFORMATION attribute "
0626 "is missing.");
0627 }
0628 goto unm_err_out;
0629 }
0630 a = ctx->attr;
0631
0632 if ((u8 *)a + le16_to_cpu(a->data.resident.value_offset)
0633 + le32_to_cpu(a->data.resident.value_length) >
0634 (u8 *)ctx->mrec + vol->mft_record_size) {
0635 ntfs_error(vi->i_sb, "Corrupt standard information attribute in inode.");
0636 goto unm_err_out;
0637 }
0638 si = (STANDARD_INFORMATION*)((u8*)a +
0639 le16_to_cpu(a->data.resident.value_offset));
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651 vi->i_mtime = ntfs2utc(si->last_data_change_time);
0652
0653
0654
0655
0656
0657 vi->i_ctime = ntfs2utc(si->last_mft_change_time);
0658
0659
0660
0661
0662 vi->i_atime = ntfs2utc(si->last_access_time);
0663
0664
0665 ntfs_attr_reinit_search_ctx(ctx);
0666 err = ntfs_attr_lookup(AT_ATTRIBUTE_LIST, NULL, 0, 0, 0, NULL, 0, ctx);
0667 if (err) {
0668 if (unlikely(err != -ENOENT)) {
0669 ntfs_error(vi->i_sb, "Failed to lookup attribute list "
0670 "attribute.");
0671 goto unm_err_out;
0672 }
0673 } else {
0674 if (vi->i_ino == FILE_MFT)
0675 goto skip_attr_list_load;
0676 ntfs_debug("Attribute list found in inode 0x%lx.", vi->i_ino);
0677 NInoSetAttrList(ni);
0678 a = ctx->attr;
0679 if (a->flags & ATTR_COMPRESSION_MASK) {
0680 ntfs_error(vi->i_sb, "Attribute list attribute is "
0681 "compressed.");
0682 goto unm_err_out;
0683 }
0684 if (a->flags & ATTR_IS_ENCRYPTED ||
0685 a->flags & ATTR_IS_SPARSE) {
0686 if (a->non_resident) {
0687 ntfs_error(vi->i_sb, "Non-resident attribute "
0688 "list attribute is encrypted/"
0689 "sparse.");
0690 goto unm_err_out;
0691 }
0692 ntfs_warning(vi->i_sb, "Resident attribute list "
0693 "attribute in inode 0x%lx is marked "
0694 "encrypted/sparse which is not true. "
0695 "However, Windows allows this and "
0696 "chkdsk does not detect or correct it "
0697 "so we will just ignore the invalid "
0698 "flags and pretend they are not set.",
0699 vi->i_ino);
0700 }
0701
0702 ni->attr_list_size = (u32)ntfs_attr_size(a);
0703 ni->attr_list = ntfs_malloc_nofs(ni->attr_list_size);
0704 if (!ni->attr_list) {
0705 ntfs_error(vi->i_sb, "Not enough memory to allocate "
0706 "buffer for attribute list.");
0707 err = -ENOMEM;
0708 goto unm_err_out;
0709 }
0710 if (a->non_resident) {
0711 NInoSetAttrListNonResident(ni);
0712 if (a->data.non_resident.lowest_vcn) {
0713 ntfs_error(vi->i_sb, "Attribute list has non "
0714 "zero lowest_vcn.");
0715 goto unm_err_out;
0716 }
0717
0718
0719
0720
0721 ni->attr_list_rl.rl = ntfs_mapping_pairs_decompress(vol,
0722 a, NULL);
0723 if (IS_ERR(ni->attr_list_rl.rl)) {
0724 err = PTR_ERR(ni->attr_list_rl.rl);
0725 ni->attr_list_rl.rl = NULL;
0726 ntfs_error(vi->i_sb, "Mapping pairs "
0727 "decompression failed.");
0728 goto unm_err_out;
0729 }
0730
0731 if ((err = load_attribute_list(vol, &ni->attr_list_rl,
0732 ni->attr_list, ni->attr_list_size,
0733 sle64_to_cpu(a->data.non_resident.
0734 initialized_size)))) {
0735 ntfs_error(vi->i_sb, "Failed to load "
0736 "attribute list attribute.");
0737 goto unm_err_out;
0738 }
0739 } else {
0740 if ((u8*)a + le16_to_cpu(a->data.resident.value_offset)
0741 + le32_to_cpu(
0742 a->data.resident.value_length) >
0743 (u8*)ctx->mrec + vol->mft_record_size) {
0744 ntfs_error(vi->i_sb, "Corrupt attribute list "
0745 "in inode.");
0746 goto unm_err_out;
0747 }
0748
0749 memcpy(ni->attr_list, (u8*)a + le16_to_cpu(
0750 a->data.resident.value_offset),
0751 le32_to_cpu(
0752 a->data.resident.value_length));
0753 }
0754 }
0755 skip_attr_list_load:
0756
0757
0758
0759
0760 if (S_ISDIR(vi->i_mode)) {
0761 loff_t bvi_size;
0762 ntfs_inode *bni;
0763 INDEX_ROOT *ir;
0764 u8 *ir_end, *index_end;
0765
0766
0767 ntfs_attr_reinit_search_ctx(ctx);
0768 err = ntfs_attr_lookup(AT_INDEX_ROOT, I30, 4, CASE_SENSITIVE,
0769 0, NULL, 0, ctx);
0770 if (unlikely(err)) {
0771 if (err == -ENOENT) {
0772
0773
0774
0775 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute "
0776 "is missing.");
0777 }
0778 goto unm_err_out;
0779 }
0780 a = ctx->attr;
0781
0782 if (unlikely(a->non_resident)) {
0783 ntfs_error(vol->sb, "$INDEX_ROOT attribute is not "
0784 "resident.");
0785 goto unm_err_out;
0786 }
0787
0788 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
0789 le16_to_cpu(a->data.resident.value_offset)))) {
0790 ntfs_error(vol->sb, "$INDEX_ROOT attribute name is "
0791 "placed after the attribute value.");
0792 goto unm_err_out;
0793 }
0794
0795
0796
0797
0798
0799
0800 if (a->flags & ATTR_COMPRESSION_MASK)
0801 NInoSetCompressed(ni);
0802 if (a->flags & ATTR_IS_ENCRYPTED) {
0803 if (a->flags & ATTR_COMPRESSION_MASK) {
0804 ntfs_error(vi->i_sb, "Found encrypted and "
0805 "compressed attribute.");
0806 goto unm_err_out;
0807 }
0808 NInoSetEncrypted(ni);
0809 }
0810 if (a->flags & ATTR_IS_SPARSE)
0811 NInoSetSparse(ni);
0812 ir = (INDEX_ROOT*)((u8*)a +
0813 le16_to_cpu(a->data.resident.value_offset));
0814 ir_end = (u8*)ir + le32_to_cpu(a->data.resident.value_length);
0815 if (ir_end > (u8*)ctx->mrec + vol->mft_record_size) {
0816 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is "
0817 "corrupt.");
0818 goto unm_err_out;
0819 }
0820 index_end = (u8*)&ir->index +
0821 le32_to_cpu(ir->index.index_length);
0822 if (index_end > ir_end) {
0823 ntfs_error(vi->i_sb, "Directory index is corrupt.");
0824 goto unm_err_out;
0825 }
0826 if (ir->type != AT_FILE_NAME) {
0827 ntfs_error(vi->i_sb, "Indexed attribute is not "
0828 "$FILE_NAME.");
0829 goto unm_err_out;
0830 }
0831 if (ir->collation_rule != COLLATION_FILE_NAME) {
0832 ntfs_error(vi->i_sb, "Index collation rule is not "
0833 "COLLATION_FILE_NAME.");
0834 goto unm_err_out;
0835 }
0836 ni->itype.index.collation_rule = ir->collation_rule;
0837 ni->itype.index.block_size = le32_to_cpu(ir->index_block_size);
0838 if (ni->itype.index.block_size &
0839 (ni->itype.index.block_size - 1)) {
0840 ntfs_error(vi->i_sb, "Index block size (%u) is not a "
0841 "power of two.",
0842 ni->itype.index.block_size);
0843 goto unm_err_out;
0844 }
0845 if (ni->itype.index.block_size > PAGE_SIZE) {
0846 ntfs_error(vi->i_sb, "Index block size (%u) > "
0847 "PAGE_SIZE (%ld) is not "
0848 "supported. Sorry.",
0849 ni->itype.index.block_size,
0850 PAGE_SIZE);
0851 err = -EOPNOTSUPP;
0852 goto unm_err_out;
0853 }
0854 if (ni->itype.index.block_size < NTFS_BLOCK_SIZE) {
0855 ntfs_error(vi->i_sb, "Index block size (%u) < "
0856 "NTFS_BLOCK_SIZE (%i) is not "
0857 "supported. Sorry.",
0858 ni->itype.index.block_size,
0859 NTFS_BLOCK_SIZE);
0860 err = -EOPNOTSUPP;
0861 goto unm_err_out;
0862 }
0863 ni->itype.index.block_size_bits =
0864 ffs(ni->itype.index.block_size) - 1;
0865
0866 if (vol->cluster_size <= ni->itype.index.block_size) {
0867 ni->itype.index.vcn_size = vol->cluster_size;
0868 ni->itype.index.vcn_size_bits = vol->cluster_size_bits;
0869 } else {
0870 ni->itype.index.vcn_size = vol->sector_size;
0871 ni->itype.index.vcn_size_bits = vol->sector_size_bits;
0872 }
0873
0874
0875 NInoSetMstProtected(ni);
0876 ni->type = AT_INDEX_ALLOCATION;
0877 ni->name = I30;
0878 ni->name_len = 4;
0879
0880 if (!(ir->index.flags & LARGE_INDEX)) {
0881
0882 vi->i_size = ni->initialized_size =
0883 ni->allocated_size = 0;
0884
0885 ntfs_attr_put_search_ctx(ctx);
0886 unmap_mft_record(ni);
0887 m = NULL;
0888 ctx = NULL;
0889 goto skip_large_dir_stuff;
0890 }
0891 NInoSetIndexAllocPresent(ni);
0892
0893 ntfs_attr_reinit_search_ctx(ctx);
0894 err = ntfs_attr_lookup(AT_INDEX_ALLOCATION, I30, 4,
0895 CASE_SENSITIVE, 0, NULL, 0, ctx);
0896 if (unlikely(err)) {
0897 if (err == -ENOENT)
0898 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION "
0899 "attribute is not present but "
0900 "$INDEX_ROOT indicated it is.");
0901 else
0902 ntfs_error(vi->i_sb, "Failed to lookup "
0903 "$INDEX_ALLOCATION "
0904 "attribute.");
0905 goto unm_err_out;
0906 }
0907 a = ctx->attr;
0908 if (!a->non_resident) {
0909 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
0910 "is resident.");
0911 goto unm_err_out;
0912 }
0913
0914
0915
0916
0917 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
0918 le16_to_cpu(
0919 a->data.non_resident.mapping_pairs_offset)))) {
0920 ntfs_error(vol->sb, "$INDEX_ALLOCATION attribute name "
0921 "is placed after the mapping pairs "
0922 "array.");
0923 goto unm_err_out;
0924 }
0925 if (a->flags & ATTR_IS_ENCRYPTED) {
0926 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
0927 "is encrypted.");
0928 goto unm_err_out;
0929 }
0930 if (a->flags & ATTR_IS_SPARSE) {
0931 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
0932 "is sparse.");
0933 goto unm_err_out;
0934 }
0935 if (a->flags & ATTR_COMPRESSION_MASK) {
0936 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute "
0937 "is compressed.");
0938 goto unm_err_out;
0939 }
0940 if (a->data.non_resident.lowest_vcn) {
0941 ntfs_error(vi->i_sb, "First extent of "
0942 "$INDEX_ALLOCATION attribute has non "
0943 "zero lowest_vcn.");
0944 goto unm_err_out;
0945 }
0946 vi->i_size = sle64_to_cpu(a->data.non_resident.data_size);
0947 ni->initialized_size = sle64_to_cpu(
0948 a->data.non_resident.initialized_size);
0949 ni->allocated_size = sle64_to_cpu(
0950 a->data.non_resident.allocated_size);
0951
0952
0953
0954
0955 ntfs_attr_put_search_ctx(ctx);
0956 unmap_mft_record(ni);
0957 m = NULL;
0958 ctx = NULL;
0959
0960 bvi = ntfs_attr_iget(vi, AT_BITMAP, I30, 4);
0961 if (IS_ERR(bvi)) {
0962 ntfs_error(vi->i_sb, "Failed to get bitmap attribute.");
0963 err = PTR_ERR(bvi);
0964 goto unm_err_out;
0965 }
0966 bni = NTFS_I(bvi);
0967 if (NInoCompressed(bni) || NInoEncrypted(bni) ||
0968 NInoSparse(bni)) {
0969 ntfs_error(vi->i_sb, "$BITMAP attribute is compressed "
0970 "and/or encrypted and/or sparse.");
0971 goto iput_unm_err_out;
0972 }
0973
0974 bvi_size = i_size_read(bvi);
0975 if ((bvi_size << 3) < (vi->i_size >>
0976 ni->itype.index.block_size_bits)) {
0977 ntfs_error(vi->i_sb, "Index bitmap too small (0x%llx) "
0978 "for index allocation (0x%llx).",
0979 bvi_size << 3, vi->i_size);
0980 goto iput_unm_err_out;
0981 }
0982
0983 iput(bvi);
0984 skip_large_dir_stuff:
0985
0986 vi->i_op = &ntfs_dir_inode_ops;
0987 vi->i_fop = &ntfs_dir_ops;
0988 vi->i_mapping->a_ops = &ntfs_mst_aops;
0989 } else {
0990
0991 ntfs_attr_reinit_search_ctx(ctx);
0992
0993
0994 ni->type = AT_DATA;
0995 ni->name = NULL;
0996 ni->name_len = 0;
0997
0998
0999 err = ntfs_attr_lookup(AT_DATA, NULL, 0, 0, 0, NULL, 0, ctx);
1000 if (unlikely(err)) {
1001 vi->i_size = ni->initialized_size =
1002 ni->allocated_size = 0;
1003 if (err != -ENOENT) {
1004 ntfs_error(vi->i_sb, "Failed to lookup $DATA "
1005 "attribute.");
1006 goto unm_err_out;
1007 }
1008
1009
1010
1011
1012 if (vi->i_ino == FILE_Secure)
1013 goto no_data_attr_special_case;
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023 if (ntfs_is_extended_system_file(ctx) > 0)
1024 goto no_data_attr_special_case;
1025
1026
1027 ntfs_error(vi->i_sb, "$DATA attribute is missing.");
1028 goto unm_err_out;
1029 }
1030 a = ctx->attr;
1031
1032 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) {
1033 if (a->flags & ATTR_COMPRESSION_MASK) {
1034 NInoSetCompressed(ni);
1035 if (vol->cluster_size > 4096) {
1036 ntfs_error(vi->i_sb, "Found "
1037 "compressed data but "
1038 "compression is "
1039 "disabled due to "
1040 "cluster size (%i) > "
1041 "4kiB.",
1042 vol->cluster_size);
1043 goto unm_err_out;
1044 }
1045 if ((a->flags & ATTR_COMPRESSION_MASK)
1046 != ATTR_IS_COMPRESSED) {
1047 ntfs_error(vi->i_sb, "Found unknown "
1048 "compression method "
1049 "or corrupt file.");
1050 goto unm_err_out;
1051 }
1052 }
1053 if (a->flags & ATTR_IS_SPARSE)
1054 NInoSetSparse(ni);
1055 }
1056 if (a->flags & ATTR_IS_ENCRYPTED) {
1057 if (NInoCompressed(ni)) {
1058 ntfs_error(vi->i_sb, "Found encrypted and "
1059 "compressed data.");
1060 goto unm_err_out;
1061 }
1062 NInoSetEncrypted(ni);
1063 }
1064 if (a->non_resident) {
1065 NInoSetNonResident(ni);
1066 if (NInoCompressed(ni) || NInoSparse(ni)) {
1067 if (NInoCompressed(ni) && a->data.non_resident.
1068 compression_unit != 4) {
1069 ntfs_error(vi->i_sb, "Found "
1070 "non-standard "
1071 "compression unit (%u "
1072 "instead of 4). "
1073 "Cannot handle this.",
1074 a->data.non_resident.
1075 compression_unit);
1076 err = -EOPNOTSUPP;
1077 goto unm_err_out;
1078 }
1079 if (a->data.non_resident.compression_unit) {
1080 ni->itype.compressed.block_size = 1U <<
1081 (a->data.non_resident.
1082 compression_unit +
1083 vol->cluster_size_bits);
1084 ni->itype.compressed.block_size_bits =
1085 ffs(ni->itype.
1086 compressed.
1087 block_size) - 1;
1088 ni->itype.compressed.block_clusters =
1089 1U << a->data.
1090 non_resident.
1091 compression_unit;
1092 } else {
1093 ni->itype.compressed.block_size = 0;
1094 ni->itype.compressed.block_size_bits =
1095 0;
1096 ni->itype.compressed.block_clusters =
1097 0;
1098 }
1099 ni->itype.compressed.size = sle64_to_cpu(
1100 a->data.non_resident.
1101 compressed_size);
1102 }
1103 if (a->data.non_resident.lowest_vcn) {
1104 ntfs_error(vi->i_sb, "First extent of $DATA "
1105 "attribute has non zero "
1106 "lowest_vcn.");
1107 goto unm_err_out;
1108 }
1109 vi->i_size = sle64_to_cpu(
1110 a->data.non_resident.data_size);
1111 ni->initialized_size = sle64_to_cpu(
1112 a->data.non_resident.initialized_size);
1113 ni->allocated_size = sle64_to_cpu(
1114 a->data.non_resident.allocated_size);
1115 } else {
1116 vi->i_size = ni->initialized_size = le32_to_cpu(
1117 a->data.resident.value_length);
1118 ni->allocated_size = le32_to_cpu(a->length) -
1119 le16_to_cpu(
1120 a->data.resident.value_offset);
1121 if (vi->i_size > ni->allocated_size) {
1122 ntfs_error(vi->i_sb, "Resident data attribute "
1123 "is corrupt (size exceeds "
1124 "allocation).");
1125 goto unm_err_out;
1126 }
1127 }
1128 no_data_attr_special_case:
1129
1130 ntfs_attr_put_search_ctx(ctx);
1131 unmap_mft_record(ni);
1132 m = NULL;
1133 ctx = NULL;
1134
1135 vi->i_op = &ntfs_file_inode_ops;
1136 vi->i_fop = &ntfs_file_ops;
1137 vi->i_mapping->a_ops = &ntfs_normal_aops;
1138 if (NInoMstProtected(ni))
1139 vi->i_mapping->a_ops = &ntfs_mst_aops;
1140 else if (NInoCompressed(ni))
1141 vi->i_mapping->a_ops = &ntfs_compressed_aops;
1142 }
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154 if (S_ISREG(vi->i_mode) && (NInoCompressed(ni) || NInoSparse(ni)))
1155 vi->i_blocks = ni->itype.compressed.size >> 9;
1156 else
1157 vi->i_blocks = ni->allocated_size >> 9;
1158 ntfs_debug("Done.");
1159 return 0;
1160 iput_unm_err_out:
1161 iput(bvi);
1162 unm_err_out:
1163 if (!err)
1164 err = -EIO;
1165 if (ctx)
1166 ntfs_attr_put_search_ctx(ctx);
1167 if (m)
1168 unmap_mft_record(ni);
1169 err_out:
1170 ntfs_error(vol->sb, "Failed with error code %i. Marking corrupt "
1171 "inode 0x%lx as bad. Run chkdsk.", err, vi->i_ino);
1172 make_bad_inode(vi);
1173 if (err != -EOPNOTSUPP && err != -ENOMEM)
1174 NVolSetErrors(vol);
1175 return err;
1176 }
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200 static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
1201 {
1202 ntfs_volume *vol = NTFS_SB(vi->i_sb);
1203 ntfs_inode *ni, *base_ni;
1204 MFT_RECORD *m;
1205 ATTR_RECORD *a;
1206 ntfs_attr_search_ctx *ctx;
1207 int err = 0;
1208
1209 ntfs_debug("Entering for i_ino 0x%lx.", vi->i_ino);
1210
1211 ntfs_init_big_inode(vi);
1212
1213 ni = NTFS_I(vi);
1214 base_ni = NTFS_I(base_vi);
1215
1216
1217 vi->i_uid = base_vi->i_uid;
1218 vi->i_gid = base_vi->i_gid;
1219 set_nlink(vi, base_vi->i_nlink);
1220 vi->i_mtime = base_vi->i_mtime;
1221 vi->i_ctime = base_vi->i_ctime;
1222 vi->i_atime = base_vi->i_atime;
1223 vi->i_generation = ni->seq_no = base_ni->seq_no;
1224
1225
1226 vi->i_mode = base_vi->i_mode & ~S_IFMT;
1227
1228 m = map_mft_record(base_ni);
1229 if (IS_ERR(m)) {
1230 err = PTR_ERR(m);
1231 goto err_out;
1232 }
1233 ctx = ntfs_attr_get_search_ctx(base_ni, m);
1234 if (!ctx) {
1235 err = -ENOMEM;
1236 goto unm_err_out;
1237 }
1238
1239 err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
1240 CASE_SENSITIVE, 0, NULL, 0, ctx);
1241 if (unlikely(err))
1242 goto unm_err_out;
1243 a = ctx->attr;
1244 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) {
1245 if (a->flags & ATTR_COMPRESSION_MASK) {
1246 NInoSetCompressed(ni);
1247 if ((ni->type != AT_DATA) || (ni->type == AT_DATA &&
1248 ni->name_len)) {
1249 ntfs_error(vi->i_sb, "Found compressed "
1250 "non-data or named data "
1251 "attribute. Please report "
1252 "you saw this message to "
1253 "linux-ntfs-dev@lists."
1254 "sourceforge.net");
1255 goto unm_err_out;
1256 }
1257 if (vol->cluster_size > 4096) {
1258 ntfs_error(vi->i_sb, "Found compressed "
1259 "attribute but compression is "
1260 "disabled due to cluster size "
1261 "(%i) > 4kiB.",
1262 vol->cluster_size);
1263 goto unm_err_out;
1264 }
1265 if ((a->flags & ATTR_COMPRESSION_MASK) !=
1266 ATTR_IS_COMPRESSED) {
1267 ntfs_error(vi->i_sb, "Found unknown "
1268 "compression method.");
1269 goto unm_err_out;
1270 }
1271 }
1272
1273
1274
1275
1276 if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) {
1277 ntfs_error(vi->i_sb, "Found mst protected attribute "
1278 "but the attribute is %s. Please "
1279 "report you saw this message to "
1280 "linux-ntfs-dev@lists.sourceforge.net",
1281 NInoCompressed(ni) ? "compressed" :
1282 "sparse");
1283 goto unm_err_out;
1284 }
1285 if (a->flags & ATTR_IS_SPARSE)
1286 NInoSetSparse(ni);
1287 }
1288 if (a->flags & ATTR_IS_ENCRYPTED) {
1289 if (NInoCompressed(ni)) {
1290 ntfs_error(vi->i_sb, "Found encrypted and compressed "
1291 "data.");
1292 goto unm_err_out;
1293 }
1294
1295
1296
1297
1298 if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) {
1299 ntfs_error(vi->i_sb, "Found mst protected attribute "
1300 "but the attribute is encrypted. "
1301 "Please report you saw this message "
1302 "to linux-ntfs-dev@lists.sourceforge."
1303 "net");
1304 goto unm_err_out;
1305 }
1306 if (ni->type != AT_DATA) {
1307 ntfs_error(vi->i_sb, "Found encrypted non-data "
1308 "attribute.");
1309 goto unm_err_out;
1310 }
1311 NInoSetEncrypted(ni);
1312 }
1313 if (!a->non_resident) {
1314
1315 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1316 le16_to_cpu(a->data.resident.value_offset)))) {
1317 ntfs_error(vol->sb, "Attribute name is placed after "
1318 "the attribute value.");
1319 goto unm_err_out;
1320 }
1321 if (NInoMstProtected(ni)) {
1322 ntfs_error(vi->i_sb, "Found mst protected attribute "
1323 "but the attribute is resident. "
1324 "Please report you saw this message to "
1325 "linux-ntfs-dev@lists.sourceforge.net");
1326 goto unm_err_out;
1327 }
1328 vi->i_size = ni->initialized_size = le32_to_cpu(
1329 a->data.resident.value_length);
1330 ni->allocated_size = le32_to_cpu(a->length) -
1331 le16_to_cpu(a->data.resident.value_offset);
1332 if (vi->i_size > ni->allocated_size) {
1333 ntfs_error(vi->i_sb, "Resident attribute is corrupt "
1334 "(size exceeds allocation).");
1335 goto unm_err_out;
1336 }
1337 } else {
1338 NInoSetNonResident(ni);
1339
1340
1341
1342
1343 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1344 le16_to_cpu(
1345 a->data.non_resident.mapping_pairs_offset)))) {
1346 ntfs_error(vol->sb, "Attribute name is placed after "
1347 "the mapping pairs array.");
1348 goto unm_err_out;
1349 }
1350 if (NInoCompressed(ni) || NInoSparse(ni)) {
1351 if (NInoCompressed(ni) && a->data.non_resident.
1352 compression_unit != 4) {
1353 ntfs_error(vi->i_sb, "Found non-standard "
1354 "compression unit (%u instead "
1355 "of 4). Cannot handle this.",
1356 a->data.non_resident.
1357 compression_unit);
1358 err = -EOPNOTSUPP;
1359 goto unm_err_out;
1360 }
1361 if (a->data.non_resident.compression_unit) {
1362 ni->itype.compressed.block_size = 1U <<
1363 (a->data.non_resident.
1364 compression_unit +
1365 vol->cluster_size_bits);
1366 ni->itype.compressed.block_size_bits =
1367 ffs(ni->itype.compressed.
1368 block_size) - 1;
1369 ni->itype.compressed.block_clusters = 1U <<
1370 a->data.non_resident.
1371 compression_unit;
1372 } else {
1373 ni->itype.compressed.block_size = 0;
1374 ni->itype.compressed.block_size_bits = 0;
1375 ni->itype.compressed.block_clusters = 0;
1376 }
1377 ni->itype.compressed.size = sle64_to_cpu(
1378 a->data.non_resident.compressed_size);
1379 }
1380 if (a->data.non_resident.lowest_vcn) {
1381 ntfs_error(vi->i_sb, "First extent of attribute has "
1382 "non-zero lowest_vcn.");
1383 goto unm_err_out;
1384 }
1385 vi->i_size = sle64_to_cpu(a->data.non_resident.data_size);
1386 ni->initialized_size = sle64_to_cpu(
1387 a->data.non_resident.initialized_size);
1388 ni->allocated_size = sle64_to_cpu(
1389 a->data.non_resident.allocated_size);
1390 }
1391 vi->i_mapping->a_ops = &ntfs_normal_aops;
1392 if (NInoMstProtected(ni))
1393 vi->i_mapping->a_ops = &ntfs_mst_aops;
1394 else if (NInoCompressed(ni))
1395 vi->i_mapping->a_ops = &ntfs_compressed_aops;
1396 if ((NInoCompressed(ni) || NInoSparse(ni)) && ni->type != AT_INDEX_ROOT)
1397 vi->i_blocks = ni->itype.compressed.size >> 9;
1398 else
1399 vi->i_blocks = ni->allocated_size >> 9;
1400
1401
1402
1403
1404 igrab(base_vi);
1405 ni->ext.base_ntfs_ino = base_ni;
1406 ni->nr_extents = -1;
1407
1408 ntfs_attr_put_search_ctx(ctx);
1409 unmap_mft_record(base_ni);
1410
1411 ntfs_debug("Done.");
1412 return 0;
1413
1414 unm_err_out:
1415 if (!err)
1416 err = -EIO;
1417 if (ctx)
1418 ntfs_attr_put_search_ctx(ctx);
1419 unmap_mft_record(base_ni);
1420 err_out:
1421 ntfs_error(vol->sb, "Failed with error code %i while reading attribute "
1422 "inode (mft_no 0x%lx, type 0x%x, name_len %i). "
1423 "Marking corrupt inode and base inode 0x%lx as bad. "
1424 "Run chkdsk.", err, vi->i_ino, ni->type, ni->name_len,
1425 base_vi->i_ino);
1426 make_bad_inode(vi);
1427 if (err != -ENOMEM)
1428 NVolSetErrors(vol);
1429 return err;
1430 }
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465 static int ntfs_read_locked_index_inode(struct inode *base_vi, struct inode *vi)
1466 {
1467 loff_t bvi_size;
1468 ntfs_volume *vol = NTFS_SB(vi->i_sb);
1469 ntfs_inode *ni, *base_ni, *bni;
1470 struct inode *bvi;
1471 MFT_RECORD *m;
1472 ATTR_RECORD *a;
1473 ntfs_attr_search_ctx *ctx;
1474 INDEX_ROOT *ir;
1475 u8 *ir_end, *index_end;
1476 int err = 0;
1477
1478 ntfs_debug("Entering for i_ino 0x%lx.", vi->i_ino);
1479 ntfs_init_big_inode(vi);
1480 ni = NTFS_I(vi);
1481 base_ni = NTFS_I(base_vi);
1482
1483 vi->i_uid = base_vi->i_uid;
1484 vi->i_gid = base_vi->i_gid;
1485 set_nlink(vi, base_vi->i_nlink);
1486 vi->i_mtime = base_vi->i_mtime;
1487 vi->i_ctime = base_vi->i_ctime;
1488 vi->i_atime = base_vi->i_atime;
1489 vi->i_generation = ni->seq_no = base_ni->seq_no;
1490
1491 vi->i_mode = base_vi->i_mode & ~S_IFMT;
1492
1493 m = map_mft_record(base_ni);
1494 if (IS_ERR(m)) {
1495 err = PTR_ERR(m);
1496 goto err_out;
1497 }
1498 ctx = ntfs_attr_get_search_ctx(base_ni, m);
1499 if (!ctx) {
1500 err = -ENOMEM;
1501 goto unm_err_out;
1502 }
1503
1504 err = ntfs_attr_lookup(AT_INDEX_ROOT, ni->name, ni->name_len,
1505 CASE_SENSITIVE, 0, NULL, 0, ctx);
1506 if (unlikely(err)) {
1507 if (err == -ENOENT)
1508 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is "
1509 "missing.");
1510 goto unm_err_out;
1511 }
1512 a = ctx->attr;
1513
1514 if (unlikely(a->non_resident)) {
1515 ntfs_error(vol->sb, "$INDEX_ROOT attribute is not resident.");
1516 goto unm_err_out;
1517 }
1518
1519 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1520 le16_to_cpu(a->data.resident.value_offset)))) {
1521 ntfs_error(vol->sb, "$INDEX_ROOT attribute name is placed "
1522 "after the attribute value.");
1523 goto unm_err_out;
1524 }
1525
1526
1527
1528
1529 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_ENCRYPTED |
1530 ATTR_IS_SPARSE)) {
1531 ntfs_error(vi->i_sb, "Found compressed/encrypted/sparse index "
1532 "root attribute.");
1533 goto unm_err_out;
1534 }
1535 ir = (INDEX_ROOT*)((u8*)a + le16_to_cpu(a->data.resident.value_offset));
1536 ir_end = (u8*)ir + le32_to_cpu(a->data.resident.value_length);
1537 if (ir_end > (u8*)ctx->mrec + vol->mft_record_size) {
1538 ntfs_error(vi->i_sb, "$INDEX_ROOT attribute is corrupt.");
1539 goto unm_err_out;
1540 }
1541 index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
1542 if (index_end > ir_end) {
1543 ntfs_error(vi->i_sb, "Index is corrupt.");
1544 goto unm_err_out;
1545 }
1546 if (ir->type) {
1547 ntfs_error(vi->i_sb, "Index type is not 0 (type is 0x%x).",
1548 le32_to_cpu(ir->type));
1549 goto unm_err_out;
1550 }
1551 ni->itype.index.collation_rule = ir->collation_rule;
1552 ntfs_debug("Index collation rule is 0x%x.",
1553 le32_to_cpu(ir->collation_rule));
1554 ni->itype.index.block_size = le32_to_cpu(ir->index_block_size);
1555 if (!is_power_of_2(ni->itype.index.block_size)) {
1556 ntfs_error(vi->i_sb, "Index block size (%u) is not a power of "
1557 "two.", ni->itype.index.block_size);
1558 goto unm_err_out;
1559 }
1560 if (ni->itype.index.block_size > PAGE_SIZE) {
1561 ntfs_error(vi->i_sb, "Index block size (%u) > PAGE_SIZE "
1562 "(%ld) is not supported. Sorry.",
1563 ni->itype.index.block_size, PAGE_SIZE);
1564 err = -EOPNOTSUPP;
1565 goto unm_err_out;
1566 }
1567 if (ni->itype.index.block_size < NTFS_BLOCK_SIZE) {
1568 ntfs_error(vi->i_sb, "Index block size (%u) < NTFS_BLOCK_SIZE "
1569 "(%i) is not supported. Sorry.",
1570 ni->itype.index.block_size, NTFS_BLOCK_SIZE);
1571 err = -EOPNOTSUPP;
1572 goto unm_err_out;
1573 }
1574 ni->itype.index.block_size_bits = ffs(ni->itype.index.block_size) - 1;
1575
1576 if (vol->cluster_size <= ni->itype.index.block_size) {
1577 ni->itype.index.vcn_size = vol->cluster_size;
1578 ni->itype.index.vcn_size_bits = vol->cluster_size_bits;
1579 } else {
1580 ni->itype.index.vcn_size = vol->sector_size;
1581 ni->itype.index.vcn_size_bits = vol->sector_size_bits;
1582 }
1583
1584 if (!(ir->index.flags & LARGE_INDEX)) {
1585
1586 vi->i_size = ni->initialized_size = ni->allocated_size = 0;
1587
1588 ntfs_attr_put_search_ctx(ctx);
1589 unmap_mft_record(base_ni);
1590 m = NULL;
1591 ctx = NULL;
1592 goto skip_large_index_stuff;
1593 }
1594 NInoSetIndexAllocPresent(ni);
1595
1596 ntfs_attr_reinit_search_ctx(ctx);
1597 err = ntfs_attr_lookup(AT_INDEX_ALLOCATION, ni->name, ni->name_len,
1598 CASE_SENSITIVE, 0, NULL, 0, ctx);
1599 if (unlikely(err)) {
1600 if (err == -ENOENT)
1601 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1602 "not present but $INDEX_ROOT "
1603 "indicated it is.");
1604 else
1605 ntfs_error(vi->i_sb, "Failed to lookup "
1606 "$INDEX_ALLOCATION attribute.");
1607 goto unm_err_out;
1608 }
1609 a = ctx->attr;
1610 if (!a->non_resident) {
1611 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1612 "resident.");
1613 goto unm_err_out;
1614 }
1615
1616
1617
1618 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
1619 le16_to_cpu(
1620 a->data.non_resident.mapping_pairs_offset)))) {
1621 ntfs_error(vol->sb, "$INDEX_ALLOCATION attribute name is "
1622 "placed after the mapping pairs array.");
1623 goto unm_err_out;
1624 }
1625 if (a->flags & ATTR_IS_ENCRYPTED) {
1626 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1627 "encrypted.");
1628 goto unm_err_out;
1629 }
1630 if (a->flags & ATTR_IS_SPARSE) {
1631 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is sparse.");
1632 goto unm_err_out;
1633 }
1634 if (a->flags & ATTR_COMPRESSION_MASK) {
1635 ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
1636 "compressed.");
1637 goto unm_err_out;
1638 }
1639 if (a->data.non_resident.lowest_vcn) {
1640 ntfs_error(vi->i_sb, "First extent of $INDEX_ALLOCATION "
1641 "attribute has non zero lowest_vcn.");
1642 goto unm_err_out;
1643 }
1644 vi->i_size = sle64_to_cpu(a->data.non_resident.data_size);
1645 ni->initialized_size = sle64_to_cpu(
1646 a->data.non_resident.initialized_size);
1647 ni->allocated_size = sle64_to_cpu(a->data.non_resident.allocated_size);
1648
1649
1650
1651
1652 ntfs_attr_put_search_ctx(ctx);
1653 unmap_mft_record(base_ni);
1654 m = NULL;
1655 ctx = NULL;
1656
1657 bvi = ntfs_attr_iget(base_vi, AT_BITMAP, ni->name, ni->name_len);
1658 if (IS_ERR(bvi)) {
1659 ntfs_error(vi->i_sb, "Failed to get bitmap attribute.");
1660 err = PTR_ERR(bvi);
1661 goto unm_err_out;
1662 }
1663 bni = NTFS_I(bvi);
1664 if (NInoCompressed(bni) || NInoEncrypted(bni) ||
1665 NInoSparse(bni)) {
1666 ntfs_error(vi->i_sb, "$BITMAP attribute is compressed and/or "
1667 "encrypted and/or sparse.");
1668 goto iput_unm_err_out;
1669 }
1670
1671 bvi_size = i_size_read(bvi);
1672 if ((bvi_size << 3) < (vi->i_size >> ni->itype.index.block_size_bits)) {
1673 ntfs_error(vi->i_sb, "Index bitmap too small (0x%llx) for "
1674 "index allocation (0x%llx).", bvi_size << 3,
1675 vi->i_size);
1676 goto iput_unm_err_out;
1677 }
1678 iput(bvi);
1679 skip_large_index_stuff:
1680
1681 vi->i_mapping->a_ops = &ntfs_mst_aops;
1682 vi->i_blocks = ni->allocated_size >> 9;
1683
1684
1685
1686
1687 igrab(base_vi);
1688 ni->ext.base_ntfs_ino = base_ni;
1689 ni->nr_extents = -1;
1690
1691 ntfs_debug("Done.");
1692 return 0;
1693 iput_unm_err_out:
1694 iput(bvi);
1695 unm_err_out:
1696 if (!err)
1697 err = -EIO;
1698 if (ctx)
1699 ntfs_attr_put_search_ctx(ctx);
1700 if (m)
1701 unmap_mft_record(base_ni);
1702 err_out:
1703 ntfs_error(vi->i_sb, "Failed with error code %i while reading index "
1704 "inode (mft_no 0x%lx, name_len %i.", err, vi->i_ino,
1705 ni->name_len);
1706 make_bad_inode(vi);
1707 if (err != -EOPNOTSUPP && err != -ENOMEM)
1708 NVolSetErrors(vol);
1709 return err;
1710 }
1711
1712
1713
1714
1715
1716
1717
1718
1719 static struct lock_class_key mft_ni_runlist_lock_key, mft_ni_mrec_lock_key;
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747 int ntfs_read_inode_mount(struct inode *vi)
1748 {
1749 VCN next_vcn, last_vcn, highest_vcn;
1750 s64 block;
1751 struct super_block *sb = vi->i_sb;
1752 ntfs_volume *vol = NTFS_SB(sb);
1753 struct buffer_head *bh;
1754 ntfs_inode *ni;
1755 MFT_RECORD *m = NULL;
1756 ATTR_RECORD *a;
1757 ntfs_attr_search_ctx *ctx;
1758 unsigned int i, nr_blocks;
1759 int err;
1760
1761 ntfs_debug("Entering.");
1762
1763
1764 ntfs_init_big_inode(vi);
1765
1766 ni = NTFS_I(vi);
1767
1768
1769 NInoSetNonResident(ni);
1770 NInoSetMstProtected(ni);
1771 NInoSetSparseDisabled(ni);
1772 ni->type = AT_DATA;
1773 ni->name = NULL;
1774 ni->name_len = 0;
1775
1776
1777
1778
1779 ni->itype.index.block_size = vol->mft_record_size;
1780 ni->itype.index.block_size_bits = vol->mft_record_size_bits;
1781
1782
1783 vol->mft_ino = vi;
1784
1785
1786 if (vol->mft_record_size > 64 * 1024) {
1787 ntfs_error(sb, "Unsupported mft record size %i (max 64kiB).",
1788 vol->mft_record_size);
1789 goto err_out;
1790 }
1791 i = vol->mft_record_size;
1792 if (i < sb->s_blocksize)
1793 i = sb->s_blocksize;
1794 m = (MFT_RECORD*)ntfs_malloc_nofs(i);
1795 if (!m) {
1796 ntfs_error(sb, "Failed to allocate buffer for $MFT record 0.");
1797 goto err_out;
1798 }
1799
1800
1801 block = vol->mft_lcn << vol->cluster_size_bits >>
1802 sb->s_blocksize_bits;
1803 nr_blocks = vol->mft_record_size >> sb->s_blocksize_bits;
1804 if (!nr_blocks)
1805 nr_blocks = 1;
1806
1807
1808 for (i = 0; i < nr_blocks; i++) {
1809 bh = sb_bread(sb, block++);
1810 if (!bh) {
1811 ntfs_error(sb, "Device read failed.");
1812 goto err_out;
1813 }
1814 memcpy((char*)m + (i << sb->s_blocksize_bits), bh->b_data,
1815 sb->s_blocksize);
1816 brelse(bh);
1817 }
1818
1819 if (le32_to_cpu(m->bytes_allocated) != vol->mft_record_size) {
1820 ntfs_error(sb, "Incorrect mft record size %u in superblock, should be %u.",
1821 le32_to_cpu(m->bytes_allocated), vol->mft_record_size);
1822 goto err_out;
1823 }
1824
1825
1826 if (post_read_mst_fixup((NTFS_RECORD*)m, vol->mft_record_size)) {
1827
1828 ntfs_error(sb, "MST fixup failed. $MFT is corrupt.");
1829 goto err_out;
1830 }
1831
1832
1833 vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number);
1834
1835
1836 vi->i_mapping->a_ops = &ntfs_mst_aops;
1837
1838 ctx = ntfs_attr_get_search_ctx(ni, m);
1839 if (!ctx) {
1840 err = -ENOMEM;
1841 goto err_out;
1842 }
1843
1844
1845 err = ntfs_attr_lookup(AT_ATTRIBUTE_LIST, NULL, 0, 0, 0, NULL, 0, ctx);
1846 if (err) {
1847 if (unlikely(err != -ENOENT)) {
1848 ntfs_error(sb, "Failed to lookup attribute list "
1849 "attribute. You should run chkdsk.");
1850 goto put_err_out;
1851 }
1852 } else {
1853 ATTR_LIST_ENTRY *al_entry, *next_al_entry;
1854 u8 *al_end;
1855 static const char *es = " Not allowed. $MFT is corrupt. "
1856 "You should run chkdsk.";
1857
1858 ntfs_debug("Attribute list attribute found in $MFT.");
1859 NInoSetAttrList(ni);
1860 a = ctx->attr;
1861 if (a->flags & ATTR_COMPRESSION_MASK) {
1862 ntfs_error(sb, "Attribute list attribute is "
1863 "compressed.%s", es);
1864 goto put_err_out;
1865 }
1866 if (a->flags & ATTR_IS_ENCRYPTED ||
1867 a->flags & ATTR_IS_SPARSE) {
1868 if (a->non_resident) {
1869 ntfs_error(sb, "Non-resident attribute list "
1870 "attribute is encrypted/"
1871 "sparse.%s", es);
1872 goto put_err_out;
1873 }
1874 ntfs_warning(sb, "Resident attribute list attribute "
1875 "in $MFT system file is marked "
1876 "encrypted/sparse which is not true. "
1877 "However, Windows allows this and "
1878 "chkdsk does not detect or correct it "
1879 "so we will just ignore the invalid "
1880 "flags and pretend they are not set.");
1881 }
1882
1883 ni->attr_list_size = (u32)ntfs_attr_size(a);
1884 if (!ni->attr_list_size) {
1885 ntfs_error(sb, "Attr_list_size is zero");
1886 goto put_err_out;
1887 }
1888 ni->attr_list = ntfs_malloc_nofs(ni->attr_list_size);
1889 if (!ni->attr_list) {
1890 ntfs_error(sb, "Not enough memory to allocate buffer "
1891 "for attribute list.");
1892 goto put_err_out;
1893 }
1894 if (a->non_resident) {
1895 NInoSetAttrListNonResident(ni);
1896 if (a->data.non_resident.lowest_vcn) {
1897 ntfs_error(sb, "Attribute list has non zero "
1898 "lowest_vcn. $MFT is corrupt. "
1899 "You should run chkdsk.");
1900 goto put_err_out;
1901 }
1902
1903 ni->attr_list_rl.rl = ntfs_mapping_pairs_decompress(vol,
1904 a, NULL);
1905 if (IS_ERR(ni->attr_list_rl.rl)) {
1906 err = PTR_ERR(ni->attr_list_rl.rl);
1907 ni->attr_list_rl.rl = NULL;
1908 ntfs_error(sb, "Mapping pairs decompression "
1909 "failed with error code %i.",
1910 -err);
1911 goto put_err_out;
1912 }
1913
1914 if ((err = load_attribute_list(vol, &ni->attr_list_rl,
1915 ni->attr_list, ni->attr_list_size,
1916 sle64_to_cpu(a->data.
1917 non_resident.initialized_size)))) {
1918 ntfs_error(sb, "Failed to load attribute list "
1919 "attribute with error code %i.",
1920 -err);
1921 goto put_err_out;
1922 }
1923 } else {
1924 if ((u8*)a + le16_to_cpu(
1925 a->data.resident.value_offset) +
1926 le32_to_cpu(
1927 a->data.resident.value_length) >
1928 (u8*)ctx->mrec + vol->mft_record_size) {
1929 ntfs_error(sb, "Corrupt attribute list "
1930 "attribute.");
1931 goto put_err_out;
1932 }
1933
1934 memcpy(ni->attr_list, (u8*)a + le16_to_cpu(
1935 a->data.resident.value_offset),
1936 le32_to_cpu(
1937 a->data.resident.value_length));
1938 }
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951 al_entry = (ATTR_LIST_ENTRY*)ni->attr_list;
1952 al_end = (u8*)al_entry + ni->attr_list_size;
1953 for (;; al_entry = next_al_entry) {
1954
1955 if ((u8*)al_entry < ni->attr_list ||
1956 (u8*)al_entry > al_end)
1957 goto em_put_err_out;
1958
1959 if ((u8*)al_entry == al_end)
1960 goto em_put_err_out;
1961 if (!al_entry->length)
1962 goto em_put_err_out;
1963 if ((u8*)al_entry + 6 > al_end || (u8*)al_entry +
1964 le16_to_cpu(al_entry->length) > al_end)
1965 goto em_put_err_out;
1966 next_al_entry = (ATTR_LIST_ENTRY*)((u8*)al_entry +
1967 le16_to_cpu(al_entry->length));
1968 if (le32_to_cpu(al_entry->type) > le32_to_cpu(AT_DATA))
1969 goto em_put_err_out;
1970 if (AT_DATA != al_entry->type)
1971 continue;
1972
1973 if (al_entry->name_length)
1974 goto em_put_err_out;
1975
1976 if (al_entry->lowest_vcn)
1977 goto em_put_err_out;
1978
1979 if (MREF_LE(al_entry->mft_reference) != vi->i_ino) {
1980
1981 ntfs_error(sb, "BUG: The first $DATA extent "
1982 "of $MFT is not in the base "
1983 "mft record. Please report "
1984 "you saw this message to "
1985 "linux-ntfs-dev@lists."
1986 "sourceforge.net");
1987 goto put_err_out;
1988 } else {
1989
1990 if (MSEQNO_LE(al_entry->mft_reference) !=
1991 ni->seq_no)
1992 goto em_put_err_out;
1993
1994 break;
1995 }
1996 }
1997 }
1998
1999 ntfs_attr_reinit_search_ctx(ctx);
2000
2001
2002 a = NULL;
2003 next_vcn = last_vcn = highest_vcn = 0;
2004 while (!(err = ntfs_attr_lookup(AT_DATA, NULL, 0, 0, next_vcn, NULL, 0,
2005 ctx))) {
2006 runlist_element *nrl;
2007
2008
2009 a = ctx->attr;
2010
2011 if (!a->non_resident) {
2012 ntfs_error(sb, "$MFT must be non-resident but a "
2013 "resident extent was found. $MFT is "
2014 "corrupt. Run chkdsk.");
2015 goto put_err_out;
2016 }
2017
2018 if (a->flags & ATTR_COMPRESSION_MASK ||
2019 a->flags & ATTR_IS_ENCRYPTED ||
2020 a->flags & ATTR_IS_SPARSE) {
2021 ntfs_error(sb, "$MFT must be uncompressed, "
2022 "non-sparse, and unencrypted but a "
2023 "compressed/sparse/encrypted extent "
2024 "was found. $MFT is corrupt. Run "
2025 "chkdsk.");
2026 goto put_err_out;
2027 }
2028
2029
2030
2031
2032
2033
2034 nrl = ntfs_mapping_pairs_decompress(vol, a, ni->runlist.rl);
2035 if (IS_ERR(nrl)) {
2036 ntfs_error(sb, "ntfs_mapping_pairs_decompress() "
2037 "failed with error code %ld. $MFT is "
2038 "corrupt.", PTR_ERR(nrl));
2039 goto put_err_out;
2040 }
2041 ni->runlist.rl = nrl;
2042
2043
2044 if (!next_vcn) {
2045 if (a->data.non_resident.lowest_vcn) {
2046 ntfs_error(sb, "First extent of $DATA "
2047 "attribute has non zero "
2048 "lowest_vcn. $MFT is corrupt. "
2049 "You should run chkdsk.");
2050 goto put_err_out;
2051 }
2052
2053 last_vcn = sle64_to_cpu(
2054 a->data.non_resident.allocated_size)
2055 >> vol->cluster_size_bits;
2056
2057 vi->i_size = sle64_to_cpu(
2058 a->data.non_resident.data_size);
2059 ni->initialized_size = sle64_to_cpu(
2060 a->data.non_resident.initialized_size);
2061 ni->allocated_size = sle64_to_cpu(
2062 a->data.non_resident.allocated_size);
2063
2064
2065
2066
2067 if ((vi->i_size >> vol->mft_record_size_bits) >=
2068 (1ULL << 32)) {
2069 ntfs_error(sb, "$MFT is too big! Aborting.");
2070 goto put_err_out;
2071 }
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091 ntfs_read_locked_inode(vi);
2092 if (is_bad_inode(vi)) {
2093 ntfs_error(sb, "ntfs_read_inode() of $MFT "
2094 "failed. BUG or corrupt $MFT. "
2095 "Run chkdsk and if no errors "
2096 "are found, please report you "
2097 "saw this message to "
2098 "linux-ntfs-dev@lists."
2099 "sourceforge.net");
2100 ntfs_attr_put_search_ctx(ctx);
2101
2102 ntfs_free(m);
2103 return -1;
2104 }
2105
2106
2107
2108
2109
2110 vi->i_uid = GLOBAL_ROOT_UID;
2111 vi->i_gid = GLOBAL_ROOT_GID;
2112
2113 vi->i_mode = S_IFREG;
2114
2115 vi->i_op = &ntfs_empty_inode_ops;
2116 vi->i_fop = &ntfs_empty_file_ops;
2117 }
2118
2119
2120 highest_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn);
2121 next_vcn = highest_vcn + 1;
2122
2123
2124 if (next_vcn <= 0)
2125 break;
2126
2127
2128 if (next_vcn < sle64_to_cpu(
2129 a->data.non_resident.lowest_vcn)) {
2130 ntfs_error(sb, "$MFT has corrupt attribute list "
2131 "attribute. Run chkdsk.");
2132 goto put_err_out;
2133 }
2134 }
2135 if (err != -ENOENT) {
2136 ntfs_error(sb, "Failed to lookup $MFT/$DATA attribute extent. "
2137 "$MFT is corrupt. Run chkdsk.");
2138 goto put_err_out;
2139 }
2140 if (!a) {
2141 ntfs_error(sb, "$MFT/$DATA attribute not found. $MFT is "
2142 "corrupt. Run chkdsk.");
2143 goto put_err_out;
2144 }
2145 if (highest_vcn && highest_vcn != last_vcn - 1) {
2146 ntfs_error(sb, "Failed to load the complete runlist for "
2147 "$MFT/$DATA. Driver bug or corrupt $MFT. "
2148 "Run chkdsk.");
2149 ntfs_debug("highest_vcn = 0x%llx, last_vcn - 1 = 0x%llx",
2150 (unsigned long long)highest_vcn,
2151 (unsigned long long)last_vcn - 1);
2152 goto put_err_out;
2153 }
2154 ntfs_attr_put_search_ctx(ctx);
2155 ntfs_debug("Done.");
2156 ntfs_free(m);
2157
2158
2159
2160
2161
2162 lockdep_set_class(&ni->runlist.lock, &mft_ni_runlist_lock_key);
2163 lockdep_set_class(&ni->mrec_lock, &mft_ni_mrec_lock_key);
2164
2165 return 0;
2166
2167 em_put_err_out:
2168 ntfs_error(sb, "Couldn't find first extent of $DATA attribute in "
2169 "attribute list. $MFT is corrupt. Run chkdsk.");
2170 put_err_out:
2171 ntfs_attr_put_search_ctx(ctx);
2172 err_out:
2173 ntfs_error(sb, "Failed. Marking inode as bad.");
2174 make_bad_inode(vi);
2175 ntfs_free(m);
2176 return -1;
2177 }
2178
2179 static void __ntfs_clear_inode(ntfs_inode *ni)
2180 {
2181
2182 down_write(&ni->runlist.lock);
2183 if (ni->runlist.rl) {
2184 ntfs_free(ni->runlist.rl);
2185 ni->runlist.rl = NULL;
2186 }
2187 up_write(&ni->runlist.lock);
2188
2189 if (ni->attr_list) {
2190 ntfs_free(ni->attr_list);
2191 ni->attr_list = NULL;
2192 }
2193
2194 down_write(&ni->attr_list_rl.lock);
2195 if (ni->attr_list_rl.rl) {
2196 ntfs_free(ni->attr_list_rl.rl);
2197 ni->attr_list_rl.rl = NULL;
2198 }
2199 up_write(&ni->attr_list_rl.lock);
2200
2201 if (ni->name_len && ni->name != I30) {
2202
2203 BUG_ON(!ni->name);
2204 kfree(ni->name);
2205 }
2206 }
2207
2208 void ntfs_clear_extent_inode(ntfs_inode *ni)
2209 {
2210 ntfs_debug("Entering for inode 0x%lx.", ni->mft_no);
2211
2212 BUG_ON(NInoAttr(ni));
2213 BUG_ON(ni->nr_extents != -1);
2214
2215 #ifdef NTFS_RW
2216 if (NInoDirty(ni)) {
2217 if (!is_bad_inode(VFS_I(ni->ext.base_ntfs_ino)))
2218 ntfs_error(ni->vol->sb, "Clearing dirty extent inode! "
2219 "Losing data! This is a BUG!!!");
2220
2221 }
2222 #endif
2223
2224 __ntfs_clear_inode(ni);
2225
2226
2227 ntfs_destroy_extent_inode(ni);
2228 }
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240 void ntfs_evict_big_inode(struct inode *vi)
2241 {
2242 ntfs_inode *ni = NTFS_I(vi);
2243
2244 truncate_inode_pages_final(&vi->i_data);
2245 clear_inode(vi);
2246
2247 #ifdef NTFS_RW
2248 if (NInoDirty(ni)) {
2249 bool was_bad = (is_bad_inode(vi));
2250
2251
2252 ntfs_commit_inode(vi);
2253
2254 if (!was_bad && (is_bad_inode(vi) || NInoDirty(ni))) {
2255 ntfs_error(vi->i_sb, "Failed to commit dirty inode "
2256 "0x%lx. Losing data!", vi->i_ino);
2257
2258 }
2259 }
2260 #endif
2261
2262
2263 if (ni->nr_extents > 0) {
2264 int i;
2265
2266 for (i = 0; i < ni->nr_extents; i++)
2267 ntfs_clear_extent_inode(ni->ext.extent_ntfs_inos[i]);
2268 kfree(ni->ext.extent_ntfs_inos);
2269 }
2270
2271 __ntfs_clear_inode(ni);
2272
2273 if (NInoAttr(ni)) {
2274
2275 if (ni->nr_extents == -1) {
2276 iput(VFS_I(ni->ext.base_ntfs_ino));
2277 ni->nr_extents = 0;
2278 ni->ext.base_ntfs_ino = NULL;
2279 }
2280 }
2281 BUG_ON(ni->page);
2282 if (!atomic_dec_and_test(&ni->count))
2283 BUG();
2284 return;
2285 }
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297 int ntfs_show_options(struct seq_file *sf, struct dentry *root)
2298 {
2299 ntfs_volume *vol = NTFS_SB(root->d_sb);
2300 int i;
2301
2302 seq_printf(sf, ",uid=%i", from_kuid_munged(&init_user_ns, vol->uid));
2303 seq_printf(sf, ",gid=%i", from_kgid_munged(&init_user_ns, vol->gid));
2304 if (vol->fmask == vol->dmask)
2305 seq_printf(sf, ",umask=0%o", vol->fmask);
2306 else {
2307 seq_printf(sf, ",fmask=0%o", vol->fmask);
2308 seq_printf(sf, ",dmask=0%o", vol->dmask);
2309 }
2310 seq_printf(sf, ",nls=%s", vol->nls_map->charset);
2311 if (NVolCaseSensitive(vol))
2312 seq_printf(sf, ",case_sensitive");
2313 if (NVolShowSystemFiles(vol))
2314 seq_printf(sf, ",show_sys_files");
2315 if (!NVolSparseEnabled(vol))
2316 seq_printf(sf, ",disable_sparse");
2317 for (i = 0; on_errors_arr[i].val; i++) {
2318 if (on_errors_arr[i].val & vol->on_errors)
2319 seq_printf(sf, ",errors=%s", on_errors_arr[i].str);
2320 }
2321 seq_printf(sf, ",mft_zone_multiplier=%i", vol->mft_zone_multiplier);
2322 return 0;
2323 }
2324
2325 #ifdef NTFS_RW
2326
2327 static const char *es = " Leaving inconsistent metadata. Unmount and run "
2328 "chkdsk.";
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348 int ntfs_truncate(struct inode *vi)
2349 {
2350 s64 new_size, old_size, nr_freed, new_alloc_size, old_alloc_size;
2351 VCN highest_vcn;
2352 unsigned long flags;
2353 ntfs_inode *base_ni, *ni = NTFS_I(vi);
2354 ntfs_volume *vol = ni->vol;
2355 ntfs_attr_search_ctx *ctx;
2356 MFT_RECORD *m;
2357 ATTR_RECORD *a;
2358 const char *te = " Leaving file length out of sync with i_size.";
2359 int err, mp_size, size_change, alloc_change;
2360
2361 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
2362 BUG_ON(NInoAttr(ni));
2363 BUG_ON(S_ISDIR(vi->i_mode));
2364 BUG_ON(NInoMstProtected(ni));
2365 BUG_ON(ni->nr_extents < 0);
2366 retry_truncate:
2367
2368
2369
2370
2371 down_write(&ni->runlist.lock);
2372 if (!NInoAttr(ni))
2373 base_ni = ni;
2374 else
2375 base_ni = ni->ext.base_ntfs_ino;
2376 m = map_mft_record(base_ni);
2377 if (IS_ERR(m)) {
2378 err = PTR_ERR(m);
2379 ntfs_error(vi->i_sb, "Failed to map mft record for inode 0x%lx "
2380 "(error code %d).%s", vi->i_ino, err, te);
2381 ctx = NULL;
2382 m = NULL;
2383 goto old_bad_out;
2384 }
2385 ctx = ntfs_attr_get_search_ctx(base_ni, m);
2386 if (unlikely(!ctx)) {
2387 ntfs_error(vi->i_sb, "Failed to allocate a search context for "
2388 "inode 0x%lx (not enough memory).%s",
2389 vi->i_ino, te);
2390 err = -ENOMEM;
2391 goto old_bad_out;
2392 }
2393 err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
2394 CASE_SENSITIVE, 0, NULL, 0, ctx);
2395 if (unlikely(err)) {
2396 if (err == -ENOENT) {
2397 ntfs_error(vi->i_sb, "Open attribute is missing from "
2398 "mft record. Inode 0x%lx is corrupt. "
2399 "Run chkdsk.%s", vi->i_ino, te);
2400 err = -EIO;
2401 } else
2402 ntfs_error(vi->i_sb, "Failed to lookup attribute in "
2403 "inode 0x%lx (error code %d).%s",
2404 vi->i_ino, err, te);
2405 goto old_bad_out;
2406 }
2407 m = ctx->mrec;
2408 a = ctx->attr;
2409
2410
2411
2412 new_size = i_size_read(vi);
2413
2414 old_size = ntfs_attr_size(a);
2415
2416 if (NInoNonResident(ni))
2417 new_alloc_size = (new_size + vol->cluster_size - 1) &
2418 ~(s64)vol->cluster_size_mask;
2419 else
2420 new_alloc_size = (new_size + 7) & ~7;
2421
2422 read_lock_irqsave(&ni->size_lock, flags);
2423 old_alloc_size = ni->allocated_size;
2424 read_unlock_irqrestore(&ni->size_lock, flags);
2425
2426
2427
2428
2429 size_change = -1;
2430 if (new_size - old_size >= 0) {
2431 size_change = 1;
2432 if (new_size == old_size)
2433 size_change = 0;
2434 }
2435
2436 alloc_change = -1;
2437 if (new_alloc_size - old_alloc_size >= 0) {
2438 alloc_change = 1;
2439 if (new_alloc_size == old_alloc_size)
2440 alloc_change = 0;
2441 }
2442
2443
2444
2445
2446 if (!size_change && !alloc_change)
2447 goto unm_done;
2448
2449 if (size_change) {
2450 err = ntfs_attr_size_bounds_check(vol, ni->type, new_size);
2451 if (unlikely(err)) {
2452 if (err == -ERANGE) {
2453 ntfs_error(vol->sb, "Truncate would cause the "
2454 "inode 0x%lx to %simum size "
2455 "for its attribute type "
2456 "(0x%x). Aborting truncate.",
2457 vi->i_ino,
2458 new_size > old_size ? "exceed "
2459 "the max" : "go under the min",
2460 le32_to_cpu(ni->type));
2461 err = -EFBIG;
2462 } else {
2463 ntfs_error(vol->sb, "Inode 0x%lx has unknown "
2464 "attribute type 0x%x. "
2465 "Aborting truncate.",
2466 vi->i_ino,
2467 le32_to_cpu(ni->type));
2468 err = -EIO;
2469 }
2470
2471 i_size_write(vi, old_size);
2472 goto err_out;
2473 }
2474 }
2475 if (NInoCompressed(ni) || NInoEncrypted(ni)) {
2476 ntfs_warning(vi->i_sb, "Changes in inode size are not "
2477 "supported yet for %s files, ignoring.",
2478 NInoCompressed(ni) ? "compressed" :
2479 "encrypted");
2480 err = -EOPNOTSUPP;
2481 goto bad_out;
2482 }
2483 if (a->non_resident)
2484 goto do_non_resident_truncate;
2485 BUG_ON(NInoNonResident(ni));
2486
2487 if (new_size < vol->mft_record_size &&
2488 !ntfs_resident_attr_value_resize(m, a, new_size)) {
2489
2490 flush_dcache_mft_record_page(ctx->ntfs_ino);
2491 mark_mft_record_dirty(ctx->ntfs_ino);
2492 write_lock_irqsave(&ni->size_lock, flags);
2493
2494 ni->allocated_size = le32_to_cpu(a->length) -
2495 le16_to_cpu(a->data.resident.value_offset);
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524 ni->initialized_size = new_size;
2525 write_unlock_irqrestore(&ni->size_lock, flags);
2526 goto unm_done;
2527 }
2528
2529 BUG_ON(size_change < 0);
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539 ntfs_attr_put_search_ctx(ctx);
2540 unmap_mft_record(base_ni);
2541 up_write(&ni->runlist.lock);
2542
2543
2544
2545
2546 err = ntfs_attr_make_non_resident(ni, old_size);
2547 if (likely(!err))
2548 goto retry_truncate;
2549
2550
2551
2552
2553
2554 if (unlikely(err != -EPERM && err != -ENOSPC)) {
2555 ntfs_error(vol->sb, "Cannot truncate inode 0x%lx, attribute "
2556 "type 0x%x, because the conversion from "
2557 "resident to non-resident attribute failed "
2558 "with error code %i.", vi->i_ino,
2559 (unsigned)le32_to_cpu(ni->type), err);
2560 if (err != -ENOMEM)
2561 err = -EIO;
2562 goto conv_err_out;
2563 }
2564
2565 if (err == -ENOSPC)
2566 ntfs_error(vol->sb, "Not enough space in the mft record/on "
2567 "disk for the non-resident attribute value. "
2568 "This case is not implemented yet.");
2569 else
2570 ntfs_error(vol->sb, "This attribute type may not be "
2571 "non-resident. This case is not implemented "
2572 "yet.");
2573 err = -EOPNOTSUPP;
2574 goto conv_err_out;
2575 #if 0
2576
2577 if (!err)
2578 goto do_resident_extend;
2579
2580
2581
2582
2583
2584
2585 if (ni->type == AT_ATTRIBUTE_LIST ||
2586 ni->type == AT_STANDARD_INFORMATION) {
2587
2588
2589 err = -EOPNOTSUPP;
2590 if (!err)
2591 goto do_resident_extend;
2592 goto err_out;
2593 }
2594
2595
2596
2597 err = -EOPNOTSUPP;
2598 if (!err)
2599 goto do_resident_extend;
2600
2601 goto err_out;
2602 #endif
2603 do_non_resident_truncate:
2604 BUG_ON(!NInoNonResident(ni));
2605 if (alloc_change < 0) {
2606 highest_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn);
2607 if (highest_vcn > 0 &&
2608 old_alloc_size >> vol->cluster_size_bits >
2609 highest_vcn + 1) {
2610
2611
2612
2613
2614 ntfs_error(vol->sb, "Cannot truncate inode 0x%lx, "
2615 "attribute type 0x%x, because the "
2616 "attribute is highly fragmented (it "
2617 "consists of multiple extents) and "
2618 "this case is not implemented yet.",
2619 vi->i_ino,
2620 (unsigned)le32_to_cpu(ni->type));
2621 err = -EOPNOTSUPP;
2622 goto bad_out;
2623 }
2624 }
2625
2626
2627
2628
2629 if (size_change < 0) {
2630
2631
2632
2633 write_lock_irqsave(&ni->size_lock, flags);
2634 if (new_size < ni->initialized_size) {
2635 ni->initialized_size = new_size;
2636 a->data.non_resident.initialized_size =
2637 cpu_to_sle64(new_size);
2638 }
2639 a->data.non_resident.data_size = cpu_to_sle64(new_size);
2640 write_unlock_irqrestore(&ni->size_lock, flags);
2641 flush_dcache_mft_record_page(ctx->ntfs_ino);
2642 mark_mft_record_dirty(ctx->ntfs_ino);
2643
2644 if (!alloc_change)
2645 goto unm_done;
2646
2647
2648
2649
2650 BUG_ON(alloc_change > 0);
2651 } else {
2652
2653
2654
2655
2656 if (alloc_change > 0) {
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672 ntfs_attr_put_search_ctx(ctx);
2673 unmap_mft_record(base_ni);
2674 up_write(&ni->runlist.lock);
2675 err = ntfs_attr_extend_allocation(ni, new_size,
2676 size_change > 0 ? new_size : -1, -1);
2677
2678
2679
2680
2681 goto done;
2682 }
2683 if (!alloc_change)
2684 goto alloc_done;
2685 }
2686
2687
2688 nr_freed = ntfs_cluster_free(ni, new_alloc_size >>
2689 vol->cluster_size_bits, -1, ctx);
2690 m = ctx->mrec;
2691 a = ctx->attr;
2692 if (unlikely(nr_freed < 0)) {
2693 ntfs_error(vol->sb, "Failed to release cluster(s) (error code "
2694 "%lli). Unmount and run chkdsk to recover "
2695 "the lost cluster(s).", (long long)nr_freed);
2696 NVolSetErrors(vol);
2697 nr_freed = 0;
2698 }
2699
2700 err = ntfs_rl_truncate_nolock(vol, &ni->runlist,
2701 new_alloc_size >> vol->cluster_size_bits);
2702
2703
2704
2705
2706
2707
2708 if (unlikely(err || IS_ERR(m))) {
2709 ntfs_error(vol->sb, "Failed to %s (error code %li).%s",
2710 IS_ERR(m) ?
2711 "restore attribute search context" :
2712 "truncate attribute runlist",
2713 IS_ERR(m) ? PTR_ERR(m) : err, es);
2714 err = -EIO;
2715 goto bad_out;
2716 }
2717
2718 mp_size = ntfs_get_size_for_mapping_pairs(vol, ni->runlist.rl, 0, -1);
2719 if (unlikely(mp_size <= 0)) {
2720 ntfs_error(vol->sb, "Cannot shrink allocation of inode 0x%lx, "
2721 "attribute type 0x%x, because determining the "
2722 "size for the mapping pairs failed with error "
2723 "code %i.%s", vi->i_ino,
2724 (unsigned)le32_to_cpu(ni->type), mp_size, es);
2725 err = -EIO;
2726 goto bad_out;
2727 }
2728
2729
2730
2731
2732
2733 err = ntfs_attr_record_resize(m, a, mp_size +
2734 le16_to_cpu(a->data.non_resident.mapping_pairs_offset));
2735 BUG_ON(err);
2736
2737
2738
2739 err = ntfs_mapping_pairs_build(vol, (u8*)a +
2740 le16_to_cpu(a->data.non_resident.mapping_pairs_offset),
2741 mp_size, ni->runlist.rl, 0, -1, NULL);
2742 if (unlikely(err)) {
2743 ntfs_error(vol->sb, "Cannot shrink allocation of inode 0x%lx, "
2744 "attribute type 0x%x, because building the "
2745 "mapping pairs failed with error code %i.%s",
2746 vi->i_ino, (unsigned)le32_to_cpu(ni->type),
2747 err, es);
2748 err = -EIO;
2749 goto bad_out;
2750 }
2751
2752 a->data.non_resident.highest_vcn = cpu_to_sle64((new_alloc_size >>
2753 vol->cluster_size_bits) - 1);
2754 write_lock_irqsave(&ni->size_lock, flags);
2755 ni->allocated_size = new_alloc_size;
2756 a->data.non_resident.allocated_size = cpu_to_sle64(new_alloc_size);
2757 if (NInoSparse(ni) || NInoCompressed(ni)) {
2758 if (nr_freed) {
2759 ni->itype.compressed.size -= nr_freed <<
2760 vol->cluster_size_bits;
2761 BUG_ON(ni->itype.compressed.size < 0);
2762 a->data.non_resident.compressed_size = cpu_to_sle64(
2763 ni->itype.compressed.size);
2764 vi->i_blocks = ni->itype.compressed.size >> 9;
2765 }
2766 } else
2767 vi->i_blocks = new_alloc_size >> 9;
2768 write_unlock_irqrestore(&ni->size_lock, flags);
2769
2770
2771
2772
2773
2774
2775
2776
2777 alloc_done:
2778
2779
2780
2781
2782 if (size_change > 0)
2783 a->data.non_resident.data_size = cpu_to_sle64(new_size);
2784
2785 flush_dcache_mft_record_page(ctx->ntfs_ino);
2786 mark_mft_record_dirty(ctx->ntfs_ino);
2787 unm_done:
2788 ntfs_attr_put_search_ctx(ctx);
2789 unmap_mft_record(base_ni);
2790 up_write(&ni->runlist.lock);
2791 done:
2792
2793
2794
2795
2796
2797
2798 if (!IS_NOCMTIME(VFS_I(base_ni)) && !IS_RDONLY(VFS_I(base_ni))) {
2799 struct timespec64 now = current_time(VFS_I(base_ni));
2800 int sync_it = 0;
2801
2802 if (!timespec64_equal(&VFS_I(base_ni)->i_mtime, &now) ||
2803 !timespec64_equal(&VFS_I(base_ni)->i_ctime, &now))
2804 sync_it = 1;
2805 VFS_I(base_ni)->i_mtime = now;
2806 VFS_I(base_ni)->i_ctime = now;
2807
2808 if (sync_it)
2809 mark_inode_dirty_sync(VFS_I(base_ni));
2810 }
2811
2812 if (likely(!err)) {
2813 NInoClearTruncateFailed(ni);
2814 ntfs_debug("Done.");
2815 }
2816 return err;
2817 old_bad_out:
2818 old_size = -1;
2819 bad_out:
2820 if (err != -ENOMEM && err != -EOPNOTSUPP)
2821 NVolSetErrors(vol);
2822 if (err != -EOPNOTSUPP)
2823 NInoSetTruncateFailed(ni);
2824 else if (old_size >= 0)
2825 i_size_write(vi, old_size);
2826 err_out:
2827 if (ctx)
2828 ntfs_attr_put_search_ctx(ctx);
2829 if (m)
2830 unmap_mft_record(base_ni);
2831 up_write(&ni->runlist.lock);
2832 out:
2833 ntfs_debug("Failed. Returning error code %i.", err);
2834 return err;
2835 conv_err_out:
2836 if (err != -ENOMEM && err != -EOPNOTSUPP)
2837 NVolSetErrors(vol);
2838 if (err != -EOPNOTSUPP)
2839 NInoSetTruncateFailed(ni);
2840 else
2841 i_size_write(vi, old_size);
2842 goto out;
2843 }
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853 #ifdef NTFS_RW
2854 void ntfs_truncate_vfs(struct inode *vi) {
2855 ntfs_truncate(vi);
2856 }
2857 #endif
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874 int ntfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
2875 struct iattr *attr)
2876 {
2877 struct inode *vi = d_inode(dentry);
2878 int err;
2879 unsigned int ia_valid = attr->ia_valid;
2880
2881 err = setattr_prepare(&init_user_ns, dentry, attr);
2882 if (err)
2883 goto out;
2884
2885 if (ia_valid & (ATTR_UID | ATTR_GID | ATTR_MODE)) {
2886 ntfs_warning(vi->i_sb, "Changes in user/group/mode are not "
2887 "supported yet, ignoring.");
2888 err = -EOPNOTSUPP;
2889 goto out;
2890 }
2891 if (ia_valid & ATTR_SIZE) {
2892 if (attr->ia_size != i_size_read(vi)) {
2893 ntfs_inode *ni = NTFS_I(vi);
2894
2895
2896
2897
2898 if (NInoCompressed(ni) || NInoEncrypted(ni)) {
2899 ntfs_warning(vi->i_sb, "Changes in inode size "
2900 "are not supported yet for "
2901 "%s files, ignoring.",
2902 NInoCompressed(ni) ?
2903 "compressed" : "encrypted");
2904 err = -EOPNOTSUPP;
2905 } else {
2906 truncate_setsize(vi, attr->ia_size);
2907 ntfs_truncate_vfs(vi);
2908 }
2909 if (err || ia_valid == ATTR_SIZE)
2910 goto out;
2911 } else {
2912
2913
2914
2915
2916 ia_valid |= ATTR_MTIME | ATTR_CTIME;
2917 }
2918 }
2919 if (ia_valid & ATTR_ATIME)
2920 vi->i_atime = attr->ia_atime;
2921 if (ia_valid & ATTR_MTIME)
2922 vi->i_mtime = attr->ia_mtime;
2923 if (ia_valid & ATTR_CTIME)
2924 vi->i_ctime = attr->ia_ctime;
2925 mark_inode_dirty(vi);
2926 out:
2927 return err;
2928 }
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948 int __ntfs_write_inode(struct inode *vi, int sync)
2949 {
2950 sle64 nt;
2951 ntfs_inode *ni = NTFS_I(vi);
2952 ntfs_attr_search_ctx *ctx;
2953 MFT_RECORD *m;
2954 STANDARD_INFORMATION *si;
2955 int err = 0;
2956 bool modified = false;
2957
2958 ntfs_debug("Entering for %sinode 0x%lx.", NInoAttr(ni) ? "attr " : "",
2959 vi->i_ino);
2960
2961
2962
2963
2964
2965 if (NInoAttr(ni)) {
2966 NInoClearDirty(ni);
2967 ntfs_debug("Done.");
2968 return 0;
2969 }
2970
2971 m = map_mft_record(ni);
2972 if (IS_ERR(m)) {
2973 err = PTR_ERR(m);
2974 goto err_out;
2975 }
2976
2977 ctx = ntfs_attr_get_search_ctx(ni, m);
2978 if (unlikely(!ctx)) {
2979 err = -ENOMEM;
2980 goto unm_err_out;
2981 }
2982 err = ntfs_attr_lookup(AT_STANDARD_INFORMATION, NULL, 0,
2983 CASE_SENSITIVE, 0, NULL, 0, ctx);
2984 if (unlikely(err)) {
2985 ntfs_attr_put_search_ctx(ctx);
2986 goto unm_err_out;
2987 }
2988 si = (STANDARD_INFORMATION*)((u8*)ctx->attr +
2989 le16_to_cpu(ctx->attr->data.resident.value_offset));
2990
2991 nt = utc2ntfs(vi->i_mtime);
2992 if (si->last_data_change_time != nt) {
2993 ntfs_debug("Updating mtime for inode 0x%lx: old = 0x%llx, "
2994 "new = 0x%llx", vi->i_ino, (long long)
2995 sle64_to_cpu(si->last_data_change_time),
2996 (long long)sle64_to_cpu(nt));
2997 si->last_data_change_time = nt;
2998 modified = true;
2999 }
3000 nt = utc2ntfs(vi->i_ctime);
3001 if (si->last_mft_change_time != nt) {
3002 ntfs_debug("Updating ctime for inode 0x%lx: old = 0x%llx, "
3003 "new = 0x%llx", vi->i_ino, (long long)
3004 sle64_to_cpu(si->last_mft_change_time),
3005 (long long)sle64_to_cpu(nt));
3006 si->last_mft_change_time = nt;
3007 modified = true;
3008 }
3009 nt = utc2ntfs(vi->i_atime);
3010 if (si->last_access_time != nt) {
3011 ntfs_debug("Updating atime for inode 0x%lx: old = 0x%llx, "
3012 "new = 0x%llx", vi->i_ino,
3013 (long long)sle64_to_cpu(si->last_access_time),
3014 (long long)sle64_to_cpu(nt));
3015 si->last_access_time = nt;
3016 modified = true;
3017 }
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034 if (modified) {
3035 flush_dcache_mft_record_page(ctx->ntfs_ino);
3036 if (!NInoTestSetDirty(ctx->ntfs_ino))
3037 mark_ntfs_record_dirty(ctx->ntfs_ino->page,
3038 ctx->ntfs_ino->page_ofs);
3039 }
3040 ntfs_attr_put_search_ctx(ctx);
3041
3042 if (NInoDirty(ni))
3043 err = write_mft_record(ni, m, sync);
3044
3045 mutex_lock(&ni->extent_lock);
3046 if (ni->nr_extents > 0) {
3047 ntfs_inode **extent_nis = ni->ext.extent_ntfs_inos;
3048 int i;
3049
3050 ntfs_debug("Writing %i extent inodes.", ni->nr_extents);
3051 for (i = 0; i < ni->nr_extents; i++) {
3052 ntfs_inode *tni = extent_nis[i];
3053
3054 if (NInoDirty(tni)) {
3055 MFT_RECORD *tm = map_mft_record(tni);
3056 int ret;
3057
3058 if (IS_ERR(tm)) {
3059 if (!err || err == -ENOMEM)
3060 err = PTR_ERR(tm);
3061 continue;
3062 }
3063 ret = write_mft_record(tni, tm, sync);
3064 unmap_mft_record(tni);
3065 if (unlikely(ret)) {
3066 if (!err || err == -ENOMEM)
3067 err = ret;
3068 }
3069 }
3070 }
3071 }
3072 mutex_unlock(&ni->extent_lock);
3073 unmap_mft_record(ni);
3074 if (unlikely(err))
3075 goto err_out;
3076 ntfs_debug("Done.");
3077 return 0;
3078 unm_err_out:
3079 unmap_mft_record(ni);
3080 err_out:
3081 if (err == -ENOMEM) {
3082 ntfs_warning(vi->i_sb, "Not enough memory to write inode. "
3083 "Marking the inode dirty again, so the VFS "
3084 "retries later.");
3085 mark_inode_dirty(vi);
3086 } else {
3087 ntfs_error(vi->i_sb, "Failed (error %i): Run chkdsk.", -err);
3088 NVolSetErrors(ni->vol);
3089 }
3090 return err;
3091 }
3092
3093 #endif