11e9ea7e0SNamjae Jeon /* SPDX-License-Identifier: GPL-2.0-or-later */ 21e9ea7e0SNamjae Jeon /* 340796051SNamjae Jeon * Defines for mft record handling in NTFS Linux kernel driver. 41e9ea7e0SNamjae Jeon * 51e9ea7e0SNamjae Jeon * Copyright (c) 2001-2004 Anton Altaparmakov 61e9ea7e0SNamjae Jeon */ 71e9ea7e0SNamjae Jeon 81e9ea7e0SNamjae Jeon #ifndef _LINUX_NTFS_MFT_H 91e9ea7e0SNamjae Jeon #define _LINUX_NTFS_MFT_H 101e9ea7e0SNamjae Jeon 111e9ea7e0SNamjae Jeon #include <linux/highmem.h> 121e9ea7e0SNamjae Jeon #include <linux/pagemap.h> 131e9ea7e0SNamjae Jeon 141e9ea7e0SNamjae Jeon #include "inode.h" 151e9ea7e0SNamjae Jeon 1640796051SNamjae Jeon struct mft_record *map_mft_record(struct ntfs_inode *ni); 1740796051SNamjae Jeon void unmap_mft_record(struct ntfs_inode *ni); 1840796051SNamjae Jeon struct mft_record *map_extent_mft_record(struct ntfs_inode *base_ni, u64 mref, 1940796051SNamjae Jeon struct ntfs_inode **ntfs_ino); 201e9ea7e0SNamjae Jeon 2140796051SNamjae Jeon static inline void unmap_extent_mft_record(struct ntfs_inode *ni) 221e9ea7e0SNamjae Jeon { 231e9ea7e0SNamjae Jeon unmap_mft_record(ni); 241e9ea7e0SNamjae Jeon } 251e9ea7e0SNamjae Jeon 2640796051SNamjae Jeon void __mark_mft_record_dirty(struct ntfs_inode *ni); 271e9ea7e0SNamjae Jeon 2840796051SNamjae Jeon /* 291e9ea7e0SNamjae Jeon * mark_mft_record_dirty - set the mft record and the page containing it dirty 301e9ea7e0SNamjae Jeon * @ni: ntfs inode describing the mapped mft record 311e9ea7e0SNamjae Jeon * 321e9ea7e0SNamjae Jeon * Set the mapped (extent) mft record of the (base or extent) ntfs inode @ni, 331e9ea7e0SNamjae Jeon * as well as the page containing the mft record, dirty. Also, mark the base 341e9ea7e0SNamjae Jeon * vfs inode dirty. This ensures that any changes to the mft record are 351e9ea7e0SNamjae Jeon * written out to disk. 361e9ea7e0SNamjae Jeon * 371e9ea7e0SNamjae Jeon * NOTE: Do not do anything if the mft record is already marked dirty. 381e9ea7e0SNamjae Jeon */ 3940796051SNamjae Jeon static inline void mark_mft_record_dirty(struct ntfs_inode *ni) 401e9ea7e0SNamjae Jeon { 411e9ea7e0SNamjae Jeon if (!NInoTestSetDirty(ni)) 421e9ea7e0SNamjae Jeon __mark_mft_record_dirty(ni); 431e9ea7e0SNamjae Jeon } 441e9ea7e0SNamjae Jeon 45*d9038d99SNamjae Jeon int ntfs_sync_mft_mirror(struct ntfs_volume *vol, const u64 mft_no, 4640796051SNamjae Jeon struct mft_record *m); 4740796051SNamjae Jeon int write_mft_record_nolock(struct ntfs_inode *ni, struct mft_record *m, int sync); 481e9ea7e0SNamjae Jeon 4940796051SNamjae Jeon /* 501e9ea7e0SNamjae Jeon * write_mft_record - write out a mapped (extent) mft record 511e9ea7e0SNamjae Jeon * @ni: ntfs inode describing the mapped (extent) mft record 521e9ea7e0SNamjae Jeon * @m: mapped (extent) mft record to write 531e9ea7e0SNamjae Jeon * @sync: if true, wait for i/o completion 541e9ea7e0SNamjae Jeon * 551e9ea7e0SNamjae Jeon * This is just a wrapper for write_mft_record_nolock() (see mft.c), which 561e9ea7e0SNamjae Jeon * locks the page for the duration of the write. This ensures that there are 571e9ea7e0SNamjae Jeon * no race conditions between writing the mft record via the dirty inode code 581e9ea7e0SNamjae Jeon * paths and via the page cache write back code paths or between writing 591e9ea7e0SNamjae Jeon * neighbouring mft records residing in the same page. 601e9ea7e0SNamjae Jeon * 611e9ea7e0SNamjae Jeon * Locking the page also serializes us against ->read_folio() if the page is not 621e9ea7e0SNamjae Jeon * uptodate. 631e9ea7e0SNamjae Jeon * 641e9ea7e0SNamjae Jeon * On success, clean the mft record and return 0. On error, leave the mft 651e9ea7e0SNamjae Jeon * record dirty and return -errno. 661e9ea7e0SNamjae Jeon */ 6740796051SNamjae Jeon static inline int write_mft_record(struct ntfs_inode *ni, struct mft_record *m, int sync) 681e9ea7e0SNamjae Jeon { 6940796051SNamjae Jeon struct folio *folio = ni->folio; 701e9ea7e0SNamjae Jeon int err; 711e9ea7e0SNamjae Jeon 7240796051SNamjae Jeon folio_lock(folio); 731e9ea7e0SNamjae Jeon err = write_mft_record_nolock(ni, m, sync); 7440796051SNamjae Jeon folio_unlock(folio); 7540796051SNamjae Jeon 761e9ea7e0SNamjae Jeon return err; 771e9ea7e0SNamjae Jeon } 781e9ea7e0SNamjae Jeon 7940796051SNamjae Jeon int ntfs_mft_record_alloc(struct ntfs_volume *vol, const int mode, 8040796051SNamjae Jeon struct ntfs_inode **ni, struct ntfs_inode *base_ni, 8140796051SNamjae Jeon struct mft_record **ni_mrec); 8240796051SNamjae Jeon int ntfs_mft_record_free(struct ntfs_volume *vol, struct ntfs_inode *ni); 8340796051SNamjae Jeon int ntfs_mft_records_write(const struct ntfs_volume *vol, const u64 mref, 8440796051SNamjae Jeon const s64 count, struct mft_record *b); 8540796051SNamjae Jeon int ntfs_mft_record_check(const struct ntfs_volume *vol, struct mft_record *m, 86*d9038d99SNamjae Jeon u64 mft_no); 8740796051SNamjae Jeon int ntfs_mft_writepages(struct address_space *mapping, 8840796051SNamjae Jeon struct writeback_control *wbc); 8940796051SNamjae Jeon void ntfs_mft_mark_dirty(struct folio *folio); 901e9ea7e0SNamjae Jeon 911e9ea7e0SNamjae Jeon #endif /* _LINUX_NTFS_MFT_H */ 92