brintos

brintos / linux-shallow public Read only

0
0
Text · 2.4 KiB · b9dc375 Raw
122 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2000,2005 Silicon Graphics, Inc.4 * All Rights Reserved.5 */6#include "xfs.h"7#include "xfs_fs.h"8#include "xfs_shared.h"9#include "xfs_format.h"10#include "xfs_da_format.h"11#include "xfs_log_format.h"12#include "xfs_trans_resv.h"13#include "xfs_mount.h"14#include "xfs_da_btree.h"15#include "xfs_bmap_btree.h"16#include "xfs_trans_space.h"17 18/* Calculate the disk space required to add a parent pointer. */19unsigned int20xfs_parent_calc_space_res(21	struct xfs_mount	*mp,22	unsigned int		namelen)23{24	/*25	 * Parent pointers are always the first attr in an attr tree, and never26	 * larger than a block27	 */28	return XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK) +29	       XFS_NEXTENTADD_SPACE_RES(mp, namelen, XFS_ATTR_FORK);30}31 32unsigned int33xfs_create_space_res(34	struct xfs_mount	*mp,35	unsigned int		namelen)36{37	unsigned int		ret;38 39	ret = XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp, namelen);40	if (xfs_has_parent(mp))41		ret += xfs_parent_calc_space_res(mp, namelen);42 43	return ret;44}45 46unsigned int47xfs_mkdir_space_res(48	struct xfs_mount	*mp,49	unsigned int		namelen)50{51	return xfs_create_space_res(mp, namelen);52}53 54unsigned int55xfs_link_space_res(56	struct xfs_mount	*mp,57	unsigned int		namelen)58{59	unsigned int		ret;60 61	ret = XFS_DIRENTER_SPACE_RES(mp, namelen);62	if (xfs_has_parent(mp))63		ret += xfs_parent_calc_space_res(mp, namelen);64 65	return ret;66}67 68unsigned int69xfs_symlink_space_res(70	struct xfs_mount	*mp,71	unsigned int		namelen,72	unsigned int		fsblocks)73{74	unsigned int		ret;75 76	ret = XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp, namelen) +77			fsblocks;78 79	if (xfs_has_parent(mp))80		ret += xfs_parent_calc_space_res(mp, namelen);81 82	return ret;83}84 85unsigned int86xfs_remove_space_res(87	struct xfs_mount	*mp,88	unsigned int		namelen)89{90	unsigned int		ret = XFS_DIRREMOVE_SPACE_RES(mp);91 92	if (xfs_has_parent(mp))93		ret += xfs_parent_calc_space_res(mp, namelen);94 95	return ret;96}97 98unsigned int99xfs_rename_space_res(100	struct xfs_mount	*mp,101	unsigned int		src_namelen,102	bool			target_exists,103	unsigned int		target_namelen,104	bool			has_whiteout)105{106	unsigned int		ret;107 108	ret = XFS_DIRREMOVE_SPACE_RES(mp) +109			XFS_DIRENTER_SPACE_RES(mp, target_namelen);110 111	if (xfs_has_parent(mp)) {112		if (has_whiteout)113			ret += xfs_parent_calc_space_res(mp, src_namelen);114		ret += 2 * xfs_parent_calc_space_res(mp, target_namelen);115	}116 117	if (target_exists)118		ret += xfs_parent_calc_space_res(mp, target_namelen);119 120	return ret;121}122