Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0 2 : /* 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. */ 19 : unsigned int 20 0 : xfs_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 never 26 : * larger than a block 27 : */ 28 271877697 : return XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK) + 29 271877697 : XFS_NEXTENTADD_SPACE_RES(mp, namelen, XFS_ATTR_FORK); 30 : } 31 : 32 : unsigned int 33 28287786 : xfs_create_space_res( 34 : struct xfs_mount *mp, 35 : unsigned int namelen) 36 : { 37 28287786 : unsigned int ret; 38 : 39 28287786 : ret = XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp, namelen); 40 28287786 : if (xfs_has_parent(mp)) 41 28137007 : ret += xfs_parent_calc_space_res(mp, namelen); 42 : 43 28287786 : return ret; 44 : } 45 : 46 : unsigned int 47 6365569 : xfs_mkdir_space_res( 48 : struct xfs_mount *mp, 49 : unsigned int namelen) 50 : { 51 6365569 : return xfs_create_space_res(mp, namelen); 52 : } 53 : 54 : unsigned int 55 97288344 : xfs_link_space_res( 56 : struct xfs_mount *mp, 57 : unsigned int namelen) 58 : { 59 97288344 : unsigned int ret; 60 : 61 97288344 : ret = XFS_DIRENTER_SPACE_RES(mp, namelen); 62 97288344 : if (xfs_has_parent(mp)) 63 97256917 : ret += xfs_parent_calc_space_res(mp, namelen); 64 : 65 97288344 : return ret; 66 : } 67 : 68 : unsigned int 69 30953697 : xfs_symlink_space_res( 70 : struct xfs_mount *mp, 71 : unsigned int namelen, 72 : unsigned int fsblocks) 73 : { 74 30953697 : unsigned int ret; 75 : 76 30953697 : ret = XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp, namelen) + 77 : fsblocks; 78 : 79 30953697 : if (xfs_has_parent(mp)) 80 30954483 : ret += xfs_parent_calc_space_res(mp, namelen); 81 : 82 30953697 : return ret; 83 : } 84 : 85 : unsigned int 86 42709190 : xfs_remove_space_res( 87 : struct xfs_mount *mp, 88 : unsigned int namelen) 89 : { 90 42709190 : unsigned int ret = XFS_DIRREMOVE_SPACE_RES(mp); 91 : 92 42709190 : if (xfs_has_parent(mp)) 93 42557123 : ret += xfs_parent_calc_space_res(mp, namelen); 94 : 95 42709190 : return ret; 96 : } 97 : 98 : unsigned int 99 62914421 : xfs_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 62914421 : unsigned int ret; 107 : 108 62914421 : ret = XFS_DIRREMOVE_SPACE_RES(mp) + 109 62914421 : XFS_DIRENTER_SPACE_RES(mp, target_namelen); 110 : 111 62914421 : if (xfs_has_parent(mp)) { 112 62765743 : if (has_whiteout) 113 1813313 : ret += xfs_parent_calc_space_res(mp, src_namelen); 114 62765743 : ret += 2 * xfs_parent_calc_space_res(mp, target_namelen); 115 : } 116 : 117 62914421 : if (target_exists) 118 8393111 : ret += xfs_parent_calc_space_res(mp, target_namelen); 119 : 120 62914421 : return ret; 121 : }