@@ -803,12 +803,11 @@ static struct dentry *exfat_lookup(struct inode *dir, struct dentry *dentry,
803
803
static int exfat_unlink (struct inode * dir , struct dentry * dentry )
804
804
{
805
805
struct exfat_chain cdir ;
806
- struct exfat_dentry * ep ;
807
806
struct super_block * sb = dir -> i_sb ;
808
807
struct inode * inode = dentry -> d_inode ;
809
808
struct exfat_inode_info * ei = EXFAT_I (inode );
810
- struct buffer_head * bh ;
811
- int num_entries , entry , err = 0 ;
809
+ struct exfat_entry_set_cache es ;
810
+ int entry , err = 0 ;
812
811
813
812
mutex_lock (& EXFAT_SB (sb )-> s_lock );
814
813
exfat_chain_dup (& cdir , & ei -> dir );
@@ -819,26 +818,20 @@ static int exfat_unlink(struct inode *dir, struct dentry *dentry)
819
818
goto unlock ;
820
819
}
821
820
822
- ep = exfat_get_dentry (sb , & cdir , entry , & bh );
823
- if (!ep ) {
824
- err = - EIO ;
825
- goto unlock ;
826
- }
827
- num_entries = exfat_count_ext_entries (sb , & cdir , entry , ep );
828
- if (num_entries < 0 ) {
821
+ err = exfat_get_dentry_set (& es , sb , & cdir , entry , ES_ALL_ENTRIES );
822
+ if (err ) {
829
823
err = - EIO ;
830
- brelse (bh );
831
824
goto unlock ;
832
825
}
833
- num_entries ++ ;
834
- brelse (bh );
835
826
836
827
exfat_set_volume_dirty (sb );
828
+
837
829
/* update the directory entry */
838
- if (exfat_remove_entries (dir , & cdir , entry , 0 , num_entries )) {
839
- err = - EIO ;
830
+ exfat_remove_entries (inode , & es , ES_IDX_FILE );
831
+
832
+ err = exfat_put_dentry_set (& es , IS_DIRSYNC (inode ));
833
+ if (err )
840
834
goto unlock ;
841
- }
842
835
843
836
/* This doesn't modify ei */
844
837
ei -> dir .dir = DIR_DELETED ;
@@ -954,13 +947,12 @@ static int exfat_check_dir_empty(struct super_block *sb,
954
947
static int exfat_rmdir (struct inode * dir , struct dentry * dentry )
955
948
{
956
949
struct inode * inode = dentry -> d_inode ;
957
- struct exfat_dentry * ep ;
958
950
struct exfat_chain cdir , clu_to_free ;
959
951
struct super_block * sb = inode -> i_sb ;
960
952
struct exfat_sb_info * sbi = EXFAT_SB (sb );
961
953
struct exfat_inode_info * ei = EXFAT_I (inode );
962
- struct buffer_head * bh ;
963
- int num_entries , entry , err ;
954
+ struct exfat_entry_set_cache es ;
955
+ int entry , err ;
964
956
965
957
mutex_lock (& EXFAT_SB (inode -> i_sb )-> s_lock );
966
958
@@ -984,27 +976,20 @@ static int exfat_rmdir(struct inode *dir, struct dentry *dentry)
984
976
goto unlock ;
985
977
}
986
978
987
- ep = exfat_get_dentry (sb , & cdir , entry , & bh );
988
- if (!ep ) {
989
- err = - EIO ;
990
- goto unlock ;
991
- }
992
-
993
- num_entries = exfat_count_ext_entries (sb , & cdir , entry , ep );
994
- if (num_entries < 0 ) {
979
+ err = exfat_get_dentry_set (& es , sb , & cdir , entry , ES_ALL_ENTRIES );
980
+ if (err ) {
995
981
err = - EIO ;
996
- brelse (bh );
997
982
goto unlock ;
998
983
}
999
- num_entries ++ ;
1000
- brelse (bh );
1001
984
1002
985
exfat_set_volume_dirty (sb );
1003
- err = exfat_remove_entries (dir , & cdir , entry , 0 , num_entries );
1004
- if (err ) {
1005
- exfat_err (sb , "failed to exfat_remove_entries : err(%d)" , err );
986
+
987
+ exfat_remove_entries (inode , & es , ES_IDX_FILE );
988
+
989
+ err = exfat_put_dentry_set (& es , IS_DIRSYNC (dir ));
990
+ if (err )
1006
991
goto unlock ;
1007
- }
992
+
1008
993
ei -> dir .dir = DIR_DELETED ;
1009
994
1010
995
inode_inc_iversion (dir );
@@ -1030,105 +1015,96 @@ static int exfat_rename_file(struct inode *inode, struct exfat_chain *p_dir,
1030
1015
int oldentry , struct exfat_uni_name * p_uniname ,
1031
1016
struct exfat_inode_info * ei )
1032
1017
{
1033
- int ret , num_old_entries , num_new_entries ;
1018
+ int ret , num_new_entries ;
1034
1019
struct exfat_dentry * epold , * epnew ;
1035
1020
struct super_block * sb = inode -> i_sb ;
1036
- struct buffer_head * new_bh , * old_bh ;
1021
+ struct buffer_head * new_bh ;
1022
+ struct exfat_entry_set_cache old_es ;
1037
1023
int sync = IS_DIRSYNC (inode );
1038
1024
1039
- epold = exfat_get_dentry (sb , p_dir , oldentry , & old_bh );
1040
- if (!epold )
1041
- return - EIO ;
1042
-
1043
- num_old_entries = exfat_count_ext_entries (sb , p_dir , oldentry , epold );
1044
- if (num_old_entries < 0 )
1045
- return - EIO ;
1046
- num_old_entries ++ ;
1047
-
1048
1025
num_new_entries = exfat_calc_num_entries (p_uniname );
1049
1026
if (num_new_entries < 0 )
1050
1027
return num_new_entries ;
1051
1028
1052
- if (num_old_entries < num_new_entries ) {
1029
+ ret = exfat_get_dentry_set (& old_es , sb , p_dir , oldentry , ES_ALL_ENTRIES );
1030
+ if (ret ) {
1031
+ ret = - EIO ;
1032
+ return ret ;
1033
+ }
1034
+
1035
+ epold = exfat_get_dentry_cached (& old_es , ES_IDX_FILE );
1036
+
1037
+ if (old_es .num_entries < num_new_entries ) {
1053
1038
int newentry ;
1054
1039
1055
1040
newentry =
1056
1041
exfat_find_empty_entry (inode , p_dir , num_new_entries );
1057
- if (newentry < 0 )
1058
- return newentry ; /* -EIO or -ENOSPC */
1042
+ if (newentry < 0 ) {
1043
+ ret = newentry ; /* -EIO or -ENOSPC */
1044
+ goto put_old_es ;
1045
+ }
1059
1046
1060
1047
epnew = exfat_get_dentry (sb , p_dir , newentry , & new_bh );
1061
- if (!epnew )
1062
- return - EIO ;
1048
+ if (!epnew ) {
1049
+ ret = - EIO ;
1050
+ goto put_old_es ;
1051
+ }
1063
1052
1064
1053
* epnew = * epold ;
1065
1054
if (exfat_get_entry_type (epnew ) == TYPE_FILE ) {
1066
1055
epnew -> dentry .file .attr |= cpu_to_le16 (EXFAT_ATTR_ARCHIVE );
1067
1056
ei -> attr |= EXFAT_ATTR_ARCHIVE ;
1068
1057
}
1069
1058
exfat_update_bh (new_bh , sync );
1070
- brelse (old_bh );
1071
1059
brelse (new_bh );
1072
1060
1073
- epold = exfat_get_dentry (sb , p_dir , oldentry + 1 , & old_bh );
1074
- if (!epold )
1075
- return - EIO ;
1061
+ epold = exfat_get_dentry_cached (& old_es , ES_IDX_STREAM );
1076
1062
epnew = exfat_get_dentry (sb , p_dir , newentry + 1 , & new_bh );
1077
1063
if (!epnew ) {
1078
- brelse ( old_bh ) ;
1079
- return - EIO ;
1064
+ ret = - EIO ;
1065
+ goto put_old_es ;
1080
1066
}
1081
1067
1082
1068
* epnew = * epold ;
1083
1069
exfat_update_bh (new_bh , sync );
1084
- brelse (old_bh );
1085
1070
brelse (new_bh );
1086
1071
1087
1072
ret = exfat_init_ext_entry (inode , p_dir , newentry ,
1088
1073
num_new_entries , p_uniname );
1089
1074
if (ret )
1090
- return ret ;
1075
+ goto put_old_es ;
1091
1076
1092
- exfat_remove_entries (inode , p_dir , oldentry , 0 ,
1093
- num_old_entries );
1077
+ exfat_remove_entries (inode , & old_es , ES_IDX_FILE );
1094
1078
ei -> dir = * p_dir ;
1095
1079
ei -> entry = newentry ;
1096
1080
} else {
1097
1081
if (exfat_get_entry_type (epold ) == TYPE_FILE ) {
1098
1082
epold -> dentry .file .attr |= cpu_to_le16 (EXFAT_ATTR_ARCHIVE );
1099
1083
ei -> attr |= EXFAT_ATTR_ARCHIVE ;
1100
1084
}
1101
- exfat_update_bh (old_bh , sync );
1102
- brelse (old_bh );
1103
1085
ret = exfat_init_ext_entry (inode , p_dir , oldentry ,
1104
1086
num_new_entries , p_uniname );
1105
1087
if (ret )
1106
- return ret ;
1088
+ goto put_old_es ;
1107
1089
1108
- exfat_remove_entries (inode , p_dir , oldentry , num_new_entries ,
1109
- num_old_entries );
1090
+ exfat_remove_entries (inode , & old_es , num_new_entries );
1110
1091
}
1111
- return 0 ;
1092
+ return exfat_put_dentry_set (& old_es , sync );
1093
+
1094
+ put_old_es :
1095
+ exfat_put_dentry_set (& old_es , false);
1096
+ return ret ;
1112
1097
}
1113
1098
1114
1099
static int exfat_move_file (struct inode * inode , struct exfat_chain * p_olddir ,
1115
1100
int oldentry , struct exfat_chain * p_newdir ,
1116
1101
struct exfat_uni_name * p_uniname , struct exfat_inode_info * ei )
1117
1102
{
1118
- int ret , newentry , num_new_entries , num_old_entries ;
1103
+ int ret , newentry , num_new_entries ;
1119
1104
struct exfat_dentry * epmov , * epnew ;
1120
1105
struct super_block * sb = inode -> i_sb ;
1121
- struct buffer_head * mov_bh , * new_bh ;
1122
-
1123
- epmov = exfat_get_dentry (sb , p_olddir , oldentry , & mov_bh );
1124
- if (!epmov )
1125
- return - EIO ;
1126
-
1127
- num_old_entries = exfat_count_ext_entries (sb , p_olddir , oldentry ,
1128
- epmov );
1129
- if (num_old_entries < 0 )
1130
- return - EIO ;
1131
- num_old_entries ++ ;
1106
+ struct buffer_head * new_bh ;
1107
+ struct exfat_entry_set_cache mov_es ;
1132
1108
1133
1109
num_new_entries = exfat_calc_num_entries (p_uniname );
1134
1110
if (num_new_entries < 0 )
@@ -1138,45 +1114,54 @@ static int exfat_move_file(struct inode *inode, struct exfat_chain *p_olddir,
1138
1114
if (newentry < 0 )
1139
1115
return newentry ; /* -EIO or -ENOSPC */
1140
1116
1141
- epnew = exfat_get_dentry (sb , p_newdir , newentry , & new_bh );
1142
- if (!epnew )
1117
+ ret = exfat_get_dentry_set (& mov_es , sb , p_olddir , oldentry ,
1118
+ ES_ALL_ENTRIES );
1119
+ if (ret )
1143
1120
return - EIO ;
1144
1121
1122
+ epmov = exfat_get_dentry_cached (& mov_es , ES_IDX_FILE );
1123
+ epnew = exfat_get_dentry (sb , p_newdir , newentry , & new_bh );
1124
+ if (!epnew ) {
1125
+ ret = - EIO ;
1126
+ goto put_mov_es ;
1127
+ }
1128
+
1145
1129
* epnew = * epmov ;
1146
1130
if (exfat_get_entry_type (epnew ) == TYPE_FILE ) {
1147
1131
epnew -> dentry .file .attr |= cpu_to_le16 (EXFAT_ATTR_ARCHIVE );
1148
1132
ei -> attr |= EXFAT_ATTR_ARCHIVE ;
1149
1133
}
1150
1134
exfat_update_bh (new_bh , IS_DIRSYNC (inode ));
1151
- brelse (mov_bh );
1152
1135
brelse (new_bh );
1153
1136
1154
- epmov = exfat_get_dentry (sb , p_olddir , oldentry + 1 , & mov_bh );
1155
- if (!epmov )
1156
- return - EIO ;
1137
+ epmov = exfat_get_dentry_cached (& mov_es , ES_IDX_STREAM );
1157
1138
epnew = exfat_get_dentry (sb , p_newdir , newentry + 1 , & new_bh );
1158
1139
if (!epnew ) {
1159
- brelse ( mov_bh ) ;
1160
- return - EIO ;
1140
+ ret = - EIO ;
1141
+ goto put_mov_es ;
1161
1142
}
1162
1143
1163
1144
* epnew = * epmov ;
1164
1145
exfat_update_bh (new_bh , IS_DIRSYNC (inode ));
1165
- brelse (mov_bh );
1166
1146
brelse (new_bh );
1167
1147
1168
1148
ret = exfat_init_ext_entry (inode , p_newdir , newentry , num_new_entries ,
1169
1149
p_uniname );
1170
1150
if (ret )
1171
1151
return ret ;
1172
1152
1173
- exfat_remove_entries (inode , p_olddir , oldentry , 0 , num_old_entries );
1153
+ exfat_remove_entries (inode , & mov_es , ES_IDX_FILE );
1174
1154
1175
1155
exfat_chain_set (& ei -> dir , p_newdir -> dir , p_newdir -> size ,
1176
1156
p_newdir -> flags );
1177
1157
1178
1158
ei -> entry = newentry ;
1179
- return 0 ;
1159
+ return exfat_put_dentry_set (& mov_es , IS_DIRSYNC (inode ));
1160
+
1161
+ put_mov_es :
1162
+ exfat_put_dentry_set (& mov_es , false);
1163
+
1164
+ return ret ;
1180
1165
}
1181
1166
1182
1167
/* rename or move a old file into a new file */
@@ -1194,7 +1179,6 @@ static int __exfat_rename(struct inode *old_parent_inode,
1194
1179
struct exfat_sb_info * sbi = EXFAT_SB (sb );
1195
1180
const unsigned char * new_path = new_dentry -> d_name .name ;
1196
1181
struct inode * new_inode = new_dentry -> d_inode ;
1197
- int num_entries ;
1198
1182
struct exfat_inode_info * new_ei = NULL ;
1199
1183
unsigned int new_entry_type = TYPE_UNUSED ;
1200
1184
int new_entry = 0 ;
@@ -1265,25 +1249,21 @@ static int __exfat_rename(struct inode *old_parent_inode,
1265
1249
& newdir , & uni_name , ei );
1266
1250
1267
1251
if (!ret && new_inode ) {
1252
+ struct exfat_entry_set_cache es ;
1253
+
1268
1254
/* delete entries of new_dir */
1269
- ep = exfat_get_dentry (sb , p_dir , new_entry , & new_bh );
1270
- if (!ep ) {
1255
+ ret = exfat_get_dentry_set (& es , sb , p_dir , new_entry ,
1256
+ ES_ALL_ENTRIES );
1257
+ if (ret ) {
1271
1258
ret = - EIO ;
1272
1259
goto del_out ;
1273
1260
}
1274
1261
1275
- num_entries = exfat_count_ext_entries (sb , p_dir , new_entry , ep );
1276
- if (num_entries < 0 ) {
1277
- ret = - EIO ;
1278
- goto del_out ;
1279
- }
1280
- brelse (new_bh );
1262
+ exfat_remove_entries (new_inode , & es , ES_IDX_FILE );
1281
1263
1282
- if (exfat_remove_entries (new_inode , p_dir , new_entry , 0 ,
1283
- num_entries + 1 )) {
1284
- ret = - EIO ;
1264
+ ret = exfat_put_dentry_set (& es , IS_DIRSYNC (new_inode ));
1265
+ if (ret )
1285
1266
goto del_out ;
1286
- }
1287
1267
1288
1268
/* Free the clusters if new_inode is a dir(as if exfat_rmdir) */
1289
1269
if (new_entry_type == TYPE_DIR &&
0 commit comments