1987da915Sopenharmony_ci/*
2987da915Sopenharmony_ci * mft.h - Exports for MFT record handling. Originated from the Linux-NTFS project.
3987da915Sopenharmony_ci *
4987da915Sopenharmony_ci * Copyright (c) 2000-2002 Anton Altaparmakov
5987da915Sopenharmony_ci * Copyright (c) 2004-2005 Richard Russon
6987da915Sopenharmony_ci * Copyright (c) 2006-2008 Szabolcs Szakacsits
7987da915Sopenharmony_ci *
8987da915Sopenharmony_ci * This program/include file is free software; you can redistribute it and/or
9987da915Sopenharmony_ci * modify it under the terms of the GNU General Public License as published
10987da915Sopenharmony_ci * by the Free Software Foundation; either version 2 of the License, or
11987da915Sopenharmony_ci * (at your option) any later version.
12987da915Sopenharmony_ci *
13987da915Sopenharmony_ci * This program/include file is distributed in the hope that it will be
14987da915Sopenharmony_ci * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
15987da915Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16987da915Sopenharmony_ci * GNU General Public License for more details.
17987da915Sopenharmony_ci *
18987da915Sopenharmony_ci * You should have received a copy of the GNU General Public License
19987da915Sopenharmony_ci * along with this program (in the main directory of the NTFS-3G
20987da915Sopenharmony_ci * distribution in the file COPYING); if not, write to the Free Software
21987da915Sopenharmony_ci * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22987da915Sopenharmony_ci */
23987da915Sopenharmony_ci
24987da915Sopenharmony_ci#ifndef _NTFS_MFT_H
25987da915Sopenharmony_ci#define _NTFS_MFT_H
26987da915Sopenharmony_ci
27987da915Sopenharmony_ci#include "volume.h"
28987da915Sopenharmony_ci#include "inode.h"
29987da915Sopenharmony_ci#include "layout.h"
30987da915Sopenharmony_ci#include "logging.h"
31987da915Sopenharmony_ci
32987da915Sopenharmony_ciextern int ntfs_mft_records_read(const ntfs_volume *vol, const MFT_REF mref,
33987da915Sopenharmony_ci		const s64 count, MFT_RECORD *b);
34987da915Sopenharmony_ci
35987da915Sopenharmony_ci/**
36987da915Sopenharmony_ci * ntfs_mft_record_read - read a record from the mft
37987da915Sopenharmony_ci * @vol:	volume to read from
38987da915Sopenharmony_ci * @mref:	mft record number to read
39987da915Sopenharmony_ci * @b:		output data buffer
40987da915Sopenharmony_ci *
41987da915Sopenharmony_ci * Read the mft record specified by @mref from volume @vol into buffer @b.
42987da915Sopenharmony_ci * Return 0 on success or -1 on error, with errno set to the error code.
43987da915Sopenharmony_ci *
44987da915Sopenharmony_ci * The read mft record is mst deprotected and is hence ready to use. The caller
45987da915Sopenharmony_ci * should check the record with is_baad_record() in case mst deprotection
46987da915Sopenharmony_ci * failed.
47987da915Sopenharmony_ci *
48987da915Sopenharmony_ci * NOTE: @b has to be at least of size vol->mft_record_size.
49987da915Sopenharmony_ci */
50987da915Sopenharmony_cistatic __inline__ int ntfs_mft_record_read(const ntfs_volume *vol,
51987da915Sopenharmony_ci		const MFT_REF mref, MFT_RECORD *b)
52987da915Sopenharmony_ci{
53987da915Sopenharmony_ci	int ret;
54987da915Sopenharmony_ci
55987da915Sopenharmony_ci	ntfs_log_enter("Entering for inode %lld\n", (long long)MREF(mref));
56987da915Sopenharmony_ci	ret = ntfs_mft_records_read(vol, mref, 1, b);
57987da915Sopenharmony_ci	ntfs_log_leave("\n");
58987da915Sopenharmony_ci	return ret;
59987da915Sopenharmony_ci}
60987da915Sopenharmony_ci
61987da915Sopenharmony_ciextern int ntfs_mft_record_check(const ntfs_volume *vol, const MFT_REF mref,
62987da915Sopenharmony_ci		MFT_RECORD *m);
63987da915Sopenharmony_ci
64987da915Sopenharmony_ciextern int ntfs_file_record_read(const ntfs_volume *vol, const MFT_REF mref,
65987da915Sopenharmony_ci		MFT_RECORD **mrec, ATTR_RECORD **attr);
66987da915Sopenharmony_ci
67987da915Sopenharmony_ciextern int ntfs_mft_records_write(const ntfs_volume *vol, const MFT_REF mref,
68987da915Sopenharmony_ci		const s64 count, MFT_RECORD *b);
69987da915Sopenharmony_ci
70987da915Sopenharmony_ci/**
71987da915Sopenharmony_ci * ntfs_mft_record_write - write an mft record to disk
72987da915Sopenharmony_ci * @vol:	volume to write to
73987da915Sopenharmony_ci * @mref:	mft record number to write
74987da915Sopenharmony_ci * @b:		data buffer containing the mft record to write
75987da915Sopenharmony_ci *
76987da915Sopenharmony_ci * Write the mft record specified by @mref from buffer @b to volume @vol.
77987da915Sopenharmony_ci * Return 0 on success or -1 on error, with errno set to the error code.
78987da915Sopenharmony_ci *
79987da915Sopenharmony_ci * Before the mft record is written, it is mst protected. After the write, it
80987da915Sopenharmony_ci * is deprotected again, thus resulting in an increase in the update sequence
81987da915Sopenharmony_ci * number inside the buffer @b.
82987da915Sopenharmony_ci *
83987da915Sopenharmony_ci * NOTE: @b has to be at least of size vol->mft_record_size.
84987da915Sopenharmony_ci */
85987da915Sopenharmony_cistatic __inline__ int ntfs_mft_record_write(const ntfs_volume *vol,
86987da915Sopenharmony_ci		const MFT_REF mref, MFT_RECORD *b)
87987da915Sopenharmony_ci{
88987da915Sopenharmony_ci	int ret;
89987da915Sopenharmony_ci
90987da915Sopenharmony_ci	ntfs_log_enter("Entering for inode %lld\n", (long long)MREF(mref));
91987da915Sopenharmony_ci	ret = ntfs_mft_records_write(vol, mref, 1, b);
92987da915Sopenharmony_ci	ntfs_log_leave("\n");
93987da915Sopenharmony_ci	return ret;
94987da915Sopenharmony_ci}
95987da915Sopenharmony_ci
96987da915Sopenharmony_ci/**
97987da915Sopenharmony_ci * ntfs_mft_record_get_data_size - return number of bytes used in mft record @b
98987da915Sopenharmony_ci * @m:		mft record to get the data size of
99987da915Sopenharmony_ci *
100987da915Sopenharmony_ci * Takes the mft record @m and returns the number of bytes used in the record
101987da915Sopenharmony_ci * or 0 on error (i.e. @m is not a valid mft record).  Zero is not a valid size
102987da915Sopenharmony_ci * for an mft record as it at least has to have the MFT_RECORD itself and a
103987da915Sopenharmony_ci * zero length attribute of type AT_END, thus making the minimum size 56 bytes.
104987da915Sopenharmony_ci *
105987da915Sopenharmony_ci * Aside:  The size is independent of NTFS versions 1.x/3.x because the 8-byte
106987da915Sopenharmony_ci * alignment of the first attribute mask the difference in MFT_RECORD size
107987da915Sopenharmony_ci * between NTFS 1.x and 3.x.  Also, you would expect every mft record to
108987da915Sopenharmony_ci * contain an update sequence array as well but that could in theory be
109987da915Sopenharmony_ci * non-existent (don't know if Windows' NTFS driver/chkdsk wouldn't view this
110987da915Sopenharmony_ci * as corruption in itself though).
111987da915Sopenharmony_ci */
112987da915Sopenharmony_cistatic __inline__ u32 ntfs_mft_record_get_data_size(const MFT_RECORD *m)
113987da915Sopenharmony_ci{
114987da915Sopenharmony_ci	if (!m || !ntfs_is_mft_record(m->magic))
115987da915Sopenharmony_ci		return 0;
116987da915Sopenharmony_ci	/* Get the number of used bytes and return it. */
117987da915Sopenharmony_ci	return le32_to_cpu(m->bytes_in_use);
118987da915Sopenharmony_ci}
119987da915Sopenharmony_ci
120987da915Sopenharmony_ciextern int ntfs_mft_record_layout(const ntfs_volume *vol, const MFT_REF mref,
121987da915Sopenharmony_ci		MFT_RECORD *mrec);
122987da915Sopenharmony_ci
123987da915Sopenharmony_ciextern int ntfs_mft_record_format(const ntfs_volume *vol, const MFT_REF mref);
124987da915Sopenharmony_ci
125987da915Sopenharmony_ciextern ntfs_inode *ntfs_mft_record_alloc(ntfs_volume *vol, ntfs_inode *base_ni);
126987da915Sopenharmony_ci
127987da915Sopenharmony_ciextern ntfs_inode *ntfs_mft_rec_alloc(ntfs_volume *vol, BOOL mft_data);
128987da915Sopenharmony_ci
129987da915Sopenharmony_ciextern int ntfs_mft_record_free(ntfs_volume *vol, ntfs_inode *ni);
130987da915Sopenharmony_ci
131987da915Sopenharmony_ciextern int ntfs_mft_usn_dec(MFT_RECORD *mrec);
132987da915Sopenharmony_ci
133987da915Sopenharmony_ci#endif /* defined _NTFS_MFT_H */
134987da915Sopenharmony_ci
135