* 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. ---
Hello, On Thu, Nov 05, 2009 at 12:58:02PM +0100, olafbuddenha...@gmx.net wrote: > On Wed, Nov 04, 2009 at 07:08:45PM +0200, Sergiu Ivanov wrote: > > On Fri, Oct 30, 2009 at 10:13:09AM +0100, olafbuddenha...@gmx.net > > wrote: > > > On Mon, Aug 17, 2009 at 08:55:37PM +0300, Sergiu Ivanov wrote: > > > > > I've added the corresponding comment to ulfs_register, but I > > > > didn't add anything to variable or structure declarations, because > > > > I'm not sure whether it would be suitable to describe the > > > > convention in the comment to the declaration of struct ulfs or in > > > > the comment to the declaration of ulfs_chain. > > > > > > The latter I'd say -- it's not really a property of the ulfs > > > structure itself, but rather a special entry in the list... > > Whoops, sorry, I wasn't paying attention :-( > > After looking at the patch, it immediately became clear that indeed the > comment belongs in the ulfs structure itself, not the chain -- it > describes a special value of a particular field in the structure, while > the chain only links the structures. OK :-) I've moved the corresponding comment to the declaration of the structure. > > I have eventually commented both the data structures and the > > functions, which, I hope, is not a problem :-) > > Only in the sense that more redundancy means more things to update if > something should change there... But I'm not too worried about that :-) Neither am I :-) Regards, scolobb --- 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 01d9ccd..7da6822 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; @@ -142,7 +143,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) { @@ -164,6 +167,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 <mor...@duesseldorf.ccc.de>. + Adapted for unionmount by Sergiu Ivanov <unlimitedscol...@gmail.com>. + 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 <mor...@duesseldorf.ccc.de>. + Adapted for unionmount by Sergiu Ivanov <unlimitedscol...@gmail.com>. + 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. */ -- 1.6.5.2