Lines Matching +full:data +full:- +full:mirror
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * mft.c - NTFS kernel mft record operations. Part of the Linux-NTFS project.
5 * Copyright (c) 2001-2012 Anton Altaparmakov and Tuxera Inc.
27 * map_mft_record_page - map the page in which a specific mft record resides
39 ntfs_volume *vol = ni->vol; in map_mft_record_page()
40 struct inode *mft_vi = vol->mft_ino; in map_mft_record_page()
45 BUG_ON(ni->page); in map_mft_record_page()
52 index = (u64)ni->mft_no << vol->mft_record_size_bits >> in map_mft_record_page()
54 ofs = (ni->mft_no << vol->mft_record_size_bits) & ~PAGE_MASK; in map_mft_record_page()
57 /* The maximum valid index into the page cache for $MFT's data. */ in map_mft_record_page()
63 vol->mft_record_size) { in map_mft_record_page()
64 page = ERR_PTR(-ENOENT); in map_mft_record_page()
65 ntfs_error(vol->sb, "Attempt to read mft record 0x%lx, " in map_mft_record_page()
68 "driver.", ni->mft_no); in map_mft_record_page()
73 page = ntfs_map_page(mft_vi->i_mapping, index); in map_mft_record_page()
78 ni->page = page; in map_mft_record_page()
79 ni->page_ofs = ofs; in map_mft_record_page()
82 ntfs_error(vol->sb, "Mft record 0x%lx is corrupt. " in map_mft_record_page()
83 "Run chkdsk.", ni->mft_no); in map_mft_record_page()
85 page = ERR_PTR(-EIO); in map_mft_record_page()
89 ni->page = NULL; in map_mft_record_page()
90 ni->page_ofs = 0; in map_mft_record_page()
95 * map_mft_record - map, pin and lock an mft record
111 * and the post-read mst fixups on each mft record in the page have been
148 ntfs_debug("Entering for mft_no 0x%lx.", ni->mft_no); in map_mft_record()
151 atomic_inc(&ni->count); in map_mft_record()
154 mutex_lock(&ni->mrec_lock); in map_mft_record()
160 mutex_unlock(&ni->mrec_lock); in map_mft_record()
161 atomic_dec(&ni->count); in map_mft_record()
162 ntfs_error(ni->vol->sb, "Failed with error code %lu.", -PTR_ERR(m)); in map_mft_record()
167 * unmap_mft_record_page - unmap the page in which a specific mft record resides
182 BUG_ON(!ni->page); in unmap_mft_record_page()
185 ntfs_unmap_page(ni->page); in unmap_mft_record_page()
186 ni->page = NULL; in unmap_mft_record_page()
187 ni->page_ofs = 0; in unmap_mft_record_page()
192 * unmap_mft_record - release a mapped mft record
204 struct page *page = ni->page; in unmap_mft_record()
208 ntfs_debug("Entering for mft_no 0x%lx.", ni->mft_no); in unmap_mft_record()
211 mutex_unlock(&ni->mrec_lock); in unmap_mft_record()
212 atomic_dec(&ni->count); in unmap_mft_record()
216 * caller in the non-extent, yet pure ntfs inode case, to do the actual in unmap_mft_record()
223 * map_extent_mft_record - load an extent inode and attach it to its base
247 mft_no, base_ni->mft_no); in map_extent_mft_record()
249 atomic_inc(&base_ni->count); in map_extent_mft_record()
255 mutex_lock(&base_ni->extent_lock); in map_extent_mft_record()
256 if (base_ni->nr_extents > 0) { in map_extent_mft_record()
257 extent_nis = base_ni->ext.extent_ntfs_inos; in map_extent_mft_record()
258 for (i = 0; i < base_ni->nr_extents; i++) { in map_extent_mft_record()
259 if (mft_no != extent_nis[i]->mft_no) in map_extent_mft_record()
263 atomic_inc(&ni->count); in map_extent_mft_record()
268 mutex_unlock(&base_ni->extent_lock); in map_extent_mft_record()
269 atomic_dec(&base_ni->count); in map_extent_mft_record()
273 atomic_dec(&ni->count); in map_extent_mft_record()
276 if (likely(le16_to_cpu(m->sequence_number) == seq_no)) { in map_extent_mft_record()
282 ntfs_error(base_ni->vol->sb, "Found stale extent mft " in map_extent_mft_record()
285 return ERR_PTR(-EIO); in map_extent_mft_record()
288 ntfs_error(base_ni->vol->sb, "Failed to map extent " in map_extent_mft_record()
289 "mft record, error code %ld.", -PTR_ERR(m)); in map_extent_mft_record()
293 ni = ntfs_new_extent_inode(base_ni->vol->sb, mft_no); in map_extent_mft_record()
295 mutex_unlock(&base_ni->extent_lock); in map_extent_mft_record()
296 atomic_dec(&base_ni->count); in map_extent_mft_record()
297 return ERR_PTR(-ENOMEM); in map_extent_mft_record()
299 ni->vol = base_ni->vol; in map_extent_mft_record()
300 ni->seq_no = seq_no; in map_extent_mft_record()
301 ni->nr_extents = -1; in map_extent_mft_record()
302 ni->ext.base_ntfs_ino = base_ni; in map_extent_mft_record()
306 mutex_unlock(&base_ni->extent_lock); in map_extent_mft_record()
307 atomic_dec(&base_ni->count); in map_extent_mft_record()
312 if (seq_no && (le16_to_cpu(m->sequence_number) != seq_no)) { in map_extent_mft_record()
313 ntfs_error(base_ni->vol->sb, "Found stale extent mft " in map_extent_mft_record()
316 m = ERR_PTR(-EIO); in map_extent_mft_record()
320 if (!(base_ni->nr_extents & 3)) { in map_extent_mft_record()
322 int new_size = (base_ni->nr_extents + 4) * sizeof(ntfs_inode *); in map_extent_mft_record()
326 ntfs_error(base_ni->vol->sb, "Failed to allocate " in map_extent_mft_record()
329 m = ERR_PTR(-ENOMEM); in map_extent_mft_record()
332 if (base_ni->nr_extents) { in map_extent_mft_record()
333 BUG_ON(!base_ni->ext.extent_ntfs_inos); in map_extent_mft_record()
334 memcpy(tmp, base_ni->ext.extent_ntfs_inos, new_size - in map_extent_mft_record()
336 kfree(base_ni->ext.extent_ntfs_inos); in map_extent_mft_record()
338 base_ni->ext.extent_ntfs_inos = tmp; in map_extent_mft_record()
340 base_ni->ext.extent_ntfs_inos[base_ni->nr_extents++] = ni; in map_extent_mft_record()
341 mutex_unlock(&base_ni->extent_lock); in map_extent_mft_record()
342 atomic_dec(&base_ni->count); in map_extent_mft_record()
348 mutex_unlock(&base_ni->extent_lock); in map_extent_mft_record()
349 atomic_dec(&base_ni->count); in map_extent_mft_record()
362 * __mark_mft_record_dirty - set the mft record and the page containing it dirty
373 * on the base vfs inode, because even though file data may have been modified,
374 * it is dirty in the inode meta data rather than the data page cache of the
375 * inode, and thus there are no data pages that need writing out. Therefore, a
377 * other hand, is not sufficient, because ->write_inode needs to be called even
378 * in case of fdatasync. This needs to happen or the file data would not
381 * I_DIRTY_SYNC, since the file data has not actually hit the block device yet,
388 ntfs_debug("Entering for inode 0x%lx.", ni->mft_no); in __mark_mft_record_dirty()
390 mark_ntfs_record_dirty(ni->page, ni->page_ofs); in __mark_mft_record_dirty()
392 mutex_lock(&ni->extent_lock); in __mark_mft_record_dirty()
393 if (likely(ni->nr_extents >= 0)) in __mark_mft_record_dirty()
396 base_ni = ni->ext.base_ntfs_ino; in __mark_mft_record_dirty()
397 mutex_unlock(&ni->extent_lock); in __mark_mft_record_dirty()
402 "linux-ntfs-dev@lists.sourceforge.net and say that you saw "
406 * ntfs_sync_mft_mirror_umount - synchronise an mft record to the mft mirror
412 * number @mft_no to the mft mirror ($MFTMirr) of the ntfs volume @vol,
415 * This function is only for use at umount time when the mft mirror inode has
416 * already been disposed off. We BUG() if we are called while the mft mirror
419 * On success return 0. On error return -errno.
430 BUG_ON(vol->mftmirr_ino); in ntfs_sync_mft_mirror_umount()
431 ntfs_error(vol->sb, "Umount time mft mirror syncing is not " in ntfs_sync_mft_mirror_umount()
433 return -EOPNOTSUPP; in ntfs_sync_mft_mirror_umount()
437 * ntfs_sync_mft_mirror - synchronize an mft record to the mft mirror
444 * number @mft_no to the mft mirror ($MFTMirr) of the ntfs volume @vol.
446 * On success return 0. On error return -errno and set the volume errors flag
452 * schedule i/o via ->writepage or do it via kntfsd or whatever.
458 unsigned int blocksize = vol->sb->s_blocksize; in ntfs_sync_mft_mirror()
459 int max_bhs = vol->mft_record_size / blocksize; in ntfs_sync_mft_mirror()
466 unsigned char blocksize_bits = vol->sb->s_blocksize_bits; in ntfs_sync_mft_mirror()
471 return -EINVAL; in ntfs_sync_mft_mirror()
472 if (unlikely(!vol->mftmirr_ino)) { in ntfs_sync_mft_mirror()
479 /* Get the page containing the mirror copy of the mft record @m. */ in ntfs_sync_mft_mirror()
480 page = ntfs_map_page(vol->mftmirr_ino->i_mapping, mft_no >> in ntfs_sync_mft_mirror()
481 (PAGE_SHIFT - vol->mft_record_size_bits)); in ntfs_sync_mft_mirror()
483 ntfs_error(vol->sb, "Failed to map mft mirror page."); in ntfs_sync_mft_mirror()
490 /* Offset of the mft mirror record inside the page. */ in ntfs_sync_mft_mirror()
491 page_ofs = (mft_no << vol->mft_record_size_bits) & ~PAGE_MASK; in ntfs_sync_mft_mirror()
492 /* The address in the page of the mirror copy of the mft record @m. */ in ntfs_sync_mft_mirror()
494 /* Copy the mst protected mft record to the mirror. */ in ntfs_sync_mft_mirror()
495 memcpy(kmirr, m, vol->mft_record_size); in ntfs_sync_mft_mirror()
504 bh = bh->b_this_page; in ntfs_sync_mft_mirror()
506 tail->b_this_page = head; in ntfs_sync_mft_mirror()
514 m_start = kmirr - (u8*)page_address(page); in ntfs_sync_mft_mirror()
515 m_end = m_start + vol->mft_record_size; in ntfs_sync_mft_mirror()
529 bh->b_bdev = vol->sb->s_bdev; in ntfs_sync_mft_mirror()
531 vcn = ((VCN)mft_no << vol->mft_record_size_bits) + in ntfs_sync_mft_mirror()
532 (block_start - m_start); in ntfs_sync_mft_mirror()
533 vcn_ofs = vcn & vol->cluster_size_mask; in ntfs_sync_mft_mirror()
534 vcn >>= vol->cluster_size_bits; in ntfs_sync_mft_mirror()
536 down_read(&NTFS_I(vol->mftmirr_ino)-> in ntfs_sync_mft_mirror()
538 rl = NTFS_I(vol->mftmirr_ino)->runlist.rl; in ntfs_sync_mft_mirror()
546 while (rl->length && rl[1].vcn <= vcn) in ntfs_sync_mft_mirror()
552 bh->b_blocknr = ((lcn << in ntfs_sync_mft_mirror()
553 vol->cluster_size_bits) + in ntfs_sync_mft_mirror()
557 bh->b_blocknr = -1; in ntfs_sync_mft_mirror()
558 ntfs_error(vol->sb, "Cannot write mft mirror " in ntfs_sync_mft_mirror()
564 err = -EIO; in ntfs_sync_mft_mirror()
572 } while (block_start = block_end, (bh = bh->b_this_page) != head); in ntfs_sync_mft_mirror()
574 up_read(&NTFS_I(vol->mftmirr_ino)->runlist.lock); in ntfs_sync_mft_mirror()
585 tbh->b_end_io = end_buffer_write_sync; in ntfs_sync_mft_mirror()
594 err = -EIO; in ntfs_sync_mft_mirror()
617 ntfs_error(vol->sb, "I/O error while writing mft mirror " in ntfs_sync_mft_mirror()
620 ntfs_error(vol->sb, "Failed to synchronize $MFTMirr (error " in ntfs_sync_mft_mirror()
623 "after umounting to correct this.", -err); in ntfs_sync_mft_mirror()
630 * write_mft_record_nolock - write out a mapped (extent) mft record
637 * the mft mirror, that is also updated.
645 * record dirty and return -errno.
648 * However, if the mft record has a counterpart in the mft mirror and @sync is
650 * the mft mirror copy. This ensures that if the system crashes either the mft
651 * or the mft mirror will contain a self-consistent mft record @m. If @sync is
654 * up with a self-consistent mft record in the case of a crash but if you asked
658 * schedule i/o via ->writepage or do it via kntfsd or whatever.
662 ntfs_volume *vol = ni->vol; in write_mft_record_nolock()
663 struct page *page = ni->page; in write_mft_record_nolock()
664 unsigned int blocksize = vol->sb->s_blocksize; in write_mft_record_nolock()
665 unsigned char blocksize_bits = vol->sb->s_blocksize_bits; in write_mft_record_nolock()
666 int max_bhs = vol->mft_record_size / blocksize; in write_mft_record_nolock()
673 ntfs_debug("Entering for inode 0x%lx.", ni->mft_no); in write_mft_record_nolock()
678 err = -EINVAL; in write_mft_record_nolock()
694 m_start = ni->page_ofs; in write_mft_record_nolock()
695 m_end = m_start + vol->mft_record_size; in write_mft_record_nolock()
722 bh->b_bdev = vol->sb->s_bdev; in write_mft_record_nolock()
724 vcn = ((VCN)ni->mft_no << vol->mft_record_size_bits) + in write_mft_record_nolock()
725 (block_start - m_start); in write_mft_record_nolock()
726 vcn_ofs = vcn & vol->cluster_size_mask; in write_mft_record_nolock()
727 vcn >>= vol->cluster_size_bits; in write_mft_record_nolock()
729 down_read(&NTFS_I(vol->mft_ino)->runlist.lock); in write_mft_record_nolock()
730 rl = NTFS_I(vol->mft_ino)->runlist.rl; in write_mft_record_nolock()
734 while (rl->length && rl[1].vcn <= vcn) in write_mft_record_nolock()
740 bh->b_blocknr = ((lcn << in write_mft_record_nolock()
741 vol->cluster_size_bits) + in write_mft_record_nolock()
745 bh->b_blocknr = -1; in write_mft_record_nolock()
746 ntfs_error(vol->sb, "Cannot write mft record " in write_mft_record_nolock()
750 ni->mft_no, (long long)lcn); in write_mft_record_nolock()
751 err = -EIO; in write_mft_record_nolock()
759 } while (block_start = block_end, (bh = bh->b_this_page) != head); in write_mft_record_nolock()
761 up_read(&NTFS_I(vol->mft_ino)->runlist.lock); in write_mft_record_nolock()
767 err = pre_write_mst_fixup((NTFS_RECORD*)m, vol->mft_record_size); in write_mft_record_nolock()
769 ntfs_error(vol->sb, "Failed to apply mst fixups!"); in write_mft_record_nolock()
782 tbh->b_end_io = end_buffer_write_sync; in write_mft_record_nolock()
785 /* Synchronize the mft mirror now if not @sync. */ in write_mft_record_nolock()
786 if (!sync && ni->mft_no < vol->mftmirr_size) in write_mft_record_nolock()
787 ntfs_sync_mft_mirror(vol, ni->mft_no, m, sync); in write_mft_record_nolock()
794 err = -EIO; in write_mft_record_nolock()
803 /* If @sync, now synchronize the mft mirror. */ in write_mft_record_nolock()
804 if (sync && ni->mft_no < vol->mftmirr_size) in write_mft_record_nolock()
805 ntfs_sync_mft_mirror(vol, ni->mft_no, m, sync); in write_mft_record_nolock()
811 ntfs_error(vol->sb, "I/O error while writing mft record " in write_mft_record_nolock()
814 ni->mft_no); in write_mft_record_nolock()
828 * happens. ->clear_inode() will still be invoked so all extent inodes in write_mft_record_nolock()
831 if (err == -ENOMEM) { in write_mft_record_nolock()
832 ntfs_error(vol->sb, "Not enough memory to write mft record. " in write_mft_record_nolock()
842 * ntfs_may_write_mft_record - check if an mft record may be written out
915 * initialized_size of the $MFT/$DATA attribute is extended and the new space
923 struct super_block *sb = vol->sb; in ntfs_may_write_mft_record()
924 struct inode *mft_vi = vol->mft_ino; in ntfs_may_write_mft_record()
968 atomic_inc(&ni->count); in ntfs_may_write_mft_record()
973 atomic_dec(&ni->count); in ntfs_may_write_mft_record()
979 if (unlikely(!mutex_trylock(&ni->mrec_lock))) { in ntfs_may_write_mft_record()
982 atomic_dec(&ni->count); in ntfs_may_write_mft_record()
998 if (!ntfs_is_mft_record(m->magic)) { in ntfs_may_write_mft_record()
1004 if (!m->base_mft_record) { in ntfs_may_write_mft_record()
1014 na.mft_no = MREF_LE(m->base_mft_record); in ntfs_may_write_mft_record()
1039 mutex_lock(&ni->extent_lock); in ntfs_may_write_mft_record()
1040 if (ni->nr_extents <= 0) { in ntfs_may_write_mft_record()
1045 mutex_unlock(&ni->extent_lock); in ntfs_may_write_mft_record()
1052 extent_nis = ni->ext.extent_ntfs_inos; in ntfs_may_write_mft_record()
1053 for (eni = NULL, i = 0; i < ni->nr_extents; ++i) { in ntfs_may_write_mft_record()
1054 if (mft_no == extent_nis[i]->mft_no) { in ntfs_may_write_mft_record()
1068 mutex_unlock(&ni->extent_lock); in ntfs_may_write_mft_record()
1078 atomic_inc(&eni->count); in ntfs_may_write_mft_record()
1079 mutex_unlock(&ni->extent_lock); in ntfs_may_write_mft_record()
1084 if (unlikely(!mutex_trylock(&eni->mrec_lock))) { in ntfs_may_write_mft_record()
1085 atomic_dec(&eni->count); in ntfs_may_write_mft_record()
1108 * ntfs_mft_bitmap_find_and_alloc_free_rec_nolock - see name
1120 * Return the free mft record on success and -errno on error. An error code of
1121 * -ENOSPC means that there are no free mft records in the currently
1124 * Locking: Caller must hold vol->mftbmp_lock for writing.
1139 mftbmp_mapping = vol->mftbmp_ino->i_mapping; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1144 read_lock_irqsave(&NTFS_I(vol->mft_ino)->size_lock, flags); in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1145 pass_end = NTFS_I(vol->mft_ino)->allocated_size >> in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1146 vol->mft_record_size_bits; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1147 read_unlock_irqrestore(&NTFS_I(vol->mft_ino)->size_lock, flags); in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1148 read_lock_irqsave(&NTFS_I(vol->mftbmp_ino)->size_lock, flags); in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1149 ll = NTFS_I(vol->mftbmp_ino)->initialized_size << 3; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1150 read_unlock_irqrestore(&NTFS_I(vol->mftbmp_ino)->size_lock, flags); in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1155 data_pos = vol->mft_data_pos; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1157 data_pos = base_ni->mft_no + 1; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1165 return -ENOSPC; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1177 size = PAGE_SIZE - page_ofs; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1178 ll = ((pass_end + 7) >> 3) - ofs; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1190 ntfs_error(vol->sb, "Failed to read mft " in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1210 return -ENOSPC; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1253 return -ENOSPC; in ntfs_mft_bitmap_find_and_alloc_free_rec_nolock()
1257 * ntfs_mft_bitmap_extend_allocation_nolock - extend mft bitmap by a cluster
1265 * Return 0 on success and -errno on error.
1267 * Locking: - Caller must hold vol->mftbmp_lock for writing.
1268 * - This function takes NTFS_I(vol->mftbmp_ino)->runlist.lock for
1270 * - This function takes vol->lcnbmp_lock for writing and releases it
1294 mft_ni = NTFS_I(vol->mft_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1295 mftbmp_ni = NTFS_I(vol->mftbmp_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1300 down_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1301 read_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_allocation_nolock()
1302 ll = mftbmp_ni->allocated_size; in ntfs_mft_bitmap_extend_allocation_nolock()
1303 read_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_allocation_nolock()
1305 (ll - 1) >> vol->cluster_size_bits, NULL); in ntfs_mft_bitmap_extend_allocation_nolock()
1306 if (IS_ERR(rl) || unlikely(!rl->length || rl->lcn < 0)) { in ntfs_mft_bitmap_extend_allocation_nolock()
1307 up_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1308 ntfs_error(vol->sb, "Failed to determine last allocated " in ntfs_mft_bitmap_extend_allocation_nolock()
1311 ret = -EIO; in ntfs_mft_bitmap_extend_allocation_nolock()
1316 lcn = rl->lcn + rl->length; in ntfs_mft_bitmap_extend_allocation_nolock()
1325 page = ntfs_map_page(vol->lcnbmp_ino->i_mapping, in ntfs_mft_bitmap_extend_allocation_nolock()
1328 up_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1329 ntfs_error(vol->sb, "Failed to read from lcn bitmap."); in ntfs_mft_bitmap_extend_allocation_nolock()
1334 down_write(&vol->lcnbmp_lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1340 up_write(&vol->lcnbmp_lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1343 rl->length++; in ntfs_mft_bitmap_extend_allocation_nolock()
1348 up_write(&vol->lcnbmp_lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1354 up_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1355 ntfs_error(vol->sb, "Failed to allocate a cluster for " in ntfs_mft_bitmap_extend_allocation_nolock()
1359 rl = ntfs_runlists_merge(mftbmp_ni->runlist.rl, rl2); in ntfs_mft_bitmap_extend_allocation_nolock()
1361 up_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1362 ntfs_error(vol->sb, "Failed to merge runlists for mft " in ntfs_mft_bitmap_extend_allocation_nolock()
1365 ntfs_error(vol->sb, "Failed to deallocate " in ntfs_mft_bitmap_extend_allocation_nolock()
1372 mftbmp_ni->runlist.rl = rl; in ntfs_mft_bitmap_extend_allocation_nolock()
1381 * (non-terminator) runlist element of mft bitmap. in ntfs_mft_bitmap_extend_allocation_nolock()
1385 ntfs_error(vol->sb, "Failed to map mft record."); in ntfs_mft_bitmap_extend_allocation_nolock()
1391 ntfs_error(vol->sb, "Failed to get search context."); in ntfs_mft_bitmap_extend_allocation_nolock()
1392 ret = -ENOMEM; in ntfs_mft_bitmap_extend_allocation_nolock()
1395 ret = ntfs_attr_lookup(mftbmp_ni->type, mftbmp_ni->name, in ntfs_mft_bitmap_extend_allocation_nolock()
1396 mftbmp_ni->name_len, CASE_SENSITIVE, rl[1].vcn, NULL, in ntfs_mft_bitmap_extend_allocation_nolock()
1399 ntfs_error(vol->sb, "Failed to find last attribute extent of " in ntfs_mft_bitmap_extend_allocation_nolock()
1401 if (ret == -ENOENT) in ntfs_mft_bitmap_extend_allocation_nolock()
1402 ret = -EIO; in ntfs_mft_bitmap_extend_allocation_nolock()
1405 a = ctx->attr; in ntfs_mft_bitmap_extend_allocation_nolock()
1406 ll = sle64_to_cpu(a->data.non_resident.lowest_vcn); in ntfs_mft_bitmap_extend_allocation_nolock()
1408 for (rl2 = rl; rl2 > mftbmp_ni->runlist.rl; rl2--) { in ntfs_mft_bitmap_extend_allocation_nolock()
1409 if (ll >= rl2->vcn) in ntfs_mft_bitmap_extend_allocation_nolock()
1412 BUG_ON(ll < rl2->vcn); in ntfs_mft_bitmap_extend_allocation_nolock()
1413 BUG_ON(ll >= rl2->vcn + rl2->length); in ntfs_mft_bitmap_extend_allocation_nolock()
1415 mp_size = ntfs_get_size_for_mapping_pairs(vol, rl2, ll, -1); in ntfs_mft_bitmap_extend_allocation_nolock()
1417 ntfs_error(vol->sb, "Get size for mapping pairs failed for " in ntfs_mft_bitmap_extend_allocation_nolock()
1421 ret = -EIO; in ntfs_mft_bitmap_extend_allocation_nolock()
1425 old_alen = le32_to_cpu(a->length); in ntfs_mft_bitmap_extend_allocation_nolock()
1426 ret = ntfs_attr_record_resize(ctx->mrec, a, mp_size + in ntfs_mft_bitmap_extend_allocation_nolock()
1427 le16_to_cpu(a->data.non_resident.mapping_pairs_offset)); in ntfs_mft_bitmap_extend_allocation_nolock()
1429 if (ret != -ENOSPC) { in ntfs_mft_bitmap_extend_allocation_nolock()
1430 ntfs_error(vol->sb, "Failed to resize attribute " in ntfs_mft_bitmap_extend_allocation_nolock()
1439 ntfs_error(vol->sb, "Not enough space in this mft record to " in ntfs_mft_bitmap_extend_allocation_nolock()
1442 ret = -EOPNOTSUPP; in ntfs_mft_bitmap_extend_allocation_nolock()
1448 le16_to_cpu(a->data.non_resident.mapping_pairs_offset), in ntfs_mft_bitmap_extend_allocation_nolock()
1449 mp_size, rl2, ll, -1, NULL); in ntfs_mft_bitmap_extend_allocation_nolock()
1451 ntfs_error(vol->sb, "Failed to build mapping pairs array for " in ntfs_mft_bitmap_extend_allocation_nolock()
1456 a->data.non_resident.highest_vcn = cpu_to_sle64(rl[1].vcn - 1); in ntfs_mft_bitmap_extend_allocation_nolock()
1461 if (a->data.non_resident.lowest_vcn) { in ntfs_mft_bitmap_extend_allocation_nolock()
1466 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1467 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1469 ret = ntfs_attr_lookup(mftbmp_ni->type, mftbmp_ni->name, in ntfs_mft_bitmap_extend_allocation_nolock()
1470 mftbmp_ni->name_len, CASE_SENSITIVE, 0, NULL, in ntfs_mft_bitmap_extend_allocation_nolock()
1473 ntfs_error(vol->sb, "Failed to find first attribute " in ntfs_mft_bitmap_extend_allocation_nolock()
1477 a = ctx->attr; in ntfs_mft_bitmap_extend_allocation_nolock()
1479 write_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_allocation_nolock()
1480 mftbmp_ni->allocated_size += vol->cluster_size; in ntfs_mft_bitmap_extend_allocation_nolock()
1481 a->data.non_resident.allocated_size = in ntfs_mft_bitmap_extend_allocation_nolock()
1482 cpu_to_sle64(mftbmp_ni->allocated_size); in ntfs_mft_bitmap_extend_allocation_nolock()
1483 write_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_allocation_nolock()
1485 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1486 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1489 up_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1494 if (ntfs_attr_lookup(mftbmp_ni->type, mftbmp_ni->name, in ntfs_mft_bitmap_extend_allocation_nolock()
1495 mftbmp_ni->name_len, CASE_SENSITIVE, rl[1].vcn, NULL, in ntfs_mft_bitmap_extend_allocation_nolock()
1497 ntfs_error(vol->sb, "Failed to find last attribute extent of " in ntfs_mft_bitmap_extend_allocation_nolock()
1499 write_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_allocation_nolock()
1500 mftbmp_ni->allocated_size += vol->cluster_size; in ntfs_mft_bitmap_extend_allocation_nolock()
1501 write_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_allocation_nolock()
1504 up_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1506 * The only thing that is now wrong is ->allocated_size of the in ntfs_mft_bitmap_extend_allocation_nolock()
1512 a = ctx->attr; in ntfs_mft_bitmap_extend_allocation_nolock()
1513 a->data.non_resident.highest_vcn = cpu_to_sle64(rl[1].vcn - 2); in ntfs_mft_bitmap_extend_allocation_nolock()
1517 rl->length--; in ntfs_mft_bitmap_extend_allocation_nolock()
1518 rl[1].vcn--; in ntfs_mft_bitmap_extend_allocation_nolock()
1520 lcn = rl->lcn; in ntfs_mft_bitmap_extend_allocation_nolock()
1522 rl->lcn = rl[1].lcn; in ntfs_mft_bitmap_extend_allocation_nolock()
1523 rl->length = 0; in ntfs_mft_bitmap_extend_allocation_nolock()
1526 down_write(&vol->lcnbmp_lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1527 if (ntfs_bitmap_clear_bit(vol->lcnbmp_ino, lcn)) { in ntfs_mft_bitmap_extend_allocation_nolock()
1528 ntfs_error(vol->sb, "Failed to free allocated cluster.%s", es); in ntfs_mft_bitmap_extend_allocation_nolock()
1531 up_write(&vol->lcnbmp_lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1534 a->data.non_resident.mapping_pairs_offset), in ntfs_mft_bitmap_extend_allocation_nolock()
1535 old_alen - le16_to_cpu( in ntfs_mft_bitmap_extend_allocation_nolock()
1536 a->data.non_resident.mapping_pairs_offset), in ntfs_mft_bitmap_extend_allocation_nolock()
1537 rl2, ll, -1, NULL)) { in ntfs_mft_bitmap_extend_allocation_nolock()
1538 ntfs_error(vol->sb, "Failed to restore mapping pairs " in ntfs_mft_bitmap_extend_allocation_nolock()
1542 if (ntfs_attr_record_resize(ctx->mrec, a, old_alen)) { in ntfs_mft_bitmap_extend_allocation_nolock()
1543 ntfs_error(vol->sb, "Failed to restore attribute " in ntfs_mft_bitmap_extend_allocation_nolock()
1547 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1548 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_allocation_nolock()
1554 up_write(&mftbmp_ni->runlist.lock); in ntfs_mft_bitmap_extend_allocation_nolock()
1559 * ntfs_mft_bitmap_extend_initialized_nolock - extend mftbmp initialized data
1568 * Return 0 on success and -error on error.
1570 * Locking: Caller must hold vol->mftbmp_lock for writing.
1583 ntfs_debug("Extending mft bitmap initiailized (and data) size."); in ntfs_mft_bitmap_extend_initialized_nolock()
1584 mft_ni = NTFS_I(vol->mft_ino); in ntfs_mft_bitmap_extend_initialized_nolock()
1585 mftbmp_vi = vol->mftbmp_ino; in ntfs_mft_bitmap_extend_initialized_nolock()
1590 ntfs_error(vol->sb, "Failed to map mft record."); in ntfs_mft_bitmap_extend_initialized_nolock()
1595 ntfs_error(vol->sb, "Failed to get search context."); in ntfs_mft_bitmap_extend_initialized_nolock()
1596 ret = -ENOMEM; in ntfs_mft_bitmap_extend_initialized_nolock()
1599 ret = ntfs_attr_lookup(mftbmp_ni->type, mftbmp_ni->name, in ntfs_mft_bitmap_extend_initialized_nolock()
1600 mftbmp_ni->name_len, CASE_SENSITIVE, 0, NULL, 0, ctx); in ntfs_mft_bitmap_extend_initialized_nolock()
1602 ntfs_error(vol->sb, "Failed to find first attribute extent of " in ntfs_mft_bitmap_extend_initialized_nolock()
1604 if (ret == -ENOENT) in ntfs_mft_bitmap_extend_initialized_nolock()
1605 ret = -EIO; in ntfs_mft_bitmap_extend_initialized_nolock()
1608 a = ctx->attr; in ntfs_mft_bitmap_extend_initialized_nolock()
1609 write_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_initialized_nolock()
1611 old_initialized_size = mftbmp_ni->initialized_size; in ntfs_mft_bitmap_extend_initialized_nolock()
1615 * writing which ensures that no one else is trying to access the data. in ntfs_mft_bitmap_extend_initialized_nolock()
1617 mftbmp_ni->initialized_size += 8; in ntfs_mft_bitmap_extend_initialized_nolock()
1618 a->data.non_resident.initialized_size = in ntfs_mft_bitmap_extend_initialized_nolock()
1619 cpu_to_sle64(mftbmp_ni->initialized_size); in ntfs_mft_bitmap_extend_initialized_nolock()
1620 if (mftbmp_ni->initialized_size > old_data_size) { in ntfs_mft_bitmap_extend_initialized_nolock()
1621 i_size_write(mftbmp_vi, mftbmp_ni->initialized_size); in ntfs_mft_bitmap_extend_initialized_nolock()
1622 a->data.non_resident.data_size = in ntfs_mft_bitmap_extend_initialized_nolock()
1623 cpu_to_sle64(mftbmp_ni->initialized_size); in ntfs_mft_bitmap_extend_initialized_nolock()
1625 write_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_initialized_nolock()
1627 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_initialized_nolock()
1628 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_initialized_nolock()
1638 ntfs_error(vol->sb, "Failed to write to mft bitmap."); in ntfs_mft_bitmap_extend_initialized_nolock()
1642 ntfs_error(vol->sb, "Failed to map mft record.%s", es); in ntfs_mft_bitmap_extend_initialized_nolock()
1648 ntfs_error(vol->sb, "Failed to get search context.%s", es); in ntfs_mft_bitmap_extend_initialized_nolock()
1652 if (ntfs_attr_lookup(mftbmp_ni->type, mftbmp_ni->name, in ntfs_mft_bitmap_extend_initialized_nolock()
1653 mftbmp_ni->name_len, CASE_SENSITIVE, 0, NULL, 0, ctx)) { in ntfs_mft_bitmap_extend_initialized_nolock()
1654 ntfs_error(vol->sb, "Failed to find first attribute extent of " in ntfs_mft_bitmap_extend_initialized_nolock()
1663 a = ctx->attr; in ntfs_mft_bitmap_extend_initialized_nolock()
1664 write_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_initialized_nolock()
1665 mftbmp_ni->initialized_size = old_initialized_size; in ntfs_mft_bitmap_extend_initialized_nolock()
1666 a->data.non_resident.initialized_size = in ntfs_mft_bitmap_extend_initialized_nolock()
1670 a->data.non_resident.data_size = cpu_to_sle64(old_data_size); in ntfs_mft_bitmap_extend_initialized_nolock()
1672 write_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_initialized_nolock()
1673 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_initialized_nolock()
1674 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_bitmap_extend_initialized_nolock()
1678 read_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_initialized_nolock()
1681 (long long)mftbmp_ni->allocated_size, in ntfs_mft_bitmap_extend_initialized_nolock()
1683 (long long)mftbmp_ni->initialized_size); in ntfs_mft_bitmap_extend_initialized_nolock()
1684 read_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_bitmap_extend_initialized_nolock()
1691 * ntfs_mft_data_extend_allocation_nolock - extend mft data attribute
1692 * @vol: volume on which to extend the mft data attribute
1694 * Extend the mft data attribute on the ntfs volume @vol by 16 mft records
1701 * Return 0 on success and -errno on error.
1703 * Locking: - Caller must hold vol->mftbmp_lock for writing.
1704 * - This function takes NTFS_I(vol->mft_ino)->runlist.lock for
1706 * - This function calls functions which take vol->lcnbmp_lock for
1724 ntfs_debug("Extending mft data allocation."); in ntfs_mft_data_extend_allocation_nolock()
1725 mft_ni = NTFS_I(vol->mft_ino); in ntfs_mft_data_extend_allocation_nolock()
1728 * the mft data attribute. The allocated size of the mft data in ntfs_mft_data_extend_allocation_nolock()
1731 down_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1732 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1733 ll = mft_ni->allocated_size; in ntfs_mft_data_extend_allocation_nolock()
1734 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1736 (ll - 1) >> vol->cluster_size_bits, NULL); in ntfs_mft_data_extend_allocation_nolock()
1737 if (IS_ERR(rl) || unlikely(!rl->length || rl->lcn < 0)) { in ntfs_mft_data_extend_allocation_nolock()
1738 up_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1739 ntfs_error(vol->sb, "Failed to determine last allocated " in ntfs_mft_data_extend_allocation_nolock()
1740 "cluster of mft data attribute."); in ntfs_mft_data_extend_allocation_nolock()
1742 ret = -EIO; in ntfs_mft_data_extend_allocation_nolock()
1747 lcn = rl->lcn + rl->length; in ntfs_mft_data_extend_allocation_nolock()
1748 ntfs_debug("Last lcn of mft data attribute is 0x%llx.", (long long)lcn); in ntfs_mft_data_extend_allocation_nolock()
1750 min_nr = vol->mft_record_size >> vol->cluster_size_bits; in ntfs_mft_data_extend_allocation_nolock()
1754 nr = vol->mft_record_size << 4 >> vol->cluster_size_bits; in ntfs_mft_data_extend_allocation_nolock()
1757 /* Ensure we do not go above 2^32-1 mft records. */ in ntfs_mft_data_extend_allocation_nolock()
1758 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1759 ll = mft_ni->allocated_size; in ntfs_mft_data_extend_allocation_nolock()
1760 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1761 if (unlikely((ll + (nr << vol->cluster_size_bits)) >> in ntfs_mft_data_extend_allocation_nolock()
1762 vol->mft_record_size_bits >= (1ll << 32))) { in ntfs_mft_data_extend_allocation_nolock()
1764 if (unlikely((ll + (nr << vol->cluster_size_bits)) >> in ntfs_mft_data_extend_allocation_nolock()
1765 vol->mft_record_size_bits >= (1ll << 32))) { in ntfs_mft_data_extend_allocation_nolock()
1766 ntfs_warning(vol->sb, "Cannot allocate mft record " in ntfs_mft_data_extend_allocation_nolock()
1769 up_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1770 return -ENOSPC; in ntfs_mft_data_extend_allocation_nolock()
1773 ntfs_debug("Trying mft data allocation with %s cluster count %lli.", in ntfs_mft_data_extend_allocation_nolock()
1781 if (PTR_ERR(rl2) != -ENOSPC || nr == min_nr) { in ntfs_mft_data_extend_allocation_nolock()
1782 ntfs_error(vol->sb, "Failed to allocate the minimal " in ntfs_mft_data_extend_allocation_nolock()
1784 "mft data attribute.", (long long)nr); in ntfs_mft_data_extend_allocation_nolock()
1785 up_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1794 ntfs_debug("Retrying mft data allocation with minimal cluster " in ntfs_mft_data_extend_allocation_nolock()
1797 rl = ntfs_runlists_merge(mft_ni->runlist.rl, rl2); in ntfs_mft_data_extend_allocation_nolock()
1799 up_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1800 ntfs_error(vol->sb, "Failed to merge runlists for mft data " in ntfs_mft_data_extend_allocation_nolock()
1803 ntfs_error(vol->sb, "Failed to deallocate clusters " in ntfs_mft_data_extend_allocation_nolock()
1804 "from the mft data attribute.%s", es); in ntfs_mft_data_extend_allocation_nolock()
1810 mft_ni->runlist.rl = rl; in ntfs_mft_data_extend_allocation_nolock()
1818 ntfs_error(vol->sb, "Failed to map mft record."); in ntfs_mft_data_extend_allocation_nolock()
1824 ntfs_error(vol->sb, "Failed to get search context."); in ntfs_mft_data_extend_allocation_nolock()
1825 ret = -ENOMEM; in ntfs_mft_data_extend_allocation_nolock()
1828 ret = ntfs_attr_lookup(mft_ni->type, mft_ni->name, mft_ni->name_len, in ntfs_mft_data_extend_allocation_nolock()
1831 ntfs_error(vol->sb, "Failed to find last attribute extent of " in ntfs_mft_data_extend_allocation_nolock()
1832 "mft data attribute."); in ntfs_mft_data_extend_allocation_nolock()
1833 if (ret == -ENOENT) in ntfs_mft_data_extend_allocation_nolock()
1834 ret = -EIO; in ntfs_mft_data_extend_allocation_nolock()
1837 a = ctx->attr; in ntfs_mft_data_extend_allocation_nolock()
1838 ll = sle64_to_cpu(a->data.non_resident.lowest_vcn); in ntfs_mft_data_extend_allocation_nolock()
1840 for (rl2 = rl; rl2 > mft_ni->runlist.rl; rl2--) { in ntfs_mft_data_extend_allocation_nolock()
1841 if (ll >= rl2->vcn) in ntfs_mft_data_extend_allocation_nolock()
1844 BUG_ON(ll < rl2->vcn); in ntfs_mft_data_extend_allocation_nolock()
1845 BUG_ON(ll >= rl2->vcn + rl2->length); in ntfs_mft_data_extend_allocation_nolock()
1847 mp_size = ntfs_get_size_for_mapping_pairs(vol, rl2, ll, -1); in ntfs_mft_data_extend_allocation_nolock()
1849 ntfs_error(vol->sb, "Get size for mapping pairs failed for " in ntfs_mft_data_extend_allocation_nolock()
1850 "mft data attribute extent."); in ntfs_mft_data_extend_allocation_nolock()
1853 ret = -EIO; in ntfs_mft_data_extend_allocation_nolock()
1857 old_alen = le32_to_cpu(a->length); in ntfs_mft_data_extend_allocation_nolock()
1858 ret = ntfs_attr_record_resize(ctx->mrec, a, mp_size + in ntfs_mft_data_extend_allocation_nolock()
1859 le16_to_cpu(a->data.non_resident.mapping_pairs_offset)); in ntfs_mft_data_extend_allocation_nolock()
1861 if (ret != -ENOSPC) { in ntfs_mft_data_extend_allocation_nolock()
1862 ntfs_error(vol->sb, "Failed to resize attribute " in ntfs_mft_data_extend_allocation_nolock()
1863 "record for mft data attribute."); in ntfs_mft_data_extend_allocation_nolock()
1876 ntfs_error(vol->sb, "Not enough space in this mft record to " in ntfs_mft_data_extend_allocation_nolock()
1877 "accommodate extended mft data attribute " in ntfs_mft_data_extend_allocation_nolock()
1879 ret = -EOPNOTSUPP; in ntfs_mft_data_extend_allocation_nolock()
1885 le16_to_cpu(a->data.non_resident.mapping_pairs_offset), in ntfs_mft_data_extend_allocation_nolock()
1886 mp_size, rl2, ll, -1, NULL); in ntfs_mft_data_extend_allocation_nolock()
1888 ntfs_error(vol->sb, "Failed to build mapping pairs array of " in ntfs_mft_data_extend_allocation_nolock()
1889 "mft data attribute."); in ntfs_mft_data_extend_allocation_nolock()
1893 a->data.non_resident.highest_vcn = cpu_to_sle64(rl[1].vcn - 1); in ntfs_mft_data_extend_allocation_nolock()
1895 * We now have extended the mft data allocated_size by nr clusters. in ntfs_mft_data_extend_allocation_nolock()
1897 * @rl is the last (non-terminator) runlist element of mft data in ntfs_mft_data_extend_allocation_nolock()
1900 if (a->data.non_resident.lowest_vcn) { in ntfs_mft_data_extend_allocation_nolock()
1905 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_data_extend_allocation_nolock()
1906 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_data_extend_allocation_nolock()
1908 ret = ntfs_attr_lookup(mft_ni->type, mft_ni->name, in ntfs_mft_data_extend_allocation_nolock()
1909 mft_ni->name_len, CASE_SENSITIVE, 0, NULL, 0, in ntfs_mft_data_extend_allocation_nolock()
1912 ntfs_error(vol->sb, "Failed to find first attribute " in ntfs_mft_data_extend_allocation_nolock()
1913 "extent of mft data attribute."); in ntfs_mft_data_extend_allocation_nolock()
1916 a = ctx->attr; in ntfs_mft_data_extend_allocation_nolock()
1918 write_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1919 mft_ni->allocated_size += nr << vol->cluster_size_bits; in ntfs_mft_data_extend_allocation_nolock()
1920 a->data.non_resident.allocated_size = in ntfs_mft_data_extend_allocation_nolock()
1921 cpu_to_sle64(mft_ni->allocated_size); in ntfs_mft_data_extend_allocation_nolock()
1922 write_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1924 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_data_extend_allocation_nolock()
1925 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_data_extend_allocation_nolock()
1928 up_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1933 if (ntfs_attr_lookup(mft_ni->type, mft_ni->name, mft_ni->name_len, in ntfs_mft_data_extend_allocation_nolock()
1935 ntfs_error(vol->sb, "Failed to find last attribute extent of " in ntfs_mft_data_extend_allocation_nolock()
1936 "mft data attribute.%s", es); in ntfs_mft_data_extend_allocation_nolock()
1937 write_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1938 mft_ni->allocated_size += nr << vol->cluster_size_bits; in ntfs_mft_data_extend_allocation_nolock()
1939 write_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_data_extend_allocation_nolock()
1942 up_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1944 * The only thing that is now wrong is ->allocated_size of the in ntfs_mft_data_extend_allocation_nolock()
1950 ctx->attr->data.non_resident.highest_vcn = in ntfs_mft_data_extend_allocation_nolock()
1951 cpu_to_sle64(old_last_vcn - 1); in ntfs_mft_data_extend_allocation_nolock()
1953 if (ntfs_cluster_free(mft_ni, old_last_vcn, -1, ctx) < 0) { in ntfs_mft_data_extend_allocation_nolock()
1954 ntfs_error(vol->sb, "Failed to free clusters from mft data " in ntfs_mft_data_extend_allocation_nolock()
1958 a = ctx->attr; in ntfs_mft_data_extend_allocation_nolock()
1959 if (ntfs_rl_truncate_nolock(vol, &mft_ni->runlist, old_last_vcn)) { in ntfs_mft_data_extend_allocation_nolock()
1960 ntfs_error(vol->sb, "Failed to truncate mft data attribute " in ntfs_mft_data_extend_allocation_nolock()
1964 if (mp_rebuilt && !IS_ERR(ctx->mrec)) { in ntfs_mft_data_extend_allocation_nolock()
1966 a->data.non_resident.mapping_pairs_offset), in ntfs_mft_data_extend_allocation_nolock()
1967 old_alen - le16_to_cpu( in ntfs_mft_data_extend_allocation_nolock()
1968 a->data.non_resident.mapping_pairs_offset), in ntfs_mft_data_extend_allocation_nolock()
1969 rl2, ll, -1, NULL)) { in ntfs_mft_data_extend_allocation_nolock()
1970 ntfs_error(vol->sb, "Failed to restore mapping pairs " in ntfs_mft_data_extend_allocation_nolock()
1974 if (ntfs_attr_record_resize(ctx->mrec, a, old_alen)) { in ntfs_mft_data_extend_allocation_nolock()
1975 ntfs_error(vol->sb, "Failed to restore attribute " in ntfs_mft_data_extend_allocation_nolock()
1979 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_data_extend_allocation_nolock()
1980 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_data_extend_allocation_nolock()
1981 } else if (IS_ERR(ctx->mrec)) { in ntfs_mft_data_extend_allocation_nolock()
1982 ntfs_error(vol->sb, "Failed to restore attribute search " in ntfs_mft_data_extend_allocation_nolock()
1990 up_write(&mft_ni->runlist.lock); in ntfs_mft_data_extend_allocation_nolock()
1995 * ntfs_mft_record_layout - layout an mft record into a memory buffer
1998 * @m: destination buffer of size >= @vol->mft_record_size bytes
2005 * Return 0 on success and -errno on error.
2014 ntfs_error(vol->sb, "Mft record number 0x%llx exceeds " in ntfs_mft_record_layout()
2016 return -ERANGE; in ntfs_mft_record_layout()
2019 memset(m, 0, vol->mft_record_size); in ntfs_mft_record_layout()
2020 /* Aligned to 2-byte boundary. */ in ntfs_mft_record_layout()
2021 if (vol->major_ver < 3 || (vol->major_ver == 3 && !vol->minor_ver)) in ntfs_mft_record_layout()
2022 m->usa_ofs = cpu_to_le16((sizeof(MFT_RECORD_OLD) + 1) & ~1); in ntfs_mft_record_layout()
2024 m->usa_ofs = cpu_to_le16((sizeof(MFT_RECORD) + 1) & ~1); in ntfs_mft_record_layout()
2029 m->reserved = 0; in ntfs_mft_record_layout()
2030 m->mft_record_number = cpu_to_le32((u32)mft_no); in ntfs_mft_record_layout()
2032 m->magic = magic_FILE; in ntfs_mft_record_layout()
2033 if (vol->mft_record_size >= NTFS_BLOCK_SIZE) in ntfs_mft_record_layout()
2034 m->usa_count = cpu_to_le16(vol->mft_record_size / in ntfs_mft_record_layout()
2037 m->usa_count = cpu_to_le16(1); in ntfs_mft_record_layout()
2038 ntfs_warning(vol->sb, "Sector size is bigger than mft record " in ntfs_mft_record_layout()
2041 "linux-ntfs-dev@lists.sourceforge.net stating " in ntfs_mft_record_layout()
2047 *(le16*)((u8*)m + le16_to_cpu(m->usa_ofs)) = cpu_to_le16(1); in ntfs_mft_record_layout()
2048 m->lsn = 0; in ntfs_mft_record_layout()
2049 m->sequence_number = cpu_to_le16(1); in ntfs_mft_record_layout()
2050 m->link_count = 0; in ntfs_mft_record_layout()
2053 * aligned to 8-byte boundary. in ntfs_mft_record_layout()
2055 m->attrs_offset = cpu_to_le16((le16_to_cpu(m->usa_ofs) + in ntfs_mft_record_layout()
2056 (le16_to_cpu(m->usa_count) << 1) + 7) & ~7); in ntfs_mft_record_layout()
2057 m->flags = 0; in ntfs_mft_record_layout()
2060 * attrs_offset is already aligned to 8-byte boundary, so no need to in ntfs_mft_record_layout()
2063 m->bytes_in_use = cpu_to_le32(le16_to_cpu(m->attrs_offset) + 8); in ntfs_mft_record_layout()
2064 m->bytes_allocated = cpu_to_le32(vol->mft_record_size); in ntfs_mft_record_layout()
2065 m->base_mft_record = 0; in ntfs_mft_record_layout()
2066 m->next_attr_instance = 0; in ntfs_mft_record_layout()
2068 a = (ATTR_RECORD*)((u8*)m + le16_to_cpu(m->attrs_offset)); in ntfs_mft_record_layout()
2069 a->type = AT_END; in ntfs_mft_record_layout()
2070 a->length = 0; in ntfs_mft_record_layout()
2076 * ntfs_mft_record_format - format an mft record on an ntfs volume
2080 * Format the mft record @mft_no in $MFT/$DATA, i.e. lay out an empty, unused
2081 * mft record into the appropriate place of the mft data attribute. This is
2082 * used when extending the mft data attribute.
2084 * Return 0 on success and -errno on error.
2089 struct inode *mft_vi = vol->mft_ino; in ntfs_mft_record_format()
2101 index = mft_no << vol->mft_record_size_bits >> PAGE_SHIFT; in ntfs_mft_record_format()
2102 ofs = (mft_no << vol->mft_record_size_bits) & ~PAGE_MASK; in ntfs_mft_record_format()
2103 /* The maximum valid index into the page cache for $MFT's data. */ in ntfs_mft_record_format()
2107 if (unlikely(index > end_index || ofs + vol->mft_record_size >= in ntfs_mft_record_format()
2109 ntfs_error(vol->sb, "Tried to format non-existing mft " in ntfs_mft_record_format()
2111 return -ENOENT; in ntfs_mft_record_format()
2115 page = ntfs_map_page(mft_vi->i_mapping, index); in ntfs_mft_record_format()
2117 ntfs_error(vol->sb, "Failed to map page containing mft record " in ntfs_mft_record_format()
2127 ntfs_error(vol->sb, "Failed to layout mft record 0x%llx.", in ntfs_mft_record_format()
2149 * ntfs_mft_record_alloc - allocate an mft record on an ntfs volume
2155 * Allocate an mft record in $MFT/$DATA of an open ntfs volume @vol.
2183 * for the $DATA attribute of $MFT. This is required to avoid the possibility
2193 * allocated mft records, then we extend the $MFT/$DATA attribute in order to
2194 * create free mft records. We extend the allocated size of $MFT/$DATA by 16
2200 * allocated mft record, incrementing mft data size and initialized size
2206 * If during any stage we overflow the initialized data in the mft bitmap, we
2207 * extend the initialized size (and data size) by 8 bytes, allocating another
2208 * cluster if required. The bitmap data size has to be at least equal to the
2213 * - initialized / extended the mft bitmap if necessary,
2214 * - initialized / extended the mft data if necessary,
2215 * - set the bit corresponding to the mft record being allocated in the
2217 * - opened an ntfs_inode for the allocated mft record, and we will have
2218 * - returned the ntfs_inode as well as the allocated mapped, pinned, and
2229 * the extension mft records used to store the $DATA attribute of $MFT can be
2258 (long long)base_ni->mft_no); in ntfs_mft_record_alloc()
2268 return ERR_PTR(-EOPNOTSUPP); in ntfs_mft_record_alloc()
2271 mft_ni = NTFS_I(vol->mft_ino); in ntfs_mft_record_alloc()
2272 mftbmp_ni = NTFS_I(vol->mftbmp_ino); in ntfs_mft_record_alloc()
2273 down_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2280 if (bit != -ENOSPC) { in ntfs_mft_record_alloc()
2281 up_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2292 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2293 ll = mft_ni->initialized_size >> vol->mft_record_size_bits; in ntfs_mft_record_alloc()
2294 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2295 read_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2296 old_data_initialized = mftbmp_ni->initialized_size; in ntfs_mft_record_alloc()
2297 read_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2316 read_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2317 old_data_size = mftbmp_ni->allocated_size; in ntfs_mft_record_alloc()
2321 (long long)i_size_read(vol->mftbmp_ino), in ntfs_mft_record_alloc()
2323 read_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2329 up_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2333 read_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2337 (long long)mftbmp_ni->allocated_size, in ntfs_mft_record_alloc()
2338 (long long)i_size_read(vol->mftbmp_ino), in ntfs_mft_record_alloc()
2339 (long long)mftbmp_ni->initialized_size); in ntfs_mft_record_alloc()
2340 read_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2350 up_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2354 read_lock_irqsave(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2358 (long long)mftbmp_ni->allocated_size, in ntfs_mft_record_alloc()
2359 (long long)i_size_read(vol->mftbmp_ino), in ntfs_mft_record_alloc()
2360 (long long)mftbmp_ni->initialized_size); in ntfs_mft_record_alloc()
2361 read_unlock_irqrestore(&mftbmp_ni->size_lock, flags); in ntfs_mft_record_alloc()
2367 err = ntfs_bitmap_set_bit(vol->mftbmp_ino, bit); in ntfs_mft_record_alloc()
2369 ntfs_error(vol->sb, "Failed to allocate bit in mft bitmap."); in ntfs_mft_record_alloc()
2370 up_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2376 * The mft bitmap is now uptodate. Deal with mft data attribute now. in ntfs_mft_record_alloc()
2378 * modifications to the mft data attribute are complete, too, as they in ntfs_mft_record_alloc()
2383 ll = (bit + 1) << vol->mft_record_size_bits; in ntfs_mft_record_alloc()
2384 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2385 old_data_initialized = mft_ni->initialized_size; in ntfs_mft_record_alloc()
2386 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2393 * The mft record is outside the initialized data. Extend the mft data in ntfs_mft_record_alloc()
2398 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2399 ntfs_debug("Status of mft data before extension: " in ntfs_mft_record_alloc()
2402 (long long)mft_ni->allocated_size, in ntfs_mft_record_alloc()
2403 (long long)i_size_read(vol->mft_ino), in ntfs_mft_record_alloc()
2404 (long long)mft_ni->initialized_size); in ntfs_mft_record_alloc()
2405 while (ll > mft_ni->allocated_size) { in ntfs_mft_record_alloc()
2406 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2409 ntfs_error(vol->sb, "Failed to extend mft data " in ntfs_mft_record_alloc()
2413 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2414 ntfs_debug("Status of mft data after allocation extension: " in ntfs_mft_record_alloc()
2417 (long long)mft_ni->allocated_size, in ntfs_mft_record_alloc()
2418 (long long)i_size_read(vol->mft_ino), in ntfs_mft_record_alloc()
2419 (long long)mft_ni->initialized_size); in ntfs_mft_record_alloc()
2421 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2423 * Extend mft data initialized size (and data size of course) to reach in ntfs_mft_record_alloc()
2429 write_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2430 old_data_initialized = mft_ni->initialized_size; in ntfs_mft_record_alloc()
2431 old_data_size = vol->mft_ino->i_size; in ntfs_mft_record_alloc()
2432 while (ll > mft_ni->initialized_size) { in ntfs_mft_record_alloc()
2435 new_initialized_size = mft_ni->initialized_size + in ntfs_mft_record_alloc()
2436 vol->mft_record_size; in ntfs_mft_record_alloc()
2437 mft_no = mft_ni->initialized_size >> vol->mft_record_size_bits; in ntfs_mft_record_alloc()
2438 if (new_initialized_size > i_size_read(vol->mft_ino)) in ntfs_mft_record_alloc()
2439 i_size_write(vol->mft_ino, new_initialized_size); in ntfs_mft_record_alloc()
2440 write_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2445 ntfs_error(vol->sb, "Failed to format mft record."); in ntfs_mft_record_alloc()
2448 write_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2449 mft_ni->initialized_size = new_initialized_size; in ntfs_mft_record_alloc()
2451 write_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2453 /* Update the mft data attribute record to reflect the new sizes. */ in ntfs_mft_record_alloc()
2456 ntfs_error(vol->sb, "Failed to map mft record."); in ntfs_mft_record_alloc()
2462 ntfs_error(vol->sb, "Failed to get search context."); in ntfs_mft_record_alloc()
2463 err = -ENOMEM; in ntfs_mft_record_alloc()
2467 err = ntfs_attr_lookup(mft_ni->type, mft_ni->name, mft_ni->name_len, in ntfs_mft_record_alloc()
2470 ntfs_error(vol->sb, "Failed to find first attribute extent of " in ntfs_mft_record_alloc()
2471 "mft data attribute."); in ntfs_mft_record_alloc()
2476 a = ctx->attr; in ntfs_mft_record_alloc()
2477 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2478 a->data.non_resident.initialized_size = in ntfs_mft_record_alloc()
2479 cpu_to_sle64(mft_ni->initialized_size); in ntfs_mft_record_alloc()
2480 a->data.non_resident.data_size = in ntfs_mft_record_alloc()
2481 cpu_to_sle64(i_size_read(vol->mft_ino)); in ntfs_mft_record_alloc()
2482 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2484 flush_dcache_mft_record_page(ctx->ntfs_ino); in ntfs_mft_record_alloc()
2485 mark_mft_record_dirty(ctx->ntfs_ino); in ntfs_mft_record_alloc()
2488 read_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2489 ntfs_debug("Status of mft data after mft record initialization: " in ntfs_mft_record_alloc()
2492 (long long)mft_ni->allocated_size, in ntfs_mft_record_alloc()
2493 (long long)i_size_read(vol->mft_ino), in ntfs_mft_record_alloc()
2494 (long long)mft_ni->initialized_size); in ntfs_mft_record_alloc()
2495 BUG_ON(i_size_read(vol->mft_ino) > mft_ni->allocated_size); in ntfs_mft_record_alloc()
2496 BUG_ON(mft_ni->initialized_size > i_size_read(vol->mft_ino)); in ntfs_mft_record_alloc()
2497 read_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2500 * We can finally drop the mft bitmap lock as the mft data attribute in ntfs_mft_record_alloc()
2505 * that it is allocated in the mft bitmap means that no-one will try to in ntfs_mft_record_alloc()
2508 up_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2513 index = bit << vol->mft_record_size_bits >> PAGE_SHIFT; in ntfs_mft_record_alloc()
2514 ofs = (bit << vol->mft_record_size_bits) & ~PAGE_MASK; in ntfs_mft_record_alloc()
2516 page = ntfs_map_page(vol->mft_ino->i_mapping, index); in ntfs_mft_record_alloc()
2518 ntfs_error(vol->sb, "Failed to map page containing allocated " in ntfs_mft_record_alloc()
2530 if (ntfs_is_file_record(m->magic) && in ntfs_mft_record_alloc()
2531 (m->flags & MFT_RECORD_IN_USE)) { in ntfs_mft_record_alloc()
2532 ntfs_error(vol->sb, "Mft record 0x%llx was marked " in ntfs_mft_record_alloc()
2537 err = -EIO; in ntfs_mft_record_alloc()
2545 * We need to (re-)format the mft record, preserving the in ntfs_mft_record_alloc()
2547 * sequence number if it is not zero or -1 (0xffff). This in ntfs_mft_record_alloc()
2551 seq_no = m->sequence_number; in ntfs_mft_record_alloc()
2552 usn = *(le16*)((u8*)m + le16_to_cpu(m->usa_ofs)); in ntfs_mft_record_alloc()
2555 ntfs_error(vol->sb, "Failed to layout allocated mft " in ntfs_mft_record_alloc()
2563 m->sequence_number = seq_no; in ntfs_mft_record_alloc()
2565 *(le16*)((u8*)m + le16_to_cpu(m->usa_ofs)) = usn; in ntfs_mft_record_alloc()
2568 m->flags |= MFT_RECORD_IN_USE; in ntfs_mft_record_alloc()
2570 m->flags |= MFT_RECORD_IS_DIRECTORY; in ntfs_mft_record_alloc()
2581 m->base_mft_record = MK_LE_MREF(base_ni->mft_no, in ntfs_mft_record_alloc()
2582 base_ni->seq_no); in ntfs_mft_record_alloc()
2590 ntfs_error(vol->sb, "Failed to map allocated extent " in ntfs_mft_record_alloc()
2594 m->flags &= cpu_to_le16( in ntfs_mft_record_alloc()
2620 * Allocate a new VFS inode and set it up. NOTE: @vi->i_nlink in ntfs_mft_record_alloc()
2621 * is set to 1 but the mft record->link_count is 0. The caller in ntfs_mft_record_alloc()
2624 vi = new_inode(vol->sb); in ntfs_mft_record_alloc()
2626 err = -ENOMEM; in ntfs_mft_record_alloc()
2628 m->flags &= cpu_to_le16( in ntfs_mft_record_alloc()
2637 vi->i_ino = bit; in ntfs_mft_record_alloc()
2640 vi->i_uid = vol->uid; in ntfs_mft_record_alloc()
2641 vi->i_gid = vol->gid; in ntfs_mft_record_alloc()
2651 vi->i_mode = S_IFDIR | S_IRWXUGO; in ntfs_mft_record_alloc()
2652 vi->i_mode &= ~vol->dmask; in ntfs_mft_record_alloc()
2655 ni->type = AT_INDEX_ALLOCATION; in ntfs_mft_record_alloc()
2656 ni->name = I30; in ntfs_mft_record_alloc()
2657 ni->name_len = 4; in ntfs_mft_record_alloc()
2659 ni->itype.index.block_size = 4096; in ntfs_mft_record_alloc()
2660 ni->itype.index.block_size_bits = ntfs_ffs(4096) - 1; in ntfs_mft_record_alloc()
2661 ni->itype.index.collation_rule = COLLATION_FILE_NAME; in ntfs_mft_record_alloc()
2662 if (vol->cluster_size <= ni->itype.index.block_size) { in ntfs_mft_record_alloc()
2663 ni->itype.index.vcn_size = vol->cluster_size; in ntfs_mft_record_alloc()
2664 ni->itype.index.vcn_size_bits = in ntfs_mft_record_alloc()
2665 vol->cluster_size_bits; in ntfs_mft_record_alloc()
2667 ni->itype.index.vcn_size = vol->sector_size; in ntfs_mft_record_alloc()
2668 ni->itype.index.vcn_size_bits = in ntfs_mft_record_alloc()
2669 vol->sector_size_bits; in ntfs_mft_record_alloc()
2672 vi->i_mode = S_IFREG | S_IRWXUGO; in ntfs_mft_record_alloc()
2673 vi->i_mode &= ~vol->fmask; in ntfs_mft_record_alloc()
2675 ni->type = AT_DATA; in ntfs_mft_record_alloc()
2676 ni->name = NULL; in ntfs_mft_record_alloc()
2677 ni->name_len = 0; in ntfs_mft_record_alloc()
2680 vi->i_mode &= ~S_IWUGO; in ntfs_mft_record_alloc()
2683 vi->i_atime = vi->i_mtime = vi->i_ctime = in ntfs_mft_record_alloc()
2689 vi->i_size = 0; in ntfs_mft_record_alloc()
2690 vi->i_blocks = 0; in ntfs_mft_record_alloc()
2693 vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number); in ntfs_mft_record_alloc()
2698 atomic_inc(&ni->count); in ntfs_mft_record_alloc()
2699 mutex_lock(&ni->mrec_lock); in ntfs_mft_record_alloc()
2700 ni->page = page; in ntfs_mft_record_alloc()
2701 ni->page_ofs = ofs; in ntfs_mft_record_alloc()
2719 vol->mft_data_pos = bit + 1; in ntfs_mft_record_alloc()
2730 write_lock_irqsave(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2731 mft_ni->initialized_size = old_data_initialized; in ntfs_mft_record_alloc()
2732 i_size_write(vol->mft_ino, old_data_size); in ntfs_mft_record_alloc()
2733 write_unlock_irqrestore(&mft_ni->size_lock, flags); in ntfs_mft_record_alloc()
2736 down_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2738 if (ntfs_bitmap_clear_bit(vol->mftbmp_ino, bit)) { in ntfs_mft_record_alloc()
2739 ntfs_error(vol->sb, "Failed to clear bit in mft bitmap.%s", es); in ntfs_mft_record_alloc()
2742 up_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2746 ntfs_warning(vol->sb, "Cannot allocate mft record because the maximum " in ntfs_mft_record_alloc()
2748 up_write(&vol->mftbmp_lock); in ntfs_mft_record_alloc()
2749 return ERR_PTR(-ENOSPC); in ntfs_mft_record_alloc()
2753 * ntfs_extent_mft_record_free - free an extent mft record on an ntfs volume
2763 * On success return 0 and on error return -errno. @ni and @m are still valid
2775 unsigned long mft_no = ni->mft_no; in ntfs_extent_mft_record_free()
2776 ntfs_volume *vol = ni->vol; in ntfs_extent_mft_record_free()
2784 BUG_ON(ni->nr_extents != -1); in ntfs_extent_mft_record_free()
2786 mutex_lock(&ni->extent_lock); in ntfs_extent_mft_record_free()
2787 base_ni = ni->ext.base_ntfs_ino; in ntfs_extent_mft_record_free()
2788 mutex_unlock(&ni->extent_lock); in ntfs_extent_mft_record_free()
2790 BUG_ON(base_ni->nr_extents <= 0); in ntfs_extent_mft_record_free()
2793 mft_no, base_ni->mft_no); in ntfs_extent_mft_record_free()
2795 mutex_lock(&base_ni->extent_lock); in ntfs_extent_mft_record_free()
2798 if (atomic_read(&ni->count) > 2) { in ntfs_extent_mft_record_free()
2799 ntfs_error(vol->sb, "Tried to free busy extent inode 0x%lx, " in ntfs_extent_mft_record_free()
2800 "not freeing.", base_ni->mft_no); in ntfs_extent_mft_record_free()
2801 mutex_unlock(&base_ni->extent_lock); in ntfs_extent_mft_record_free()
2802 return -EBUSY; in ntfs_extent_mft_record_free()
2806 extent_nis = base_ni->ext.extent_ntfs_inos; in ntfs_extent_mft_record_free()
2807 err = -ENOENT; in ntfs_extent_mft_record_free()
2808 for (i = 0; i < base_ni->nr_extents; i++) { in ntfs_extent_mft_record_free()
2812 base_ni->nr_extents--; in ntfs_extent_mft_record_free()
2813 memmove(extent_nis, extent_nis + 1, (base_ni->nr_extents - i) * in ntfs_extent_mft_record_free()
2819 mutex_unlock(&base_ni->extent_lock); in ntfs_extent_mft_record_free()
2822 ntfs_error(vol->sb, "Extent inode 0x%lx is not attached to " in ntfs_extent_mft_record_free()
2824 base_ni->mft_no); in ntfs_extent_mft_record_free()
2834 m->flags &= ~MFT_RECORD_IN_USE; in ntfs_extent_mft_record_free()
2837 old_seq_no = m->sequence_number; in ntfs_extent_mft_record_free()
2843 m->sequence_number = cpu_to_le16(seq_no); in ntfs_extent_mft_record_free()
2853 ntfs_error(vol->sb, "Failed to write mft record 0x%lx, not " in ntfs_extent_mft_record_free()
2863 down_write(&vol->mftbmp_lock); in ntfs_extent_mft_record_free()
2864 err = ntfs_bitmap_clear_bit(vol->mftbmp_ino, mft_no); in ntfs_extent_mft_record_free()
2865 up_write(&vol->mftbmp_lock); in ntfs_extent_mft_record_free()
2872 ntfs_error(vol->sb, "Failed to clear bit in mft bitmap.%s", es); in ntfs_extent_mft_record_free()
2878 mutex_lock(&base_ni->extent_lock); in ntfs_extent_mft_record_free()
2879 extent_nis = base_ni->ext.extent_ntfs_inos; in ntfs_extent_mft_record_free()
2880 if (!(base_ni->nr_extents & 3)) { in ntfs_extent_mft_record_free()
2881 int new_size = (base_ni->nr_extents + 4) * sizeof(ntfs_inode*); in ntfs_extent_mft_record_free()
2885 ntfs_error(vol->sb, "Failed to allocate internal " in ntfs_extent_mft_record_free()
2887 mutex_unlock(&base_ni->extent_lock); in ntfs_extent_mft_record_free()
2891 if (base_ni->nr_extents) { in ntfs_extent_mft_record_free()
2892 BUG_ON(!base_ni->ext.extent_ntfs_inos); in ntfs_extent_mft_record_free()
2893 memcpy(extent_nis, base_ni->ext.extent_ntfs_inos, in ntfs_extent_mft_record_free()
2894 new_size - 4 * sizeof(ntfs_inode*)); in ntfs_extent_mft_record_free()
2895 kfree(base_ni->ext.extent_ntfs_inos); in ntfs_extent_mft_record_free()
2897 base_ni->ext.extent_ntfs_inos = extent_nis; in ntfs_extent_mft_record_free()
2899 m->flags |= MFT_RECORD_IN_USE; in ntfs_extent_mft_record_free()
2900 m->sequence_number = old_seq_no; in ntfs_extent_mft_record_free()
2901 extent_nis[base_ni->nr_extents++] = ni; in ntfs_extent_mft_record_free()
2902 mutex_unlock(&base_ni->extent_lock); in ntfs_extent_mft_record_free()