@@ -475,17 +475,19 @@ int fat16_read(fat16_file_t* f, uint8_t* out, uint32_t size) {
475475 return read ;
476476}
477477
478- int fat16_write (fat16_file_t * f , const uint8_t * data , uint32_t size ) {
478+ int fat16_write (fat16_file_t * f , const uint8_t * data , uint32_t size )
479+ {
479480 uint32_t written = 0 ;
480481 uint8_t sector [512 ];
481482
482483 uint32_t cluster_size =
483484 f -> fs -> bs .sectors_per_cluster * 512 ;
484485
485- /* ---------- allocate first cluster if empty ---------- */
486+ /* ---------- allocate first cluster ---------- */
486487 if (f -> entry .first_cluster == 0 ) {
487488 uint16_t c = fat16_allocate_cluster (f -> fs );
488- if (!c ) return FAT_OK ;
489+ if (!c )
490+ return written ;
489491
490492 fat16_write_fat_entry (f -> fs , c , FAT16_EOC );
491493 f -> entry .first_cluster = c ;
@@ -502,12 +504,16 @@ int fat16_write(fat16_file_t* f, const uint8_t* data, uint32_t size) {
502504 /* ---------- walk / extend FAT chain ---------- */
503505 for (uint32_t i = 0 ; i < cluster_index ; i ++ ) {
504506 uint16_t next = fat16_read_fat_fs (f -> fs , cluster );
507+
505508 if (next >= FAT16_EOC ) {
506509 next = fat16_allocate_cluster (f -> fs );
507- if (!next ) return written ;
510+ if (!next )
511+ return written ;
512+
508513 fat16_write_fat_entry (f -> fs , cluster , next );
509514 fat16_write_fat_entry (f -> fs , next , FAT16_EOC );
510515 }
516+
511517 cluster = next ;
512518 }
513519
@@ -528,8 +534,7 @@ int fat16_write(fat16_file_t* f, const uint8_t* data, uint32_t size) {
528534 written += to_copy ;
529535 }
530536
531- if (f -> pos > f -> entry .filesize )
532- f -> entry .filesize = f -> pos ;
537+ f -> entry .filesize = f -> pos ;
533538
534539 /* ---------- update directory entry ---------- */
535540 if (f -> parent_cluster == 0 )
@@ -554,14 +559,16 @@ uint16_t fat16_find_free_cluster(fat16_fs_t* fs) {
554559 uint16_t * fat = (uint16_t * )sector ;
555560 for (int i = 0 ; i < 256 ; i ++ ) {
556561 uint16_t cluster = s * 256 + i ;
557- if (cluster < 2 ) continue ;
558562
559- if (fat [i ] == 0x0000 ) {
563+ if (cluster < 2 )
564+ continue ;
565+
566+ if (fat [i ] == 0x0000 )
560567 return cluster ;
561- }
562568 }
563569 }
564- return FAT_OK ; // no space
570+
571+ return 0 ; // ✅ NO SPACE
565572}
566573
567574void fat16_write_fat_entry (fat16_fs_t * fs , uint16_t cluster , uint16_t value ) {
@@ -579,17 +586,16 @@ void fat16_write_fat_entry(fat16_fs_t* fs, uint16_t cluster, uint16_t value) {
579586
580587uint16_t fat16_allocate_cluster (fat16_fs_t * fs ) {
581588 uint16_t cluster = fat16_find_free_cluster (fs );
582- if (! cluster )
583- return FAT_OK ;
589+ if (cluster == 0 )
590+ return 0 ;
584591
585592 fat16_write_fat_entry (fs , cluster , FAT16_EOC );
586593
587594 uint8_t zero [512 ] = {0 };
588595 uint32_t lba = fat16_cluster_lba (fs , cluster );
589596
590- for (uint32_t s = 0 ; s < fs -> bs .sectors_per_cluster ; s ++ ) {
597+ for (uint32_t s = 0 ; s < fs -> bs .sectors_per_cluster ; s ++ )
591598 ahci_write_sector (fs -> portno , lba + s , zero , 1 );
592- }
593599
594600 return cluster ;
595601}
@@ -835,24 +841,27 @@ int fat16_unlink(fat16_fs_t* fs, uint16_t parent_cluster, const char* name) {
835841 return fat16_delete_entry_in_cluster (fs , parent_cluster , fatname );
836842}
837843
838- int fat16_truncate (fat16_file_t * f , uint32_t new_size ) {
839- if (new_size >= f -> entry .filesize )
840- return FAT_OK ;
841-
844+ int fat16_truncate (fat16_file_t * f , uint32_t new_size )
845+ {
842846 uint32_t cluster_size =
843847 f -> fs -> bs .sectors_per_cluster * 512 ;
844848
845- /* ----- truncate to zero ----- */
849+ /* ---------- truncate to zero ----- ----- */
846850 if (new_size == 0 ) {
847851 if (f -> entry .first_cluster >= 2 )
848852 fat16_free_chain (f -> fs , f -> entry .first_cluster );
849853
850854 f -> entry .first_cluster = 0 ;
851855 f -> entry .filesize = 0 ;
852-
853- goto update ;
856+ f -> pos = 0 ;
857+ f -> cluster = 0 ;
858+ return FAT_OK ;
854859 }
855860
861+ /* ---------- no-op grow ---------- */
862+ if (new_size >= f -> entry .filesize )
863+ return FAT_OK ;
864+
856865 uint32_t keep_clusters =
857866 (new_size + cluster_size - 1 ) / cluster_size ;
858867
@@ -871,16 +880,13 @@ int fat16_truncate(fat16_file_t* f, uint32_t new_size) {
871880 fat16_free_chain (f -> fs , cluster );
872881
873882 f -> entry .filesize = new_size ;
874-
875- update :
876- if (f -> parent_cluster == 0 )
877- fat16_update_root_entry (f -> fs , & f -> entry );
878- else
879- fat16_update_dir_entry (f -> fs , f -> parent_cluster , & f -> entry );
883+ if (f -> pos > new_size )
884+ f -> pos = new_size ;
880885
881886 return FAT_OK ;
882887}
883888
889+
884890int fat16_mkdir (fat16_fs_t * fs , uint16_t parent_cluster , const char * name ) {
885891 if (fat16_is_reserved_name (name )) {
886892 printf ("refusing to create reserved name '%s'" , name );
0 commit comments