Lines Matching full:ni
82 * @ni: ntfs inode whose mft record page to map
84 * This maps the folio in which the mft record of the ntfs inode @ni is
87 * This allocates a new buffer (@ni->mrec), copies the MFT record data from
91 * The folio is pinned (referenced) in @ni->folio to ensure the data remains
94 * Return: A pointer to the allocated and fixed-up mft record (@ni->mrec).
98 static inline struct mft_record *map_mft_record_folio(struct ntfs_inode *ni) in map_mft_record_folio() argument
101 struct ntfs_volume *vol = ni->vol; in map_mft_record_folio()
107 WARN_ON(ni->folio); in map_mft_record_folio()
112 index = NTFS_MFT_NR_TO_PIDX(vol, ni->mft_no); in map_mft_record_folio()
113 ofs = NTFS_MFT_NR_TO_POFS(vol, ni->mft_no); in map_mft_record_folio()
126 ni->mft_no); in map_mft_record_folio()
136 ni->mrec = kmalloc(vol->mft_record_size, GFP_NOFS); in map_mft_record_folio()
137 if (!ni->mrec) { in map_mft_record_folio()
144 memcpy(ni->mrec, addr + ofs, vol->mft_record_size); in map_mft_record_folio()
145 post_read_mst_fixup((struct ntfs_record *)ni->mrec, vol->mft_record_size); in map_mft_record_folio()
148 if (!ntfs_mft_record_check(vol, (struct mft_record *)ni->mrec, ni->mft_no)) { in map_mft_record_folio()
150 ni->folio = folio; in map_mft_record_folio()
151 ni->folio_ofs = ofs; in map_mft_record_folio()
152 return ni->mrec; in map_mft_record_folio()
156 kfree(ni->mrec); in map_mft_record_folio()
157 ni->mrec = NULL; in map_mft_record_folio()
162 ni->folio = NULL; in map_mft_record_folio()
163 ni->folio_ofs = 0; in map_mft_record_folio()
169 * @ni: ntfs inode whose MFT record to map
175 * already mapped (@ni->folio is set), it returns the cached record
185 struct mft_record *map_mft_record(struct ntfs_inode *ni) in map_mft_record() argument
189 if (!ni) in map_mft_record()
192 ntfs_debug("Entering for mft_no 0x%llx.", ni->mft_no); in map_mft_record()
195 atomic_inc(&ni->count); in map_mft_record()
197 if (ni->folio) in map_mft_record()
198 return (struct mft_record *)ni->mrec; in map_mft_record()
200 m = map_mft_record_folio(ni); in map_mft_record()
204 atomic_dec(&ni->count); in map_mft_record()
205 ntfs_error(ni->vol->sb, "Failed with error code %lu.", -PTR_ERR(m)); in map_mft_record()
211 * @ni: ntfs inode whose MFT record to unmap
223 void unmap_mft_record(struct ntfs_inode *ni) in unmap_mft_record() argument
227 if (!ni) in unmap_mft_record()
230 ntfs_debug("Entering for mft_no 0x%llx.", ni->mft_no); in unmap_mft_record()
232 folio = ni->folio; in unmap_mft_record()
233 if (atomic_dec_return(&ni->count) > 1) in unmap_mft_record()
255 struct ntfs_inode *ni = NULL; in map_extent_mft_record() local
278 ni = extent_nis[i]; in map_extent_mft_record()
280 atomic_inc(&ni->count); in map_extent_mft_record()
284 if (likely(ni != NULL)) { in map_extent_mft_record()
288 m = map_mft_record(ni); in map_extent_mft_record()
290 atomic_dec(&ni->count); in map_extent_mft_record()
295 *ntfs_ino = ni; in map_extent_mft_record()
298 unmap_mft_record(ni); in map_extent_mft_record()
312 ni = ntfs_new_extent_inode(base_ni->vol->sb, mft_no); in map_extent_mft_record()
313 if (unlikely(!ni)) { in map_extent_mft_record()
317 ni->vol = base_ni->vol; in map_extent_mft_record()
318 ni->seq_no = seq_no; in map_extent_mft_record()
319 ni->nr_extents = -1; in map_extent_mft_record()
320 ni->ext.base_ntfs_ino = base_ni; in map_extent_mft_record()
322 m = map_mft_record(ni); in map_extent_mft_record()
325 ntfs_clear_extent_inode(ni); in map_extent_mft_record()
341 ntfs_clear_extent_inode(ni); in map_extent_mft_record()
365 base_ni->ext.extent_ntfs_inos[base_ni->nr_extents++] = ni; in map_extent_mft_record()
369 *ntfs_ino = ni; in map_extent_mft_record()
374 unmap_mft_record(ni); in map_extent_mft_record()
381 ntfs_clear_extent_inode(ni); in map_extent_mft_record()
387 * @ni: ntfs inode describing the mapped mft record
391 * This function determines the base ntfs inode (in case @ni is an extent
406 void __mark_mft_record_dirty(struct ntfs_inode *ni) in __mark_mft_record_dirty() argument
410 ntfs_debug("Entering for inode 0x%llx.", ni->mft_no); in __mark_mft_record_dirty()
411 WARN_ON(NInoAttr(ni)); in __mark_mft_record_dirty()
413 if (likely(ni->nr_extents >= 0)) in __mark_mft_record_dirty()
414 base_ni = ni; in __mark_mft_record_dirty()
416 base_ni = ni->ext.base_ntfs_ino; in __mark_mft_record_dirty()
523 * @ni: ntfs inode describing the mapped (extent) mft record
528 * ntfs inode @ni to backing store. If the mft record @m has a counterpart in
531 * We only write the mft record if the ntfs inode @ni is dirty.
537 int write_mft_record_nolock(struct ntfs_inode *ni, struct mft_record *m, int sync) in write_mft_record_nolock() argument
539 struct ntfs_volume *vol = ni->vol; in write_mft_record_nolock()
540 struct folio *folio = ni->folio; in write_mft_record_nolock()
547 ntfs_debug("Entering for inode 0x%llx.", ni->mft_no); in write_mft_record_nolock()
549 WARN_ON(NInoAttr(ni)); in write_mft_record_nolock()
558 if (!NInoTestClearDirty(ni)) in write_mft_record_nolock()
562 fixup_m = (struct mft_record *)(kaddr + ni->folio_ofs); in write_mft_record_nolock()
572 folio_size = vol->mft_record_size / ni->mft_lcn_count; in write_mft_record_nolock()
573 while (i < ni->mft_lcn_count) { in write_mft_record_nolock()
576 clu_off = (unsigned int)((s64)ni->mft_no * vol->mft_record_size + offset) & in write_mft_record_nolock()
581 NTFS_B_TO_SECTOR(vol, NTFS_CLU_TO_B(vol, ni->mft_lcn[i]) + in write_mft_record_nolock()
585 ni->folio_ofs + offset)) { in write_mft_record_nolock()
591 if (!sync && ni->mft_no < vol->mftmirr_size) in write_mft_record_nolock()
592 ntfs_sync_mft_mirror(vol, ni->mft_no, fixup_m); in write_mft_record_nolock()
603 if (sync && ni->mft_no < vol->mftmirr_size) in write_mft_record_nolock()
604 ntfs_sync_mft_mirror(vol, ni->mft_no, fixup_m); in write_mft_record_nolock()
610 ni->mft_no); in write_mft_record_nolock()
628 mark_mft_record_dirty(ni); in write_mft_record_nolock()
741 struct ntfs_inode *ni, *eni, **extent_nis; in ntfs_may_write_mft_record() local
780 ni = NTFS_I(vi); in ntfs_may_write_mft_record()
782 atomic_inc(&ni->count); in ntfs_may_write_mft_record()
784 if (NInoDirty(ni)) { in ntfs_may_write_mft_record()
787 atomic_dec(&ni->count); in ntfs_may_write_mft_record()
793 if (unlikely(!mutex_trylock(&ni->mrec_lock))) { in ntfs_may_write_mft_record()
795 atomic_dec(&ni->count); in ntfs_may_write_mft_record()
805 *locked_ni = ni; in ntfs_may_write_mft_record()
848 ni = NTFS_I(vi); in ntfs_may_write_mft_record()
849 mutex_lock(&ni->extent_lock); in ntfs_may_write_mft_record()
850 if (ni->nr_extents <= 0) { in ntfs_may_write_mft_record()
855 mutex_unlock(&ni->extent_lock); in ntfs_may_write_mft_record()
862 extent_nis = ni->ext.extent_ntfs_inos; in ntfs_may_write_mft_record()
863 for (eni = NULL, i = 0; i < ni->nr_extents; ++i) { in ntfs_may_write_mft_record()
878 mutex_unlock(&ni->extent_lock); in ntfs_may_write_mft_record()
888 mutex_unlock(&ni->extent_lock); in ntfs_may_write_mft_record()
1085 static int ntfs_mft_attr_extend(struct ntfs_inode *ni) in ntfs_mft_attr_extend() argument
1090 if (NInoAttr(ni)) in ntfs_mft_attr_extend()
1091 base_ni = ni->ext.base_ntfs_ino; in ntfs_mft_attr_extend()
1093 base_ni = ni; in ntfs_mft_attr_extend()
1106 ret = ntfs_attr_update_mapping_pairs(ni, 0); in ntfs_mft_attr_extend()
2004 * @ni: [OUT] on success, set to the allocated ntfs inode
2092 struct ntfs_inode **ni, struct ntfs_inode *base_ni, in ntfs_mft_record_alloc() argument
2109 if (base_ni && *ni) in ntfs_mft_record_alloc()
2453 ni); in ntfs_mft_record_alloc()
2489 (*ni)->seq_no = le16_to_cpu(m->sequence_number); in ntfs_mft_record_alloc()
2501 (*ni)->mrec = kmalloc(vol->mft_record_size, GFP_NOFS); in ntfs_mft_record_alloc()
2502 if (!(*ni)->mrec) { in ntfs_mft_record_alloc()
2510 memcpy((*ni)->mrec, m, vol->mft_record_size); in ntfs_mft_record_alloc()
2511 post_read_mst_fixup((struct ntfs_record *)(*ni)->mrec, vol->mft_record_size); in ntfs_mft_record_alloc()
2514 (*ni)->folio = folio; in ntfs_mft_record_alloc()
2515 (*ni)->folio_ofs = ofs; in ntfs_mft_record_alloc()
2516 atomic_inc(&(*ni)->count); in ntfs_mft_record_alloc()
2530 (*ni)->mft_no = bit; in ntfs_mft_record_alloc()
2532 *ni_mrec = (*ni)->mrec; in ntfs_mft_record_alloc()
2570 * @ni: open ntfs inode of the mft record to free
2572 * Free the mft record of the open inode @ni on the mounted ntfs volume @vol.
2574 * cannot use the pointer @ni any more after this function returns success.
2578 int ntfs_mft_record_free(struct ntfs_volume *vol, struct ntfs_inode *ni) in ntfs_mft_record_free() argument
2588 if (!vol || !ni) in ntfs_mft_record_free()
2591 ntfs_debug("Entering for inode 0x%llx.\n", (long long)ni->mft_no); in ntfs_mft_record_free()
2593 ni_mrec = map_mft_record(ni); in ntfs_mft_record_free()
2598 mft_no = ni->mft_no; in ntfs_mft_record_free()
2613 err = ntfs_get_block_mft_record(NTFS_I(vol->mft_ino), ni); in ntfs_mft_record_free()
2616 unmap_mft_record(ni); in ntfs_mft_record_free()
2625 NInoSetDirty(ni); in ntfs_mft_record_free()
2626 err = write_mft_record(ni, ni_mrec, 0); in ntfs_mft_record_free()
2630 if (likely(ni->nr_extents >= 0)) in ntfs_mft_record_free()
2631 base_ni = ni; in ntfs_mft_record_free()
2633 base_ni = ni->ext.base_ntfs_ino; in ntfs_mft_record_free()
2646 unmap_mft_record(ni); in ntfs_mft_record_free()
2665 NInoSetDirty(ni); in ntfs_mft_record_free()
2666 write_mft_record(ni, ni_mrec, 0); in ntfs_mft_record_free()
2667 unmap_mft_record(ni); in ntfs_mft_record_free()
2671 static s64 lcn_from_index(struct ntfs_volume *vol, struct ntfs_inode *ni, in lcn_from_index() argument
2679 down_read(&ni->runlist.lock); in lcn_from_index()
2680 lcn = ntfs_attr_vcn_to_lcn_nolock(ni, vcn, false); in lcn_from_index()
2681 up_read(&ni->runlist.lock); in lcn_from_index()
2702 struct ntfs_inode *ni = NTFS_I(vi); in ntfs_write_mft_block() local
2703 struct ntfs_volume *vol = ni->vol; in ntfs_write_mft_block()
2716 s64 end_vcn = ntfs_bytes_to_cluster(vol, ni->allocated_size); in ntfs_write_mft_block()
2722 ni->mft_no, ni->type, folio->index); in ntfs_write_mft_block()
2734 lcn = lcn_from_index(vol, ni, folio->index); in ntfs_write_mft_block()
2792 down_write(&ni->runlist.lock); in ntfs_write_mft_block()
2793 rl = ntfs_attr_vcn_to_rl(ni, vcn_off, &lcn); in ntfs_write_mft_block()
2794 up_write(&ni->runlist.lock); in ntfs_write_mft_block()