@@ -120,7 +120,7 @@ static int adfs_fplus_read(struct super_block *sb, u32 indaddr,
120
120
}
121
121
122
122
dirsize = le32_to_cpu (h -> bigdirsize );
123
- if (dirsize != size ) {
123
+ if (size && dirsize != size ) {
124
124
adfs_msg (sb , KERN_WARNING ,
125
125
"dir %06x header size %X does not match directory size %X" ,
126
126
indaddr , dirsize , size );
@@ -226,9 +226,61 @@ static int adfs_fplus_iterate(struct adfs_dir *dir, struct dir_context *ctx)
226
226
return 0 ;
227
227
}
228
228
229
+ static int adfs_fplus_update (struct adfs_dir * dir , struct object_info * obj )
230
+ {
231
+ struct adfs_bigdirheader * h = dir -> bighead ;
232
+ struct adfs_bigdirentry bde ;
233
+ int offset , end , ret ;
234
+
235
+ offset = adfs_fplus_offset (h , 0 ) - sizeof (bde );
236
+ end = adfs_fplus_offset (h , le32_to_cpu (h -> bigdirentries ));
237
+
238
+ do {
239
+ offset += sizeof (bde );
240
+ if (offset >= end ) {
241
+ adfs_error (dir -> sb , "unable to locate entry to update" );
242
+ return - ENOENT ;
243
+ }
244
+ ret = adfs_dir_copyfrom (& bde , dir , offset , sizeof (bde ));
245
+ if (ret ) {
246
+ adfs_error (dir -> sb , "error reading directory entry" );
247
+ return - ENOENT ;
248
+ }
249
+ } while (le32_to_cpu (bde .bigdirindaddr ) != obj -> indaddr );
250
+
251
+ bde .bigdirload = cpu_to_le32 (obj -> loadaddr );
252
+ bde .bigdirexec = cpu_to_le32 (obj -> execaddr );
253
+ bde .bigdirlen = cpu_to_le32 (obj -> size );
254
+ bde .bigdirindaddr = cpu_to_le32 (obj -> indaddr );
255
+ bde .bigdirattr = cpu_to_le32 (obj -> attr );
256
+
257
+ return adfs_dir_copyto (dir , offset , & bde , sizeof (bde ));
258
+ }
259
+
260
+ static int adfs_fplus_commit (struct adfs_dir * dir )
261
+ {
262
+ int ret ;
263
+
264
+ /* Increment directory sequence number */
265
+ dir -> bighead -> startmasseq += 1 ;
266
+ dir -> bigtail -> bigdirendmasseq += 1 ;
267
+
268
+ /* Update directory check byte */
269
+ dir -> bigtail -> bigdircheckbyte = adfs_fplus_checkbyte (dir );
270
+
271
+ /* Make sure the directory still validates correctly */
272
+ ret = adfs_fplus_validate_header (dir -> bighead );
273
+ if (ret == 0 )
274
+ ret = adfs_fplus_validate_tail (dir -> bighead , dir -> bigtail );
275
+
276
+ return ret ;
277
+ }
278
+
229
279
const struct adfs_dir_ops adfs_fplus_dir_ops = {
230
280
.read = adfs_fplus_read ,
231
281
.iterate = adfs_fplus_iterate ,
232
282
.setpos = adfs_fplus_setpos ,
233
283
.getnext = adfs_fplus_getnext ,
284
+ .update = adfs_fplus_update ,
285
+ .commit = adfs_fplus_commit ,
234
286
};
0 commit comments