diff options
3 files changed, 317 insertions, 0 deletions
diff --git a/debian/patches/flavio0001-Use-refcount_t-for-peropen-reference-counting-in-lib.patch b/debian/patches/flavio0001-Use-refcount_t-for-peropen-reference-counting-in-lib.patch new file mode 100644 index 00000000..f1842e7e --- /dev/null +++ b/debian/patches/flavio0001-Use-refcount_t-for-peropen-reference-counting-in-lib.patch @@ -0,0 +1,167 @@ +From afea5285b0e40b68f97b47f0f0edc471b554fb34 Mon Sep 17 00:00:00 2001 +From: Flavio Cruz <flaviocruz@gmail.com> +Date: Sun, 7 Feb 2016 01:33:00 -0500 +Subject: [PATCH hurd 1/2] Use refcount_t for peropen reference counting in + libnetfs. + +* libnetfs/netfs.h: Use refcount_t. +* libnetfs/make-peropen.c: Initialize to 1 with refcount_init just like in libdiskfs. +* libnetfs/make-protid.c: Don't increment the count here. Do it like libdiskfs. +* libnetfs/io-duplicate.c: Add refcount_ref since netfs_make_protid no longer increments the refcount. +* libnetfs/io-reauthenticate.c: Likewise. +* libnetfs/io-restrict-auth.c: Likewise. +* libnetfs/release-peropen.c: Dereference without locking. +--- + libnetfs/io-duplicate.c | 1 + + libnetfs/io-reauthenticate.c | 2 ++ + libnetfs/io-restrict-auth.c | 2 ++ + libnetfs/make-peropen.c | 2 +- + libnetfs/make-protid.c | 1 - + libnetfs/netfs.h | 2 +- + libnetfs/release-peropen.c | 38 ++++++++++++++++++-------------------- + 7 files changed, 25 insertions(+), 23 deletions(-) + +diff --git a/libnetfs/io-duplicate.c b/libnetfs/io-duplicate.c +index b2c3a3a..263f9e8 100644 +--- a/libnetfs/io-duplicate.c ++++ b/libnetfs/io-duplicate.c +@@ -34,6 +34,7 @@ netfs_S_io_duplicate (struct protid *user, + if (err) + return err; + ++ refcount_ref (&user->po->refcnt); + pthread_mutex_lock (&user->po->np->lock); + newpi = netfs_make_protid (user->po, clone); + *newport = ports_get_right (newpi); +diff --git a/libnetfs/io-reauthenticate.c b/libnetfs/io-reauthenticate.c +index 8ff4182..b2d4a44 100644 +--- a/libnetfs/io-reauthenticate.c ++++ b/libnetfs/io-reauthenticate.c +@@ -34,12 +34,14 @@ netfs_S_io_reauthenticate (struct protid *user, mach_port_t rend_port) + /* This routine must carefully ignore EINTR because we + are a simpleroutine, so callers won't know to restart. */ + ++ refcount_ref (&user->po->refcnt); + pthread_mutex_lock (&user->po->np->lock); + do + newpi = netfs_make_protid (user->po, 0); + while (! newpi && errno == EINTR); + if (! newpi) + { ++ refcount_deref (&user->po->refcnt); + pthread_mutex_unlock (&user->po->np->lock); + return errno; + } +diff --git a/libnetfs/io-restrict-auth.c b/libnetfs/io-restrict-auth.c +index 0c3403d..79b7d09 100644 +--- a/libnetfs/io-restrict-auth.c ++++ b/libnetfs/io-restrict-auth.c +@@ -43,6 +43,7 @@ netfs_S_io_restrict_auth (struct protid *user, + return err; + + pthread_mutex_lock (&user->po->np->lock); ++ refcount_ref (&user->po->refcnt); + newpi = netfs_make_protid (user->po, new_user); + if (newpi) + { +@@ -52,6 +53,7 @@ netfs_S_io_restrict_auth (struct protid *user, + } + else + { ++ refcount_deref (&user->po->refcnt); + pthread_mutex_unlock (&user->po->np->lock); + iohelp_free_iouser (new_user); + err = ENOMEM; +diff --git a/libnetfs/make-peropen.c b/libnetfs/make-peropen.c +index f7be58b..413e914 100644 +--- a/libnetfs/make-peropen.c ++++ b/libnetfs/make-peropen.c +@@ -31,7 +31,7 @@ netfs_make_peropen (struct node *np, int flags, struct peropen *context) + + po->filepointer = 0; + po->lock_status = LOCK_UN; +- po->refcnt = 0; ++ refcount_init (&po->refcnt, 1); + po->openstat = flags; + po->np = np; + po->path = NULL; +diff --git a/libnetfs/make-protid.c b/libnetfs/make-protid.c +index bf18283..995ac1e 100644 +--- a/libnetfs/make-protid.c ++++ b/libnetfs/make-protid.c +@@ -36,7 +36,6 @@ netfs_make_protid (struct peropen *po, struct iouser *cred) + if (errno) + return 0; + +- po->refcnt++; + pi->po = po; + pi->user = cred; + pi->shared_object = MACH_PORT_NULL; +diff --git a/libnetfs/netfs.h b/libnetfs/netfs.h +index fbe2c60..3f94ccd 100644 +--- a/libnetfs/netfs.h ++++ b/libnetfs/netfs.h +@@ -51,7 +51,7 @@ struct peropen + { + loff_t filepointer; + int lock_status; +- int refcnt; ++ refcount_t refcnt; + int openstat; + + struct node *np; +diff --git a/libnetfs/release-peropen.c b/libnetfs/release-peropen.c +index c206b43..01af97d 100644 +--- a/libnetfs/release-peropen.c ++++ b/libnetfs/release-peropen.c +@@ -24,29 +24,27 @@ + void + netfs_release_peropen (struct peropen *po) + { ++ if (refcount_deref (&po->refcnt) > 0) ++ return; ++ + pthread_mutex_lock (&po->np->lock); +- if (--po->refcnt) +- pthread_mutex_unlock (&po->np->lock); +- else +- { +- if (po->root_parent) +- mach_port_deallocate (mach_task_self (), po->root_parent); ++ if (po->root_parent) ++ mach_port_deallocate (mach_task_self (), po->root_parent); + +- if (po->shadow_root && po->shadow_root != po->np) +- { +- pthread_mutex_lock (&po->shadow_root->lock); +- netfs_nput (po->shadow_root); +- } +- if (po->shadow_root_parent) +- mach_port_deallocate (mach_task_self (), po->shadow_root_parent); ++ if (po->shadow_root && po->shadow_root != po->np) ++ { ++ pthread_mutex_lock (&po->shadow_root->lock); ++ netfs_nput (po->shadow_root); ++ } ++ if (po->shadow_root_parent) ++ mach_port_deallocate (mach_task_self (), po->shadow_root_parent); + +- if (po->lock_status != LOCK_UN) +- fshelp_acquire_lock (&po->np->userlock, &po->lock_status, +- &po->np->lock, LOCK_UN); ++ if (po->lock_status != LOCK_UN) ++ fshelp_acquire_lock (&po->np->userlock, &po->lock_status, ++ &po->np->lock, LOCK_UN); + +- netfs_nput (po->np); ++ netfs_nput (po->np); + +- free (po->path); +- free (po); +- } ++ free (po->path); ++ free (po); + } +-- +2.1.4 + diff --git a/debian/patches/flavio0002-Remove-libfshelp-trans.h-and-libfshelp-locks.h.patch b/debian/patches/flavio0002-Remove-libfshelp-trans.h-and-libfshelp-locks.h.patch new file mode 100644 index 00000000..23dc9699 --- /dev/null +++ b/debian/patches/flavio0002-Remove-libfshelp-trans.h-and-libfshelp-locks.h.patch @@ -0,0 +1,148 @@ +From fb08495170d43a9382e508c9f65f884576c4aa7c Mon Sep 17 00:00:00 2001 +From: Flavio Cruz <flaviocruz@gmail.com> +Date: Sun, 7 Feb 2016 02:04:34 -0500 +Subject: [PATCH hurd 2/2] Remove libfshelp/trans.h and libfshelp/locks.h. + +* libfshelp/locks.h: Remove. +* libfshelp/trans.h: Remove. struct transboot is not used anywhere. +* libfshelp/fetch-root.c: Adjust includes. +* libfshelp/lock-acquire.c: Likewise. +* libfshelp/lock-init.c: Likewise. +--- + libfshelp/fetch-root.c | 9 ++++++--- + libfshelp/lock-acquire.c | 5 ++++- + libfshelp/lock-init.c | 4 +++- + libfshelp/locks.h | 28 ---------------------------- + libfshelp/trans.h | 32 -------------------------------- + 5 files changed, 13 insertions(+), 65 deletions(-) + delete mode 100644 libfshelp/locks.h + delete mode 100644 libfshelp/trans.h + +diff --git a/libfshelp/fetch-root.c b/libfshelp/fetch-root.c +index 712c11f..1b6739e 100644 +--- a/libfshelp/fetch-root.c ++++ b/libfshelp/fetch-root.c +@@ -18,11 +18,14 @@ + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +-#include "trans.h" +-#include <unistd.h> + #include <assert.h> +-#include <string.h> + #include <hurd/fsys.h> ++#include <hurd/ports.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++ ++#include "fshelp.h" + + error_t + fshelp_fetch_root (struct transbox *box, void *cookie, +diff --git a/libfshelp/lock-acquire.c b/libfshelp/lock-acquire.c +index f68c30a..07df428 100644 +--- a/libfshelp/lock-acquire.c ++++ b/libfshelp/lock-acquire.c +@@ -19,7 +19,10 @@ + + /* Written by Michael I. Bushnell. */ + +-#include "locks.h" ++#include <assert.h> ++#include <sys/file.h> ++ ++#include "fshelp.h" + + #define EWOULDBLOCK EAGAIN /* XXX */ + +diff --git a/libfshelp/lock-init.c b/libfshelp/lock-init.c +index 21fb0d7..bb1f1f8 100644 +--- a/libfshelp/lock-init.c ++++ b/libfshelp/lock-init.c +@@ -19,7 +19,9 @@ + + /* Written by Michael I. Bushnell. */ + +-#include "locks.h" ++#include <sys/file.h> ++ ++#include "fshelp.h" + + /* Initialize a lock box. */ + void +diff --git a/libfshelp/locks.h b/libfshelp/locks.h +deleted file mode 100644 +index a950f61..0000000 +--- a/libfshelp/locks.h ++++ /dev/null +@@ -1,28 +0,0 @@ +-/* +- Copyright (C) 1994 Free Software Foundation +- +-This file is part of the GNU Hurd. +- +-The GNU Hurd is free software; you can redistribute it and/or modify +-it under the terms of the GNU General Public License as published by +-the Free Software Foundation; either version 2, or (at your option) +-any later version. +- +-The GNU Hurd is distributed in the hope that it will be useful, +-but WITHOUT ANY WARRANTY; without even the implied warranty of +-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-GNU General Public License for more details. +- +-You should have received a copy of the GNU General Public License +-along with the GNU Hurd; see the file COPYING. If not, write to +-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +- +-/* Written by Michael I. Bushnell. */ +- +-#include <mach.h> +-#include <hurd.h> +-#include <pthread.h> +-#include <hurd/ports.h> +-#include "fshelp.h" +-#include <sys/file.h> +-#include <assert.h> +diff --git a/libfshelp/trans.h b/libfshelp/trans.h +deleted file mode 100644 +index a9ea648..0000000 +--- a/libfshelp/trans.h ++++ /dev/null +@@ -1,32 +0,0 @@ +-/* +- Copyright (C) 1994 Free Software Foundation +- +- This program is free software; you can redistribute it and/or +- modify it under the terms of the GNU General Public License as +- published by the Free Software Foundation; either version 2, or (at +- your option) any later version. +- +- This program is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +- +-#include <mach.h> +-#include <hurd.h> +-#include <pthread.h> +-#include <hurd/ports.h> +-#include "fshelp.h" +- +-struct transboot +-{ +- struct port_info pi; +- file_t node; +- struct trans_link *link; +-}; +- +-pthread_spinlock_t _fshelp_translistlock; +-struct trans_link *_fshelp_translist; +-- +2.1.4 + diff --git a/debian/patches/series b/debian/patches/series index ddbfc2a4..420351ef 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -39,3 +39,5 @@ translators-list0004-add-iteration.patch nodeihash0001-xxx-fix-node-iteration.patch fix-devnode0001-devnode-fix-falling-back-to-the-kernel-driver.patch gpg0001-trans-add-transparent-GnuPG-translator.patch +flavio0001-Use-refcount_t-for-peropen-reference-counting-in-lib.patch +flavio0002-Remove-libfshelp-trans.h-and-libfshelp-locks.h.patch |