From 7d59ef13479f8e6f343d88e9c95ae77d48232f51 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sat, 2 Nov 2024 22:29:05 +0100 Subject: [PATCH 1/4] Add mechanism for tracking dirty state of the last modified date --- .../org/filesys/server/filesys/NetworkFile.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/org/filesys/server/filesys/NetworkFile.java b/src/main/java/org/filesys/server/filesys/NetworkFile.java index 87a940f..c2fe579 100644 --- a/src/main/java/org/filesys/server/filesys/NetworkFile.java +++ b/src/main/java/org/filesys/server/filesys/NetworkFile.java @@ -118,6 +118,9 @@ public enum Flags { protected long m_modifyDate; protected long m_accessDate; + // Track whether file date needs updating on file close + protected boolean m_modifyDateDirty; + // Granted file access type protected Access m_grantedAccess; @@ -566,6 +569,17 @@ public final long getModifyDate() { return m_modifyDate; } + /** + * Return whether the file modify date/time is dirty due to file writes. Calling + * {@link incrementWriteCount} marks the modify date/time as dirty, setting the + * date/time via {@link setModifyDate} resets it back to clean. + * + * @return boolean + */ + public final boolean isModifyDateDirty() { + return m_modifyDateDirty; + } + /** * Get the write count for the file * @@ -580,6 +594,7 @@ public final int getWriteCount() { */ public final void incrementWriteCount() { m_writeCount++; + m_modifyDateDirty = true; } /** @@ -799,6 +814,7 @@ public final void setDelayedClose(boolean delayClose) { */ public final void setModifyDate(long dattim) { m_modifyDate = dattim; + m_modifyDateDirty = false; } /** From 7424355f67fbf5a02a262f09a71cc0cce409387f Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sat, 2 Nov 2024 23:08:13 +0100 Subject: [PATCH 2/4] Include netFile in fileInfo object when calling setFileInformation The NTProtocolHandler already does this when a NetworkFile object is available, so for consistency do this in the CoreProtocolHandler, too. --- src/main/java/org/filesys/smb/server/CoreProtocolHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java b/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java index bb5d5dc..3448019 100644 --- a/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java +++ b/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java @@ -2608,6 +2608,9 @@ protected void procSetFileInformation(SMBSrvPacket smbPkt, SMBV1Parser parser) // Access the disk interface that is associated with the shared device DiskInterface disk = (DiskInterface) conn.getSharedDevice().getInterface(); + // Store the associated network file in the file information object + finfo.setNetworkFile(netFile); + // Get the file information for the specified file/directory finfo.setFileInformationFlags(setFlags); disk.setFileInformation(m_sess, conn, netFile.getFullName(), finfo); From 2cbba86fc6f63a4ab55c204e2fa0665b3684bbc5 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sat, 2 Nov 2024 23:22:00 +0100 Subject: [PATCH 3/4] Propagate last modified date changes into the network file, too Incrementing the write count on a network file marks the last modified date as dirty. In order to reset the flag back to clean, we need to attempt applying any date changes happening via setFileInformation() to the corresponding network file, too. --- .../java/org/filesys/server/filesys/db/DBDiskDriver.java | 8 ++++++-- .../org/filesys/smb/server/disk/JavaNIODiskDriver.java | 4 ++++ .../smb/server/disk/original/JavaFileDiskDriver.java | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java b/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java index 1f80c07..4506727 100755 --- a/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java +++ b/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java @@ -1488,8 +1488,12 @@ public void setFileInformation(SrvSession sess, TreeConnection tree, String name if (info.hasSetFlag(FileInfo.SetCreationDate)) dbInfo.setAccessDateTime(info.getCreationDateTime()); - if (info.hasSetFlag(FileInfo.SetModifyDate)) - dbInfo.setAccessDateTime(info.getModifyDateTime()); + if (info.hasSetFlag(FileInfo.SetModifyDate)) { + long modifyDate = info.getModifyDateTime(); + dbInfo.setAccessDateTime(modifyDate); + if (info.hasNetworkFile()) + info.getNetworkFile().setModifyDate(modifyDate); + } if (info.hasSetFlag(FileInfo.SetChangeDate)) dbInfo.setAccessDateTime(info.getChangeDateTime()); diff --git a/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java b/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java index b25cb62..2803843 100644 --- a/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java +++ b/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java @@ -855,6 +855,10 @@ public void setFileInformation(SrvSession sess, TreeConnection tree, String name // Update the file/folder modify date/time Files.setLastModifiedTime( filePath, FileTime.fromMillis( info.getModifyDateTime())); + + // Update the associated network file, too, if possible + if (info.hasNetworkFile()) + info.getNetworkFile().setModifyDate(info.getModifyDateTime()); } } diff --git a/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java b/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java index 5b9f5c4..143af80 100644 --- a/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java +++ b/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java @@ -810,6 +810,10 @@ public void setFileInformation(SrvSession sess, TreeConnection tree, String n // Update the file/folder modify date/time File file = new File(fname); file.setLastModified(info.getModifyDateTime()); + + // Update the associated network file, too, if possible + if (info.hasNetworkFile()) + info.getNetworkFile().setModifyDate(info.getModifyDateTime()); } } From eeb041e655e5f2ec9b4f40aa531b0b04ab8491bb Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sat, 2 Nov 2024 23:29:50 +0100 Subject: [PATCH 4/4] Only update the last modified date on file close when it's actually dirty Also just to be on the safe side, update the network file, too, in order to reset the tracking flack back to clean. --- .../filesys/server/filesys/db/LocalDataNetworkFile.java | 7 +++++-- .../filesys/server/filesys/pseudo/PseudoNetworkFile.java | 7 +++++-- .../org/filesys/smb/server/disk/JavaNIONetworkFile.java | 7 +++++-- .../filesys/smb/server/disk/original/JavaNetworkFile.java | 7 +++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java b/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java index 09a0653..697f2a9 100755 --- a/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java +++ b/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java @@ -244,8 +244,11 @@ public void closeFile() { m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - m_file.setLastModified(System.currentTimeMillis()); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + m_file.setLastModified(curTime); + this.setModifyDate(curTime); + } // Set the new file size setFileSize(m_file.length()); diff --git a/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java b/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java index be36396..45196c8 100644 --- a/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java +++ b/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java @@ -97,8 +97,11 @@ public void closeFile() m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - m_file.setLastModified(System.currentTimeMillis()); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + m_file.setLastModified(curTime); + this.setModifyDate(curTime); + } // Indicate that the file is closed setClosed(true); diff --git a/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java b/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java index d5e2a9b..298dd0d 100644 --- a/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java +++ b/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java @@ -130,8 +130,11 @@ public void closeFile() throws IOException { m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - Files.setLastModifiedTime(m_path, FileTime.fromMillis( System.currentTimeMillis())); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + Files.setLastModifiedTime(m_path, FileTime.fromMillis(curTime)); + this.setModifyDate(curTime); + } // Indicate that the file is closed setClosed(true); diff --git a/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java b/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java index 0b658a9..473e2c1 100644 --- a/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java +++ b/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java @@ -198,8 +198,11 @@ public void closeFile() throws IOException { m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - m_file.setLastModified(System.currentTimeMillis()); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + m_file.setLastModified(curTime); + this.setModifyDate(curTime); + } // Indicate that the file is closed setClosed(true);