diff options
Diffstat (limited to 'debian/patches/fs_unification0005-libnetfs-treat-disconnected-shadow-roots-as-virtual-.patch')
-rw-r--r-- | debian/patches/fs_unification0005-libnetfs-treat-disconnected-shadow-roots-as-virtual-.patch | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/debian/patches/fs_unification0005-libnetfs-treat-disconnected-shadow-roots-as-virtual-.patch b/debian/patches/fs_unification0005-libnetfs-treat-disconnected-shadow-roots-as-virtual-.patch new file mode 100644 index 00000000..2f7dd826 --- /dev/null +++ b/debian/patches/fs_unification0005-libnetfs-treat-disconnected-shadow-roots-as-virtual-.patch @@ -0,0 +1,61 @@ +From 0a4c575e6ad9587e5a007309576c89737a96de39 Mon Sep 17 00:00:00 2001 +From: Justus Winter <justus@gnupg.org> +Date: Thu, 21 Apr 2016 17:51:40 +0200 +Subject: [PATCH hurd 5/5] libnetfs: treat disconnected shadow roots as virtual + roots + +* libnetfs/dir-lookup.c (netfs_S_dir_lookup): Treat a shadow_root with +null shadow_root_parent as a "virtual root". + +Analog to 6875a586. +--- + libnetfs/dir-lookup.c | 33 +++++++++++++++++++++++---------- + 1 file changed, 23 insertions(+), 10 deletions(-) + +diff --git a/libnetfs/dir-lookup.c b/libnetfs/dir-lookup.c +index 3bcc745..731e53c 100644 +--- a/libnetfs/dir-lookup.c ++++ b/libnetfs/dir-lookup.c +@@ -125,16 +125,29 @@ netfs_S_dir_lookup (struct protid *dircred, + if (dnp == dircred->po->shadow_root) + /* We're at the root of a shadow tree. */ + { +- *do_retry = FS_RETRY_REAUTH; +- *retry_port = dircred->po->shadow_root_parent; +- *retry_port_type = MACH_MSG_TYPE_COPY_SEND; +- if (lastcomp && mustbedir) /* Trailing slash. */ +- strcpy (retry_name, "/"); +- else if (!lastcomp) +- strcpy (retry_name, nextname); +- err = 0; +- pthread_mutex_unlock (&dnp->lock); +- goto out; ++ if (dircred->po->shadow_root_parent == MACH_PORT_NULL) ++ { ++ /* This is a shadow root with no parent, meaning ++ we should treat it as a virtual root disconnected ++ from its real .. directory. */ ++ err = 0; ++ np = dnp; ++ netfs_nref (np); ++ } ++ else ++ { ++ /* Punt the client up to the shadow root parent. */ ++ *do_retry = FS_RETRY_REAUTH; ++ *retry_port = dircred->po->shadow_root_parent; ++ *retry_port_type = MACH_MSG_TYPE_COPY_SEND; ++ if (lastcomp && mustbedir) /* Trailing slash. */ ++ strcpy (retry_name, "/"); ++ else if (!lastcomp) ++ strcpy (retry_name, nextname); ++ err = 0; ++ pthread_mutex_unlock (&dnp->lock); ++ goto out; ++ } + } + else if (dircred->po->root_parent != MACH_PORT_NULL) + /* We're at a real translator root; even if DIRCRED->po has a +-- +2.1.4 + |