Lines Matching refs:ni

20 static struct mft_inode *ni_ins_mi(struct ntfs_inode *ni, struct rb_root *tree,
50 static struct mft_inode *ni_find_mi(struct ntfs_inode *ni, CLST rno)
52 return ni_ins_mi(ni, &ni->mi_tree, rno, NULL);
58 static void ni_add_mi(struct ntfs_inode *ni, struct mft_inode *mi)
60 ni_ins_mi(ni, &ni->mi_tree, mi->rno, &mi->node);
66 void ni_remove_mi(struct ntfs_inode *ni, struct mft_inode *mi)
68 rb_erase(&mi->node, &ni->mi_tree);
74 struct ATTR_STD_INFO *ni_std(struct ntfs_inode *ni)
78 attr = mi_find_attr(&ni->mi, NULL, ATTR_STD, NULL, 0, NULL);
88 struct ATTR_STD_INFO5 *ni_std5(struct ntfs_inode *ni)
92 attr = mi_find_attr(&ni->mi, NULL, ATTR_STD, NULL, 0, NULL);
101 void ni_clear(struct ntfs_inode *ni)
105 if (!ni->vfs_inode.i_nlink && ni->mi.mrec && is_rec_inuse(ni->mi.mrec))
106 ni_delete_all(ni);
108 al_destroy(ni);
110 for (node = rb_first(&ni->mi_tree); node;) {
114 rb_erase(node, &ni->mi_tree);
120 if (ni->ni_flags & NI_FLAG_DIR)
121 indx_clear(&ni->dir);
123 run_close(&ni->file.run);
125 if (ni->file.offs_page) {
127 put_page(ni->file.offs_page);
128 ni->file.offs_page = NULL;
133 mi_clear(&ni->mi);
139 int ni_load_mi_ex(struct ntfs_inode *ni, CLST rno, struct mft_inode **mi)
144 r = ni_find_mi(ni, rno);
148 err = mi_get(ni->mi.sbi, rno, &r);
152 ni_add_mi(ni, r);
163 int ni_load_mi(struct ntfs_inode *ni, const struct ATTR_LIST_ENTRY *le,
169 *mi = &ni->mi;
174 if (rno == ni->mi.rno) {
175 *mi = &ni->mi;
178 return ni_load_mi_ex(ni, rno, mi);
186 struct ATTRIB *ni_find_attr(struct ntfs_inode *ni, struct ATTRIB *attr,
194 if (!ni->attr_list.size ||
199 *mi = &ni->mi;
202 return mi_find_attr(&ni->mi, attr, type, name, name_len, NULL);
206 le = al_find_ex(ni, le_o ? *le_o : NULL, type, name, name_len, vcn);
214 if (ni_load_mi(ni, le, &m))
239 ntfs_inode_err(&ni->vfs_inode, "failed to parse mft record");
240 ntfs_set_state(ni->mi.sbi, NTFS_DIRTY_ERROR);
247 struct ATTRIB *ni_enum_attr_ex(struct ntfs_inode *ni, struct ATTRIB *attr,
255 if (!ni->attr_list.size) {
258 *mi = &ni->mi;
260 return mi_enum_attr(&ni->mi, attr);
264 le2 = *le = al_enumerate(ni, attr ? *le : NULL);
269 if (ni_load_mi(ni, le2, &mi2))
282 struct ATTRIB *ni_load_attr(struct ntfs_inode *ni, enum ATTR_TYPE type,
291 if (!ni->attr_list.size) {
293 *pmi = &ni->mi;
294 return mi_find_attr(&ni->mi, NULL, type, name, name_len, NULL);
297 le = al_find_ex(ni, NULL, type, name, name_len, NULL);
308 next = al_find_ex(ni, le, type, name, name_len, NULL);
314 if (ni_load_mi(ni, le, &mi))
337 int ni_load_all_mi(struct ntfs_inode *ni)
342 if (!ni->attr_list.size)
347 while ((le = al_enumerate(ni, le))) {
350 if (rno == ni->mi.rno)
353 err = ni_load_mi_ex(ni, rno, NULL);
364 bool ni_add_subrecord(struct ntfs_inode *ni, CLST rno, struct mft_inode **mi)
372 if (mi_format_new(m, ni->mi.sbi, rno, 0, ni->mi.rno == MFT_REC_MFT)) {
377 mi_get_ref(&ni->mi, &m->mrec->parent_ref);
379 ni_add_mi(ni, m);
387 int ni_remove_attr(struct ntfs_inode *ni, enum ATTR_TYPE type,
398 if (base_only || type == ATTR_LIST || !ni->attr_list.size) {
399 attr = mi_find_attr(&ni->mi, NULL, type, name, name_len, id);
403 mi_remove_attr(ni, &ni->mi, attr);
411 le = al_enumerate(ni, le);
432 err = ni_load_mi(ni, le, &mi);
436 al_remove_le(ni, le);
442 mi_remove_attr(ni, mi, attr);
444 if (PtrOffset(ni->attr_list.le, le) >= ni->attr_list.size)
456 ni_ins_new_attr(struct ntfs_inode *ni, struct mft_inode *mi,
468 if (type != ATTR_LIST && !le && ni->attr_list.size) {
469 err = al_add_le(ni, type, name, name_len, svcn, cpu_to_le16(-1),
489 al_remove_le(ni, le);
503 ni->attr_list.dirty = true;
519 static int ni_repack(struct ntfs_inode *ni)
525 struct ntfs_sb_info *sbi = ni->mi.sbi;
537 while ((attr = ni_enum_attr_ex(ni, attr, &le, &mi))) {
581 err = run_unpack(&run, sbi, ni->mi.rno, svcn, evcn, svcn,
609 al_remove_le(ni, le);
617 ni->attr_list.dirty = true;
636 ntfs_inode_warn(&ni->vfs_inode, "repack problem");
655 static int ni_try_remove_attr_list(struct ntfs_inode *ni)
658 struct ntfs_sb_info *sbi = ni->mi.sbi;
667 if (!ni->attr_list.dirty)
670 err = ni_repack(ni);
674 attr_list = mi_find_attr(&ni->mi, NULL, ATTR_LIST, NULL, 0, NULL);
681 free = sbi->record_size - le32_to_cpu(ni->mi.mrec->used) + asize;
682 mi_get_ref(&ni->mi, &ref);
685 while ((le = al_enumerate(ni, le))) {
692 mi = ni_find_mi(ni, ino_get(&le->ref));
709 mrec = kmemdup(ni->mi.mrec, sbi->record_size, GFP_NOFS);
714 mi_remove_attr(NULL, &ni->mi, attr_list);
722 while ((le = al_enumerate(ni, le))) {
726 mi = ni_find_mi(ni, ino_get(&le->ref));
741 attr_ins = mi_insert_attr(&ni->mi, le->type, le_name(le),
761 while ((le = al_enumerate(ni, le))) {
765 mi = ni_find_mi(ni, ino_get(&le->ref));
778 run_deallocate(sbi, &ni->attr_list.run, true);
779 run_close(&ni->attr_list.run);
780 ni->attr_list.size = 0;
781 kvfree(ni->attr_list.le);
782 ni->attr_list.le = NULL;
783 ni->attr_list.dirty = false;
789 swap(mrec, ni->mi.mrec);
797 int ni_create_attr_list(struct ntfs_inode *ni)
799 struct ntfs_sb_info *sbi = ni->mi.sbi;
812 is_mft = ni->mi.rno == MFT_REC_MFT;
813 rec = ni->mi.mrec;
824 mi_get_ref(&ni->mi, &le->ref);
825 ni->attr_list.le = le;
832 for (; (attr = mi_enum_attr(&ni->mi, attr)); le = Add2Ptr(le, sz)) {
839 if (le != ni->attr_list.le)
840 le->ref = ni->attr_list.le->ref;
860 lsize = PtrOffset(ni->attr_list.le, le);
861 ni->attr_list.size = lsize;
876 err = ntfs_look_free_mft(sbi, &rno, is_mft, ni, &mi);
900 if (!mi_remove_attr(NULL, &ni->mi, b))
910 attr = mi_insert_attr(&ni->mi, ATTR_LIST, NULL, 0,
922 memcpy(resident_data_ex(attr, lsize), ni->attr_list.le, lsize);
924 ni->attr_list.dirty = false;
926 mark_inode_dirty(&ni->vfs_inode);
930 kvfree(ni->attr_list.le);
931 ni->attr_list.le = NULL;
932 ni->attr_list.size = 0;
939 static int ni_ins_attr_ext(struct ntfs_inode *ni, struct ATTR_LIST_ENTRY *le,
952 struct ntfs_sb_info *sbi = ni->mi.sbi;
954 is_mft = ni->mi.rno == MFT_REC_MFT;
967 ni->mi.rno == MFT_REC_LOG) {
973 if (!ni->attr_list.size) {
974 err = ni_create_attr_list(ni);
985 err = ni_load_all_mi(ni);
990 for (node = rb_first(&ni->mi_tree); node; node = rb_next(node)) {
1022 attr = ni_ins_new_attr(ni, mi, le, type, name, name_len, asize,
1038 err = ntfs_look_free_mft(sbi, &rno, is_mft_data, ni, &mi);
1047 attr = ni_ins_new_attr(ni, mi, le, type, name, name_len, asize,
1067 ni_remove_mi(ni, mi);
1090 static int ni_insert_attr(struct ntfs_inode *ni, enum ATTR_TYPE type,
1096 struct ntfs_sb_info *sbi = ni->mi.sbi;
1106 is_mft = ni->mi.rno == MFT_REC_MFT;
1107 rec = ni->mi.mrec;
1122 attr = ni_ins_new_attr(ni, &ni->mi, NULL, type, name, name_len,
1133 *ins_mi = &ni->mi;
1141 err = ni_ins_attr_ext(ni, NULL, type, name, name_len, asize,
1158 while ((attr = mi_enum_attr(&ni->mi, attr))) {
1176 attr = mi_enum_attr(&ni->mi, attr);
1188 if (ni->attr_list.size) {
1189 le = al_find_le(ni, NULL, attr);
1199 err = ni_ins_attr_ext(ni, le, attr->type, Add2Ptr(attr, t16),
1210 mi_remove_attr(NULL, &ni->mi, attr);
1219 attr = ni_ins_new_attr(ni, &ni->mi, NULL, type, name, name_len, asize,
1234 *ins_mi = &ni->mi;
1241 static int ni_expand_mft_list(struct ntfs_inode *ni)
1244 struct runs_tree *run = &ni->file.run;
1250 struct ntfs_sb_info *sbi = ni->mi.sbi;
1257 for (node = rb_first(&ni->mi_tree); node; node = rb_next(node)) {
1269 if (ntfs_look_free_mft(sbi, &mft_new, true, ni, &mi_new)) {
1278 ni_remove_mi(ni, mi_new);
1281 attr = mi_find_attr(&ni->mi, NULL, ATTR_DATA, NULL, 0, NULL);
1318 le32_sub_cpu(&ni->mi.mrec->used, done);
1338 attr = ni_ins_new_attr(ni, mi_min, NULL, ATTR_DATA, NULL, 0,
1366 ni_remove_mi(ni, mi_new);
1375 int ni_expand_list(struct ntfs_inode *ni)
1381 bool is_mft = ni->mi.rno == MFT_REC_MFT;
1384 mi_get_ref(&ni->mi, &ref);
1387 while ((le = al_enumerate(ni, le))) {
1398 attr = rec_find_attr_le(&ni->mi, le);
1407 err = ni_ins_attr_ext(ni, le, attr->type, attr_name(attr),
1418 mi_remove_attr(NULL, &ni->mi, attr);
1430 err = ni_expand_mft_list(ni);
1439 int ni_insert_nonresident(struct ntfs_inode *ni, enum ATTR_TYPE type,
1454 struct ntfs_sb_info *sbi = ni->mi.sbi;
1476 err = ni_insert_attr(ni, type, name, name_len, asize, name_off, svcn,
1498 svcn ? 0 : cpu_to_le64((u64)len << ni->mi.sbi->cluster_bits);
1515 int ni_insert_resident(struct ntfs_inode *ni, u32 data_size,
1525 err = ni_insert_attr(ni, type, name, name_len, asize, SIZEOF_RESIDENT,
1539 le16_add_cpu(&ni->mi.mrec->hard_links, 1);
1540 ni->mi.dirty = true;
1553 void ni_remove_attr_le(struct ntfs_inode *ni, struct ATTRIB *attr,
1556 mi_remove_attr(ni, mi, attr);
1559 al_remove_le(ni, le);
1567 int ni_delete_all(struct ntfs_inode *ni)
1576 struct ntfs_sb_info *sbi = ni->mi.sbi;
1580 while ((attr = ni_enum_attr_ex(ni, attr, &le, NULL))) {
1584 mi_get_ref(&ni->mi, &ref);
1608 run_unpack_ex(RUN_DEALLOCATE, sbi, ni->mi.rno, svcn, evcn, svcn,
1612 if (ni->attr_list.size) {
1613 run_deallocate(ni->mi.sbi, &ni->attr_list.run, true);
1614 al_destroy(ni);
1618 for (node = rb_first(&ni->mi_tree); node;) {
1627 ni_remove_mi(ni, mi);
1633 clear_rec_inuse(ni->mi.mrec);
1634 ni->mi.dirty = true;
1635 err = mi_write(&ni->mi, 0);
1637 ntfs_mark_rec_free(sbi, ni->mi.rno, false);
1646 struct ATTR_FILE_NAME *ni_fname_name(struct ntfs_inode *ni,
1660 attr = ni_find_attr(ni, attr, le, ATTR_NAME, NULL, 0, NULL, mi);
1688 struct ATTR_FILE_NAME *ni_fname_type(struct ntfs_inode *ni, u8 name_type,
1702 attr = ni_find_attr(ni, attr, le, ATTR_NAME, NULL, 0, NULL, mi);
1716 * NOTE: You need to set ni->std_fa = new_fa
1719 int ni_new_attr_flags(struct ntfs_inode *ni, enum FILE_ATTRIBUTE new_fa)
1726 attr = ni_find_attr(ni, NULL, NULL, ATTR_DATA, NULL, 0, NULL, &mi);
1747 ntfs_inode_warn(&ni->vfs_inode,
1757 &ni->vfs_inode,
1774 ni->vfs_inode.i_mapping->a_ops = &ntfs_aops;
1779 ni->vfs_inode.i_mapping->a_ops = &ntfs_aops_cmpr;
1784 ni->vfs_inode.i_mapping->a_ops = &ntfs_aops;
1799 enum REPARSE_SIGN ni_parse_reparse(struct ntfs_inode *ni, struct ATTRIB *attr,
1816 if (!attr_load_runs_vcn(ni, ATTR_REPARSE, NULL, 0, &run, 0) &&
1817 !ntfs_read_run_nb(ni->mi.sbi, &run, 0, buffer,
1878 ni_set_ext_compress_bits(ni, bits);
1882 ni->ni_flags |= NI_FLAG_DEDUPLICATED;
1905 int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
1909 struct ntfs_sb_info *sbi = ni->mi.sbi;
1916 u64 valid = ni->i_valid;
1923 if (S_ISDIR(ni->vfs_inode.i_mode)) {
1924 run = &ni->dir.alloc_run;
1925 attr = ni_find_attr(ni, NULL, NULL, ATTR_ALLOC, I30_NAME,
1927 run_lock = &ni->dir.run_lock;
1929 run = &ni->file.run;
1930 attr = ni_find_attr(ni, NULL, NULL, ATTR_DATA, NULL, 0, NULL,
1940 &ni->vfs_inode,
1944 run_lock = &ni->file.run_lock;
1979 err = attr_load_runs_vcn(ni, attr->type,
2009 if (S_ISDIR(ni->vfs_inode.i_mode)) {
2015 ni, attr, vcn >> attr->nres.c_unit, &clst_data);
2088 int ni_readpage_cmpr(struct ntfs_inode *ni, struct page *page)
2091 struct ntfs_sb_info *sbi = ni->mi.sbi;
2102 if (vbo >= i_size_read(&ni->vfs_inode)) {
2108 if (ni->ni_flags & NI_FLAG_COMPRESSED_MASK) {
2110 frame_bits = ni_ext_compress_bits(ni);
2143 err = ni_read_frame(ni, frame_vbo, pages, pages_per_frame);
2172 int ni_decompress_file(struct ntfs_inode *ni)
2174 struct ntfs_sb_info *sbi = ni->mi.sbi;
2175 struct inode *inode = &ni->vfs_inode;
2202 frame_bits = ni_ext_compress_bits(ni);
2230 err = attr_data_get_block(ni, vcn, cend - vcn, &lcn,
2251 err = ni_read_frame(ni, vbo, pages, pages_per_frame);
2254 down_read(&ni->file.run_lock);
2255 err = ntfs_bio_pages(sbi, &ni->file.run, pages,
2258 up_read(&ni->file.run_lock);
2279 while ((attr = ni_enum_attr_ex(ni, attr, &le, NULL))) {
2286 mi_get_ref(&ni->mi, &ref);
2314 run_unpack_ex(RUN_DEALLOCATE, sbi, ni->mi.rno, svcn, evcn, svcn,
2321 err = ni_remove_attr(ni, ATTR_DATA, WOF_NAME, ARRAY_SIZE(WOF_NAME),
2329 err = ni_remove_attr(ni, ATTR_REPARSE, NULL, 0, false, NULL);
2336 attr = ni_find_attr(ni, NULL, NULL, ATTR_DATA, NULL, 0, NULL, &mi);
2357 ni->std_fa &= ~(FILE_ATTRIBUTE_SPARSE_FILE |
2364 ni->ni_flags &= ~NI_FLAG_COMPRESSED_MASK;
2365 if (ni->file.offs_page) {
2366 put_page(ni->file.offs_page);
2367 ni->file.offs_page = NULL;
2448 int ni_read_frame(struct ntfs_inode *ni, u64 frame_vbo, struct page **pages,
2452 struct ntfs_sb_info *sbi = ni->mi.sbi;
2458 struct runs_tree *run = &ni->file.run;
2459 u64 valid_size = ni->i_valid;
2481 attr = ni_find_attr(ni, NULL, &le, ATTR_DATA, NULL, 0, NULL, NULL);
2506 if (ni->ni_flags & NI_FLAG_COMPRESSED_MASK) {
2511 loff_t i_size = i_size_read(&ni->vfs_inode);
2512 u32 frame_bits = ni_ext_compress_bits(ni);
2532 attr = ni_find_attr(ni, attr, &le, ATTR_DATA, WOF_NAME,
2536 &ni->vfs_inode,
2554 err = attr_wof_frame_info(ni, attr, run, frame64, frames,
2585 err = attr_load_runs_range(ni, ATTR_DATA, WOF_NAME,
2606 down_write(&ni->file.run_lock);
2609 err = attr_is_frame_compressed(ni, attr, frame, &clst_data);
2610 up_write(&ni->file.run_lock);
2624 down_read(&ni->file.run_lock);
2628 up_read(&ni->file.run_lock);
2657 down_read(&ni->file.run_lock);
2660 up_read(&ni->file.run_lock);
2675 if (run != &ni->file.run) {
2712 if (run != &ni->file.run)
2733 int ni_write_frame(struct ntfs_inode *ni, struct page **pages,
2737 struct ntfs_sb_info *sbi = ni->mi.sbi;
2753 attr = ni_find_attr(ni, NULL, &le, ATTR_DATA, NULL, 0, NULL, &mi);
2770 down_write(&ni->file.run_lock);
2771 err = attr_make_nonresident(ni, attr, le, mi,
2773 &ni->file.run, &attr, pages[0]);
2774 up_write(&ni->file.run_lock);
2857 down_write(&ni->file.run_lock);
2858 run_truncate_around(&ni->file.run, le64_to_cpu(attr->nres.svcn));
2859 err = attr_allocate_frame(ni, frame, compr_size, ni->i_valid);
2860 up_write(&ni->file.run_lock);
2867 down_read(&ni->file.run_lock);
2868 err = ntfs_bio_pages(sbi, &ni->file.run,
2872 up_read(&ni->file.run_lock);
2900 int ni_remove_name(struct ntfs_inode *dir_ni, struct ntfs_inode *ni,
2904 struct ntfs_sb_info *sbi = ni->mi.sbi;
2917 fname = ni_fname_name(ni, (struct le_str *)&de_name->name_len,
2934 ni_remove_attr_le(ni, attr_from_name(fname), mi, le);
2939 fname = ni_fname_type(ni, name_type, &mi, &le);
2955 ni_remove_attr_le(ni, attr_from_name(fname), mi, le);
2967 bool ni_remove_name_undo(struct ntfs_inode *dir_ni, struct ntfs_inode *ni,
2970 struct ntfs_sb_info *sbi = ni->mi.sbi;
2977 if (ni_insert_resident(ni, de_key_size, ATTR_NAME, NULL, 0,
2982 mi_get_ref(&ni->mi, &de2->ref);
2995 if (ni_insert_resident(ni, de_key_size, ATTR_NAME, NULL, 0,
3000 mi_get_ref(&ni->mi, &de->ref);
3012 int ni_add_name(struct ntfs_inode *dir_ni, struct ntfs_inode *ni,
3016 struct ntfs_sb_info *sbi = ni->mi.sbi;
3029 if (ni->mi.sbi->options->hide_dot_files) {
3032 ni->std_fa |= FILE_ATTRIBUTE_HIDDEN;
3034 ni->std_fa &= ~FILE_ATTRIBUTE_HIDDEN;
3037 mi_get_ref(&ni->mi, &de->ref);
3041 fname = ni_fname_name(ni, NULL, NULL, NULL, NULL);
3044 de_name->dup.fa = ni->std_fa;
3047 err = ni_insert_resident(ni, de_key_size, ATTR_NAME, NULL, 0, &attr,
3057 ni_remove_attr_le(ni, attr, mi, le);
3066 struct ntfs_inode *ni, struct NTFS_DE *de, struct NTFS_DE *new_de,
3087 err = ni_add_name(new_dir_ni, ni, new_de);
3089 err = ni_remove_name(dir_ni, ni, de, &de2, &undo);
3090 if (err && ni_remove_name(new_dir_ni, ni, new_de, &de2, &undo))
3098 * err = ni_remove_name(dir_ni, ni, de, &de2, &undo);
3100 * err = ni_add_name(new_dir_ni, ni, new_de);
3101 * if (err && !ni_remove_name_undo(dir_ni, ni, de, de2, undo))
3110 * ni_is_dirty - Return: True if 'ni' requires ni_write_inode.
3114 struct ntfs_inode *ni = ntfs_i(inode);
3117 if (ni->mi.dirty || ni->attr_list.dirty ||
3118 (ni->ni_flags & NI_FLAG_UPDATE_PARENT))
3121 for (node = rb_first(&ni->mi_tree); node; node = rb_next(node)) {
3134 static bool ni_update_parent(struct ntfs_inode *ni, struct NTFS_DUP_INFO *dup,
3140 struct ntfs_sb_info *sbi = ni->mi.sbi;
3144 if (ni->mi.mrec->flags & RECORD_FLAG_DIR) {
3152 attr = ni_find_attr(ni, NULL, &le, ATTR_DATA, NULL, 0, NULL,
3162 u64 new_valid = ni->i_valid;
3186 if (ni->ni_flags & NI_FLAG_EA) {
3187 attr = ni_find_attr(ni, attr, &le, ATTR_EA_INFO, NULL, 0, NULL,
3202 while ((attr = ni_find_attr(ni, attr, &le, ATTR_NAME, NULL, 0, NULL,
3212 if (ino_get(&fname->home) == ni->vfs_inode.i_ino) {
3221 &ni->vfs_inode,
3251 struct ntfs_inode *ni = ntfs_i(inode);
3265 if (!ni_trylock(ni)) {
3266 /* 'ni' is under modification, skip for now. */
3271 if (!ni->mi.mrec)
3274 if (is_rec_inuse(ni->mi.mrec) &&
3280 std = ni_std(ni);
3308 dup.fa = ni->std_fa;
3316 ni->mi.dirty = true;
3319 (modified || (ni->ni_flags & NI_FLAG_UPDATE_PARENT))
3324 re_dirty = ni_update_parent(ni, &dup, sync);
3327 ni->ni_flags |= NI_FLAG_UPDATE_PARENT;
3329 ni->ni_flags &= ~NI_FLAG_UPDATE_PARENT;
3333 if (ni->attr_list.size && ni->attr_list.dirty) {
3335 err = ni_try_remove_attr_list(ni);
3340 err = al_update(ni, sync);
3346 for (node = rb_first(&ni->mi_tree); node; node = next) {
3366 rb_erase(node, &ni->mi_tree);
3371 if (ni->mi.dirty) {
3372 err2 = mi_write(&ni->mi, sync);
3377 ni_unlock(ni);