diff options
author | Justus Winter <justus@gnupg.org> | 2016-10-05 15:38:58 +0200 |
---|---|---|
committer | Justus Winter <justus@gnupg.org> | 2017-09-12 10:41:35 +0200 |
commit | 5fef1b7f22ec0ee3730b80bbf972dbf9a8995091 (patch) | |
tree | 29890aef362b5a8ebffb4721a1967b818a22a3af | |
parent | 116552c075abf1d22057a608fee9d27684bcbbe5 (diff) | |
download | hurd-5fef1b7f22ec0ee3730b80bbf972dbf9a8995091.tar.gz hurd-5fef1b7f22ec0ee3730b80bbf972dbf9a8995091.tar.bz2 hurd-5fef1b7f22ec0ee3730b80bbf972dbf9a8995091.zip |
libfshelp: Add function to map over all active translators.
* libdiskfs/file-syncfs.c (diskfs_S_file_syncfs): Use the new function.
* libdiskfs/fsys-options.c (diskfs_S_fsys_set_options): Likewise.
* libdiskfs/fsys-syncfs.c (diskfs_S_fsys_syncfs): Likewise.
* libdiskfs/shutdown.c (diskfs_shutdown): Likewise.
* libfshelp/fshelp.h (fshelp_map_active_translators): New declaration.
* libfshelp/translator-list.c (fshelp_map_active_translators): New
function.
* libnetfs/file-syncfs.c (netfs_S_file_syncfs): Use the new function.
* libnetfs/fsys-set-options.c (netfs_S_fsys_set_options): Likewise.
* libnetfs/fsys-syncfs.c (netfs_S_fsys_syncfs): Likewise.
* libnetfs/shutdown.c (netfs_shutdown): Likewise.
-rw-r--r-- | libdiskfs/file-syncfs.c | 35 | ||||
-rw-r--r-- | libdiskfs/fsys-options.c | 44 | ||||
-rw-r--r-- | libdiskfs/fsys-syncfs.c | 33 | ||||
-rw-r--r-- | libdiskfs/shutdown.c | 45 | ||||
-rw-r--r-- | libfshelp/fshelp.h | 10 | ||||
-rw-r--r-- | libfshelp/translator-list.c | 26 | ||||
-rw-r--r-- | libnetfs/file-syncfs.c | 23 | ||||
-rw-r--r-- | libnetfs/fsys-set-options.c | 53 | ||||
-rw-r--r-- | libnetfs/fsys-syncfs.c | 22 | ||||
-rw-r--r-- | libnetfs/shutdown.c | 45 |
10 files changed, 196 insertions, 140 deletions
diff --git a/libdiskfs/file-syncfs.c b/libdiskfs/file-syncfs.c index 2faab6ad..8cd4003b 100644 --- a/libdiskfs/file-syncfs.c +++ b/libdiskfs/file-syncfs.c @@ -19,34 +19,33 @@ #include "fs_S.h" #include <hurd/fsys.h> +struct args +{ + int wait; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + (void) name; + fsys_syncfs (control, args->wait, 1); + return 0; +} + /* Implement file_syncfs as described in <hurd/fs.defs>. */ kern_return_t diskfs_S_file_syncfs (struct protid *cred, int wait, int dochildren) { - error_t - helper (struct node *np) - { - error_t err; - mach_port_t control; - - err = fshelp_fetch_control (&np->transbox, &control); - pthread_mutex_unlock (&np->lock); - if (!err && (control != MACH_PORT_NULL)) - { - fsys_syncfs (control, wait, 1); - mach_port_deallocate (mach_task_self (), control); - } - pthread_mutex_lock (&np->lock); - return 0; - } - + struct args args = { wait }; + if (!cred) return EOPNOTSUPP; if (dochildren) - diskfs_node_iterate (helper); + fshelp_map_active_translators (helper, &args); if (diskfs_synchronous) wait = 1; diff --git a/libdiskfs/fsys-options.c b/libdiskfs/fsys-options.c index f676ed07..61148823 100644 --- a/libdiskfs/fsys-options.c +++ b/libdiskfs/fsys-options.c @@ -26,6 +26,25 @@ #include "priv.h" #include "fsys_S.h" +struct args +{ + char *data; + mach_msg_type_number_t len; + int do_children; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + error_t err; + (void) name; + err = fsys_set_options (control, args->data, args->len, args->do_children); + if (err == MIG_SERVER_DIED || err == MACH_SEND_INVALID_DEST) + err = 0; + return err; +} + /* Implement fsys_set_options as described in <hurd/fsys.defs>. */ kern_return_t diskfs_S_fsys_set_options (struct diskfs_control *pt, @@ -35,28 +54,7 @@ diskfs_S_fsys_set_options (struct diskfs_control *pt, int do_children) { error_t err = 0; - - error_t - helper (struct node *np) - { - error_t error; - mach_port_t control; - - error = fshelp_fetch_control (&np->transbox, &control); - pthread_mutex_unlock (&np->lock); - if (!error && (control != MACH_PORT_NULL)) - { - error = fsys_set_options (control, data, len, do_children); - mach_port_deallocate (mach_task_self (), control); - } - else - error = 0; - pthread_mutex_lock (&np->lock); - - if ((error == MIG_SERVER_DIED) || (error == MACH_SEND_INVALID_DEST)) - error = 0; - return error; - } + struct args args = { data, len, do_children }; if (!pt) return EOPNOTSUPP; @@ -64,7 +62,7 @@ diskfs_S_fsys_set_options (struct diskfs_control *pt, if (do_children) { pthread_rwlock_wrlock (&diskfs_fsys_lock); - err = diskfs_node_iterate (helper); + err = fshelp_map_active_translators (helper, &args); pthread_rwlock_unlock (&diskfs_fsys_lock); } diff --git a/libdiskfs/fsys-syncfs.c b/libdiskfs/fsys-syncfs.c index 17b83ee0..1a40fcda 100644 --- a/libdiskfs/fsys-syncfs.c +++ b/libdiskfs/fsys-syncfs.c @@ -22,6 +22,20 @@ #include "fsys_S.h" #include <hurd/fsys.h> +struct args +{ + int wait; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + (void) name; + fsys_syncfs (control, args->wait, 1); + return 0; +} + /* Implement fsys_syncfs as described in <hurd/fsys.defs>. */ kern_return_t diskfs_S_fsys_syncfs (struct diskfs_control *pi, @@ -30,22 +44,7 @@ diskfs_S_fsys_syncfs (struct diskfs_control *pi, int wait, int children) { - error_t - helper (struct node *np) - { - error_t error; - mach_port_t control; - - error = fshelp_fetch_control (&np->transbox, &control); - pthread_mutex_unlock (&np->lock); - if (!error && (control != MACH_PORT_NULL)) - { - fsys_syncfs (control, wait, 1); - mach_port_deallocate (mach_task_self (), control); - } - pthread_mutex_lock (&np->lock); - return 0; - } + struct args args = { wait }; if (!pi) return EOPNOTSUPP; @@ -53,7 +52,7 @@ diskfs_S_fsys_syncfs (struct diskfs_control *pi, pthread_rwlock_rdlock (&diskfs_fsys_lock); if (children) - diskfs_node_iterate (helper); + fshelp_map_active_translators (helper, &args); if (diskfs_synchronous) wait = 1; diff --git a/libdiskfs/shutdown.c b/libdiskfs/shutdown.c index 2436d528..3f774c31 100644 --- a/libdiskfs/shutdown.c +++ b/libdiskfs/shutdown.c @@ -22,35 +22,30 @@ #include "priv.h" #include <hurd/fsys.h> +struct args +{ + int flags; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + error_t err; + (void) name; + err = fsys_goaway (control, args->flags); + if (err == MIG_SERVER_DIED || err == MACH_SEND_INVALID_DEST) + err = 0; + return err; +} + /* Shutdown the filesystem; flags are as for fsys_goaway. */ error_t diskfs_shutdown (int flags) { int nports = -1; - int err; - - error_t - helper (struct node *np) - { - error_t error; - mach_port_t control; - - error = fshelp_fetch_control (&np->transbox, &control); - pthread_mutex_unlock (&np->lock); - if (!error && (control != MACH_PORT_NULL)) - { - error = fsys_goaway (control, flags); - mach_port_deallocate (mach_task_self (), control); - } - else - error = 0; - pthread_mutex_lock (&np->lock); - - if ((error == MIG_SERVER_DIED) || (error == MACH_SEND_INVALID_DEST)) - error = 0; - - return error; - } + error_t err; + struct args args = { flags }; if ((flags & FSYS_GOAWAY_UNLINK) && S_ISDIR (diskfs_root_node->dn_stat.st_mode)) @@ -58,7 +53,7 @@ diskfs_shutdown (int flags) if (flags & FSYS_GOAWAY_RECURSE) { - err = diskfs_node_iterate (helper); + err = fshelp_map_active_translators (helper, &args); if (err) return err; } diff --git a/libfshelp/fshelp.h b/libfshelp/fshelp.h index ecd9335d..d1dd49c4 100644 --- a/libfshelp/fshelp.h +++ b/libfshelp/fshelp.h @@ -71,6 +71,16 @@ fshelp_get_active_translators (char **translators, fshelp_filter filter, const char *prefix); +/* Call FUN for each active translator. If FUN returns non-zero, the + iteration immediately stops, and returns that value. FUN is called + with COOKIE, the name of the translator, and the translators + control port. */ +error_t +fshelp_map_active_translators (error_t (*fun)(void *cookie, + const char *name, + mach_port_t control), + void *cookie); + /* Passive translator linkage */ /* These routines are self-contained and start passive translators, diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c index b8fe3f94..c64e1747 100644 --- a/libfshelp/translator-list.c +++ b/libfshelp/translator-list.c @@ -229,3 +229,29 @@ fshelp_get_active_translators (char **translators, pthread_mutex_unlock (&translator_ihash_lock); return err; } + +/* Call FUN for each active translator. If FUN returns non-zero, the + iteration immediately stops, and returns that value. FUN is called + with COOKIE, the name of the translator, and the translators + control port. */ +error_t +fshelp_map_active_translators (error_t (*fun)(void *cookie, + const char *name, + mach_port_t control), + void *cookie) +{ + error_t err = 0; + pthread_mutex_lock (&translator_ihash_lock); + + HURD_IHASH_ITERATE (&translator_ihash, value) + { + struct translator *t = value; + + err = fun (cookie, t->name, t->active); + if (err) + break; + } + + pthread_mutex_unlock (&translator_ihash_lock); + return err; +} diff --git a/libnetfs/file-syncfs.c b/libnetfs/file-syncfs.c index 2302e926..0b14bb87 100644 --- a/libnetfs/file-syncfs.c +++ b/libnetfs/file-syncfs.c @@ -20,6 +20,21 @@ #include "netfs.h" #include "fs_S.h" +#include <hurd/fsys.h> + +struct args +{ + int wait; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + (void) name; + fsys_syncfs (control, args->wait, 1); + return 0; +} error_t netfs_S_file_syncfs (struct protid *user, @@ -27,11 +42,13 @@ netfs_S_file_syncfs (struct protid *user, int dochildren) { error_t err; - + struct args args = { wait }; + if (!user) return EOPNOTSUPP; - - /* Translators not yet supported by netfs. XXX */ + + if (dochildren) + fshelp_map_active_translators (helper, &args); pthread_mutex_lock (&user->po->np->lock); err = netfs_attempt_syncfs (user->user, wait); diff --git a/libnetfs/fsys-set-options.c b/libnetfs/fsys-set-options.c index fb1c87ef..afa480f8 100644 --- a/libnetfs/fsys-set-options.c +++ b/libnetfs/fsys-set-options.c @@ -26,8 +26,24 @@ #include "netfs.h" #include "fsys_S.h" -/* This code is originally from libdiskfs; things surrounded by `#if NOT_YET' - are pending libnetfs being fleshed out some more. */ +struct args +{ + char *data; + mach_msg_type_number_t len; + int do_children; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + error_t err; + (void) name; + err = fsys_set_options (control, args->data, args->len, args->do_children); + if (err == MIG_SERVER_DIED || err == MACH_SEND_INVALID_DEST) + err = 0; + return err; +} /* Implement fsys_set_options as described in <hurd/fsys.defs>. */ error_t @@ -38,40 +54,21 @@ netfs_S_fsys_set_options (struct netfs_control *pt, int do_children) { error_t err = 0; + struct args args = { data, data_len, do_children }; + if (!pt) return EOPNOTSUPP; - error_t - helper (struct node *np) - { - error_t error; - mach_port_t control; - - error = fshelp_fetch_control (&np->transbox, &control); - pthread_mutex_unlock (&np->lock); - if (!error && (control != MACH_PORT_NULL)) - { - error = fsys_set_options (control, data, data_len, do_children); - mach_port_deallocate (mach_task_self (), control); - } - else - error = 0; - pthread_mutex_lock (&np->lock); - - if ((error == MIG_SERVER_DIED) || (error == MACH_SEND_INVALID_DEST)) - error = 0; - - return error; - } - -#if NOT_YET if (do_children) { +#if NOT_YET pthread_rwlock_wrlock (&netfs_fsys_lock); - err = netfs_node_iterate (helper); +#endif + err = fshelp_map_active_translators (helper, &args); +#if NOT_YET pthread_rwlock_unlock (&netfs_fsys_lock); - } #endif + } if (!err) { diff --git a/libnetfs/fsys-syncfs.c b/libnetfs/fsys-syncfs.c index e232936e..904e9246 100644 --- a/libnetfs/fsys-syncfs.c +++ b/libnetfs/fsys-syncfs.c @@ -20,6 +20,21 @@ #include "netfs.h" #include "fsys_S.h" +#include <hurd/fsys.h> + +struct args +{ + int wait; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + (void) name; + fsys_syncfs (control, args->wait, 1); + return 0; +} error_t netfs_S_fsys_syncfs (struct netfs_control *cntl, @@ -30,6 +45,13 @@ netfs_S_fsys_syncfs (struct netfs_control *cntl, { struct iouser *cred; error_t err; + struct args args = { wait }; + + if (! cntl) + return EOPNOTSUPP; + + if (children) + fshelp_map_active_translators (helper, &args); err = iohelp_create_simple_iouser (&cred, 0, 0); if (err) diff --git a/libnetfs/shutdown.c b/libnetfs/shutdown.c index 7fa05cdb..082f2bcd 100644 --- a/libnetfs/shutdown.c +++ b/libnetfs/shutdown.c @@ -26,33 +26,28 @@ #include <hurd/fshelp.h> #include <pthread.h> +struct args +{ + int flags; +}; + +static error_t +helper (void *cookie, const char *name, mach_port_t control) +{ + struct args *args = cookie; + error_t err; + (void) name; + err = fsys_goaway (control, args->flags); + if (err == MIG_SERVER_DIED || err == MACH_SEND_INVALID_DEST) + err = 0; + return err; +} + /* Shutdown the filesystem; flags are as for fsys_goaway. */ error_t netfs_shutdown (int flags) { - error_t - helper (struct node *node) - { - error_t err; - mach_port_t control; - - err = fshelp_fetch_control (&node->transbox, &control); - if (!err && (control != MACH_PORT_NULL)) - { - pthread_mutex_unlock (&node->lock); - err = fsys_goaway (control, flags); - mach_port_deallocate (mach_task_self (), control); - pthread_mutex_lock (&node->lock); - } - else - err = 0; - - if ((err == MIG_SERVER_DIED) || (err == MACH_SEND_INVALID_DEST)) - err = 0; - - return err; - } - + struct args args = { flags }; int nports; int err; @@ -60,14 +55,12 @@ netfs_shutdown (int flags) && S_ISDIR (netfs_root_node->nn_stat.st_mode)) return EBUSY; -#ifdef NOTYET if (flags & FSYS_GOAWAY_RECURSE) { - err = netfs_node_iterate (helper); + err = fshelp_map_active_translators (helper, &args); if (err) return err; } -#endif #ifdef NOTYET pthread_rwlock_wrlock (&netfs_fsys_lock); |