diff options
Diffstat (limited to 'debian/patches/flavio0002-libdiskfs-fix-and-improve-locking-in-nrefs-nput.patch')
-rw-r--r-- | debian/patches/flavio0002-libdiskfs-fix-and-improve-locking-in-nrefs-nput.patch | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/debian/patches/flavio0002-libdiskfs-fix-and-improve-locking-in-nrefs-nput.patch b/debian/patches/flavio0002-libdiskfs-fix-and-improve-locking-in-nrefs-nput.patch new file mode 100644 index 00000000..2999c041 --- /dev/null +++ b/debian/patches/flavio0002-libdiskfs-fix-and-improve-locking-in-nrefs-nput.patch @@ -0,0 +1,68 @@ +From 0f6a5081d875051e1b6275096d25332e66f0458c Mon Sep 17 00:00:00 2001 +From: Flavio Cruz <flaviocruz@gmail.com> +Date: Sun, 14 Feb 2016 18:37:16 -0500 +Subject: [PATCH hurd 2/2] libdiskfs: fix and improve locking in nrefs/nput. + +* libnetfs/node-nput.c: Do not unlock the node since it will be unlocked +later. +* libnetfs/node-nrele.c: Do not lock the node twice if not needed. +--- + libdiskfs/node-nput.c | 1 - + libdiskfs/node-nrele.c | 8 ++++++-- + 2 files changed, 6 insertions(+), 3 deletions(-) + +diff --git a/libdiskfs/node-nput.c b/libdiskfs/node-nput.c +index d23c103..d59769b 100644 +--- a/libdiskfs/node-nput.c ++++ b/libdiskfs/node-nput.c +@@ -56,7 +56,6 @@ diskfs_nput (struct node *np) + hold a weak reference ourselves. */ + diskfs_try_dropping_softrefs (np); + } +- pthread_mutex_unlock (&np->lock); + } + + /* Finally get rid of our reference. */ +diff --git a/libdiskfs/node-nrele.c b/libdiskfs/node-nrele.c +index d962846..a96d134 100644 +--- a/libdiskfs/node-nrele.c ++++ b/libdiskfs/node-nrele.c +@@ -28,6 +28,7 @@ + void + diskfs_nrele (struct node *np) + { ++ int locked = FALSE; + struct references result; + + /* While we call the diskfs_try_dropping_softrefs, we need to hold +@@ -37,6 +38,7 @@ diskfs_nrele (struct node *np) + + if (result.hard == 0) + { ++ locked = TRUE; + pthread_mutex_lock (&np->lock); + diskfs_lost_hardrefs (np); + if (!np->dn_stat.st_nlink) +@@ -49,7 +51,6 @@ diskfs_nrele (struct node *np) + hold a weak reference ourselves. */ + diskfs_try_dropping_softrefs (np); + } +- pthread_mutex_unlock (&np->lock); + } + + /* Finally get rid of our reference. */ +@@ -57,7 +58,10 @@ diskfs_nrele (struct node *np) + + if (result.hard == 0 && result.weak == 0) + { +- pthread_mutex_lock (&np->lock); ++ if (! locked) ++ pthread_mutex_lock (&np->lock); + diskfs_drop_node (np); + } ++ else if (locked) ++ pthread_mutex_unlock (&np->lock); + } +-- +2.1.4 + |