@@ -731,8 +731,9 @@ int fatfs_read(struct fnode *fno, void *buf, unsigned int len)
731731 struct fatfs * fs = fsd -> fs ;
732732
733733 int r_len = 0 , sect = 0 , off = 0 , clust = 0 ;
734+ uint32_t cur_off = task_fd_get_off (fno );
734735
735- off = task_fd_get_off ( fno ) ;
736+ off = cur_off ;
736737 sect = off / fs -> bps ;
737738 off = off & (fs -> bps - 1 );
738739 clust = sect / fs -> spc ;
@@ -741,25 +742,26 @@ int fatfs_read(struct fnode *fno, void *buf, unsigned int len)
741742 priv -> cclust = priv -> fat [clust ];
742743 priv -> sect = CLUST2SECT (fs , priv -> cclust );
743744
744- while ((r_len < len ) && (off < fno -> size )) {
745+ while ((r_len < len ) && (cur_off < fno -> size )) {
745746 int r = len - r_len ;
746747 if (r > fs -> bps )
747748 r = fs -> bps ;
748749
749750 if ((r == fs -> bps ) && off > 0 )
750751 r -= off ;
751752
752- if (off + r > fno -> size )
753- r = fno -> size - off ;
753+ if (cur_off + r > fno -> size )
754+ r = fno -> size - cur_off ;
754755
755756 /* XXX: use returned value, maybe lower level returned less.. */
756757 disk_read (fsd , ((uint8_t * )buf + r_len ), (priv -> sect + sect ), off , r );
757758
758759 r_len += r ;
759760 off += r ;
760- task_fd_set_off (fno , off );
761+ cur_off += r ;
762+ task_fd_set_off (fno , cur_off );
761763
762- if ((r_len < len ) && (off == fs -> bps ) && (off < fno -> size )) {
764+ if ((r_len < len ) && (off == fs -> bps ) && (cur_off < fno -> size )) {
763765 sect ++ ;
764766 if ((sect ) >= fs -> spc ) {
765767 clust ++ ;
@@ -782,12 +784,14 @@ int fatfs_write(struct fnode *fno, const void *buf, unsigned int len)
782784 struct fatfs_priv * priv = (struct fatfs_priv * )fno -> priv ;
783785 struct fatfs_disk * fsd = priv -> fsd ;
784786 struct fatfs * fs = fsd -> fs ;
785- uint32_t off ;
786- int w_len = 0 , sect = 0 , clust = 0 ;
787- off = task_fd_get_off (fno );
787+ uint32_t cur_off ;
788+ int w_len = 0 , sect = 0 , clust = 0 , off = 0 ;
789+ cur_off = task_fd_get_off (fno );
788790
789791 if (priv -> flags & O_APPEND ) {
790792 off = fno -> size ;
793+ } else {
794+ off = cur_off ;
791795 }
792796
793797 task_fd_set_off (fno , off );
@@ -811,13 +815,14 @@ int fatfs_write(struct fnode *fno, const void *buf, unsigned int len)
811815 disk_write (fsd , buf , (priv -> sect + sect ), off , r );
812816 w_len += r ;
813817 off += r ;
818+ cur_off += r ;
814819 task_fd_set_off (fno , off );
815820 if ((w_len < len ) && (off == fs -> bps )) {
816821 sect ++ ;
817822 if ((sect ) >= fs -> spc ) {
818823 clust ++ ;
819824 sect = 0 ;
820- if (off <= fno -> size ) {
825+ if (cur_off <= fno -> size ) {
821826 priv -> cclust = priv -> fat [clust ];
822827 } else {
823828 uint32_t tempclust = priv -> cclust ;
@@ -836,8 +841,8 @@ int fatfs_write(struct fnode *fno, const void *buf, unsigned int len)
836841 }
837842 off = 0 ;
838843 }
839- if (off > fno -> size ) {
840- fno -> size = off ;
844+ if (cur_off > fno -> size ) {
845+ fno -> size = cur_off ;
841846 disk_read (fsd , fs -> win , priv -> dirsect , 0 , fs -> bps );
842847 st_dword ((fs -> win + priv -> off + DIR_FSIZE ), (uint32_t )fno -> size );
843848 disk_write (fsd , fs -> win , priv -> dirsect , 0 , fs -> bps );
0 commit comments