xref: /linux/fs/xfs/libxfs/xfs_metafile.c (revision 7f71507851fc7764b36a3221839607d3a45c2025)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) 2018-2024 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <djwong@kernel.org>
5  */
6 #include "xfs.h"
7 #include "xfs_fs.h"
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_bit.h"
13 #include "xfs_sb.h"
14 #include "xfs_mount.h"
15 #include "xfs_defer.h"
16 #include "xfs_trans.h"
17 #include "xfs_metafile.h"
18 #include "xfs_trace.h"
19 #include "xfs_inode.h"
20 
21 /* Set up an inode to be recognized as a metadata directory inode. */
22 void
23 xfs_metafile_set_iflag(
24 	struct xfs_trans	*tp,
25 	struct xfs_inode	*ip,
26 	enum xfs_metafile_type	metafile_type)
27 {
28 	VFS_I(ip)->i_mode &= ~0777;
29 	VFS_I(ip)->i_uid = GLOBAL_ROOT_UID;
30 	VFS_I(ip)->i_gid = GLOBAL_ROOT_GID;
31 	if (S_ISDIR(VFS_I(ip)->i_mode))
32 		ip->i_diflags |= XFS_METADIR_DIFLAGS;
33 	else
34 		ip->i_diflags |= XFS_METAFILE_DIFLAGS;
35 	ip->i_diflags2 &= ~XFS_DIFLAG2_DAX;
36 	ip->i_diflags2 |= XFS_DIFLAG2_METADATA;
37 	ip->i_metatype = metafile_type;
38 	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
39 }
40 
41 /* Clear the metadata directory inode flag. */
42 void
43 xfs_metafile_clear_iflag(
44 	struct xfs_trans	*tp,
45 	struct xfs_inode	*ip)
46 {
47 	ASSERT(xfs_is_metadir_inode(ip));
48 	ASSERT(VFS_I(ip)->i_nlink == 0);
49 
50 	ip->i_diflags2 &= ~XFS_DIFLAG2_METADATA;
51 	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
52 }
53