]> git.sur5r.net Git - bacula/bacula/commitdiff
Flush mntent cache on exit.
authorMarco van Wieringen <mvw@planets.elm.net>
Mon, 14 Nov 2011 15:51:46 +0000 (16:51 +0100)
committerKern Sibbald <kern@sibbald.com>
Sat, 20 Apr 2013 12:50:13 +0000 (14:50 +0200)
Any daemon that uses fstype should call the flush_mntent_cache
function as the fstype on Linux and OSF1 uses the mntent cache
for mountpoint lookups.

bacula/src/filed/filed.c
bacula/src/lib/mntent_cache.c
bacula/src/lib/mntent_cache.h
bacula/src/tools/fstype.c
bacula/src/tools/testfind.c

index 79dd1928aad3b5c31e0018d9ffac80753e2219d9..9526879b5275582bc15d475bdcdc4ef9fcc66108 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "bacula.h"
 #include "filed.h"
+#include "lib/mntent_cache.h"
 
 #ifdef HAVE_PYTHON
 
@@ -295,6 +296,7 @@ void terminate_filed(int sig)
    bnet_stop_thread_server(server_tid);
    generate_daemon_event(NULL, "Exit");
    unload_plugins();
+   flush_mntent_cache();
    write_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
    delete_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
 
index 75eefe2abf3836f97030f4ec23ef92dcba8a60c6..aa46efa2a79317e7b6ba85b17bbb06362c446c60 100644 (file)
@@ -365,14 +365,21 @@ static void initialize_mntent_cache(void)
 
 /**
  * Flush the current content from the cache.
- * This function should be called with a write lock on the mntent_cache.
  */
-static void flush_mntent_cache(void)
+void flush_mntent_cache(void)
 {
    /**
-    * Make sure the cache is empty (either by flushing it or by initializing it.)
+    * Lock the cache.
     */
-   clear_mount_cache();
+   P(mntent_cache_lock);
+
+   if (mntent_cache_entry_hashtable) {
+      previous_cache_hit = NULL;
+      mntent_cache_entry_hashtable->destroy();
+      mntent_cache_entry_hashtable = NULL;
+   }
+
+   V(mntent_cache_lock);
 }
 
 /**
@@ -423,16 +430,7 @@ mntent_cache_entry_t *find_mntent_mapping(uint32_t dev)
     * the lookup again.
     */
    if (!mce) {
-      /**
-       * Make sure the cache is empty (either by flushing it or by initializing it.)
-       */
-      clear_mount_cache();
-
-      /**
-       * Refresh the cache.
-       */
-      refresh_mount_cache();
-
+      initialize_mntent_cache();
       mce = (mntent_cache_entry_t *)mntent_cache_entry_hashtable->lookup(dev);
    }
 
index 8e1e79d67d2aea819d1f3a7ec8cc0180f8d7a146..82c2f64f1f3fec8f818a371a31d395f32fe85937 100644 (file)
@@ -60,5 +60,6 @@ struct mntent_cache_entry_t {
 };
 
 mntent_cache_entry_t *find_mntent_mapping(uint32_t dev);
+void flush_mntent_cache(void);
 
 #endif /* _MNTENT_CACHE_H */
index 2094bf5870b54d11d65794457df6821ec7f3eae7..8a8c31a350e82a6abbf129d21a798f46fdb32bfd 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "bacula.h"
 #include "findlib/find.h"
+#include "lib/mntent_cache.h"
 
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) 
@@ -103,5 +104,7 @@ main (int argc, char *const *argv)
       }
    }
 
+   flush_mntent_cache();
+
    exit(status);
 }
index 15e4ac67f5114593a0dbefce1be2dc963e0f189b..613a4186d1377d2235e132e5439e30b44cc288ec 100644 (file)
@@ -35,6 +35,7 @@
 #include "bacula.h"
 #include "dird/dird.h"
 #include "findlib/find.h"
+#include "lib/mntent_cache.h"
 #include "ch.h"
 
 #if defined(HAVE_WIN32)
@@ -241,6 +242,8 @@ main (int argc, char *const *argv)
      num_files, max_file_len, max_path_len,
      trunc_fname, trunc_path, hard_links);
 
+   flush_mntent_cache();
+
    term_msg();
 
    close_memory_pool();