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 383581210 : 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 383581210 : return XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK) + 29 383581210 : XFS_NEXTENTADD_SPACE_RES(mp, namelen, XFS_ATTR_FORK); 30 : } 31 : 32 : unsigned int 33 73984109 : xfs_create_space_res( 34 : struct xfs_mount *mp, 35 : unsigned int namelen) 36 : { 37 73984109 : unsigned int ret; 38 : 39 73984109 : ret = XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp, namelen); 40 73984109 : if (xfs_has_parent(mp)) 41 69074862 : ret += xfs_parent_calc_space_res(mp, namelen); 42 : 43 73804641 : return ret; 44 : } 45 : 46 : unsigned int 47 13430652 : xfs_mkdir_space_res( 48 : struct xfs_mount *mp, 49 : unsigned int namelen) 50 : { 51 13430652 : return xfs_create_space_res(mp, namelen); 52 : } 53 : 54 : unsigned int 55 116208431 : xfs_link_space_res( 56 : struct xfs_mount *mp, 57 : unsigned int namelen) 58 : { 59 116208431 : unsigned int ret; 60 : 61 116208431 : ret = XFS_DIRENTER_SPACE_RES(mp, namelen); 62 116208431 : if (xfs_has_parent(mp)) 63 114898338 : ret += xfs_parent_calc_space_res(mp, namelen); 64 : 65 116208138 : return ret; 66 : } 67 : 68 : unsigned int 69 31835788 : xfs_symlink_space_res( 70 : struct xfs_mount *mp, 71 : unsigned int namelen, 72 : unsigned int fsblocks) 73 : { 74 31835788 : unsigned int ret; 75 : 76 31835788 : ret = XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp, namelen) + 77 : fsblocks; 78 : 79 31835788 : if (xfs_has_parent(mp)) 80 31291653 : ret += xfs_parent_calc_space_res(mp, namelen); 81 : 82 31830727 : return ret; 83 : } 84 : 85 : unsigned int 86 70606964 : xfs_remove_space_res( 87 : struct xfs_mount *mp, 88 : unsigned int namelen) 89 : { 90 70606964 : unsigned int ret = XFS_DIRREMOVE_SPACE_RES(mp); 91 : 92 70606964 : if (xfs_has_parent(mp)) 93 66583857 : ret += xfs_parent_calc_space_res(mp, namelen); 94 : 95 70602433 : return ret; 96 : } 97 : 98 : unsigned int 99 87009208 : 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 87009208 : unsigned int ret; 107 : 108 87009208 : ret = XFS_DIRREMOVE_SPACE_RES(mp) + 109 87009208 : XFS_DIRENTER_SPACE_RES(mp, target_namelen); 110 : 111 87009208 : if (xfs_has_parent(mp)) { 112 83457468 : if (has_whiteout) 113 3715766 : ret += xfs_parent_calc_space_res(mp, src_namelen); 114 83457525 : ret += 2 * xfs_parent_calc_space_res(mp, target_namelen); 115 : } 116 : 117 87009258 : if (target_exists) 118 14645606 : ret += xfs_parent_calc_space_res(mp, target_namelen); 119 : 120 87009254 : return ret; 121 : }