From 4db02de530ceb22a814ab6f53eda77c40de03fe7 Mon Sep 17 00:00:00 2001 From: Sergiu Ivanov Date: Sun, 5 Jul 2009 15:26:58 +0300 Subject: Add the mountee to the list of merged filesystems. * mount.c (start_mountee): Add the mountee's filesystem to the list of merged filesystems. * node.c (node_init_root): Take into consideration the fact that an empty string refers to the mountee root. * ulfs.c (ulfs_check): Likewise. (ulfs_register): Don't check whether "" is a valid directory. --- mount.c | 14 +++++++++++++- mount.h | 4 +++- node.c | 15 ++++++++++++--- ulfs.c | 19 +++++++++++++++---- ulfs.h | 8 ++++++-- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/mount.c b/mount.c index 72c720d..c73ad8d 100644 --- a/mount.c +++ b/mount.c @@ -27,6 +27,7 @@ #include "mount.h" #include "lib.h" +#include "ulfs.h" /* The command line for starting the mountee. */ char * mountee_argz; @@ -144,7 +145,9 @@ start_mountee (node_t * np, char * argz, size_t argz_len, mach_port_t * port) return err; } /* start_mountee */ -/* Sets up a proxy node and sets the translator on it. */ +/* Sets up a proxy node, sets the translator on it, and registers the + filesystem published by the translator in the list of merged + filesystems. */ error_t setup_unionmount (void) { @@ -166,6 +169,15 @@ setup_unionmount (void) if (err) return err; + /* A path equal to "" will mean that the current ULFS entry is the + mountee port. */ + ulfs_register ("", 0, 0); + + /* Reinitialize the list of merged filesystems to take into account + the newly added mountee's filesystem. */ + ulfs_check (); + node_init_root (netfs_root_node); + mountee_started = 1; return 0; diff --git a/mount.h b/mount.h index fd265f0..fb5758d 100644 --- a/mount.h +++ b/mount.h @@ -42,7 +42,9 @@ extern int mountee_started; error_t start_mountee (node_t * np, char * argz, size_t argz_len, mach_port_t * port); -/* Sets up a proxy node and sets the translator on it. */ +/* Sets up a proxy node, sets the translator on it, and registers the + filesystem published by the translator in the list of merged + filesystems. */ error_t setup_unionmount (void); diff --git a/node.c b/node.c index cf9a8b4..f8ad886 100644 --- a/node.c +++ b/node.c @@ -1,7 +1,10 @@ /* Hurd unionfs - Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2005, 2009 Free Software Foundation, Inc. + Written by Moritz Schulte . + Adapted for unionmount by Sergiu Ivanov . + 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 of the @@ -33,6 +36,7 @@ #include "node.h" #include "ulfs.h" #include "lib.h" +#include "mount.h" /* Declarations for functions only used in this file. */ @@ -535,8 +539,13 @@ node_init_root (node_t *node) break; if (ulfs->path) - node_ulfs->port = file_name_lookup (ulfs->path, - O_READ | O_DIRECTORY, 0); + { + if (!ulfs->path[0]) + node_ulfs->port = mountee_root; + else + node_ulfs->port = file_name_lookup (ulfs->path, + O_READ | O_DIRECTORY, 0); + } else node_ulfs->port = underlying_node; diff --git a/ulfs.c b/ulfs.c index 3c565a5..2626a90 100644 --- a/ulfs.c +++ b/ulfs.c @@ -1,7 +1,10 @@ /* Hurd unionfs - Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2005, 2009 Free Software Foundation, Inc. + Written by Moritz Schulte . + Adapted for unionmount by Sergiu Ivanov . + 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 of the @@ -31,6 +34,7 @@ #include "lib.h" #include "ulfs.h" +#include "mount.h" /* The start of the ulfs chain. */ ulfs_t *ulfs_chain_start; @@ -212,14 +216,16 @@ ulfs_for_each_under_priv (char *path_under, return err; } -/* Register a new underlying filesystem. */ +/* Register a new underlying filesystem. A null path refers to the + underlying filesystem; a path equal to an empty string refers to + the filesystem of the mountee. */ error_t ulfs_register (char *path, int flags, int priority) { ulfs_t *ulfs; error_t err; - if (path) + if (path && path[0]) { err = check_dir (path); if (err) @@ -261,7 +267,12 @@ ulfs_check () { if (u->path) - p = file_name_lookup (u->path, O_READ | O_DIRECTORY, 0); + { + if (!u->path[0]) + p = mountee_root; + else + p = file_name_lookup (u->path, O_READ | O_DIRECTORY, 0); + } else p = underlying_node; diff --git a/ulfs.h b/ulfs.h index 532e3c7..46eb7ff 100644 --- a/ulfs.h +++ b/ulfs.h @@ -22,7 +22,9 @@ #ifndef INCLUDED_ULFS_H #define INCLUDED_ULFS_H -/* The structure for each registered underlying filesystem. */ +/* The structure for each registered underlying filesystem. A null + path refers to the underlying filesystem; a path equal to an empty + string refers to the filesystem of the mountee. */ typedef struct ulfs { char *path; @@ -49,7 +51,9 @@ extern unsigned int ulfs_num; /* The lock protecting the ulfs data structures. */ extern struct mutex ulfs_lock; -/* Register a new underlying filesystem. */ +/* Register a new underlying filesystem. A null path refers to the + underlying filesystem; a path equal to an empty string refers to + the filesystem of the mountee. */ error_t ulfs_register (char *path, int flags, int priority); /* Unregister an underlying filesystem. */ -- cgit v1.2.3