[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Dazuko-devel] DazukoFS 3.0.0-rc2 posted
From: |
John Ogness |
Subject: |
Re: [Dazuko-devel] DazukoFS 3.0.0-rc2 posted |
Date: |
Mon, 03 Nov 2008 20:27:15 +0100 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.1 (berkeley-unix) |
On 2008-11-03, jim burns <address@hidden> 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.
$ tar xzvf dazukofs-3.0.0-rc3.tar.gz
$ cd dazukofs-3.0.0-rc3
$ patch -p1 < this_email
$ make
John Ogness
---
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)