diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index 1808a895..55ecb77e 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -122,10 +122,14 @@ NTSTATUS FspFsvolCleanupComplete( PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FILE_NODE *FileNode = FileObject->FsContext; + /* if the file is being deleted do a change notification */ if (Request->Req.Cleanup.Delete) FspFileNodeNotifyChange(FileNode, FileNode->IsDirectory ? FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME, FILE_ACTION_REMOVED); + /* if the file is being resized invalidate the volume info */ + else if (FileNode->TruncateOnClose) + FspFsvolDeviceInvalidateVolumeInfo(IrpSp->DeviceObject); FSP_LEAVE_IOC("FileObject=%p", IrpSp->FileObject); } diff --git a/src/sys/device.c b/src/sys/device.c index f5c0e237..31a15f1a 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -56,6 +56,7 @@ static RTL_AVL_FREE_ROUTINE FspFsvolDeviceFreeContextByName; VOID FspFsvolDeviceGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); BOOLEAN FspFsvolDeviceTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); VOID FspFsvolDeviceSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); +VOID FspFsvolDeviceInvalidateVolumeInfo(PDEVICE_OBJECT DeviceObject); NTSTATUS FspDeviceCopyList( PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); VOID FspDeviceDeleteList( @@ -871,6 +872,18 @@ VOID FspFsvolDeviceSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VO KeReleaseSpinLock(&FsvolDeviceExtension->InfoSpinLock, Irql); } +VOID FspFsvolDeviceInvalidateVolumeInfo(PDEVICE_OBJECT DeviceObject) +{ + // !PAGED_CODE(); + + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); + KIRQL Irql; + + KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql); + FsvolDeviceExtension->InfoExpirationTime = 0; + KeReleaseSpinLock(&FsvolDeviceExtension->InfoSpinLock, Irql); +} + NTSTATUS FspDeviceCopyList( PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount) { diff --git a/src/sys/driver.h b/src/sys/driver.h index 8f034e88..85053460 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -817,6 +817,7 @@ VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STR VOID FspFsvolDeviceGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); BOOLEAN FspFsvolDeviceTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); VOID FspFsvolDeviceSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); +VOID FspFsvolDeviceInvalidateVolumeInfo(PDEVICE_OBJECT DeviceObject); NTSTATUS FspDeviceCopyList( PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); VOID FspDeviceDeleteList( diff --git a/src/sys/file.c b/src/sys/file.c index 3fac5ff7..0a220635 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -919,6 +919,8 @@ VOID FspFileNodeNotifyChange(FSP_FILE_NODE *FileNode, //case FILE_ACTION_MODIFIED: case FILE_ACTION_RENAMED_OLD_NAME: case FILE_ACTION_RENAMED_NEW_NAME: + FspFsvolDeviceInvalidateVolumeInfo(FsvolDeviceObject); + FspFsvolDeviceLockContextTable(FsvolDeviceObject); ParentNode = FspFsvolDeviceLookupContextByName(FsvolDeviceObject, &Parent); if (0 != ParentNode)