bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/3] Add the mountee to the list of merged filesystems.


From: Sergiu Ivanov
Subject: [PATCH 3/3] Add the mountee to the list of merged filesystems.
Date: Mon, 17 Aug 2009 20:55:37 +0300
User-agent: Mutt/1.5.16 (2007-06-09)

* 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 Sun, Aug 16, 2009 at 07:56:03PM +0200, olafBuddenhagen@gmx.net wrote:
> On Mon, Aug 03, 2009 at 08:42:27PM +0300, Sergiu Ivanov wrote:
> 
> > diff --git a/mount.c b/mount.c
> > index 45889f8..9d2a1e5 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;
> > @@ -167,6 +168,14 @@ 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);
> 
> This comment would actually be more appropriate near the definition of
> the actual data structure and/or the function filling it in...
> 
> Of course, it doesn't hurt to mention it here *in addition* to that :-)

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.  Also, in ulfs.h, both are near the
declaration of ulfs_register, so it seems to me that it's sufficient
to describe the convention in the comment to ulfs_register only.

> > +
> > +  /* Initialize the list of merged filesystems.  */
> > +  ulfs_check ();
> > +  node_init_root (netfs_root_node);
> 
> The comment still doesn't explain why this is necessary.
> 
> AIUI, the list is already initialized earlier. Here, we have to do it
> *again*, because we just added another element to the union, and need to
> pick up the new info...

I've added some explanation to this comment; I hope it will be
sufficient.
 
> I actually wonder whether the patches are really split up in the most
> useful manner... But I'd rather leave it as is now.

I'm asking out of pure interest: what different way of splitting the
functionality across patches do you envision? (Well, besides
implementing the unioning functionality before modifying command line
handling, just like you suggested in the very beginning and which
suggestion I managed to not understand :-( ).

---
 mount.c |   14 +++++++++++++-
 mount.h |    4 +++-
 node.c  |   15 ++++++++++++---
 ulfs.c  |   19 +++++++++++++++----
 ulfs.h  |    4 +++-
 5 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/mount.c b/mount.c
index e325d3d..64dc63b 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;
@@ -138,7 +139,9 @@ start_mountee (node_t * np, char * argz, size_t argz_len, 
int flags,
   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)
 {
@@ -165,6 +168,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 ce860e6..53679ad 100644
--- a/mount.h
+++ b/mount.h
@@ -44,7 +44,9 @@ error_t
 start_mountee (node_t * np, char * argz, size_t argz_len, int flags,
               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..852b5c9 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 <moritz@duesseldorf.ccc.de>.
 
+   Adapted for unionmount by Sergiu Ivanov <unlimitedscolobb@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 <moritz@duesseldorf.ccc.de>.
 
+   Adapted for unionmount by Sergiu Ivanov <unlimitedscolobb@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..872e87c 100644
--- a/ulfs.h
+++ b/ulfs.h
@@ -49,7 +49,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.3.3





reply via email to

[Prev in Thread] Current Thread [Next in Thread]