Re: DazukoFS 3.0.0-rc2 posted

Ann Davis <[email protected]> Tue, 04 Nov 2008 12:35:22 -0700
Newsgroups gmane.linux.dazuko.devel
Message-ID <[email protected]>
John Ogness wrote:
> On 2008-11-03, jim burns <[email protected]> wrote:
>   
>> John - had any luck deciphering the fs/ecryptfs/inode.c file you had
>> me post yet?
>>     
>
> As stated by Ann in a follow-up post, most of the vfs functions take
> an additional vfsmount argument. I've created a patch against
> dazukofs-3.0.0-rc3 that should work for you. I couldn't actually test
> it, so hopefully I didn't miss any careless mistakes. Let me know if
> this works for you.
>   

John, thanks for the patch; I tried it on openSUSE 11.0.  It compiles 
with warnings but the resulting dazukofs module does not load 
(segmentation error).  The following patch incorporates your patch and 
makes a few other changes to address the compile warnings.  Using this 
patch does create a dazukofs.ko that will load, but I haven't done any 
functional testing.  I assume that we can't really test w/ AntiVir until 
Avira supports dazukofs, right?

Ann

diff -Nurp a//ctrl_dev.c c//ctrl_dev.c
--- a//ctrl_dev.c    2008-11-04 11:36:52.000000000 -0700
+++ c//ctrl_dev.c    2008-11-04 11:48:34.000000000 -0700
@@ -178,7 +178,7 @@ int dazukofs_ctrl_dev_init(int dev_major
 
     /* create control device */
     dev = device_create(dazukofs_class, NULL, MKDEV(dev_major, dev_minor),
-                NULL, "%s.ctrl", DEVICE_NAME);
+                "%s.ctrl", DEVICE_NAME);
     if (IS_ERR(dev)) {
         err = PTR_ERR(dev);
         goto error_out2;
diff -Nurp a//group_dev.c c//group_dev.c
--- a//group_dev.c    2008-11-04 11:36:53.000000000 -0700
+++ c//group_dev.c    2008-11-04 11:47:55.000000000 -0700
@@ -210,7 +210,7 @@ int dazukofs_group_dev_init(int dev_majo
     /* create group devices */
     for (i = 0; i < GROUP_COUNT; i++) {
         dev = device_create(dazukofs_class, NULL,
-                    MKDEV(dev_major, dev_minor_end), NULL,
+                    MKDEV(dev_major, dev_minor_end),
                     "%s.%d", DEVICE_NAME, i);
         if (IS_ERR(dev)) {
             err = PTR_ERR(dev);
diff -Nurp a//inode.c c//inode.c
--- a//inode.c    2008-11-04 11:36:53.000000000 -0700
+++ c//inode.c    2008-11-04 08:51:26.000000000 -0700
@@ -284,6 +284,7 @@ static int dazukofs_mknod(struct inode *
               dev_t dev)
 {
     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
+    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
     struct inode *lower_dentry_parent_inode = lower_dentry_parent->d_inode;
     int err = -ENOENT;
@@ -291,7 +292,8 @@ static int dazukofs_mknod(struct inode *
     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
               I_MUTEX_PARENT);
 
-    err = vfs_mknod(lower_dentry_parent_inode, lower_dentry, mode, dev);
+    err = vfs_mknod(lower_dentry_parent_inode, lower_dentry, lower_mnt,
+            mode, dev);
     if (err)
         goto out;
 
@@ -325,6 +327,7 @@ out:
 static int dazukofs_mkdir(struct inode *dir, struct dentry *dentry, int 
mode)
 {
     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
+    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
     struct inode *lower_dentry_parent_inode = lower_dentry_parent->d_inode;
     int err = -ENOENT;
@@ -332,7 +335,8 @@ static int dazukofs_mkdir(struct inode *
     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
               I_MUTEX_PARENT);
 
-    err = vfs_mkdir(lower_dentry_parent_inode, lower_dentry, mode);
+    err = vfs_mkdir(lower_dentry_parent_inode, lower_dentry, lower_mnt,
+            mode);
     if (err)
         goto out;
 
@@ -429,14 +433,17 @@ static int dazukofs_symlink(struct inode
                 const char *symname)
 {
     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
+    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
     struct inode *lower_dentry_parent_inode = lower_dentry_parent->d_inode;
+    umode_t mode = S_IALLUGO;
     int err = -ENOENT;
 
     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
               I_MUTEX_PARENT);
 
-    err = vfs_symlink(lower_dentry_parent_inode, lower_dentry, symname);
+    err = vfs_symlink(lower_dentry_parent_inode, lower_dentry, lower_mnt,
+              symname, mode);
     if (err)
         goto out;
 
@@ -581,9 +588,28 @@ static void dazukofs_put_link(struct den
  *
  * Returns some result.
  */
-static int dazukofs_permission(struct inode *inode, int mask)
+static int dazukofs_permission(struct inode *inode, int mask,
+                   struct nameidata *nd)
 {
-    return inode_permission(GET_LOWER_INODE(inode), mask);
+    struct vfsmount *vfsmnt_save = NULL;
+    struct dentry *dentry_save = NULL;
+    int rc;
+
+    if (nd) {
+        vfsmnt_save = nd->path.mnt;
+        dentry_save = nd->path.dentry;
+        nd->path.mnt = GET_LOWER_MNT(nd->path.dentry);
+        nd->path.dentry = GET_LOWER_DENTRY(nd->path.dentry);
+    }
+
+    rc = permission(GET_LOWER_INODE(inode), mask, nd);
+
+    if (nd) {
+        nd->path.mnt = vfsmnt_save;
+        nd->path.dentry = dentry_save;
+    }
+
+    return rc;
 }
 
 /**
@@ -601,11 +627,12 @@ static int dazukofs_permission(struct in
 static int dazukofs_setattr(struct dentry *dentry, struct iattr *ia)
 {
     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
+    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
     struct inode *inode = dentry->d_inode;
     struct inode *lower_inode = GET_LOWER_INODE(inode);
     int err;
 
-    err = notify_change(lower_dentry, ia);
+    err = notify_change(lower_dentry, lower_mnt, ia);
 
     fsstack_copy_attr_all(inode, lower_inode, NULL);
     fsstack_copy_inode_size(inode, lower_inode);
@@ -786,6 +813,8 @@ static int dazukofs_link(struct dentry *
 {
     struct dentry *lower_old_dentry = GET_LOWER_DENTRY(old_dentry);
     struct dentry *lower_new_dentry = GET_LOWER_DENTRY(new_dentry);
+    struct vfsmount *lower_old_mnt = GET_LOWER_MNT(old_dentry);
+    struct vfsmount *lower_new_mnt = GET_LOWER_MNT(new_dentry);
     struct dentry *lower_dentry_parent = dget(lower_new_dentry->d_parent);
     struct inode *lower_dentry_parent_inode = lower_dentry_parent->d_inode;
     int err = -ENOENT;
@@ -793,8 +822,9 @@ static int dazukofs_link(struct dentry *
     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
               I_MUTEX_PARENT);
 
-    err = vfs_link(lower_old_dentry, lower_dentry_parent_inode,
-               lower_new_dentry);
+    err = vfs_link(lower_old_dentry, lower_old_mnt,
+               lower_dentry_parent_inode, lower_new_dentry,
+               lower_new_mnt);
     if (err)
         goto out;
 
@@ -826,6 +856,7 @@ out:
 static int dazukofs_unlink(struct inode *dir, struct dentry *dentry)
 {
     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
+    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
     struct inode *lower_dentry_parent_inode = lower_dentry_parent->d_inode;
     int err;
@@ -833,7 +864,7 @@ static int dazukofs_unlink(struct inode
     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
               I_MUTEX_PARENT);
 
-    err = vfs_unlink(lower_dentry_parent_inode, lower_dentry);
+    err = vfs_unlink(lower_dentry_parent_inode, lower_dentry, lower_mnt);
     if (err)
         goto out;
 
@@ -863,6 +894,7 @@ out:
 static int dazukofs_rmdir(struct inode *dir, struct dentry *dentry)
 {
     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
+    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
     struct inode *lower_dentry_parent_inode = lower_dentry_parent->d_inode;
     int err;
@@ -870,7 +902,7 @@ static int dazukofs_rmdir(struct inode *
     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
               I_MUTEX_PARENT);
 
-    err = vfs_rmdir(lower_dentry_parent_inode, lower_dentry);
+    err = vfs_rmdir(lower_dentry_parent_inode, lower_dentry, lower_mnt);
     if (err)
         goto out;
 
@@ -905,6 +937,8 @@ static int dazukofs_rename(struct inode
 {
     struct dentry *lower_old_dentry = GET_LOWER_DENTRY(old_dentry);
     struct dentry *lower_new_dentry = GET_LOWER_DENTRY(new_dentry);
+    struct vfsmount *lower_old_mnt = GET_LOWER_MNT(old_dentry);
+    struct vfsmount *lower_new_mnt = GET_LOWER_MNT(new_dentry);
     struct dentry *lower_old_dentry_parent =
         dget(lower_old_dentry->d_parent);
     struct dentry *lower_new_dentry_parent =
@@ -927,7 +961,8 @@ static int dazukofs_rename(struct inode
 
     lock_rename(lower_old_dentry_parent, lower_new_dentry_parent);
     err = vfs_rename(lower_old_dentry_parent_inode, lower_old_dentry,
-             lower_new_dentry_parent_inode, lower_new_dentry);
+             lower_old_mnt, lower_new_dentry_parent_inode,
+             lower_new_dentry, lower_new_mnt);
     unlock_rename(lower_old_dentry_parent, lower_new_dentry_parent);
 
     if (err)
diff -Nurp a//modules.order c//modules.order
--- a//modules.order    2008-11-04 11:36:53.000000000 -0700
+++ c//modules.order    2008-11-04 11:53:06.000000000 -0700
@@ -1 +1 @@
-kernel//root/data/dazukofs-3.0.0/dazukofs/dazukofs-3.0.0-rc3/dazukofs.ko
+kernel//root/dazukofs-3.0.0/dazukofs/c/dazukofs.ko
diff -Nurp a//super.c c//super.c
--- a//super.c    2008-11-04 11:36:53.000000000 -0700
+++ c//super.c    2008-11-04 11:43:17.000000000 -0700
@@ -396,7 +396,7 @@ static int init_caches(void)
         kmem_cache_create("dazukofs_inode_info_cache",
                   sizeof(struct dazukofs_inode_info), 0,
                   SLAB_HWCACHE_ALIGN,
-                  init_once);
+                  (void *)init_once);
     if (!dazukofs_inode_info_cachep)
         goto out_nomem;
 
diff -Nurp a//suse-vfs_mknod.patch c//suse-vfs_mknod.patch
--- a//suse-vfs_mknod.patch    1969-12-31 17:00:00.000000000 -0700
+++ c//suse-vfs_mknod.patch    2008-11-04 08:51:19.000000000 -0700
@@ -0,0 +1,180 @@
+inode.c |   57 +++++++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 46 insertions(+), 11 deletions(-)
+diff -Nurp a/inode.c b/inode.c
+--- a/inode.c    2008-10-25 00:58:45.000000000 +0200
++++ b/inode.c    2008-11-03 20:17:35.000000000 +0100
+@@ -284,6 +284,7 @@ static int dazukofs_mknod(struct inode *
+               dev_t dev)
+ {
+     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
++    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
+     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
+     struct inode *lower_dentry_parent_inode = 
lower_dentry_parent->d_inode;
+     int err = -ENOENT;
+@@ -291,7 +292,8 @@ static int dazukofs_mknod(struct inode *
+     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
+               I_MUTEX_PARENT);
+
+-    err = vfs_mknod(lower_dentry_parent_inode, lower_dentry, mode, dev);
++    err = vfs_mknod(lower_dentry_parent_inode, lower_dentry, lower_mnt,
++            mode, dev);
+     if (err)
+         goto out;
+
+@@ -325,6 +327,7 @@ out:
+ static int dazukofs_mkdir(struct inode *dir, struct dentry *dentry, 
int mode)
+ {
+     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
++    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
+     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
+     struct inode *lower_dentry_parent_inode = 
lower_dentry_parent->d_inode;
+     int err = -ENOENT;
+@@ -332,7 +335,8 @@ static int dazukofs_mkdir(struct inode *
+     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
+               I_MUTEX_PARENT);
+
+-    err = vfs_mkdir(lower_dentry_parent_inode, lower_dentry, mode);
++    err = vfs_mkdir(lower_dentry_parent_inode, lower_dentry, lower_mnt,
++            mode);
+     if (err)
+         goto out;
+
+@@ -429,14 +433,17 @@ static int dazukofs_symlink(struct inode
+                 const char *symname)
+ {
+     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
++    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
+     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
+     struct inode *lower_dentry_parent_inode = 
lower_dentry_parent->d_inode;
++    umode_t mode = S_IALLUGO;
+     int err = -ENOENT;
+
+     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
+               I_MUTEX_PARENT);
+
+-    err = vfs_symlink(lower_dentry_parent_inode, lower_dentry, symname);
++    err = vfs_symlink(lower_dentry_parent_inode, lower_dentry, lower_mnt,
++              symname, mode);
+     if (err)
+         goto out;
+
+@@ -581,9 +588,28 @@ static void dazukofs_put_link(struct den
+  *
+  * Returns some result.
+  */
+-static int dazukofs_permission(struct inode *inode, int mask)
++static int dazukofs_permission(struct inode *inode, int mask,
++                   struct nameidata *nd)
+ {
+-    return inode_permission(GET_LOWER_INODE(inode), mask);
++    struct vfsmount *vfsmnt_save = NULL;
++    struct dentry *dentry_save = NULL;
++    int rc;
++
++    if (nd) {
++        vfsmnt_save = nd->path.mnt;
++        dentry_save = nd->path.dentry;
++        nd->path.mnt = GET_LOWER_MNT(nd->path.dentry);
++        nd->path.dentry = GET_LOWER_DENTRY(nd->path.dentry);
++    }
++
++    rc = permission(GET_LOWER_INODE(inode), mask, nd);
++
++    if (nd) {
++        nd->path.mnt = vfsmnt_save;
++        nd->path.dentry = dentry_save;
++    }
++
++    return rc;
+ }
+
+ /**
+@@ -601,11 +627,12 @@ static int dazukofs_permission(struct in
+ static int dazukofs_setattr(struct dentry *dentry, struct iattr *ia)
+ {
+     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
++    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
+     struct inode *inode = dentry->d_inode;
+     struct inode *lower_inode = GET_LOWER_INODE(inode);
+     int err;
+
+-    err = notify_change(lower_dentry, ia);
++    err = notify_change(lower_dentry, lower_mnt, ia);
+
+     fsstack_copy_attr_all(inode, lower_inode, NULL);
+     fsstack_copy_inode_size(inode, lower_inode);
+@@ -786,6 +813,8 @@ static int dazukofs_link(struct dentry *
+ {
+     struct dentry *lower_old_dentry = GET_LOWER_DENTRY(old_dentry);
+     struct dentry *lower_new_dentry = GET_LOWER_DENTRY(new_dentry);
++    struct vfsmount *lower_old_mnt = GET_LOWER_MNT(old_dentry);
++    struct vfsmount *lower_new_mnt = GET_LOWER_MNT(new_dentry);
+     struct dentry *lower_dentry_parent = dget(lower_new_dentry->d_parent);
+     struct inode *lower_dentry_parent_inode = 
lower_dentry_parent->d_inode;
+     int err = -ENOENT;
+@@ -793,8 +822,9 @@ static int dazukofs_link(struct dentry *
+     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
+               I_MUTEX_PARENT);
+
+-    err = vfs_link(lower_old_dentry, lower_dentry_parent_inode,
+-               lower_new_dentry);
++    err = vfs_link(lower_old_dentry, lower_old_mnt,
++               lower_dentry_parent_inode, lower_new_dentry,
++               lower_new_mnt);
+     if (err)
+         goto out;
+
+@@ -826,6 +856,7 @@ out:
+ static int dazukofs_unlink(struct inode *dir, struct dentry *dentry)
+ {
+     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
++    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
+     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
+     struct inode *lower_dentry_parent_inode = 
lower_dentry_parent->d_inode;
+     int err;
+@@ -833,7 +864,7 @@ static int dazukofs_unlink(struct inode
+     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
+               I_MUTEX_PARENT);
+
+-    err = vfs_unlink(lower_dentry_parent_inode, lower_dentry);
++    err = vfs_unlink(lower_dentry_parent_inode, lower_dentry, lower_mnt);
+     if (err)
+         goto out;
+
+@@ -863,6 +894,7 @@ out:
+ static int dazukofs_rmdir(struct inode *dir, struct dentry *dentry)
+ {
+     struct dentry *lower_dentry = GET_LOWER_DENTRY(dentry);
++    struct vfsmount *lower_mnt = GET_LOWER_MNT(dentry);
+     struct dentry *lower_dentry_parent = dget(lower_dentry->d_parent);
+     struct inode *lower_dentry_parent_inode = 
lower_dentry_parent->d_inode;
+     int err;
+@@ -870,7 +902,7 @@ static int dazukofs_rmdir(struct inode *
+     mutex_lock_nested(&(lower_dentry_parent_inode->i_mutex),
+               I_MUTEX_PARENT);
+
+-    err = vfs_rmdir(lower_dentry_parent_inode, lower_dentry);
++    err = vfs_rmdir(lower_dentry_parent_inode, lower_dentry, lower_mnt);
+     if (err)
+         goto out;
+
+@@ -905,6 +937,8 @@ static int dazukofs_rename(struct inode
+ {
+     struct dentry *lower_old_dentry = GET_LOWER_DENTRY(old_dentry);
+     struct dentry *lower_new_dentry = GET_LOWER_DENTRY(new_dentry);
++    struct vfsmount *lower_old_mnt = GET_LOWER_MNT(old_dentry);
++    struct vfsmount *lower_new_mnt = GET_LOWER_MNT(new_dentry);
+     struct dentry *lower_old_dentry_parent =
+         dget(lower_old_dentry->d_parent);
+     struct dentry *lower_new_dentry_parent =
+@@ -927,7 +961,8 @@ static int dazukofs_rename(struct inode
+
+     lock_rename(lower_old_dentry_parent, lower_new_dentry_parent);
+     err = vfs_rename(lower_old_dentry_parent_inode, lower_old_dentry,
+-             lower_new_dentry_parent_inode, lower_new_dentry);
++             lower_old_mnt, lower_new_dentry_parent_inode,
++             lower_new_dentry, lower_new_mnt);
+     unlock_rename(lower_old_dentry_parent, lower_new_dentry_parent);
+
+     if (err)
+