On 2008-11-04, Ann Davis <[EMAIL PROTECTED]> wrote: > 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.
Thanks. The rest of the missing changes simply correspond to an earlier CVS version that supported 2.6.26. And from looking at the earlier version, I noticed that a couple parts of your patch are incorrect. Below I've included a new version of the patch that should compile and run on openSUSE 11.0. I would appreciate some feedback on this. > I assume that we can't really test w/ AntiVir until Avira supports > dazukofs, right? You can test with the "showfiles" test application included in the dazukofs package. But as for AntiVir, I do not know what their plans are with regard to DazukoFS. However, Avira GmbH is maintainer contact with me and we will be meeting soon to discuss exactly this issue. $ tar xzvf dazukofs-3.0.0-rc3.tar.gz $ cd dazukofs-3.0.0-rc3 $ patch -p1 < this_email $ make John Ogness --- ctrl_dev.c | 2 - group_dev.c | 2 - ign_dev.c | 2 - inode.c | 66 +++++++++++++++++++++++++++++++++++++++++--------- super.c | 7 +++-- 5 files changed, 62 insertions(+), 17 deletions(-) diff -Nurp a/ctrl_dev.c b/ctrl_dev.c --- a/ctrl_dev.c 2008-10-25 00:58:25.000000000 +0200 +++ b/ctrl_dev.c 2008-11-04 20:59:41.000000000 +0100 @@ -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 b/group_dev.c --- a/group_dev.c 2008-10-25 00:58:17.000000000 +0200 +++ b/group_dev.c 2008-11-04 20:59:42.000000000 +0100 @@ -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/ign_dev.c b/ign_dev.c --- a/ign_dev.c 2008-10-25 00:58:32.000000000 +0200 +++ b/ign_dev.c 2008-11-04 20:59:42.000000000 +0100 @@ -157,7 +157,7 @@ int dazukofs_ign_dev_init(int dev_major, /* create ignore device */ dev = device_create(dazukofs_class, NULL, MKDEV(dev_major, dev_minor), - NULL, "%s.ign", DEVICE_NAME); + "%s.ign", DEVICE_NAME); if (IS_ERR(dev)) { err = PTR_ERR(dev); goto error_out3; diff -Nurp a/inode.c b/inode.c --- a/inode.c 2008-10-25 00:58:45.000000000 +0200 +++ b/inode.c 2008-11-04 20:58:55.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,37 @@ 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 *lower_mnt = NULL; + struct dentry *lower_dentry = NULL; + struct vfsmount *vfsmnt_save = NULL; + struct dentry *dentry_save = NULL; + int err; + + if (nd) { + lower_mnt = GET_LOWER_MNT(nd->path.dentry); + lower_dentry = GET_LOWER_DENTRY(nd->path.dentry); + + vfsmnt_save = nd->path.mnt; + dentry_save = nd->path.dentry; + + nd->path.mnt = mntget(lower_mnt); + nd->path.dentry = dget(lower_dentry); + } + + err = permission(GET_LOWER_INODE(inode), mask, nd); + + if (nd) { + mntput(lower_mnt); + dput(lower_dentry); + + nd->path.mnt = vfsmnt_save; + nd->path.dentry = dentry_save; + } + + return err; } /** @@ -601,11 +636,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 +822,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 +831,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 +865,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 +873,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 +903,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 +911,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 +946,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 +970,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/super.c b/super.c --- a/super.c 2008-10-25 00:58:38.000000000 +0200 +++ b/super.c 2008-11-04 20:59:44.000000000 +0100 @@ -336,16 +336,17 @@ out: /** * init_once - do something. - * @data: is something. + * @cachep: is something. + * @vptr: is something. * * Description: Does something. * * We do some stuff and then call the lower function version. */ -static void init_once(void *data) +static void init_once(struct kmem_cache *cachep, void *vptr) { struct dazukofs_inode_info *inode_info = - (struct dazukofs_inode_info *)data; + (struct dazukofs_inode_info *)vptr; memset(inode_info, 0, sizeof(struct dazukofs_inode_info)); inode_init_once(&(inode_info->vfs_inode)); _______________________________________________ Dazuko-devel mailing list Dazuko-devel@nongnu.org http://lists.nongnu.org/mailman/listinfo/dazuko-devel