diff --git a/src/main/java/org/filesys/app/SMBOnlyXMLServerConfiguration.java b/src/main/java/org/filesys/app/SMBOnlyXMLServerConfiguration.java index 9044e19..5331d12 100644 --- a/src/main/java/org/filesys/app/SMBOnlyXMLServerConfiguration.java +++ b/src/main/java/org/filesys/app/SMBOnlyXMLServerConfiguration.java @@ -573,6 +573,11 @@ protected void procSMBServerElement(Element smb) if ( findChildNode( "disableNIO", smb.getChildNodes()) != null) smbConfig.setDisableNIOCode( true); + // Check if the HashedOpenFileMap should be disabled (and ArrayOpenFileMap used + // instead) + if (findChildNode("disableHashedOpenFileMap", smb.getChildNodes()) != null) + smbConfig.setDisableHashedOpenFileMap(true); + // Check if a maximum virtual circuits per session limit has been specified elem = findChildNode("virtualCircuits", smb.getChildNodes()); if ( elem != null) { diff --git a/src/main/java/org/filesys/server/config/ConfigId.java b/src/main/java/org/filesys/server/config/ConfigId.java index c82879f..c4b6110 100644 --- a/src/main/java/org/filesys/server/config/ConfigId.java +++ b/src/main/java/org/filesys/server/config/ConfigId.java @@ -85,6 +85,7 @@ public class ConfigId { public static final int SMBRequireSigning = GroupSMB + 33; public static final int SMBSocketKeepAlive = GroupSMB + 34; public static final int SMBPacketsPerThreadRun = GroupSMB + 35; + public static final int SMBDisableHashedOFM = GroupSMB + 36; // FTP server variables public static final int FTPBindAddress = GroupFTP + 1; diff --git a/src/main/java/org/filesys/server/filesys/ArrayOpenFileMap.java b/src/main/java/org/filesys/server/filesys/ArrayOpenFileMap.java index e6dd48b..2180ccd 100644 --- a/src/main/java/org/filesys/server/filesys/ArrayOpenFileMap.java +++ b/src/main/java/org/filesys/server/filesys/ArrayOpenFileMap.java @@ -49,7 +49,7 @@ public class ArrayOpenFileMapIterator implements Iterator { @Override public boolean hasNext() { - while ( m_files[ m_nextId] == null && m_nextId < m_files.length) + while (m_nextId < m_files.length && m_files[m_nextId] == null) m_nextId++; return m_nextId < m_files.length; @@ -57,7 +57,7 @@ public boolean hasNext() { @Override public Integer next() { - while ( m_files[ m_nextId] == null && m_nextId < m_files.length) + while (m_nextId < m_files.length && m_files[m_nextId] == null) m_nextId++; if ( m_nextId < m_files.length) diff --git a/src/main/java/org/filesys/server/filesys/TreeConnection.java b/src/main/java/org/filesys/server/filesys/TreeConnection.java index cbce72e..625a6a9 100644 --- a/src/main/java/org/filesys/server/filesys/TreeConnection.java +++ b/src/main/java/org/filesys/server/filesys/TreeConnection.java @@ -23,10 +23,12 @@ import org.filesys.server.SrvSession; import org.filesys.server.auth.ISMBAuthenticator; import org.filesys.server.auth.acl.AccessControl; +import org.filesys.server.config.ServerConfiguration; import org.filesys.server.core.DeviceContext; import org.filesys.server.core.DeviceInterface; import org.filesys.server.core.InvalidDeviceInterfaceException; import org.filesys.server.core.SharedDevice; +import org.filesys.smb.server.SMBConfigSection; import org.filesys.smb.server.SMBSrvSession; import java.util.Iterator; @@ -67,7 +69,7 @@ public TreeConnection(SharedDevice shrDev) { m_shareDev = shrDev; m_shareDev.incrementConnectionCount(); - m_files = new HashedOpenFileMap(); + m_files = getOpenFileMap(shrDev.getConfiguration()); } /** @@ -82,9 +84,21 @@ public TreeConnection(SharedDevice shrDev, int treeId) { m_treeId = treeId; - m_files = new HashedOpenFileMap(); + m_files = getOpenFileMap(shrDev.getConfiguration()); } + private OpenFileMap getOpenFileMap(ServerConfiguration config) { + if (config != null) { + SMBConfigSection smbConfig = (SMBConfigSection) config.getConfigSection(SMBConfigSection.SectionName); + if (smbConfig != null) + if (smbConfig.hasDisableHashedOpenFileMap()) { + return new ArrayOpenFileMap(); + } + } + + return new HashedOpenFileMap(); + } + /** * Return the tree id * diff --git a/src/main/java/org/filesys/smb/server/SMBConfigSection.java b/src/main/java/org/filesys/smb/server/SMBConfigSection.java index 766eda1..f942b81 100644 --- a/src/main/java/org/filesys/smb/server/SMBConfigSection.java +++ b/src/main/java/org/filesys/smb/server/SMBConfigSection.java @@ -138,6 +138,9 @@ public class SMBConfigSection extends ConfigSection { // Per session virtual circuit limit private int m_virtualCircuitLimit = SMBV1VirtualCircuitList.DefMaxCircuits; + // Use ArrayOpenFileMap instead of HashedOpenFileMap + private boolean m_disableHashedOpenFileMap; + //-------------------------------------------------------------------------------- // Win32 NetBIOS configuration // @@ -655,6 +658,15 @@ public final boolean isNativeCodeDisabled() { return m_disableNativeCode; } + /** + * Determine if the HashedOpenFileMap should be disabled + * + * @return boolean + */ + public final boolean hasDisableHashedOpenFileMap() { + return m_disableHashedOpenFileMap; + } + /** * Set the authenticator to be used to authenticate users and share connections. * @@ -1494,6 +1506,24 @@ public final int setMaximumPacketsPerThreadRun(int maxPkts) */ public final void setForestName(String forestName) { m_forestName = forestName; } + /** + * Set the disable HashedOpenFileMap flag + * + * @param disableHashedOFM boolean + * @return int + * @throws InvalidConfigurationException Failed to set the disable + * HashedOpenFileMap flag + */ + public final int setDisableHashedOpenFileMap(boolean disableHashedOFM) throws InvalidConfigurationException { + + // Inform listeners, validate the configuration change + int sts = fireConfigurationChange(ConfigId.SMBDisableHashedOFM, new Boolean(disableHashedOFM)); + m_disableHashedOpenFileMap = disableHashedOFM; + + // Return the change status + return sts; + } + /** * Close the configuration section */