xref: /openbmc/linux/fs/ntfs/mft.h (revision c49c31115067bc7c9a51ffdc735a515151dfa3eb)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * mft.h - Defines for mft record handling in NTFS Linux kernel driver.
31da177e4SLinus Torvalds  *	   Part of the Linux-NTFS project.
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Copyright (c) 2001-2004 Anton Altaparmakov
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * This program/include file is free software; you can redistribute it and/or
81da177e4SLinus Torvalds  * modify it under the terms of the GNU General Public License as published
91da177e4SLinus Torvalds  * by the Free Software Foundation; either version 2 of the License, or
101da177e4SLinus Torvalds  * (at your option) any later version.
111da177e4SLinus Torvalds  *
121da177e4SLinus Torvalds  * This program/include file is distributed in the hope that it will be
131da177e4SLinus Torvalds  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
141da177e4SLinus Torvalds  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151da177e4SLinus Torvalds  * GNU General Public License for more details.
161da177e4SLinus Torvalds  *
171da177e4SLinus Torvalds  * You should have received a copy of the GNU General Public License
181da177e4SLinus Torvalds  * along with this program (in the main directory of the Linux-NTFS
191da177e4SLinus Torvalds  * distribution in the file COPYING); if not, write to the Free Software
201da177e4SLinus Torvalds  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
211da177e4SLinus Torvalds  */
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds #ifndef _LINUX_NTFS_MFT_H
241da177e4SLinus Torvalds #define _LINUX_NTFS_MFT_H
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds #include <linux/fs.h>
271da177e4SLinus Torvalds #include <linux/highmem.h>
281da177e4SLinus Torvalds #include <linux/pagemap.h>
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds #include "inode.h"
311da177e4SLinus Torvalds 
321da177e4SLinus Torvalds extern MFT_RECORD *map_mft_record(ntfs_inode *ni);
331da177e4SLinus Torvalds extern void unmap_mft_record(ntfs_inode *ni);
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds extern MFT_RECORD *map_extent_mft_record(ntfs_inode *base_ni, MFT_REF mref,
361da177e4SLinus Torvalds 		ntfs_inode **ntfs_ino);
371da177e4SLinus Torvalds 
381da177e4SLinus Torvalds static inline void unmap_extent_mft_record(ntfs_inode *ni)
391da177e4SLinus Torvalds {
401da177e4SLinus Torvalds 	unmap_mft_record(ni);
411da177e4SLinus Torvalds 	return;
421da177e4SLinus Torvalds }
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds #ifdef NTFS_RW
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds /**
471da177e4SLinus Torvalds  * flush_dcache_mft_record_page - flush_dcache_page() for mft records
481da177e4SLinus Torvalds  * @ni:		ntfs inode structure of mft record
491da177e4SLinus Torvalds  *
501da177e4SLinus Torvalds  * Call flush_dcache_page() for the page in which an mft record resides.
511da177e4SLinus Torvalds  *
521da177e4SLinus Torvalds  * This must be called every time an mft record is modified, just after the
531da177e4SLinus Torvalds  * modification.
541da177e4SLinus Torvalds  */
551da177e4SLinus Torvalds static inline void flush_dcache_mft_record_page(ntfs_inode *ni)
561da177e4SLinus Torvalds {
571da177e4SLinus Torvalds 	flush_dcache_page(ni->page);
581da177e4SLinus Torvalds }
591da177e4SLinus Torvalds 
601da177e4SLinus Torvalds extern void __mark_mft_record_dirty(ntfs_inode *ni);
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds /**
631da177e4SLinus Torvalds  * mark_mft_record_dirty - set the mft record and the page containing it dirty
641da177e4SLinus Torvalds  * @ni:		ntfs inode describing the mapped mft record
651da177e4SLinus Torvalds  *
661da177e4SLinus Torvalds  * Set the mapped (extent) mft record of the (base or extent) ntfs inode @ni,
671da177e4SLinus Torvalds  * as well as the page containing the mft record, dirty.  Also, mark the base
681da177e4SLinus Torvalds  * vfs inode dirty.  This ensures that any changes to the mft record are
691da177e4SLinus Torvalds  * written out to disk.
701da177e4SLinus Torvalds  *
711da177e4SLinus Torvalds  * NOTE:  Do not do anything if the mft record is already marked dirty.
721da177e4SLinus Torvalds  */
731da177e4SLinus Torvalds static inline void mark_mft_record_dirty(ntfs_inode *ni)
741da177e4SLinus Torvalds {
751da177e4SLinus Torvalds 	if (!NInoTestSetDirty(ni))
761da177e4SLinus Torvalds 		__mark_mft_record_dirty(ni);
771da177e4SLinus Torvalds }
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds extern int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no,
801da177e4SLinus Torvalds 		MFT_RECORD *m, int sync);
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds extern int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync);
831da177e4SLinus Torvalds 
841da177e4SLinus Torvalds /**
851da177e4SLinus Torvalds  * write_mft_record - write out a mapped (extent) mft record
861da177e4SLinus Torvalds  * @ni:		ntfs inode describing the mapped (extent) mft record
871da177e4SLinus Torvalds  * @m:		mapped (extent) mft record to write
881da177e4SLinus Torvalds  * @sync:	if true, wait for i/o completion
891da177e4SLinus Torvalds  *
901da177e4SLinus Torvalds  * This is just a wrapper for write_mft_record_nolock() (see mft.c), which
911da177e4SLinus Torvalds  * locks the page for the duration of the write.  This ensures that there are
921da177e4SLinus Torvalds  * no race conditions between writing the mft record via the dirty inode code
931da177e4SLinus Torvalds  * paths and via the page cache write back code paths or between writing
941da177e4SLinus Torvalds  * neighbouring mft records residing in the same page.
951da177e4SLinus Torvalds  *
961da177e4SLinus Torvalds  * Locking the page also serializes us against ->readpage() if the page is not
971da177e4SLinus Torvalds  * uptodate.
981da177e4SLinus Torvalds  *
991da177e4SLinus Torvalds  * On success, clean the mft record and return 0.  On error, leave the mft
100f95c4018SAnton Altaparmakov  * record dirty and return -errno.
1011da177e4SLinus Torvalds  */
1021da177e4SLinus Torvalds static inline int write_mft_record(ntfs_inode *ni, MFT_RECORD *m, int sync)
1031da177e4SLinus Torvalds {
1041da177e4SLinus Torvalds 	struct page *page = ni->page;
1051da177e4SLinus Torvalds 	int err;
1061da177e4SLinus Torvalds 
1071da177e4SLinus Torvalds 	BUG_ON(!page);
1081da177e4SLinus Torvalds 	lock_page(page);
1091da177e4SLinus Torvalds 	err = write_mft_record_nolock(ni, m, sync);
1101da177e4SLinus Torvalds 	unlock_page(page);
1111da177e4SLinus Torvalds 	return err;
1121da177e4SLinus Torvalds }
1131da177e4SLinus Torvalds 
114*c49c3111SRichard Knutsson extern bool ntfs_may_write_mft_record(ntfs_volume *vol,
1151da177e4SLinus Torvalds 		const unsigned long mft_no, const MFT_RECORD *m,
1161da177e4SLinus Torvalds 		ntfs_inode **locked_ni);
1171da177e4SLinus Torvalds 
1181da177e4SLinus Torvalds extern ntfs_inode *ntfs_mft_record_alloc(ntfs_volume *vol, const int mode,
1191da177e4SLinus Torvalds 		ntfs_inode *base_ni, MFT_RECORD **mrec);
1201da177e4SLinus Torvalds extern int ntfs_extent_mft_record_free(ntfs_inode *ni, MFT_RECORD *m);
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds #endif /* NTFS_RW */
1231da177e4SLinus Torvalds 
1241da177e4SLinus Torvalds #endif /* _LINUX_NTFS_MFT_H */
125