diff options
| -rw-r--r-- | fs/xfs/xfs_dir2.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2_block.c | 7 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2_data.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2_leaf.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2_node.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2_sf.c | 35 | ||||
| -rw-r--r-- | fs/xfs/xfs_sb.h | 3 |
7 files changed, 47 insertions, 9 deletions
diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index f9825b125fcf..d3ff96c321f9 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c | |||
| @@ -209,6 +209,7 @@ xfs_dir_createname( | |||
| 209 | memset(&args, 0, sizeof(xfs_da_args_t)); | 209 | memset(&args, 0, sizeof(xfs_da_args_t)); |
| 210 | args.name = name->name; | 210 | args.name = name->name; |
| 211 | args.namelen = name->len; | 211 | args.namelen = name->len; |
| 212 | args.filetype = name->type; | ||
| 212 | args.hashval = dp->i_mount->m_dirnameops->hashname(name); | 213 | args.hashval = dp->i_mount->m_dirnameops->hashname(name); |
| 213 | args.inumber = inum; | 214 | args.inumber = inum; |
| 214 | args.dp = dp; | 215 | args.dp = dp; |
| @@ -283,6 +284,7 @@ xfs_dir_lookup( | |||
| 283 | memset(&args, 0, sizeof(xfs_da_args_t)); | 284 | memset(&args, 0, sizeof(xfs_da_args_t)); |
| 284 | args.name = name->name; | 285 | args.name = name->name; |
| 285 | args.namelen = name->len; | 286 | args.namelen = name->len; |
| 287 | args.filetype = name->type; | ||
| 286 | args.hashval = dp->i_mount->m_dirnameops->hashname(name); | 288 | args.hashval = dp->i_mount->m_dirnameops->hashname(name); |
| 287 | args.dp = dp; | 289 | args.dp = dp; |
| 288 | args.whichfork = XFS_DATA_FORK; | 290 | args.whichfork = XFS_DATA_FORK; |
| @@ -338,6 +340,7 @@ xfs_dir_removename( | |||
| 338 | memset(&args, 0, sizeof(xfs_da_args_t)); | 340 | memset(&args, 0, sizeof(xfs_da_args_t)); |
| 339 | args.name = name->name; | 341 | args.name = name->name; |
| 340 | args.namelen = name->len; | 342 | args.namelen = name->len; |
| 343 | args.filetype = name->type; | ||
| 341 | args.hashval = dp->i_mount->m_dirnameops->hashname(name); | 344 | args.hashval = dp->i_mount->m_dirnameops->hashname(name); |
| 342 | args.inumber = ino; | 345 | args.inumber = ino; |
| 343 | args.dp = dp; | 346 | args.dp = dp; |
diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 1cd2f564e374..0957aa98b6c0 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c | |||
| @@ -549,6 +549,7 @@ xfs_dir2_block_addname( | |||
| 549 | dep->inumber = cpu_to_be64(args->inumber); | 549 | dep->inumber = cpu_to_be64(args->inumber); |
| 550 | dep->namelen = args->namelen; | 550 | dep->namelen = args->namelen; |
| 551 | memcpy(dep->name, args->name, args->namelen); | 551 | memcpy(dep->name, args->name, args->namelen); |
| 552 | xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); | ||
| 552 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); | 553 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); |
| 553 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); | 554 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); |
| 554 | /* | 555 | /* |
| @@ -641,6 +642,7 @@ xfs_dir2_block_lookup( | |||
| 641 | * Fill in inode number, CI name if appropriate, release the block. | 642 | * Fill in inode number, CI name if appropriate, release the block. |
| 642 | */ | 643 | */ |
| 643 | args->inumber = be64_to_cpu(dep->inumber); | 644 | args->inumber = be64_to_cpu(dep->inumber); |
| 645 | args->filetype = xfs_dir3_dirent_get_ftype(mp, dep); | ||
| 644 | error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); | 646 | error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); |
| 645 | xfs_trans_brelse(args->trans, bp); | 647 | xfs_trans_brelse(args->trans, bp); |
| 646 | return XFS_ERROR(error); | 648 | return XFS_ERROR(error); |
| @@ -873,6 +875,7 @@ xfs_dir2_block_replace( | |||
| 873 | * Change the inode number to the new value. | 875 | * Change the inode number to the new value. |
| 874 | */ | 876 | */ |
| 875 | dep->inumber = cpu_to_be64(args->inumber); | 877 | dep->inumber = cpu_to_be64(args->inumber); |
| 878 | xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); | ||
| 876 | xfs_dir2_data_log_entry(args->trans, bp, dep); | 879 | xfs_dir2_data_log_entry(args->trans, bp, dep); |
| 877 | xfs_dir3_data_check(dp, bp); | 880 | xfs_dir3_data_check(dp, bp); |
| 878 | return 0; | 881 | return 0; |
| @@ -1159,6 +1162,7 @@ xfs_dir2_sf_to_block( | |||
| 1159 | dep->inumber = cpu_to_be64(dp->i_ino); | 1162 | dep->inumber = cpu_to_be64(dp->i_ino); |
| 1160 | dep->namelen = 1; | 1163 | dep->namelen = 1; |
| 1161 | dep->name[0] = '.'; | 1164 | dep->name[0] = '.'; |
| 1165 | xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); | ||
| 1162 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); | 1166 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); |
| 1163 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); | 1167 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); |
| 1164 | xfs_dir2_data_log_entry(tp, bp, dep); | 1168 | xfs_dir2_data_log_entry(tp, bp, dep); |
| @@ -1172,6 +1176,7 @@ xfs_dir2_sf_to_block( | |||
| 1172 | dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); | 1176 | dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); |
| 1173 | dep->namelen = 2; | 1177 | dep->namelen = 2; |
| 1174 | dep->name[0] = dep->name[1] = '.'; | 1178 | dep->name[0] = dep->name[1] = '.'; |
| 1179 | xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); | ||
| 1175 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); | 1180 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); |
| 1176 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); | 1181 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); |
| 1177 | xfs_dir2_data_log_entry(tp, bp, dep); | 1182 | xfs_dir2_data_log_entry(tp, bp, dep); |
| @@ -1219,6 +1224,8 @@ xfs_dir2_sf_to_block( | |||
| 1219 | dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); | 1224 | dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); |
| 1220 | dep->inumber = cpu_to_be64(xfs_dir3_sfe_get_ino(mp, sfp, sfep)); | 1225 | dep->inumber = cpu_to_be64(xfs_dir3_sfe_get_ino(mp, sfp, sfep)); |
| 1221 | dep->namelen = sfep->namelen; | 1226 | dep->namelen = sfep->namelen; |
| 1227 | xfs_dir3_dirent_put_ftype(mp, dep, | ||
| 1228 | xfs_dir3_sfe_get_ftype(mp, sfp, sfep)); | ||
| 1222 | memcpy(dep->name, sfep->name, dep->namelen); | 1229 | memcpy(dep->name, sfep->name, dep->namelen); |
| 1223 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); | 1230 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); |
| 1224 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); | 1231 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); |
diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 1b59e43d97d9..47e1326c169a 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c | |||
| @@ -149,6 +149,8 @@ __xfs_dir3_data_check( | |||
| 149 | XFS_WANT_CORRUPTED_RETURN( | 149 | XFS_WANT_CORRUPTED_RETURN( |
| 150 | be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) == | 150 | be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) == |
| 151 | (char *)dep - (char *)hdr); | 151 | (char *)dep - (char *)hdr); |
| 152 | XFS_WANT_CORRUPTED_RETURN( | ||
| 153 | xfs_dir3_dirent_get_ftype(mp, dep) < XFS_DIR3_FT_MAX); | ||
| 152 | count++; | 154 | count++; |
| 153 | lastfree = 0; | 155 | lastfree = 0; |
| 154 | if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || | 156 | if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || |
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 887b1bdec6dd..08984eeee159 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c | |||
| @@ -897,6 +897,7 @@ xfs_dir2_leaf_addname( | |||
| 897 | dep->inumber = cpu_to_be64(args->inumber); | 897 | dep->inumber = cpu_to_be64(args->inumber); |
| 898 | dep->namelen = args->namelen; | 898 | dep->namelen = args->namelen; |
| 899 | memcpy(dep->name, args->name, dep->namelen); | 899 | memcpy(dep->name, args->name, dep->namelen); |
| 900 | xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); | ||
| 900 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); | 901 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); |
| 901 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); | 902 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); |
| 902 | /* | 903 | /* |
| @@ -1225,6 +1226,7 @@ xfs_dir2_leaf_lookup( | |||
| 1225 | * Return the found inode number & CI name if appropriate | 1226 | * Return the found inode number & CI name if appropriate |
| 1226 | */ | 1227 | */ |
| 1227 | args->inumber = be64_to_cpu(dep->inumber); | 1228 | args->inumber = be64_to_cpu(dep->inumber); |
| 1229 | args->filetype = xfs_dir3_dirent_get_ftype(dp->i_mount, dep); | ||
| 1228 | error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); | 1230 | error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); |
| 1229 | xfs_trans_brelse(tp, dbp); | 1231 | xfs_trans_brelse(tp, dbp); |
| 1230 | xfs_trans_brelse(tp, lbp); | 1232 | xfs_trans_brelse(tp, lbp); |
| @@ -1555,6 +1557,7 @@ xfs_dir2_leaf_replace( | |||
| 1555 | * Put the new inode number in, log it. | 1557 | * Put the new inode number in, log it. |
| 1556 | */ | 1558 | */ |
| 1557 | dep->inumber = cpu_to_be64(args->inumber); | 1559 | dep->inumber = cpu_to_be64(args->inumber); |
| 1560 | xfs_dir3_dirent_put_ftype(dp->i_mount, dep, args->filetype); | ||
| 1558 | tp = args->trans; | 1561 | tp = args->trans; |
| 1559 | xfs_dir2_data_log_entry(tp, dbp, dep); | 1562 | xfs_dir2_data_log_entry(tp, dbp, dep); |
| 1560 | xfs_dir3_leaf_check(dp->i_mount, lbp); | 1563 | xfs_dir3_leaf_check(dp->i_mount, lbp); |
diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 49f1e9ed492c..4c3dba7ffb74 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c | |||
| @@ -816,6 +816,7 @@ xfs_dir2_leafn_lookup_for_entry( | |||
| 816 | xfs_trans_brelse(tp, state->extrablk.bp); | 816 | xfs_trans_brelse(tp, state->extrablk.bp); |
| 817 | args->cmpresult = cmp; | 817 | args->cmpresult = cmp; |
| 818 | args->inumber = be64_to_cpu(dep->inumber); | 818 | args->inumber = be64_to_cpu(dep->inumber); |
| 819 | args->filetype = xfs_dir3_dirent_get_ftype(mp, dep); | ||
| 819 | *indexp = index; | 820 | *indexp = index; |
| 820 | state->extravalid = 1; | 821 | state->extravalid = 1; |
| 821 | state->extrablk.bp = curbp; | 822 | state->extrablk.bp = curbp; |
| @@ -2007,6 +2008,7 @@ xfs_dir2_node_addname_int( | |||
| 2007 | dep->inumber = cpu_to_be64(args->inumber); | 2008 | dep->inumber = cpu_to_be64(args->inumber); |
| 2008 | dep->namelen = args->namelen; | 2009 | dep->namelen = args->namelen; |
| 2009 | memcpy(dep->name, args->name, dep->namelen); | 2010 | memcpy(dep->name, args->name, dep->namelen); |
| 2011 | xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); | ||
| 2010 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); | 2012 | tagp = xfs_dir3_data_entry_tag_p(mp, dep); |
| 2011 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); | 2013 | *tagp = cpu_to_be16((char *)dep - (char *)hdr); |
| 2012 | xfs_dir2_data_log_entry(tp, dbp, dep); | 2014 | xfs_dir2_data_log_entry(tp, dbp, dep); |
| @@ -2227,6 +2229,7 @@ xfs_dir2_node_replace( | |||
| 2227 | * Fill in the new inode number and log the entry. | 2229 | * Fill in the new inode number and log the entry. |
| 2228 | */ | 2230 | */ |
| 2229 | dep->inumber = cpu_to_be64(inum); | 2231 | dep->inumber = cpu_to_be64(inum); |
| 2232 | xfs_dir3_dirent_put_ftype(state->mp, dep, args->filetype); | ||
| 2230 | xfs_dir2_data_log_entry(args->trans, state->extrablk.bp, dep); | 2233 | xfs_dir2_data_log_entry(args->trans, state->extrablk.bp, dep); |
| 2231 | rval = 0; | 2234 | rval = 0; |
| 2232 | } | 2235 | } |
