Revert "pthreadpool: call unshare(CLONE_FS) if available"
authorRalph Boehme <slow@samba.org>
Mon, 7 Jan 2019 17:35:27 +0000 (18:35 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 11 Jan 2019 22:11:13 +0000 (23:11 +0100)
This reverts commit 65e4742d168454df6507d9e74993749063435dd6.

See the discussion in

https://lists.samba.org/archive/samba-technical/2018-December/131731.html

for the reasoning behind this revert.

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
lib/pthreadpool/pthreadpool.c
lib/pthreadpool/pthreadpool.h
lib/pthreadpool/pthreadpool_sync.c

index c2bafd5..b6dad31 100644 (file)
@@ -113,13 +113,10 @@ struct pthreadpool {
         * where the forking thread will unlock it again.
         */
        pthread_mutex_t fork_mutex;
-
-       bool per_thread_cwd;
 };
 
 static pthread_mutex_t pthreadpools_mutex = PTHREAD_MUTEX_INITIALIZER;
 static struct pthreadpool *pthreadpools = NULL;
-static bool pthreadpool_support_thread_cwd = false;
 static pthread_once_t pthreadpool_atfork_initialized = PTHREAD_ONCE_INIT;
 
 static void pthreadpool_prep_atfork(void);
@@ -186,11 +183,6 @@ int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult,
        pool->max_threads = max_threads;
        pool->num_idle = 0;
        pool->prefork_cond = NULL;
-       if (max_threads != 0) {
-               pool->per_thread_cwd = pthreadpool_support_thread_cwd;
-       } else {
-               pool->per_thread_cwd = false;
-       }
 
        ret = pthread_mutex_lock(&pthreadpools_mutex);
        if (ret != 0) {
@@ -250,15 +242,6 @@ size_t pthreadpool_queued_jobs(struct pthreadpool *pool)
        return ret;
 }
 
-bool pthreadpool_per_thread_cwd(struct pthreadpool *pool)
-{
-       if (pool->stopped) {
-               return false;
-       }
-
-       return pool->per_thread_cwd;
-}
-
 static void pthreadpool_prepare_pool(struct pthreadpool *pool)
 {
        int ret;
@@ -377,16 +360,6 @@ static void pthreadpool_child(void)
 
 static void pthreadpool_prep_atfork(void)
 {
-#ifdef HAVE_UNSHARE_CLONE_FS
-       int res;
-
-       /* remember if unshare(CLONE_FS) works. */
-       res = unshare(CLONE_FS);
-       if (res == 0) {
-               pthreadpool_support_thread_cwd = true;
-       }
-#endif
-
        pthread_atfork(pthreadpool_prepare, pthreadpool_parent,
                       pthreadpool_child);
 }
@@ -599,13 +572,6 @@ static void *pthreadpool_server(void *arg)
        struct pthreadpool *pool = (struct pthreadpool *)arg;
        int res;
 
-#ifdef HAVE_UNSHARE_CLONE_FS
-       if (pool->per_thread_cwd) {
-               res = unshare(CLONE_FS);
-               assert(res == 0);
-       }
-#endif
-
        res = pthread_mutex_lock(&pool->mutex);
        if (res != 0) {
                return NULL;
index d8daf9e..b473358 100644 (file)
@@ -71,23 +71,6 @@ size_t pthreadpool_max_threads(struct pthreadpool *pool);
  */
 size_t pthreadpool_queued_jobs(struct pthreadpool *pool);
 
-/**
- * @brief Check for per thread current working directory support of pthreadpool
- *
- * Since Linux kernel 2.6.16, unshare(CLONE_FS) is supported,
- * which provides a per thread current working directory
- * and allows [f]chdir() within the worker threads.
- *
- * Note that this doesn't work on some contraint container setups,
- * the complete unshare() syscall might be rejected.
- * pthreadpool_per_thread_cwd() returns what is available
- * at runtime, so the callers should really check this!
- *
- * @param[in]  pool            The pool to run the job on
- * @return                     supported: true, otherwise: false
- */
-bool pthreadpool_per_thread_cwd(struct pthreadpool *pool);
-
 /**
  * @brief Stop a pthreadpool
  *
index 2ed6f36..48e6a0d 100644 (file)
@@ -65,11 +65,6 @@ size_t pthreadpool_queued_jobs(struct pthreadpool *pool)
        return 0;
 }
 
-bool pthreadpool_per_thread_cwd(struct pthreadpool *pool)
-{
-       return false;
-}
-
 int pthreadpool_add_job(struct pthreadpool *pool, int job_id,
                        void (*fn)(void *private_data), void *private_data)
 {