@@ -258,21 +258,6 @@ static int exfat_map_cluster(struct inode *inode, unsigned int clu_offset,
258
258
return 0 ;
259
259
}
260
260
261
- static int exfat_map_new_buffer (struct exfat_inode_info * ei ,
262
- struct buffer_head * bh , loff_t pos )
263
- {
264
- if (buffer_delay (bh ) && pos > ei -> i_size_aligned )
265
- return - EIO ;
266
- set_buffer_new (bh );
267
-
268
- /*
269
- * Adjust i_size_aligned if ondisk_size is bigger than it.
270
- */
271
- if (exfat_ondisk_size (& ei -> vfs_inode ) > ei -> i_size_aligned )
272
- ei -> i_size_aligned = exfat_ondisk_size (& ei -> vfs_inode );
273
- return 0 ;
274
- }
275
-
276
261
static int exfat_get_block (struct inode * inode , sector_t iblock ,
277
262
struct buffer_head * bh_result , int create )
278
263
{
@@ -286,7 +271,6 @@ static int exfat_get_block(struct inode *inode, sector_t iblock,
286
271
sector_t last_block ;
287
272
sector_t phys = 0 ;
288
273
sector_t valid_blks ;
289
- loff_t pos ;
290
274
291
275
mutex_lock (& sbi -> s_lock );
292
276
last_block = EXFAT_B_TO_BLK_ROUND_UP (i_size_read (inode ), sb );
@@ -314,8 +298,6 @@ static int exfat_get_block(struct inode *inode, sector_t iblock,
314
298
mapped_blocks = sbi -> sect_per_clus - sec_offset ;
315
299
max_blocks = min (mapped_blocks , max_blocks );
316
300
317
- pos = EXFAT_BLK_TO_B ((iblock + 1 ), sb );
318
-
319
301
map_bh (bh_result , sb , phys );
320
302
if (buffer_delay (bh_result ))
321
303
clear_buffer_delay (bh_result );
@@ -336,13 +318,7 @@ static int exfat_get_block(struct inode *inode, sector_t iblock,
336
318
}
337
319
338
320
/* The area has not been written, map and mark as new. */
339
- err = exfat_map_new_buffer (ei , bh_result , pos );
340
- if (err ) {
341
- exfat_fs_error (sb ,
342
- "requested for bmap out of range(pos : (%llu) > i_size_aligned(%llu)\n" ,
343
- pos , ei -> i_size_aligned );
344
- goto unlock_ret ;
345
- }
321
+ set_buffer_new (bh_result );
346
322
347
323
ei -> valid_size = EXFAT_BLK_TO_B (iblock + max_blocks , sb );
348
324
mark_inode_dirty (inode );
@@ -365,7 +341,7 @@ static int exfat_get_block(struct inode *inode, sector_t iblock,
365
341
* The block has been partially written,
366
342
* zero the unwritten part and map the block.
367
343
*/
368
- loff_t size , off ;
344
+ loff_t size , off , pos ;
369
345
370
346
max_blocks = 1 ;
371
347
@@ -376,7 +352,7 @@ static int exfat_get_block(struct inode *inode, sector_t iblock,
376
352
if (!bh_result -> b_folio )
377
353
goto done ;
378
354
379
- pos -= sb -> s_blocksize ;
355
+ pos = EXFAT_BLK_TO_B ( iblock , sb ) ;
380
356
size = ei -> valid_size - pos ;
381
357
off = pos & (PAGE_SIZE - 1 );
382
358
@@ -463,14 +439,6 @@ static int exfat_write_end(struct file *file, struct address_space *mapping,
463
439
int err ;
464
440
465
441
err = generic_write_end (file , mapping , pos , len , copied , folio , fsdata );
466
-
467
- if (ei -> i_size_aligned < i_size_read (inode )) {
468
- exfat_fs_error (inode -> i_sb ,
469
- "invalid size(size(%llu) > aligned(%llu)\n" ,
470
- i_size_read (inode ), ei -> i_size_aligned );
471
- return - EIO ;
472
- }
473
-
474
442
if (err < len )
475
443
exfat_write_failed (mapping , pos + len );
476
444
@@ -498,20 +466,6 @@ static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
498
466
int rw = iov_iter_rw (iter );
499
467
ssize_t ret ;
500
468
501
- if (rw == WRITE ) {
502
- /*
503
- * FIXME: blockdev_direct_IO() doesn't use ->write_begin(),
504
- * so we need to update the ->i_size_aligned to block boundary.
505
- *
506
- * But we must fill the remaining area or hole by nul for
507
- * updating ->i_size_aligned
508
- *
509
- * Return 0, and fallback to normal buffered write.
510
- */
511
- if (EXFAT_I (inode )-> i_size_aligned < size )
512
- return 0 ;
513
- }
514
-
515
469
/*
516
470
* Need to use the DIO_LOCKING for avoiding the race
517
471
* condition of exfat_get_block() and ->truncate().
@@ -525,8 +479,18 @@ static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
525
479
} else
526
480
size = pos + ret ;
527
481
528
- /* zero the unwritten part in the partially written block */
529
- if (rw == READ && pos < ei -> valid_size && ei -> valid_size < size ) {
482
+ if (rw == WRITE ) {
483
+ /*
484
+ * If the block had been partially written before this write,
485
+ * ->valid_size will not be updated in exfat_get_block(),
486
+ * update it here.
487
+ */
488
+ if (ei -> valid_size < size ) {
489
+ ei -> valid_size = size ;
490
+ mark_inode_dirty (inode );
491
+ }
492
+ } else if (pos < ei -> valid_size && ei -> valid_size < size ) {
493
+ /* zero the unwritten part in the partially written block */
530
494
iov_iter_revert (iter , size - ei -> valid_size );
531
495
iov_iter_zero (size - ei -> valid_size , iter );
532
496
}
@@ -661,14 +625,6 @@ static int exfat_fill_inode(struct inode *inode, struct exfat_dir_entry *info)
661
625
662
626
i_size_write (inode , size );
663
627
664
- /* ondisk and aligned size should be aligned with block size */
665
- if (size & (inode -> i_sb -> s_blocksize - 1 )) {
666
- size |= (inode -> i_sb -> s_blocksize - 1 );
667
- size ++ ;
668
- }
669
-
670
- ei -> i_size_aligned = size ;
671
-
672
628
exfat_save_attr (inode , info -> attr );
673
629
674
630
inode -> i_blocks = round_up (i_size_read (inode ), sbi -> cluster_size ) >> 9 ;
0 commit comments