diff options
Diffstat (limited to 'fs/ntfs/mft.c')
-rw-r--r-- | fs/ntfs/mft.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 15df34f62038..5577fc6e190f 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c | |||
@@ -1952,20 +1952,21 @@ restore_undo_alloc: | |||
1952 | NVolSetErrors(vol); | 1952 | NVolSetErrors(vol); |
1953 | return ret; | 1953 | return ret; |
1954 | } | 1954 | } |
1955 | a = ctx->attr; | 1955 | ctx->attr->data.non_resident.highest_vcn = |
1956 | a->data.non_resident.highest_vcn = cpu_to_sle64(old_last_vcn - 1); | 1956 | cpu_to_sle64(old_last_vcn - 1); |
1957 | undo_alloc: | 1957 | undo_alloc: |
1958 | if (ntfs_cluster_free(mft_ni, old_last_vcn, -1) < 0) { | 1958 | if (ntfs_cluster_free(mft_ni, old_last_vcn, -1, ctx) < 0) { |
1959 | ntfs_error(vol->sb, "Failed to free clusters from mft data " | 1959 | ntfs_error(vol->sb, "Failed to free clusters from mft data " |
1960 | "attribute.%s", es); | 1960 | "attribute.%s", es); |
1961 | NVolSetErrors(vol); | 1961 | NVolSetErrors(vol); |
1962 | } | 1962 | } |
1963 | a = ctx->attr; | ||
1963 | if (ntfs_rl_truncate_nolock(vol, &mft_ni->runlist, old_last_vcn)) { | 1964 | if (ntfs_rl_truncate_nolock(vol, &mft_ni->runlist, old_last_vcn)) { |
1964 | ntfs_error(vol->sb, "Failed to truncate mft data attribute " | 1965 | ntfs_error(vol->sb, "Failed to truncate mft data attribute " |
1965 | "runlist.%s", es); | 1966 | "runlist.%s", es); |
1966 | NVolSetErrors(vol); | 1967 | NVolSetErrors(vol); |
1967 | } | 1968 | } |
1968 | if (mp_rebuilt) { | 1969 | if (mp_rebuilt && !IS_ERR(ctx->mrec)) { |
1969 | if (ntfs_mapping_pairs_build(vol, (u8*)a + le16_to_cpu( | 1970 | if (ntfs_mapping_pairs_build(vol, (u8*)a + le16_to_cpu( |
1970 | a->data.non_resident.mapping_pairs_offset), | 1971 | a->data.non_resident.mapping_pairs_offset), |
1971 | old_alen - le16_to_cpu( | 1972 | old_alen - le16_to_cpu( |
@@ -1982,6 +1983,10 @@ undo_alloc: | |||
1982 | } | 1983 | } |
1983 | flush_dcache_mft_record_page(ctx->ntfs_ino); | 1984 | flush_dcache_mft_record_page(ctx->ntfs_ino); |
1984 | mark_mft_record_dirty(ctx->ntfs_ino); | 1985 | mark_mft_record_dirty(ctx->ntfs_ino); |
1986 | } else if (IS_ERR(ctx->mrec)) { | ||
1987 | ntfs_error(vol->sb, "Failed to restore attribute search " | ||
1988 | "context.%s", es); | ||
1989 | NVolSetErrors(vol); | ||
1985 | } | 1990 | } |
1986 | if (ctx) | 1991 | if (ctx) |
1987 | ntfs_attr_put_search_ctx(ctx); | 1992 | ntfs_attr_put_search_ctx(ctx); |