[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[hurd] 11/14: Unify the short-circuit translator logic
From: |
Samuel Thibault |
Subject: |
[hurd] 11/14: Unify the short-circuit translator logic |
Date: |
Sun, 22 May 2016 01:15:22 +0000 |
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch upstream
in repository hurd.
commit 13efe6721a370c38b65e0da3d33f310f42cfa05f
Author: Justus Winter <address@hidden>
Date: Mon Apr 18 21:53:28 2016 +0200
Unify the short-circuit translator logic
* libdiskfs/dir-lookup.c (short_circuited_callback1): Move function to
libfshelp.
(diskfs_S_dir_lookup): Use the function from libfshelp instead.
* libdiskfs/fsys-getroot.c (diskfs_S_fsys_getroot): Adapt accordingly.
* libdiskfs/trans-callback.c (_diskfs_translator_callback2_fn): Likewise.
* libfshelp/fetch-root.c (fshelp_short_circuited_callback1): New function.
* libfshelp/fshelp.h (struct fshelp_stat_cookie): New definition.
(fshelp_short_circuited_callback1): New prototype.
* libnetfs/dir-lookup.c (short_circuited_callback1): Drop function.
(netfs_S_dir_lookup): Use the function from libfshelp instead.
* libnetfs/fsys-getroot.c (netfs_S_fsys_getroot): Adapt accordingly.
* libnetfs/trans-callback.c (_netfs_translator_callback2_fn): Likewise.
---
libdiskfs/dir-lookup.c | 61 ++++++++++++----------------------------------
libdiskfs/fsys-getroot.c | 13 +++++++---
libdiskfs/trans-callback.c | 4 ++-
libfshelp/fetch-root.c | 40 ++++++++++++++++++++++++++++++
libfshelp/fshelp.h | 16 ++++++++++++
libnetfs/dir-lookup.c | 53 +++++++---------------------------------
libnetfs/fsys-getroot.c | 7 +++++-
libnetfs/trans-callback.c | 4 ++-
8 files changed, 102 insertions(+), 96 deletions(-)
diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c
index 72ada0f..8b43e27 100644
--- a/libdiskfs/dir-lookup.c
+++ b/libdiskfs/dir-lookup.c
@@ -20,6 +20,7 @@
#include <fcntl.h>
#include <string.h>
#include <sys/file.h>
+#include <hurd/fshelp.h>
#include <hurd/fsys.h>
#include <hurd/paths.h>
@@ -225,43 +226,6 @@ diskfs_S_dir_lookup (struct protid *dircred,
mach_port_t dirport;
struct iouser *user;
- /* A callback function for short-circuited translators.
- S_ISLNK and S_IFSOCK are handled elsewhere. */
- error_t short_circuited_callback1 (void *cookie1, void *cookie2,
- uid_t *uid, gid_t *gid,
- char **argz, size_t *argz_len)
- {
- struct node *node = cookie1;
-
- switch (node->dn_stat.st_mode & S_IFMT)
- {
- case S_IFCHR:
- case S_IFBLK:
- if (asprintf (argz, "%s%c%d%c%d",
- (S_ISCHR (node->dn_stat.st_mode)
- ? _HURD_CHRDEV : _HURD_BLKDEV),
- 0, major (node->dn_stat.st_rdev),
- 0, minor (node->dn_stat.st_rdev)) < 0)
- return ENOMEM;
- *argz_len = strlen (*argz) + 1;
- *argz_len += strlen (*argz + *argz_len) + 1;
- *argz_len += strlen (*argz + *argz_len) + 1;
- break;
- case S_IFIFO:
- if (asprintf (argz, "%s", _HURD_FIFO) < 0)
- return ENOMEM;
- *argz_len = strlen (*argz) + 1;
- break;
- default:
- return ENOENT;
- }
-
- *uid = node->dn_stat.st_uid;
- *gid = node->dn_stat.st_gid;
-
- return 0;
- }
-
/* Create an unauthenticated port for DNP, and then
unlock it. */
err = iohelp_create_empty_iouser (&user);
@@ -292,14 +256,21 @@ diskfs_S_dir_lookup (struct protid *dircred,
boolean_t register_translator =
np->transbox.active == MACH_PORT_NULL;
- err = fshelp_fetch_root (&np->transbox, dircred->po,
- dirport, dircred->user,
- lastcomp ? flags : 0,
- ((np->dn_stat.st_mode & S_IPTRANS)
- ? _diskfs_translator_callback1
- : short_circuited_callback1),
- _diskfs_translator_callback2,
- do_retry, retry_name, retry_port);
+ struct fshelp_stat_cookie2 cookie = {
+ .statp = &np->dn_stat,
+ .modep = &np->dn_stat.st_mode,
+ .next = dircred->po,
+ };
+ err = fshelp_fetch_root (&np->transbox,
+ &cookie,
+ dirport,
+ dircred->user,
+ lastcomp ? flags : 0,
+ ((np->dn_stat.st_mode & S_IPTRANS)
+ ? _diskfs_translator_callback1
+ : fshelp_short_circuited_callback1),
+ _diskfs_translator_callback2,
+ do_retry, retry_name, retry_port);
/* fetch_root copies DIRPORT for success, so we always should
deallocate our send right. */
diff --git a/libdiskfs/fsys-getroot.c b/libdiskfs/fsys-getroot.c
index 401f103..6f93888 100644
--- a/libdiskfs/fsys-getroot.c
+++ b/libdiskfs/fsys-getroot.c
@@ -21,6 +21,7 @@
#include "priv.h"
#include "fsys_S.h"
+#include <hurd/fshelp.h>
#include <hurd/fsys.h>
#include <fcntl.h>
@@ -78,11 +79,15 @@ diskfs_S_fsys_getroot (struct diskfs_control *pt,
|| fshelp_translated (&diskfs_root_node->transbox))
&& !(flags & O_NOTRANS))
{
+ struct fshelp_stat_cookie2 cookie = {
+ .next = &peropen_context,
+ };
+
err = fshelp_fetch_root (&diskfs_root_node->transbox,
- &peropen_context, dotdot, &user, flags,
- _diskfs_translator_callback1,
- _diskfs_translator_callback2,
- retry, retryname, returned_port);
+ &cookie, dotdot, &user, flags,
+ _diskfs_translator_callback1,
+ _diskfs_translator_callback2,
+ retry, retryname, returned_port);
if (err != ENOENT)
{
pthread_mutex_unlock (&diskfs_root_node->lock);
diff --git a/libdiskfs/trans-callback.c b/libdiskfs/trans-callback.c
index 283b184..15e8f9a 100644
--- a/libdiskfs/trans-callback.c
+++ b/libdiskfs/trans-callback.c
@@ -20,6 +20,7 @@
#include "priv.h"
#include <fcntl.h>
+#include <hurd/fshelp.h>
/* Callback function needed for calls to fshelp_fetch_root. See
<hurd/fshelp.h> for the interface description. */
@@ -56,6 +57,7 @@ _diskfs_translator_callback2_fn (void *cookie1, void *cookie2,
mach_msg_type_name_t *underlying_type)
{
struct node *np = cookie1;
+ struct fshelp_stat_cookie2 *statc = cookie2;
struct protid *cred;
struct peropen *po;
error_t err;
@@ -66,7 +68,7 @@ _diskfs_translator_callback2_fn (void *cookie1, void *cookie2,
if (err)
return err;
- err = diskfs_make_peropen (np, flags, cookie2, &po);
+ err = diskfs_make_peropen (np, flags, statc->next, &po);
if (! err)
{
err = diskfs_create_protid (po, user, &cred);
diff --git a/libfshelp/fetch-root.c b/libfshelp/fetch-root.c
index eb0f315..75aa2d3 100644
--- a/libfshelp/fetch-root.c
+++ b/libfshelp/fetch-root.c
@@ -20,7 +20,9 @@
#include <assert.h>
#include <hurd/fsys.h>
+#include <hurd/paths.h>
#include <hurd/ports.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -197,3 +199,41 @@ fshelp_fetch_root (struct transbox *box, void *cookie,
return err;
}
+
+/* A callback function for short-circuited translators. S_ISLNK and
+ S_IFSOCK must be handled elsewhere. */
+error_t
+fshelp_short_circuited_callback1 (void *cookie1, void *cookie2,
+ uid_t *uid, gid_t *gid,
+ char **argz, size_t *argz_len)
+{
+ struct fshelp_stat_cookie2 *statc = cookie2;
+
+ switch (*statc->modep & S_IFMT)
+ {
+ case S_IFCHR:
+ case S_IFBLK:
+ if (asprintf (argz, "%s%c%d%c%d",
+ (S_ISCHR (*statc->modep)
+ ? _HURD_CHRDEV : _HURD_BLKDEV),
+ 0, major (statc->statp->st_rdev),
+ 0, minor (statc->statp->st_rdev)) < 0)
+ return ENOMEM;
+ *argz_len = strlen (*argz) + 1;
+ *argz_len += strlen (*argz + *argz_len) + 1;
+ *argz_len += strlen (*argz + *argz_len) + 1;
+ break;
+ case S_IFIFO:
+ if (asprintf (argz, "%s", _HURD_FIFO) < 0)
+ return ENOMEM;
+ *argz_len = strlen (*argz) + 1;
+ break;
+ default:
+ return ENOENT;
+ }
+
+ *uid = statc->statp->st_uid;
+ *gid = statc->statp->st_gid;
+
+ return 0;
+}
diff --git a/libfshelp/fshelp.h b/libfshelp/fshelp.h
index d04c056..ecd9335 100644
--- a/libfshelp/fshelp.h
+++ b/libfshelp/fshelp.h
@@ -148,6 +148,22 @@ typedef error_t (*fshelp_fetch_root_callback1_t) (void
*cookie1, void *cookie2,
uid_t *uid, gid_t *gid,
char **argz, size_t
*argz_len);
+/* A cookie for fshelp_short_circuited_callback1. Such a structure
+ must be passed to the call to fshelp_fetch_root. */
+struct fshelp_stat_cookie2
+{
+ io_statbuf_t *statp;
+ mode_t *modep;
+ void *next;
+};
+
+/* A callback function for short-circuited translators. S_ISLNK and
+ S_IFSOCK must be handled elsewhere. */
+error_t fshelp_short_circuited_callback1 (void *cookie1, void *cookie2,
+ uid_t *uid, gid_t *gid,
+ char **argz, size_t *argz_len);
+
+
/* This routine is called by fshelp_fetch_root to fetch more information.
Return an unauthenticated node for the file itself in *UNDERLYING and
*UNDERLYING_TYPE (opened with FLAGS). COOKIE1 is the cookie passed in
diff --git a/libnetfs/dir-lookup.c b/libnetfs/dir-lookup.c
index caeb151..3bcc745 100644
--- a/libnetfs/dir-lookup.c
+++ b/libnetfs/dir-lookup.c
@@ -207,48 +207,6 @@ netfs_S_dir_lookup (struct protid *dircred,
{
mach_port_t dirport;
- /* A callback function for short-circuited translators.
- S_ISLNK and S_IFSOCK are handled elsewhere. */
- error_t short_circuited_callback1 (void *cookie1, void *cookie2,
- uid_t *uid, gid_t *gid,
- char **argz, size_t *argz_len)
- {
- struct node *np = cookie1;
- error_t err;
-
- err = netfs_validate_stat (np, dircred->user);
- if (err)
- return err;
-
- switch (np->nn_translated & S_IFMT)
- {
- case S_IFCHR:
- case S_IFBLK:
- if (asprintf (argz, "%s%c%d%c%d",
- (S_ISCHR (np->nn_translated)
- ? _HURD_CHRDEV : _HURD_BLKDEV),
- 0, major (np->nn_stat.st_rdev),
- 0, minor (np->nn_stat.st_rdev)) < 0)
- return ENOMEM;
- *argz_len = strlen (*argz) + 1;
- *argz_len += strlen (*argz + *argz_len) + 1;
- *argz_len += strlen (*argz + *argz_len) + 1;
- break;
- case S_IFIFO:
- if (asprintf (argz, "%s", _HURD_FIFO) < 0)
- return ENOMEM;
- *argz_len = strlen (*argz) + 1;
- break;
- default:
- return ENOENT;
- }
-
- *uid = np->nn_stat.st_uid;
- *gid = np->nn_stat.st_gid;
-
- return 0;
- }
-
/* Create an unauthenticated port for DNP, and then
unlock it. */
err = iohelp_create_empty_iouser (&user);
@@ -267,6 +225,12 @@ netfs_S_dir_lookup (struct protid *dircred,
boolean_t register_translator = 0;
if (! err)
{
+ struct fshelp_stat_cookie2 cookie = {
+ .statp = &np->nn_stat,
+ .modep = &np->nn_translated,
+ .next = dircred->po,
+ };
+
dirport = ports_get_send_right (newpi);
/* Check if an active translator is currently running. If
@@ -275,13 +239,14 @@ netfs_S_dir_lookup (struct protid *dircred,
translators. */
register_translator = np->transbox.active == MACH_PORT_NULL;
- err = fshelp_fetch_root (&np->transbox, dircred->po,
+ err = fshelp_fetch_root (&np->transbox,
+ &cookie,
dirport,
dircred->user,
lastcomp ? flags : 0,
((np->nn_translated & S_IPTRANS)
? _netfs_translator_callback1
- : short_circuited_callback1),
+ : fshelp_short_circuited_callback1),
_netfs_translator_callback2,
do_retry, retry_name, retry_port);
/* fetch_root copies DIRPORT for success, so we always should
diff --git a/libnetfs/fsys-getroot.c b/libnetfs/fsys-getroot.c
index 2d02120..d919110 100644
--- a/libnetfs/fsys-getroot.c
+++ b/libnetfs/fsys-getroot.c
@@ -23,6 +23,7 @@
#include "misc.h"
#include "callbacks.h"
#include <fcntl.h>
+#include <hurd/fshelp.h>
error_t
netfs_S_fsys_getroot (struct netfs_control *pt,
@@ -67,8 +68,12 @@ netfs_S_fsys_getroot (struct netfs_control *pt,
|| fshelp_translated (&netfs_root_node->transbox))
&& !(flags & O_NOTRANS))
{
+ struct fshelp_stat_cookie2 cookie = {
+ .next = &peropen_context,
+ };
+
err = fshelp_fetch_root (&netfs_root_node->transbox,
- &peropen_context, dotdot, cred, flags,
+ &cookie, dotdot, cred, flags,
_netfs_translator_callback1,
_netfs_translator_callback2,
do_retry, retry_name, retry_port);
diff --git a/libnetfs/trans-callback.c b/libnetfs/trans-callback.c
index ed21aa2..99f4dc0 100644
--- a/libnetfs/trans-callback.c
+++ b/libnetfs/trans-callback.c
@@ -20,6 +20,7 @@
#include "priv.h"
#include <fcntl.h>
+#include <hurd/fshelp.h>
/* Callback function needed for calls to fshelp_fetch_root. See
<hurd/fshelp.h> for the interface description. */
@@ -57,6 +58,7 @@ _netfs_translator_callback2_fn (void *cookie1, void *cookie2,
int flags,
error_t err;
struct protid *cred;
struct node *node = cookie1;
+ struct fshelp_stat_cookie2 *statc = cookie2;
struct iouser *user;
struct peropen *po;
@@ -65,7 +67,7 @@ _netfs_translator_callback2_fn (void *cookie1, void *cookie2,
int flags,
if (err)
return err;
- po = netfs_make_peropen (node, flags, cookie2);
+ po = netfs_make_peropen (node, flags, statc->next);
if (! po)
{
err = errno;
--
Alioth's /usr/local/bin/git-commit-notice on
/srv/git.debian.org/git/pkg-hurd/hurd.git
- [hurd] 06/14: GNU Hurd 0.8, (continued)
- [hurd] 06/14: GNU Hurd 0.8, Samuel Thibault, 2016/05/21
- [hurd] 05/14: Complete changes to use -L instead of -Wl, -rpath-link, Samuel Thibault, 2016/05/21
- [hurd] 07/14: mach-defpager: fix panic invocation, Samuel Thibault, 2016/05/21
- [hurd] 02/14: libihash: fix corner case, Samuel Thibault, 2016/05/21
- [hurd] 12/14: libnetfs: treat disconnected shadow roots as virtual roots, Samuel Thibault, 2016/05/21
- [hurd] 14/14: Avoid superfluous locking of node, Samuel Thibault, 2016/05/21
- [hurd] 10/14: libdiskfs: cosmetic changes, Samuel Thibault, 2016/05/21
- [hurd] 09/14: libnetfs: rename 'diruser' to 'dircred', Samuel Thibault, 2016/05/21
- [hurd] 08/14: libnetfs: rename 'error' to 'err', Samuel Thibault, 2016/05/21
- [hurd] 03/14: libihash: enable fast insertions replacing tombstones, Samuel Thibault, 2016/05/21
- [hurd] 11/14: Unify the short-circuit translator logic,
Samuel Thibault <=
- [hurd] 13/14: utils/settrans: implement active translator stacking, Samuel Thibault, 2016/05/21