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:
parent
99c40acc80
commit
99d287bd2c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user