Destroy DMAPI session when main smbd daemon exits.
authorAlexander Bokovoy <ab@samba.org>
Tue, 8 Apr 2008 11:19:01 +0000 (15:19 +0400)
committerAlexander Bokovoy <ab@samba.org>
Tue, 8 Apr 2008 11:19:01 +0000 (15:19 +0400)
DMAPI session is precious resource maintained at kernel level. We open one of them and use across multiple smbd daemons
but once last of them exits, DMAPI session needs to be destroyed. There are some HSM implementations which fail to
shutdown when opened DMAPI sessions left. Ensure we shutdown our session when it is really not needed anymore.
This is what recommended by DMAPI specification anyway.
(This used to be commit a0cefd44009d414fa00ec6e08c70d21b74acdbcb)

source3/smbd/dmapi.c
source3/smbd/server.c

index fab0d5f9ef404015442c7ea268275695f0b38fdf..fd252e980ab7fcaf516838c464b95f96b49d51b2 100644 (file)
@@ -212,6 +212,30 @@ bool dmapi_new_session(void)
        return samba_dmapi_session != DM_NO_SESSION;    
 }
 
+/* 
+    only call this when exiting from master smbd process. DMAPI sessions
+    are long-lived kernel resources we ought to share across smbd processes.
+    However, we must free them when all smbd processes are finished to
+    allow other subsystems clean up properly. Not freeing DMAPI session
+    blocks certain HSM implementations from proper shutdown.
+*/
+bool dmapi_destroy_session(void)
+{
+       if (samba_dmapi_session != DM_NO_SESSION) {
+               become_root();
+               if (!dm_destroy_session(samba_dmapi_session)) {
+                       session_num--;
+                       samba_dmapi_session = DM_NO_SESSION;
+               } else {
+                       DEBUG(0,("Couldn't destroy DMAPI session: %s\n",
+                                strerror(errno)));
+               }
+               unbecome_root();
+       }
+       return samba_dmapi_session == DM_NO_SESSION;
+}
+
+
 /* 
    This is default implementation of dmapi_file_flags() that is 
    called from VFS is_offline() call to know whether file is offline.
index 179d480f4367af3e90712e540d34bfbd2cc1dd6a..7a6e17135fe0ccdbae245d99e0faef0c8d64d378 100644 (file)
@@ -918,6 +918,15 @@ static void exit_server_common(enum server_exit_reason how,
        }
 #endif
 
+#ifdef USE_DMAPI
+       /* Destroy Samba DMAPI session only if we are master smbd process */
+       if (am_parent) {
+               if (!dmapi_destroy_session()) {
+                       DEBUG(0,("Unable to close Samba DMAPI session\n"));
+               }
+       }
+#endif
+
        locking_end();
        printing_end();