-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Here's the updated patch. The old one compiled but had a few stupid
merge errors left in it that caused it to bail out early after reading
the inode. This one works as expected.
- -Jeff
- --
Jeff Mahoney
SUSE Labs
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4-svn0 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org
iD8DBQFH1qE2LPWxlyuTD7IRAiVtAJsEFJF1XGdqjGhN/NZtH3GMk43cUQCfd/dS
ijTA5I+zQRhn0OzIN+hr4VQ=
=EPkm
-----END PGP SIGNATURE-----
From: Jeff Mahoney <[EMAIL PROTECTED]>
Subject: [PATCH] aufs: Update aufs to use 2.6.25-rc API
References: 356902
This patch contains changes to allow aufs to work with the 2.6.25-rc API.
As required by the project, it preserves the compatibility with older
releases. I've tested with 2.6.22.
Signed-off-by: Jeff Mahoney <[EMAIL PROTECTED]>
---
fs/aufs/branch.c | 23 ++++++++++++-----------
fs/aufs/compat.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
fs/aufs/dentry.c | 6 +++---
fs/aufs/i_op.c | 9 +++++----
fs/aufs/inode.c | 20 ++++++++++----------
fs/aufs/inode.h | 1 +
fs/aufs/misc.c | 23 ++++++++++++-----------
fs/aufs/opts.c | 14 +++++++-------
fs/aufs/super.c | 29 ++++++++++++++++++-----------
fs/aufs/sysaufs.c | 48 ++++++++++++++++++++++++++++++++++++++++--------
fs/aufs/vfsub.c | 2 +-
fs/aufs/vfsub.h | 6 ++++--
fs/aufs/xino.c | 5 +++--
13 files changed, 165 insertions(+), 70 deletions(-)
--- a/fs/aufs/branch.c 2008-03-10 15:41:21.000000000 -0400
+++ b/fs/aufs/branch.c 2008-03-11 10:58:38.000000000 -0400
@@ -306,7 +306,8 @@ static int test_add(struct super_block *
root = sb->s_root;
bend = sbend(sb);
- if (unlikely(bend >= 0 && au_find_dbindex(root, add->nd.dentry) >= 0)) {
+ if (unlikely(bend >= 0 &&
+ au_find_dbindex(root, nd_dentry(&add->nd)) >= 0)) {
err = 1;
if (!remount) {
err = -EINVAL;
@@ -329,7 +330,7 @@ static int test_add(struct super_block *
goto out;
}
- inode = add->nd.dentry->d_inode;
+ inode = nd_dentry(&add->nd)->d_inode;
AuDebugOn(!inode || !S_ISDIR(inode->i_mode));
err = -ENOENT;
if (unlikely(!inode->i_nlink)) {
@@ -358,7 +359,7 @@ static int test_add(struct super_block *
goto out;
}
- err = test_br(sb, add->nd.dentry->d_inode, add->perm, add->path);
+ err = test_br(sb, nd_dentry(&add->nd)->d_inode, add->perm, add->path);
if (unlikely(err))
goto out;
@@ -379,7 +380,7 @@ static int test_add(struct super_block *
err = -EINVAL;
for (bindex = 0; bindex <= bend; bindex++)
- if (unlikely(test_overlap(sb, add->nd.dentry,
+ if (unlikely(test_overlap(sb, nd_dentry(&add->nd),
au_h_dptr_i(root, bindex)))) {
AuErr("%s is overlapped\n", add->path);
goto out;
@@ -406,7 +407,7 @@ int br_add(struct super_block *sb, struc
struct aufs_hinode *hinodep;
LKTRTrace("b%d, %s, 0x%x, %.*s\n", add->bindex, add->path,
- add->perm, AuDLNPair(add->nd.dentry));
+ add->perm, AuDLNPair(nd_dentry(&add->nd)));
SiMustWriteLock(sb);
root = sb->s_root;
DiMustWriteLock(root);
@@ -432,14 +433,14 @@ int br_add(struct super_block *sb, struc
add_branch->br_wh = NULL;
if (unlikely(br_writable(add->perm))) {
err = init_br_wh(sb, /*bindex*/-1, add_branch, add->perm,
- add->nd.dentry, add->nd.mnt);
+ nd_dentry(&add->nd), nd_mnt(&add->nd));
if (unlikely(err)) {
kfree(add_branch);
goto out;
}
}
add_branch->br_xino = NULL;
- add_branch->br_mnt = mntget(add->nd.mnt);
+ add_branch->br_mnt = mntget(nd_mnt(&add->nd));
atomic_set(&add_branch->br_wh_running, 0);
add_branch->br_id = new_br_id(sb);
add_branch->br_perm = add->perm;
@@ -477,13 +478,13 @@ int br_add(struct super_block *sb, struc
dinfo->di_bstart = 0;
iinfo->ii_bstart = 0;
}
- set_h_dptr(root, add_bindex, dget(add->nd.dentry));
- set_h_iptr(root_inode, add_bindex, igrab(add->nd.dentry->d_inode), 0);
+ set_h_dptr(root, add_bindex, dget(nd_dentry(&add->nd)));
+ set_h_iptr(root_inode, add_bindex, igrab(nd_dentry(&add->nd)->d_inode), 0);
if (!add_bindex)
au_cpup_attr_all(root_inode);
else
- au_add_nlink(root_inode, add->nd.dentry->d_inode);
- maxb = add->nd.dentry->d_sb->s_maxbytes;
+ au_add_nlink(root_inode, nd_dentry(&add->nd)->d_inode);
+ maxb = nd_dentry(&add->nd)->d_sb->s_maxbytes;
if (sb->s_maxbytes < maxb)
sb->s_maxbytes = maxb;
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ b/fs/aufs/compat.h 2008-03-11 10:58:38.000000000 -0400
@@ -0,0 +1,49 @@
+#ifndef _AUFS_COMPAT_H_
+#define _AUFS_COMPAT_H_
+
+#include <linux/version.h>
+#include <linux/fs.h>
+#include <linux/seq_file.h>
+static inline int compat_seq_path(struct seq_file *m, struct vfsmount *mnt,
+ struct dentry *dentry, char *esc)
+{
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+ struct path path = { .mnt = mnt, .dentry = dentry, };
+ return seq_path(m, &path, esc);
+#else
+ return seq_path(m, mnt, dentry, esc);
+#endif
+}
+static inline char *compat_d_path(struct dentry *dentry,
+ struct vfsmount *vfsmnt, char *buf,
+ int buflen)
+{
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+ struct path path = { .mnt = vfsmnt, .dentry = dentry, };
+ return d_path(&path, buf, buflen);
+#else
+ return d_path(dentry, vfsmnt, buf, buflen);
+#endif
+}
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+#define nd_dentry(nd) (nd)->path.dentry
+#define nd_mnt(nd) (nd)->path.mnt
+static inline void path_release(struct nameidata *nd)
+{
+ path_put(&nd->path);
+}
+
+#else
+#define nd_dentry(nd) (nd)->dentry
+#define nd_mnt(nd) (nd)->mnt
+
+static inline void iget_failed(struct inode *inode)
+{
+ make_bad_inode(inode);
+ unlock_new_inode(inode);
+ iput(inode);
+}
+#endif
+
+#endif /* _AUFS_COMPAT_H_ */
--- a/fs/aufs/dentry.c 2008-03-10 15:41:21.000000000 -0400
+++ b/fs/aufs/dentry.c 2008-03-11 10:58:38.000000000 -0400
@@ -880,7 +880,7 @@ static int h_d_revalidate(struct dentry
e = au_hin_after_reval(p, dentry, bindex,
nd->intent.open.file);
#ifndef TestingFuse
- au_update_fuse_h_inode(p->mnt, h_dentry);
+ au_update_fuse_h_inode(nd_mnt(p), h_dentry);
/*ignore*/
#endif
if (unlikely(e && !err))
@@ -1084,8 +1084,8 @@ static int aufs_d_revalidate(struct dent
//todo: no more lower nameidata, only here. re-use it.
LKTRTrace("dentry %.*s\n", AuDLNPair(dentry));
- if (nd && nd->dentry)
- LKTRTrace("nd{%.*s, 0x%x}\n", AuDLNPair(nd->dentry), nd->flags);
+ if (nd && nd_dentry(nd))
+ LKTRTrace("nd{%.*s, 0x%x}\n", AuDLNPair(nd_dentry(nd)), nd->flags);
//dir case: AuDebugOn(dentry->d_parent != nd->dentry);
//remove failure case:AuDebugOn(!IS_ROOT(dentry) && d_unhashed(dentry));
AuDebugOn(!dentry->d_fsdata);
--- a/fs/aufs/i_op.c 2008-03-10 15:41:54.000000000 -0400
+++ b/fs/aufs/i_op.c 2008-03-11 10:58:38.000000000 -0400
@@ -52,8 +52,8 @@ static int h_permission(struct inode *h_
err = -EACCES;
if (unlikely((write_mask && IS_IMMUTABLE(h_inode))
|| ((mask & MAY_EXEC) && S_ISREG(h_inode->i_mode)
- && fake_nd && fake_nd->mnt
- && (fake_nd->mnt->mnt_flags & MNT_NOEXEC))
+ && fake_nd && nd_mnt(fake_nd)
+ && (nd_mnt(fake_nd)->mnt_flags & MNT_NOEXEC))
))
goto out;
@@ -170,7 +170,7 @@ static int aufs_permission(struct inode
LKTRTrace("ino %lu, mask 0x%x, nondir %d, write_mask %d, "
"nd %d{%d, %d}\n",
inode->i_ino, mask, nondir, write_mask,
- !!nd, nd ? !!nd->dentry : 0, nd ? !!nd->mnt : 0);
+ !!nd, nd ? !!nd_dentry(nd) : 0, nd ? !!nd_mnt(nd) : 0);
sb = inode->i_sb;
locked = silly_lock(inode, nd);
@@ -869,7 +869,8 @@ static void *aufs_follow_link(struct den
char *buf;
mm_segment_t old_fs;
- LKTRTrace("%.*s, nd %.*s\n", AuDLNPair(dentry), AuDLNPair(nd->dentry));
+ LKTRTrace("%.*s, nd %.*s\n", AuDLNPair(dentry),
+ AuDLNPair(nd_dentry(nd)));
err = -ENOMEM;
buf = __getname();
--- a/fs/aufs/inode.c 2008-03-10 15:41:22.000000000 -0400
+++ b/fs/aufs/inode.c 2008-03-11 10:58:38.000000000 -0400
@@ -323,17 +323,17 @@ struct inode *au_new_inode(struct dentry
LKTRTrace("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW));
if (inode->i_state & I_NEW) {
- sb->s_op->read_inode(inode);
- if (!is_bad_inode(inode)) {
- ii_write_lock_new(inode);
- err = set_inode(inode, dentry);
- //err = -1;
+ err = aufs_read_inode(inode);
+ if (err)
+ goto out_iput;
+ ii_write_lock_new(inode);
+ err = set_inode(inode, dentry);
+ if (err) {
+ ii_write_unlock(inode);
+ goto out_iput;
}
unlock_new_inode(inode);
- if (!err)
- goto out; /* success */
- ii_write_unlock(inode);
- goto out_iput;
+ goto out;
} else {
err = reval_inode(inode, dentry, &match);
if (!err)
@@ -372,7 +372,7 @@ struct inode *au_new_inode(struct dentry
/* force noxino? */
out_iput:
- iput(inode);
+ iget_failed(inode);
inode = ERR_PTR(err);
out:
AuTraceErrPtr(inode);
--- a/fs/aufs/inode.h 2008-03-10 15:41:22.000000000 -0400
+++ b/fs/aufs/inode.h 2008-03-11 10:58:38.000000000 -0400
@@ -51,6 +51,7 @@ struct aufs_icntnr {
int au_refresh_hinode_self(struct inode *inode);
int au_refresh_hinode(struct inode *inode, struct dentry *dentry);
struct inode *au_new_inode(struct dentry *dentry);
+int aufs_read_inode(struct inode *inode);
/* i_op.c */
extern struct inode_operations aufs_iop, aufs_symlink_iop, aufs_dir_iop;
--- a/fs/aufs/misc.c 2008-03-10 15:41:22.000000000 -0400
+++ b/fs/aufs/misc.c 2008-03-11 10:58:38.000000000 -0400
@@ -22,6 +22,7 @@
//#include <linux/namei.h>
//#include <linux/mm.h>
//#include <asm/uaccess.h>
+#include "compat.h"
#include "aufs.h"
void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp)
@@ -86,19 +87,19 @@ struct nameidata *au_fake_dm(struct name
if (!nd)
return NULL;
- fake_nd->dentry = NULL;
- fake_nd->mnt = NULL;
+ nd_dentry(fake_nd) = NULL;
+ nd_mnt(fake_nd) = NULL;
#ifndef CONFIG_AUFS_FAKE_DM
DiMustAnyLock(nd->dentry);
- if (bindex <= dbend(nd->dentry))
- fake_nd->dentry = au_h_dptr_i(nd->dentry, bindex);
- if (fake_nd->dentry) {
- dget(fake_nd->dentry);
- fake_nd->mnt = sbr_mnt(sb, bindex);
- AuDebugOn(!fake_nd->mnt);
- mntget(fake_nd->mnt);
+ if (bindex <= dbend(nd_dentry(nd)))
+ nd_dentry(fake_nd) = au_h_dptr_i(nd_dentry(nd), bindex);
+ if (nd_dentry(fake_nd)) {
+ dget(nd_dentry(fake_nd));
+ nd_mnt(fake_nd) = sbr_mnt(sb, bindex);
+ AuDebugOn(!nd_mnt(fake_nd));
+ mntget(nd_mnt(fake_nd));
} else
fake_nd = ERR_PTR(-ENOENT);
#endif
@@ -111,8 +112,8 @@ void au_fake_dm_release(struct nameidata
{
#ifndef CONFIG_AUFS_FAKE_DM
if (fake_nd) {
- mntput(fake_nd->mnt);
- dput(fake_nd->dentry);
+ mntput(nd_mnt(fake_nd));
+ dput(nd_dentry(fake_nd));
}
#endif
}
--- a/fs/aufs/opts.c 2008-03-10 15:41:22.000000000 -0400
+++ b/fs/aufs/opts.c 2008-03-11 10:58:38.000000000 -0400
@@ -452,7 +452,7 @@ static void dump_opts(struct au_opts *op
u.add = &opt->add;
LKTRTrace("add {b%d, %s, 0x%x, %p}\n",
u.add->bindex, u.add->path, u.add->perm,
- u.add->nd.dentry);
+ nd_dentry(&u.add->nd));
break;
case Opt_del:
case Opt_idel:
@@ -469,13 +469,13 @@ static void dump_opts(struct au_opts *op
u.add = &opt->add;
LKTRTrace("append {b%d, %s, 0x%x, %p}\n",
u.add->bindex, u.add->path, u.add->perm,
- u.add->nd.dentry);
+ nd_dentry(&u.add->nd));
break;
case Opt_prepend:
u.add = &opt->add;
LKTRTrace("prepend {b%d, %s, 0x%x, %p}\n",
u.add->bindex, u.add->path, u.add->perm,
- u.add->nd.dentry);
+ nd_dentry(&u.add->nd));
break;
case Opt_dirwh:
LKTRTrace("dirwh %d\n", opt->dirwh);
@@ -660,7 +660,7 @@ static int opt_add(struct au_opt *opt, c
if (!err) {
if (!p /* && add->perm == AuBr_Last */) {
add->perm = AuBr_RO;
- if (au_test_def_rr(add->nd.dentry->d_sb))
+ if (au_test_def_rr(nd_dentry(&add->nd)->d_sb))
add->perm = AuBr_RR;
if (!bindex && !(sb->s_flags & MS_RDONLY))
add->perm = AuBr_RW;
@@ -760,7 +760,7 @@ int au_opts_parse(struct super_block *sb
u.del->path, err);
break;
}
- u.del->h_root = dget(nd.dentry);
+ u.del->h_root = dget(nd_dentry(&nd));
path_release(&nd);
opt->type = token;
break;
@@ -806,7 +806,7 @@ int au_opts_parse(struct super_block *sb
u.mod->path, err);
break;
}
- u.mod->h_root = dget(nd.dentry);
+ u.mod->h_root = dget(nd_dentry(&nd));
path_release(&nd);
opt->type = token;
break;
@@ -868,7 +868,7 @@ int au_opts_parse(struct super_block *sb
aufs_read_lock(root, AuLock_FLUSH);
bend = sbend(sb);
for (bindex = 0; bindex <= bend; bindex++) {
- if (au_h_dptr_i(root, bindex) == nd.dentry) {
+ if (au_h_dptr_i(root, bindex) == nd_dentry(&nd)) {
u.xino_itrunc->bindex = bindex;
break;
}
--- a/fs/aufs/super.c 2008-03-10 15:41:22.000000000 -0400
+++ b/fs/aufs/super.c 2008-03-11 10:58:38.000000000 -0400
@@ -42,6 +42,7 @@ typedef struct namespace au_mnt_ns_t;
#define au_mnt_ns(tsk) (tsk)->namespace
#endif
+#include "compat.h"
#include "aufs.h"
/*
@@ -73,7 +74,7 @@ static void aufs_destroy_inode(struct in
}
//todo: how about merge with alloc_inode()?
-static void aufs_read_inode(struct inode *inode)
+int aufs_read_inode(struct inode *inode)
{
int err;
#if 0
@@ -93,11 +94,11 @@ static void aufs_read_inode(struct inode
inode->i_fop = &aufs_file_fop;
inode->i_mapping->a_ops = &aufs_aop;
//inode->i_mapping->backing_dev_info = &bdi;
- return; /* success */
+ return err; /* success */
}
LKTRTrace("intializing inode info failed(%d)\n", err);
- make_bad_inode(inode);
+ return err;
}
int au_show_brs(struct seq_file *seq, struct super_block *sb)
@@ -114,8 +115,8 @@ int au_show_brs(struct seq_file *seq, st
err = 0;
bend = sbend(sb);
for (bindex = 0; !err && bindex <= bend; bindex++) {
- err = seq_path(seq, sbr_mnt(sb, bindex),
- au_h_dptr_i(root, bindex), au_esc_chars);
+ err = compat_seq_path(seq, sbr_mnt(sb, bindex),
+ au_h_dptr_i(root, bindex), au_esc_chars);
if (err > 0)
err = seq_printf
(seq, "=%s",
@@ -148,7 +149,8 @@ static int aufs_show_options(struct seq_
if (unlikely(err))
goto out;
xino = sbinfo->si_xib;
- err = seq_path(m, xino->f_vfsmnt, xino->f_dentry, au_esc_chars);
+ err = compat_seq_path(m, xino->f_vfsmnt, xino->f_dentry,
+ au_esc_chars);
if (unlikely(err <= 0))
goto out;
err = 0;
@@ -747,7 +749,6 @@ static int aufs_remount_fs(struct super_
static struct super_operations aufs_sop = {
.alloc_inode = aufs_alloc_inode,
.destroy_inode = aufs_destroy_inode,
- .read_inode = aufs_read_inode,
//.dirty_inode = aufs_dirty_inode,
//.write_inode = aufs_write_inode,
//void (*put_inode) (struct inode *);
@@ -856,18 +857,24 @@ static int alloc_root(struct super_block
AuTraceEnter();
err = -ENOMEM;
- inode = iget(sb, AUFS_ROOT_INO);
+ inode = iget_locked(sb, AUFS_ROOT_INO);
//if (LktrCond) {iput(inode); inode = NULL;}
if (unlikely(!inode))
goto out;
err = PTR_ERR(inode);
if (IS_ERR(inode))
goto out;
- err = -ENOMEM;
- if (unlikely(is_bad_inode(inode)))
- goto out_iput;
+ err = -EINVAL;
+ if (inode->i_state & I_NEW) {
+ err = aufs_read_inode(inode);
+ if (err) {
+ iget_failed(inode);
+ goto out;
+ }
+ }
inode->i_mode = S_IFDIR;
+ unlock_new_inode(inode);
root = d_alloc_root(inode);
//if (LktrCond) {igrab(inode); dput(root); root = NULL;}
if (unlikely(!root))
--- a/fs/aufs/sysaufs.c 2008-03-11 10:58:13.000000000 -0400
+++ b/fs/aufs/sysaufs.c 2008-03-11 10:58:38.000000000 -0400
@@ -26,6 +26,7 @@
#include <linux/fs.h>
#include <../fs/sysfs/sysfs.h>
#endif
+#include "compat.h"
#include "aufs.h"
/* ---------------------------------------------------------------------- */
@@ -127,7 +128,17 @@ SbFuncBody(_index, func)
SbFunc(read_##name, index, sysaufs_read) \
SbFunc(write_##name, index, sysaufs_free_write)
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+static struct kset *aufs_subsys;
+#define AUFS_SUBSYS aufs_subsys
+
+/* No, not really, but we'll handle fs_kobj manually */
+#define FS_SUBSYS NULL
+#else
static decl_subsys(aufs, NULL, NULL);
+#define AUFS_SUBSYS &aufs_subsys
+#define FS_SUBSYS &fs_subsys
+#endif
enum {
Brs, Stat, Config,
#ifdef CONFIG_AUFS_DEBUG
@@ -252,22 +263,34 @@ static void unreg(au_subsys_t *subsys, s
free_entry(a);
}
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+ kset_unregister(subsys);
+#else
subsystem_unregister(subsys);
subsys_put(parent);
+#endif
}
static int reg(au_subsys_t *subsys, struct sysaufs_entry *a, int n,
au_subsys_t *parent)
{
- int err, i;
+ int err = 0, i;
AuTraceEnter();
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+ if (!subsys->kobj.parent) {
+ subsys->kobj.parent = &aufs_subsys->kobj;
+ kset_register(subsys);
+ }
+#else
subsys_get(parent);
kobj_set_kset_s(&au_subsys_to_kset(*subsys), *parent);
err = subsystem_register(subsys);
if (unlikely(err))
goto out;
+#endif
for (i = 0; !err && i < n; i++) {
a[i].err = sysfs_create_bin_file
@@ -277,7 +300,7 @@ static int reg(au_subsys_t *subsys, stru
if (unlikely(err))
unreg(subsys, a, n, parent);
- out:
+out:
AuTraceErr(err);
return err;
}
@@ -302,8 +325,9 @@ void sysaufs_add(struct aufs_sbinfo *sbi
SbSetEntry(SysaufsSb_XINO, xino, 128);
err = kobject_set_name(&au_subsys_to_kset(sa->subsys).kobj, "%p",
sbinfo->si_mnt->mnt_sb);
+
if (!err)
- err = reg(&sa->subsys, sa->array, SysaufsSb_Last, &aufs_subsys);
+ err = reg(&sa->subsys, sa->array, SysaufsSb_Last, AUFS_SUBSYS);
if (unlikely(err))
AuWarn("failed adding sysfs (%d)\n", err);
@@ -317,7 +341,7 @@ void sysaufs_del(struct aufs_sbinfo *sbi
AuTraceEnter();
mutex_lock(&aufs_sbilist_mtx);
- unreg(&sa->subsys, sa->array, SysaufsSb_Last, &aufs_subsys);
+ unreg(&sa->subsys, sa->array, SysaufsSb_Last, AUFS_SUBSYS);
list_del(&sbinfo->si_list);
free_entries();
mutex_unlock(&aufs_sbilist_mtx);
@@ -358,7 +382,7 @@ static int make_brs(struct seq_file *seq
if (!err)
err = seq_putc(seq, ' ');
if (!err)
- err = seq_path(seq, mnt, root, au_esc_chars);
+ err = compat_seq_path(seq, mnt, root, au_esc_chars);
if (err > 0)
err = seq_printf(seq, " %p br:", sb);
if (!err)
@@ -697,7 +721,7 @@ static sysaufs_op g_ops[] = {
int __init sysaufs_init(void)
{
- int err;
+ int err = 0;
GSetEntry(Brs, brs, 128);
GSetEntry(Stat, stat, 32);
@@ -705,7 +729,15 @@ int __init sysaufs_init(void)
#ifdef CONFIG_AUFS_DEBUG
GSetEntry(Debug, debug, 32);
#endif
- err = reg(&aufs_subsys, g_array, _Last, &fs_subsys);
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+ aufs_subsys = kset_create_and_add("aufs", NULL, fs_kobj);
+ if (!aufs_subsys)
+ err = -ENOMEM;
+#endif
+
+ if (!err)
+ err = reg(AUFS_SUBSYS, g_array, _Last, FS_SUBSYS);
AuTraceErr(err);
return err;
}
@@ -713,7 +745,7 @@ int __init sysaufs_init(void)
void sysaufs_fin(void)
{
mutex_lock(&aufs_sbilist_mtx);
- unreg(&aufs_subsys, g_array, _Last, &fs_subsys);
+ unreg(AUFS_SUBSYS, g_array, _Last, FS_SUBSYS);
mutex_unlock(&aufs_sbilist_mtx);
}
--- a/fs/aufs/vfsub.c 2008-03-11 10:58:13.000000000 -0400
+++ b/fs/aufs/vfsub.c 2008-03-11 10:58:38.000000000 -0400
@@ -94,7 +94,7 @@ int do_vfsub_create(struct inode *dir, s
if (!err) {
mnt = NULL;
if (nd)
- mnt = nd->mnt;
+ mnt = nd_mnt(nd);
/* dir inode is locked */
au_update_fuse_h_inode(mnt, dentry->d_parent); /*ignore*/
au_update_fuse_h_inode(mnt, dentry); /*ignore*/
--- a/fs/aufs/vfsub.h 2008-03-10 15:41:22.000000000 -0400
+++ b/fs/aufs/vfsub.h 2008-03-11 10:58:38.000000000 -0400
@@ -33,6 +33,8 @@
#include <linux/inotify.h>
#endif
+#include "compat.h"
+
/* ---------------------------------------------------------------------- */
/* vfsub flags */
@@ -284,7 +286,7 @@ int vfsub_path_lookup(const char *name,
err = path_lookup(name, flags, nd);
/* lockdep_on(); */
if (!err)
- au_update_fuse_h_inode(nd->mnt, nd->dentry); /*ignore*/
+ au_update_fuse_h_inode(nd_mnt(nd), nd_dentry(nd)); /*ignore*/
return err;
}
@@ -336,7 +338,7 @@ int vfsub_vfs_path_lookup(struct dentry
err = vfs_path_lookup(parent, mnt, name, flags, nd);
lockdep_on();
if (!err)
- au_update_fuse_h_inode(mnt, nd->dentry); /*ignore*/
+ au_update_fuse_h_inode(mnt, nd_dentry(nd)); /*ignore*/
AuTraceErr(err);
return err;
--- a/fs/aufs/xino.c 2008-03-10 15:41:22.000000000 -0400
+++ b/fs/aufs/xino.c 2008-03-11 10:58:38.000000000 -0400
@@ -1195,8 +1195,9 @@ struct file *xino_def(struct super_block
//if (LktrCond) {__putname(page); page = NULL;}
if (unlikely(!page))
goto out;
- p = d_path(au_h_dptr_i(sb->s_root, bwr), sbr_mnt(sb, bwr), page,
- PATH_MAX - sizeof(AUFS_XINO_FNAME));
+ p = compat_d_path(au_h_dptr_i(sb->s_root, bwr),
+ sbr_mnt(sb, bwr), page,
+ PATH_MAX - sizeof(AUFS_XINO_FNAME));
//if (LktrCond) p = ERR_PTR(-1);
file = (void *)p;
if (p && !IS_ERR(p)) {
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/