Changed the starting cluster for the call to OffsetToCluster in VfatSetAllocationSizeInformation

from current cluster to the first cluster of a file or directory.
Do not set the new size for directories in VfatSetAllocationSizeInformation.

svn path=/trunk/; revision=3576
This commit is contained in:
Hartmut Birr 2002-09-30 20:47:28 +00:00
parent 5f0f163996
commit a2d32d6cf7

View file

@ -1,4 +1,4 @@
/* $Id: finfo.c,v 1.20 2002/09/08 10:22:12 chorns Exp $ /* $Id: finfo.c,v 1.21 2002/09/30 20:47:28 hbirr Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -351,7 +351,7 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
PLARGE_INTEGER AllocationSize) PLARGE_INTEGER AllocationSize)
{ {
ULONG OldSize; ULONG OldSize;
ULONG Cluster; ULONG Cluster, FirstCluster;
ULONG Offset; ULONG Offset;
NTSTATUS Status; NTSTATUS Status;
@ -370,29 +370,30 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
{ {
return(STATUS_SUCCESS); return(STATUS_SUCCESS);
} }
Cluster = vfatDirEntryGetFirstCluster (DeviceExt, &Fcb->entry);
FirstCluster = vfatDirEntryGetFirstCluster (DeviceExt, &Fcb->entry);
if (NewSize > Fcb->RFCB.AllocationSize.u.LowPart) if (NewSize > Fcb->RFCB.AllocationSize.u.LowPart)
{ {
if (Cluster == 0) if (FirstCluster == 0)
{ {
Status = NextCluster (DeviceExt, Fcb, Cluster, &Cluster, TRUE); Status = NextCluster (DeviceExt, Fcb, FirstCluster, &FirstCluster, TRUE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("NextCluster failed.\n"); DPRINT1("NextCluster failed.\n");
return Status; return Status;
} }
if (Cluster == 0xffffffff) if (FirstCluster == 0xffffffff)
{ {
return STATUS_DISK_FULL; return STATUS_DISK_FULL;
} }
Status = OffsetToCluster(DeviceExt, Fcb, Cluster, Status = OffsetToCluster(DeviceExt, Fcb, FirstCluster,
ROUND_DOWN(NewSize - 1, ClusterSize), ROUND_DOWN(NewSize - 1, ClusterSize),
&NCluster, TRUE); &NCluster, TRUE);
if (NCluster == 0xffffffff) if (NCluster == 0xffffffff)
{ {
/* disk is full */ /* disk is full */
NCluster = Cluster; NCluster = Cluster = FirstCluster;
while (Cluster != 0xffffffff) while (Cluster != 0xffffffff)
{ {
NextCluster (DeviceExt, Fcb, Cluster, &NCluster, FALSE); NextCluster (DeviceExt, Fcb, Cluster, &NCluster, FALSE);
@ -401,16 +402,16 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
} }
return STATUS_DISK_FULL; return STATUS_DISK_FULL;
} }
Fcb->entry.FirstCluster = (Cluster & 0x0000FFFF); Fcb->entry.FirstCluster = (FirstCluster & 0x0000FFFF);
Fcb->entry.FirstClusterHigh = (Cluster & 0xFFFF0000) >> 16; Fcb->entry.FirstClusterHigh = (FirstCluster & 0xFFFF0000) >> 16;
} }
else else
{ {
Status = OffsetToCluster(DeviceExt, Fcb, Cluster, Status = OffsetToCluster(DeviceExt, Fcb, FirstCluster,
Fcb->RFCB.AllocationSize.u.LowPart - ClusterSize, Fcb->RFCB.AllocationSize.u.LowPart - ClusterSize,
&Cluster, FALSE); &Cluster, FALSE);
/* Cluster points now to the last cluster within the chain */ /* Cluster points now to the last cluster within the chain */
Status = OffsetToCluster(DeviceExt, Fcb, Cluster, Status = OffsetToCluster(DeviceExt, Fcb, FirstCluster,
ROUND_DOWN(NewSize - 1, ClusterSize), ROUND_DOWN(NewSize - 1, ClusterSize),
&NCluster, TRUE); &NCluster, TRUE);
if (NCluster == 0xffffffff) if (NCluster == 0xffffffff)
@ -437,6 +438,7 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
Status = OffsetToCluster(DeviceExt, Fcb, Cluster, Status = OffsetToCluster(DeviceExt, Fcb, Cluster,
ROUND_DOWN(NewSize - 1, ClusterSize), ROUND_DOWN(NewSize - 1, ClusterSize),
&Cluster, FALSE); &Cluster, FALSE);
} }
NCluster = Cluster; NCluster = Cluster;
Status = NextCluster (DeviceExt, Fcb, Cluster, &NCluster, FALSE); Status = NextCluster (DeviceExt, Fcb, Cluster, &NCluster, FALSE);
@ -449,7 +451,10 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
Cluster = NCluster; Cluster = NCluster;
} }
} }
Fcb->entry.FileSize = NewSize; if (!vfatFCBIsDirectory(DeviceExt, Fcb))
{
Fcb->entry.FileSize = NewSize;
}
if (NewSize > 0) if (NewSize > 0)
{ {
Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP(NewSize - 1, ClusterSize); Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP(NewSize - 1, ClusterSize);