fattab.c now remembers if the old FAT entry was free or not, so the free

space adjustment could be moved back to fattab.c.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@921 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2004-05-04 09:43:06 +00:00
parent 99c40acc80
commit 99d287bd2c
2 changed files with 49 additions and 51 deletions

View File

@ -1021,37 +1021,30 @@ STATIC CLUSTER find_fat_free(f_node_ptr fnp)
break; break;
} }
/* No empty clusters, disk is FULL! */
#ifdef WITHFAT32 #ifdef WITHFAT32
if (ISFAT32(dpbp)) if (ISFAT32(dpbp))
{ {
if (idx > dpbp->dpb_xsize)
{
dpbp->dpb_xcluster = UNKNCLUSTER;
write_fsinfo(dpbp);
return LONG_LAST_CLUSTER;
}
if (dpbp->dpb_xnfreeclst != XUNKNCLSTFREE)
dpbp->dpb_xnfreeclst--; /* TE: moved from link_fat() */
/* return the free entry */
dpbp->dpb_xcluster = idx; dpbp->dpb_xcluster = idx;
if (idx > size)
{
/* No empty clusters, disk is FULL! */
dpbp->dpb_xcluster = UNKNCLUSTER;
idx = LONG_LAST_CLUSTER;
}
/* return the free entry */
write_fsinfo(dpbp); write_fsinfo(dpbp);
return idx; return idx;
} }
#endif #endif
if ((UWORD)idx > dpbp->dpb_size)
{
dpbp->dpb_cluster = UNKNCLUSTER;
return LONG_LAST_CLUSTER;
}
if (dpbp->dpb_nfreeclst != UNKNCLSTFREE)
dpbp->dpb_nfreeclst--; /* TE: moved from link_fat() */
/* return the free entry */
dpbp->dpb_cluster = (UWORD)idx; dpbp->dpb_cluster = (UWORD)idx;
if ((UWORD)idx > (UWORD)size)
{
/* No empty clusters, disk is FULL! */
dpbp->dpb_cluster = UNKNCLUSTER;
idx = LONG_LAST_CLUSTER;
}
/* return the free entry */
return idx; return idx;
} }

View File

@ -125,6 +125,7 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
struct buffer FAR *bp; struct buffer FAR *bp;
unsigned idx; unsigned idx;
unsigned secdiv; unsigned secdiv;
unsigned char wasfree;
CLUSTER clussec = Cluster1; CLUSTER clussec = Cluster1;
CLUSTER max_cluster = dpbp->dpb_size; CLUSTER max_cluster = dpbp->dpb_size;
@ -141,7 +142,7 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
#endif #endif
put_unsigned((unsigned)(clussec & 0xffffu), 16, 4); put_unsigned((unsigned)(clussec & 0xffffu), 16, 4);
put_console('\n'); put_console('\n');
return NULL; return 1;
} }
secdiv = dpbp->dpb_secsize; secdiv = dpbp->dpb_secsize;
@ -213,8 +214,9 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
} }
cluster = *fbp0 | (*fbp1 << 8); cluster = *fbp0 | (*fbp1 << 8);
if ((unsigned)Cluster2 == READ_CLUSTER)
{ {
unsigned res = cluster;
/* Now to unpack the contents of the FAT entry. Odd and */ /* Now to unpack the contents of the FAT entry. Odd and */
/* even bytes are packed differently. */ /* even bytes are packed differently. */
@ -222,6 +224,8 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
cluster >>= 4; cluster >>= 4;
cluster &= 0x0fff; cluster &= 0x0fff;
if ((unsigned)Cluster2 == READ_CLUSTER)
{
if (cluster >= MASK12) if (cluster >= MASK12)
return LONG_LAST_CLUSTER; return LONG_LAST_CLUSTER;
if (cluster == BAD12) if (cluster == BAD12)
@ -229,6 +233,13 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
return cluster; return cluster;
} }
wasfree = 0;
if (cluster == FREE)
wasfree = 1;
cluster = res;
}
/* Cluster2 may be set to LONG_LAST_CLUSTER == 0x0FFFFFFFUL or 0xFFFF */ /* Cluster2 may be set to LONG_LAST_CLUSTER == 0x0FFFFFFFUL or 0xFFFF */
/* -- please don't remove this mask! */ /* -- please don't remove this mask! */
cluster2 = (unsigned)Cluster2 & 0x0fff; cluster2 = (unsigned)Cluster2 & 0x0fff;
@ -251,10 +262,10 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
{ {
/* form an index so that we can read the block as a */ /* form an index so that we can read the block as a */
/* byte array */ /* byte array */
if ((unsigned)Cluster2 == READ_CLUSTER)
{
/* and get the cluster number */ /* and get the cluster number */
UWORD res = fgetword(&bp->b_buffer[idx * 2]); UWORD res = fgetword(&bp->b_buffer[idx * 2]);
if ((unsigned)Cluster2 == READ_CLUSTER)
{
if (res >= MASK16) if (res >= MASK16)
return LONG_LAST_CLUSTER; return LONG_LAST_CLUSTER;
if (res == BAD16) if (res == BAD16)
@ -265,15 +276,18 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
/* Finally, put the word into the buffer and mark the */ /* Finally, put the word into the buffer and mark the */
/* buffer as dirty. */ /* buffer as dirty. */
fputword(&bp->b_buffer[idx * 2], (UWORD)Cluster2); fputword(&bp->b_buffer[idx * 2], (UWORD)Cluster2);
wasfree = 0;
if (res == FREE)
wasfree = 1;
} }
#ifdef WITHFAT32 #ifdef WITHFAT32
else if (ISFAT32(dpbp)) else if (ISFAT32(dpbp))
{ {
/* form an index so that we can read the block as a */ /* form an index so that we can read the block as a */
/* byte array */ /* byte array */
UDWORD res = fgetlong(&bp->b_buffer[idx * 4]);
if (Cluster2 == READ_CLUSTER) if (Cluster2 == READ_CLUSTER)
{ {
UDWORD res = fgetlong(&bp->b_buffer[idx * 4]);
if (res > LONG_BAD) if (res > LONG_BAD)
return LONG_LAST_CLUSTER; return LONG_LAST_CLUSTER;
@ -282,6 +296,9 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
/* Finally, put the word into the buffer and mark the */ /* Finally, put the word into the buffer and mark the */
/* buffer as dirty. */ /* buffer as dirty. */
fputlong(&bp->b_buffer[idx * 4], Cluster2); fputlong(&bp->b_buffer[idx * 4], Cluster2);
wasfree = 0;
if (res == FREE)
wasfree = 1;
} }
#endif #endif
else else
@ -289,38 +306,26 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
/* update the free space count */ /* update the free space count */
bp->b_flag |= BFR_DIRTY | BFR_VALID; bp->b_flag |= BFR_DIRTY | BFR_VALID;
if (Cluster2 == FREE) if (Cluster2 == FREE || wasfree)
{ {
int adjust = 0;
if (!wasfree)
adjust = 1;
else if (Cluster2 != FREE)
adjust = -1;
#ifdef WITHFAT32 #ifdef WITHFAT32
if (ISFAT32(dpbp) && dpbp->dpb_xnfreeclst != XUNKNCLSTFREE) if (ISFAT32(dpbp) && dpbp->dpb_xnfreeclst != XUNKNCLSTFREE)
{ {
/* update the free space count for returned */ /* update the free space count for returned */
/* cluster */ /* cluster */
++dpbp->dpb_xnfreeclst; dpbp->dpb_xnfreeclst += adjust;
write_fsinfo(dpbp); write_fsinfo(dpbp);
} }
else else
#endif #endif
if (dpbp->dpb_nfreeclst != UNKNCLSTFREE) if (dpbp->dpb_nfreeclst != UNKNCLSTFREE)
++dpbp->dpb_nfreeclst; dpbp->dpb_nfreeclst += adjust;
} }
/*if (Cluster2 == FREE)
{ */
/* update the free space count for returned */
/* cluster */
/* ++dpbp->dpb_nfreeclst;
} */
/* update the free space count for removed */
/* cluster */
/* BUG: was counted twice for 2nd,.. cluster. moved to find_fat_free() */
/* BO: don't completely understand this yet - leave here for now as
a comment */
/* else
{
--dpbp->dpb_nfreeclst;
} */
return SUCCESS; return SUCCESS;
} }