Skip to content

Commit 2cce206

Browse files
committed
Fixed regressions in fatfs introduced by refactoring
1 parent e640731 commit 2cce206

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

kernel/fs/fatfs.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)