@@ -75,8 +75,8 @@ int __exfat_write_inode(struct inode *inode, int sync)
75
75
if (ei -> start_clu == EXFAT_EOF_CLUSTER )
76
76
on_disk_size = 0 ;
77
77
78
- ep2 -> dentry .stream .valid_size = cpu_to_le64 (on_disk_size );
79
- ep2 -> dentry .stream .size = ep2 -> dentry . stream . valid_size ;
78
+ ep2 -> dentry .stream .valid_size = cpu_to_le64 (ei -> valid_size );
79
+ ep2 -> dentry .stream .size = cpu_to_le64 ( on_disk_size ) ;
80
80
if (on_disk_size ) {
81
81
ep2 -> dentry .stream .flags = ei -> flags ;
82
82
ep2 -> dentry .stream .start_clu = cpu_to_le32 (ei -> start_clu );
@@ -278,6 +278,7 @@ static int exfat_get_block(struct inode *inode, sector_t iblock,
278
278
unsigned int cluster , sec_offset ;
279
279
sector_t last_block ;
280
280
sector_t phys = 0 ;
281
+ sector_t valid_blks ;
281
282
loff_t pos ;
282
283
283
284
mutex_lock (& sbi -> s_lock );
@@ -306,29 +307,88 @@ static int exfat_get_block(struct inode *inode, sector_t iblock,
306
307
mapped_blocks = sbi -> sect_per_clus - sec_offset ;
307
308
max_blocks = min (mapped_blocks , max_blocks );
308
309
309
- /* Treat newly added block / cluster */
310
- if (iblock < last_block )
311
- create = 0 ;
312
-
313
- if (create || buffer_delay (bh_result )) {
314
- pos = EXFAT_BLK_TO_B ((iblock + 1 ), sb );
310
+ pos = EXFAT_BLK_TO_B ((iblock + 1 ), sb );
311
+ if ((create && iblock >= last_block ) || buffer_delay (bh_result )) {
315
312
if (ei -> i_size_ondisk < pos )
316
313
ei -> i_size_ondisk = pos ;
317
314
}
318
315
316
+ map_bh (bh_result , sb , phys );
317
+ if (buffer_delay (bh_result ))
318
+ clear_buffer_delay (bh_result );
319
+
319
320
if (create ) {
321
+ valid_blks = EXFAT_B_TO_BLK_ROUND_UP (ei -> valid_size , sb );
322
+
323
+ if (iblock + max_blocks < valid_blks ) {
324
+ /* The range has been written, map it */
325
+ goto done ;
326
+ } else if (iblock < valid_blks ) {
327
+ /*
328
+ * The range has been partially written,
329
+ * map the written part.
330
+ */
331
+ max_blocks = valid_blks - iblock ;
332
+ goto done ;
333
+ }
334
+
335
+ /* The area has not been written, map and mark as new. */
320
336
err = exfat_map_new_buffer (ei , bh_result , pos );
321
337
if (err ) {
322
338
exfat_fs_error (sb ,
323
339
"requested for bmap out of range(pos : (%llu) > i_size_aligned(%llu)\n" ,
324
340
pos , ei -> i_size_aligned );
325
341
goto unlock_ret ;
326
342
}
343
+ } else {
344
+ valid_blks = EXFAT_B_TO_BLK (ei -> valid_size , sb );
345
+
346
+ if (iblock + max_blocks < valid_blks ) {
347
+ /* The range has been written, map it */
348
+ goto done ;
349
+ } else if (iblock < valid_blks ) {
350
+ /*
351
+ * The area has been partially written,
352
+ * map the written part.
353
+ */
354
+ max_blocks = valid_blks - iblock ;
355
+ goto done ;
356
+ } else if (iblock == valid_blks &&
357
+ (ei -> valid_size & (sb -> s_blocksize - 1 ))) {
358
+ /*
359
+ * The block has been partially written,
360
+ * zero the unwritten part and map the block.
361
+ */
362
+ loff_t size , off ;
363
+
364
+ max_blocks = 1 ;
365
+
366
+ /*
367
+ * For direct read, the unwritten part will be zeroed in
368
+ * exfat_direct_IO()
369
+ */
370
+ if (!bh_result -> b_folio )
371
+ goto done ;
372
+
373
+ pos -= sb -> s_blocksize ;
374
+ size = ei -> valid_size - pos ;
375
+ off = pos & (PAGE_SIZE - 1 );
376
+
377
+ folio_set_bh (bh_result , bh_result -> b_folio , off );
378
+ err = bh_read (bh_result , 0 );
379
+ if (err < 0 )
380
+ goto unlock_ret ;
381
+
382
+ folio_zero_segment (bh_result -> b_folio , off + size ,
383
+ off + sb -> s_blocksize );
384
+ } else {
385
+ /*
386
+ * The range has not been written, clear the mapped flag
387
+ * to only zero the cache and do not read from disk.
388
+ */
389
+ clear_buffer_mapped (bh_result );
390
+ }
327
391
}
328
-
329
- if (buffer_delay (bh_result ))
330
- clear_buffer_delay (bh_result );
331
- map_bh (bh_result , sb , phys );
332
392
done :
333
393
bh_result -> b_size = EXFAT_BLK_TO_B (max_blocks , sb );
334
394
unlock_ret :
@@ -343,6 +403,17 @@ static int exfat_read_folio(struct file *file, struct folio *folio)
343
403
344
404
static void exfat_readahead (struct readahead_control * rac )
345
405
{
406
+ struct address_space * mapping = rac -> mapping ;
407
+ struct inode * inode = mapping -> host ;
408
+ struct exfat_inode_info * ei = EXFAT_I (inode );
409
+ loff_t pos = readahead_pos (rac );
410
+
411
+ /* Range cross valid_size, read it page by page. */
412
+ if (ei -> valid_size < i_size_read (inode ) &&
413
+ pos <= ei -> valid_size &&
414
+ ei -> valid_size < pos + readahead_length (rac ))
415
+ return ;
416
+
346
417
mpage_readahead (rac , exfat_get_block );
347
418
}
348
419
@@ -370,9 +441,7 @@ static int exfat_write_begin(struct file *file, struct address_space *mapping,
370
441
int ret ;
371
442
372
443
* pagep = NULL ;
373
- ret = cont_write_begin (file , mapping , pos , len , pagep , fsdata ,
374
- exfat_get_block ,
375
- & EXFAT_I (mapping -> host )-> i_size_ondisk );
444
+ ret = block_write_begin (mapping , pos , len , pagep , exfat_get_block );
376
445
377
446
if (ret < 0 )
378
447
exfat_write_failed (mapping , pos + len );
@@ -400,6 +469,11 @@ static int exfat_write_end(struct file *file, struct address_space *mapping,
400
469
if (err < len )
401
470
exfat_write_failed (mapping , pos + len );
402
471
472
+ if (!(err < 0 ) && pos + err > ei -> valid_size ) {
473
+ ei -> valid_size = pos + err ;
474
+ mark_inode_dirty (inode );
475
+ }
476
+
403
477
if (!(err < 0 ) && !(ei -> attr & EXFAT_ATTR_ARCHIVE )) {
404
478
inode_set_mtime_to_ts (inode , inode_set_ctime_current (inode ));
405
479
ei -> attr |= EXFAT_ATTR_ARCHIVE ;
@@ -413,6 +487,8 @@ static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
413
487
{
414
488
struct address_space * mapping = iocb -> ki_filp -> f_mapping ;
415
489
struct inode * inode = mapping -> host ;
490
+ struct exfat_inode_info * ei = EXFAT_I (inode );
491
+ loff_t pos = iocb -> ki_pos ;
416
492
loff_t size = iocb -> ki_pos + iov_iter_count (iter );
417
493
int rw = iov_iter_rw (iter );
418
494
ssize_t ret ;
@@ -436,8 +512,21 @@ static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
436
512
* condition of exfat_get_block() and ->truncate().
437
513
*/
438
514
ret = blockdev_direct_IO (iocb , inode , iter , exfat_get_block );
439
- if (ret < 0 && (rw & WRITE ))
440
- exfat_write_failed (mapping , size );
515
+ if (ret < 0 ) {
516
+ if (rw == WRITE )
517
+ exfat_write_failed (mapping , size );
518
+
519
+ if (ret != - EIOCBQUEUED )
520
+ return ret ;
521
+ } else
522
+ size = pos + ret ;
523
+
524
+ /* zero the unwritten part in the partially written block */
525
+ if (rw == READ && pos < ei -> valid_size && ei -> valid_size < size ) {
526
+ iov_iter_revert (iter , size - ei -> valid_size );
527
+ iov_iter_zero (size - ei -> valid_size , iter );
528
+ }
529
+
441
530
return ret ;
442
531
}
443
532
@@ -537,6 +626,7 @@ static int exfat_fill_inode(struct inode *inode, struct exfat_dir_entry *info)
537
626
ei -> start_clu = info -> start_clu ;
538
627
ei -> flags = info -> flags ;
539
628
ei -> type = info -> type ;
629
+ ei -> valid_size = info -> valid_size ;
540
630
541
631
ei -> version = 0 ;
542
632
ei -> hint_stat .eidx = 0 ;
0 commit comments