frecord.c (fa3cacf544636b2dc48cfb2f277a2071f14d66a2) frecord.c (195c52bdd5d5ecfdabf5a7c6159efe299e534f84)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 *
4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
5 *
6 */
7
8#include <linux/blkdev.h>

--- 374 unchanged lines hidden (view full) ---

383 * ni_add_subrecord
384 *
385 * allocate + format + attach a new subrecord
386 */
387bool ni_add_subrecord(struct ntfs_inode *ni, CLST rno, struct mft_inode **mi)
388{
389 struct mft_inode *m;
390
1// SPDX-License-Identifier: GPL-2.0
2/*
3 *
4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
5 *
6 */
7
8#include <linux/blkdev.h>

--- 374 unchanged lines hidden (view full) ---

383 * ni_add_subrecord
384 *
385 * allocate + format + attach a new subrecord
386 */
387bool ni_add_subrecord(struct ntfs_inode *ni, CLST rno, struct mft_inode **mi)
388{
389 struct mft_inode *m;
390
391 m = ntfs_zalloc(sizeof(struct mft_inode));
391 m = kzalloc(sizeof(struct mft_inode), GFP_NOFS);
392 if (!m)
393 return false;
394
395 if (mi_format_new(m, ni->mi.sbi, rno, 0, ni->mi.rno == MFT_REC_MFT)) {
396 mi_put(m);
397 return false;
398 }
399

--- 347 unchanged lines hidden (view full) ---

747
748 /* remove from original record */
749 mi_remove_attr(mi, attr);
750 }
751
752 run_deallocate(sbi, &ni->attr_list.run, true);
753 run_close(&ni->attr_list.run);
754 ni->attr_list.size = 0;
392 if (!m)
393 return false;
394
395 if (mi_format_new(m, ni->mi.sbi, rno, 0, ni->mi.rno == MFT_REC_MFT)) {
396 mi_put(m);
397 return false;
398 }
399

--- 347 unchanged lines hidden (view full) ---

747
748 /* remove from original record */
749 mi_remove_attr(mi, attr);
750 }
751
752 run_deallocate(sbi, &ni->attr_list.run, true);
753 run_close(&ni->attr_list.run);
754 ni->attr_list.size = 0;
755 ntfs_free(ni->attr_list.le);
755 kfree(ni->attr_list.le);
756 ni->attr_list.le = NULL;
757 ni->attr_list.dirty = false;
758
759 return 0;
760}
761
762/*
763 * ni_create_attr_list

--- 18 unchanged lines hidden (view full) ---

782 is_mft = ni->mi.rno == MFT_REC_MFT;
783 rec = ni->mi.mrec;
784 rs = sbi->record_size;
785
786 /*
787 * Skip estimating exact memory requirement
788 * Looks like one record_size is always enough
789 */
756 ni->attr_list.le = NULL;
757 ni->attr_list.dirty = false;
758
759 return 0;
760}
761
762/*
763 * ni_create_attr_list

--- 18 unchanged lines hidden (view full) ---

782 is_mft = ni->mi.rno == MFT_REC_MFT;
783 rec = ni->mi.mrec;
784 rs = sbi->record_size;
785
786 /*
787 * Skip estimating exact memory requirement
788 * Looks like one record_size is always enough
789 */
790 le = ntfs_malloc(al_aligned(rs));
790 le = kmalloc(al_aligned(rs), GFP_NOFS);
791 if (!le) {
792 err = -ENOMEM;
793 goto out;
794 }
795
796 mi_get_ref(&ni->mi, &le->ref);
797 ni->attr_list.le = le;
798

--- 89 unchanged lines hidden (view full) ---

888 memcpy(resident_data_ex(attr, lsize), ni->attr_list.le, lsize);
889
890 ni->attr_list.dirty = false;
891
892 mark_inode_dirty(&ni->vfs_inode);
893 goto out;
894
895out1:
791 if (!le) {
792 err = -ENOMEM;
793 goto out;
794 }
795
796 mi_get_ref(&ni->mi, &le->ref);
797 ni->attr_list.le = le;
798

--- 89 unchanged lines hidden (view full) ---

888 memcpy(resident_data_ex(attr, lsize), ni->attr_list.le, lsize);
889
890 ni->attr_list.dirty = false;
891
892 mark_inode_dirty(&ni->vfs_inode);
893 goto out;
894
895out1:
896 ntfs_free(ni->attr_list.le);
896 kfree(ni->attr_list.le);
897 ni->attr_list.le = NULL;
898 ni->attr_list.size = 0;
899
900out:
901 return err;
902}
903
904/*

--- 1144 unchanged lines hidden (view full) ---

2049 frame_bits = NTFS_LZNT_CUNIT + sbi->cluster_bits;
2050 }
2051 frame_size = 1u << frame_bits;
2052 frame = vbo >> frame_bits;
2053 frame_vbo = (u64)frame << frame_bits;
2054 idx = (vbo - frame_vbo) >> PAGE_SHIFT;
2055
2056 pages_per_frame = frame_size >> PAGE_SHIFT;
897 ni->attr_list.le = NULL;
898 ni->attr_list.size = 0;
899
900out:
901 return err;
902}
903
904/*

--- 1144 unchanged lines hidden (view full) ---

2049 frame_bits = NTFS_LZNT_CUNIT + sbi->cluster_bits;
2050 }
2051 frame_size = 1u << frame_bits;
2052 frame = vbo >> frame_bits;
2053 frame_vbo = (u64)frame << frame_bits;
2054 idx = (vbo - frame_vbo) >> PAGE_SHIFT;
2055
2056 pages_per_frame = frame_size >> PAGE_SHIFT;
2057 pages = ntfs_zalloc(pages_per_frame * sizeof(struct page *));
2057 pages = kzalloc(pages_per_frame * sizeof(struct page *), GFP_NOFS);
2058 if (!pages) {
2059 err = -ENOMEM;
2060 goto out;
2061 }
2062
2063 pages[idx] = page;
2064 index = frame_vbo >> PAGE_SHIFT;
2065 gfp_mask = mapping_gfp_mask(mapping);

--- 21 unchanged lines hidden (view full) ---

2087 if (i == idx)
2088 continue;
2089 unlock_page(pg);
2090 put_page(pg);
2091 }
2092
2093out:
2094 /* At this point, err contains 0 or -EIO depending on the "critical" page */
2058 if (!pages) {
2059 err = -ENOMEM;
2060 goto out;
2061 }
2062
2063 pages[idx] = page;
2064 index = frame_vbo >> PAGE_SHIFT;
2065 gfp_mask = mapping_gfp_mask(mapping);

--- 21 unchanged lines hidden (view full) ---

2087 if (i == idx)
2088 continue;
2089 unlock_page(pg);
2090 put_page(pg);
2091 }
2092
2093out:
2094 /* At this point, err contains 0 or -EIO depending on the "critical" page */
2095 ntfs_free(pages);
2095 kfree(pages);
2096 unlock_page(page);
2097
2098 return err;
2099}
2100
2101#ifdef CONFIG_NTFS3_LZX_XPRESS
2102/*
2103 * decompress lzx/xpress compressed file

--- 28 unchanged lines hidden (view full) ---

2132 if (cend > wnd_zeroes(&sbi->used.bitmap)) {
2133 err = -ENOSPC;
2134 goto out;
2135 }
2136
2137 frame_bits = ni_ext_compress_bits(ni);
2138 frame_size = 1u << frame_bits;
2139 pages_per_frame = frame_size >> PAGE_SHIFT;
2096 unlock_page(page);
2097
2098 return err;
2099}
2100
2101#ifdef CONFIG_NTFS3_LZX_XPRESS
2102/*
2103 * decompress lzx/xpress compressed file

--- 28 unchanged lines hidden (view full) ---

2132 if (cend > wnd_zeroes(&sbi->used.bitmap)) {
2133 err = -ENOSPC;
2134 goto out;
2135 }
2136
2137 frame_bits = ni_ext_compress_bits(ni);
2138 frame_size = 1u << frame_bits;
2139 pages_per_frame = frame_size >> PAGE_SHIFT;
2140 pages = ntfs_zalloc(pages_per_frame * sizeof(struct page *));
2140 pages = kzalloc(pages_per_frame * sizeof(struct page *), GFP_NOFS);
2141 if (!pages) {
2142 err = -ENOMEM;
2143 goto out;
2144 }
2145
2146 /*
2147 * Step 1: decompress data and copy to new allocated clusters
2148 */

--- 144 unchanged lines hidden (view full) ---

2293 ni->ni_flags &= ~NI_FLAG_COMPRESSED_MASK;
2294 if (ni->file.offs_page) {
2295 put_page(ni->file.offs_page);
2296 ni->file.offs_page = NULL;
2297 }
2298 mapping->a_ops = &ntfs_aops;
2299
2300out:
2141 if (!pages) {
2142 err = -ENOMEM;
2143 goto out;
2144 }
2145
2146 /*
2147 * Step 1: decompress data and copy to new allocated clusters
2148 */

--- 144 unchanged lines hidden (view full) ---

2293 ni->ni_flags &= ~NI_FLAG_COMPRESSED_MASK;
2294 if (ni->file.offs_page) {
2295 put_page(ni->file.offs_page);
2296 ni->file.offs_page = NULL;
2297 }
2298 mapping->a_ops = &ntfs_aops;
2299
2300out:
2301 ntfs_free(pages);
2301 kfree(pages);
2302 if (err) {
2303 make_bad_inode(inode);
2304 ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
2305 }
2306
2307 return err;
2308}
2309

--- 249 unchanged lines hidden (view full) ---

2559 vbo_disk = frame_vbo;
2560 npages_disk = (ondisk_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
2561 } else {
2562 __builtin_unreachable();
2563 err = -EINVAL;
2564 goto out1;
2565 }
2566
2302 if (err) {
2303 make_bad_inode(inode);
2304 ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
2305 }
2306
2307 return err;
2308}
2309

--- 249 unchanged lines hidden (view full) ---

2559 vbo_disk = frame_vbo;
2560 npages_disk = (ondisk_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
2561 } else {
2562 __builtin_unreachable();
2563 err = -EINVAL;
2564 goto out1;
2565 }
2566
2567 pages_disk = ntfs_zalloc(npages_disk * sizeof(struct page *));
2567 pages_disk = kzalloc(npages_disk * sizeof(struct page *), GFP_NOFS);
2568 if (!pages_disk) {
2569 err = -ENOMEM;
2570 goto out2;
2571 }
2572
2573 for (i = 0; i < npages_disk; i++) {
2574 pg = alloc_page(GFP_KERNEL);
2575 if (!pg) {

--- 52 unchanged lines hidden (view full) ---

2628 for (i = 0; i < npages_disk; i++) {
2629 pg = pages_disk[i];
2630 if (pg) {
2631 kunmap(pg);
2632 unlock_page(pg);
2633 put_page(pg);
2634 }
2635 }
2568 if (!pages_disk) {
2569 err = -ENOMEM;
2570 goto out2;
2571 }
2572
2573 for (i = 0; i < npages_disk; i++) {
2574 pg = alloc_page(GFP_KERNEL);
2575 if (!pg) {

--- 52 unchanged lines hidden (view full) ---

2628 for (i = 0; i < npages_disk; i++) {
2629 pg = pages_disk[i];
2630 if (pg) {
2631 kunmap(pg);
2632 unlock_page(pg);
2633 put_page(pg);
2634 }
2635 }
2636 ntfs_free(pages_disk);
2636 kfree(pages_disk);
2637
2638out2:
2639#ifdef CONFIG_NTFS3_LZX_XPRESS
2640 if (run != &ni->file.run)
2641 run_free(run);
2642#endif
2643out1:
2644 vunmap(frame_mem);

--- 59 unchanged lines hidden (view full) ---

2704 goto out;
2705 }
2706
2707 if (attr->nres.c_unit != NTFS_LZNT_CUNIT) {
2708 err = -EOPNOTSUPP;
2709 goto out;
2710 }
2711
2637
2638out2:
2639#ifdef CONFIG_NTFS3_LZX_XPRESS
2640 if (run != &ni->file.run)
2641 run_free(run);
2642#endif
2643out1:
2644 vunmap(frame_mem);

--- 59 unchanged lines hidden (view full) ---

2704 goto out;
2705 }
2706
2707 if (attr->nres.c_unit != NTFS_LZNT_CUNIT) {
2708 err = -EOPNOTSUPP;
2709 goto out;
2710 }
2711
2712 pages_disk = ntfs_zalloc(pages_per_frame * sizeof(struct page *));
2712 pages_disk = kzalloc(pages_per_frame * sizeof(struct page *),
2713 GFP_NOFS);
2713 if (!pages_disk) {
2714 err = -ENOMEM;
2715 goto out;
2716 }
2717
2718 for (i = 0; i < pages_per_frame; i++) {
2719 pg = alloc_page(GFP_KERNEL);
2720 if (!pg) {

--- 43 unchanged lines hidden (view full) ---

2764 sbi->compress.lznt = lznt;
2765 lznt = NULL;
2766 }
2767
2768 /* compress: frame_mem -> frame_ondisk */
2769 compr_size = compress_lznt(frame_mem, frame_size, frame_ondisk,
2770 frame_size, sbi->compress.lznt);
2771 mutex_unlock(&sbi->compress.mtx_lznt);
2714 if (!pages_disk) {
2715 err = -ENOMEM;
2716 goto out;
2717 }
2718
2719 for (i = 0; i < pages_per_frame; i++) {
2720 pg = alloc_page(GFP_KERNEL);
2721 if (!pg) {

--- 43 unchanged lines hidden (view full) ---

2765 sbi->compress.lznt = lznt;
2766 lznt = NULL;
2767 }
2768
2769 /* compress: frame_mem -> frame_ondisk */
2770 compr_size = compress_lznt(frame_mem, frame_size, frame_ondisk,
2771 frame_size, sbi->compress.lznt);
2772 mutex_unlock(&sbi->compress.mtx_lznt);
2772 ntfs_free(lznt);
2773 kfree(lznt);
2773
2774 if (compr_size + sbi->cluster_size > frame_size) {
2775 /* frame is not compressed */
2776 compr_size = frame_size;
2777 ondisk_size = frame_size;
2778 } else if (compr_size) {
2779 /* frame is compressed */
2780 ondisk_size = ntfs_up_cluster(sbi, compr_size);

--- 32 unchanged lines hidden (view full) ---

2813 for (i = 0; i < pages_per_frame; i++) {
2814 pg = pages_disk[i];
2815 if (pg) {
2816 kunmap(pg);
2817 unlock_page(pg);
2818 put_page(pg);
2819 }
2820 }
2774
2775 if (compr_size + sbi->cluster_size > frame_size) {
2776 /* frame is not compressed */
2777 compr_size = frame_size;
2778 ondisk_size = frame_size;
2779 } else if (compr_size) {
2780 /* frame is compressed */
2781 ondisk_size = ntfs_up_cluster(sbi, compr_size);

--- 32 unchanged lines hidden (view full) ---

2814 for (i = 0; i < pages_per_frame; i++) {
2815 pg = pages_disk[i];
2816 if (pg) {
2817 kunmap(pg);
2818 unlock_page(pg);
2819 put_page(pg);
2820 }
2821 }
2821 ntfs_free(pages_disk);
2822 kfree(pages_disk);
2822out:
2823 return err;
2824}
2825
2826/*
2827 * update duplicate info of ATTR_FILE_NAME in MFT and in parent directories
2828 */
2829static bool ni_update_parent(struct ntfs_inode *ni, struct NTFS_DUP_INFO *dup,

--- 246 unchanged lines hidden ---
2823out:
2824 return err;
2825}
2826
2827/*
2828 * update duplicate info of ATTR_FILE_NAME in MFT and in parent directories
2829 */
2830static bool ni_update_parent(struct ntfs_inode *ni, struct NTFS_DUP_INFO *dup,

--- 246 unchanged lines hidden ---