-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Tested 2.6.23-rc6 - didn't solve the BUG.
But I think I fixed the sysfs support compared to the previous patch,
therefore:
aufs 20070903
aufs test_add:455:exe[1828]: uid/gid/perm /root 0/0/0755, 0/0/01777
/config
CONFIG_AUFS=m
CONFIG_AUFS_FAKE_DM=y
CONFIG_AUFS_BRANCH_MAX_127=y
CONFIG_AUFS_SYSAUFS=y
CONFIG_AUFS_LHASH_PATCH=y
CONFIG_AUFS_DEBUG=y
/brs
aufs /root be934800 br:/root/cow=rw:/root=ro
/stats
wkq max_busy: 1 0 0 0, 0(generic)
Not sure why there were all these i_size_write calls?
Jan-Marek
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
iD8DBQFG5sKAj6MK58wZA3cRAstqAJ9gr87RyZDebBz5kM3M/lrlQH51WgCeMYHt
kaf58YzFzlNT9W66Tk2zUNg=
=kcRc
-----END PGP SIGNATURE-----
Index: fs/aufs/f_op.c
===================================================================
RCS file: /cvsroot/aufs/aufs/fs/aufs/f_op.c,v
retrieving revision 1.33
diff -u -r1.33 f_op.c
--- fs/aufs/f_op.c 12 Aug 2007 21:54:06 -0000 1.33
+++ fs/aufs/f_op.c 11 Sep 2007 14:59:13 -0000
@@ -391,10 +391,10 @@
}
#endif /* CONFIG_AUFS_ROBR */
-static struct page *aufs_nopage(struct vm_area_struct *vma, unsigned long addr,
- int *type)
+static int aufs_fault(struct vm_area_struct *vma,
+ struct vm_fault *vmf)
{
- struct page *page;
+ int page;
struct dentry *dentry;
struct file *file, *hidden_file;
struct inode *inode;
@@ -406,7 +406,7 @@
wait_event(wq, (file = safe_file(vma)));
AuDebugOn(!au_is_aufs(file->f_dentry->d_sb));
dentry = file->f_dentry;
- LKTRTrace("%.*s, addr %lx\n", DLNPair(dentry), addr);
+ LKTRTrace("%.*s, page offset %lu\n", DLNPair(dentry), vmf->pgoff);
inode = dentry->d_inode;
AuDebugOn(!S_ISREG(inode->i_mode));
@@ -416,7 +416,7 @@
AuDebugOn(!hidden_file || !au_is_mmapped(file));
vma->vm_file = hidden_file;
//smp_mb();
- page = finfo->fi_h_vm_ops->nopage(vma, addr, type);
+ page = finfo->fi_h_vm_ops->fault(vma, vmf);
reset_file(vma, file);
#if 0 //def CONFIG_SMP
//wake_up_nr(&wq, online_cpu - 1);
@@ -424,32 +424,21 @@
#else
wake_up(&wq);
#endif
- if (!IS_ERR(page)) {
+/* if (!IS_ERR(page)) {
//page->mapping = file->f_mapping;
//get_page(page);
//file->f_mapping = hidden_file->f_mapping;
//touch_atime(NULL, dentry);
//inode->i_atime = hidden_file->f_dentry->d_inode->i_atime;
- }
- TraceErrPtr(page);
+ }*/
+// TraceErrPtr(page);
return page;
}
-static int aufs_populate(struct vm_area_struct *vma, unsigned long addr,
- unsigned long len, pgprot_t prot, unsigned long pgoff,
- int nonblock)
-{
- Err("please report me this application\n");
- BUG();
- return ftofi(vma->vm_file)->fi_h_vm_ops->populate
- (vma, addr, len, prot, pgoff, nonblock);
-}
-
static struct vm_operations_struct aufs_vm_ops = {
//.open = aufs_vmaopen,
//.close = aufs_vmaclose,
- .nopage = aufs_nopage,
- .populate = aufs_populate,
+ .fault = aufs_fault,
//page_mkwrite(struct vm_area_struct *vma, struct page *page)
};
Index: fs/aufs/module.c
===================================================================
RCS file: /cvsroot/aufs/aufs/fs/aufs/module.c,v
retrieving revision 1.19
diff -u -r1.19 module.c
--- fs/aufs/module.c 12 Aug 2007 21:56:04 -0000 1.19
+++ fs/aufs/module.c 11 Sep 2007 14:59:13 -0000
@@ -31,7 +31,7 @@
static int __init create_cache(void)
{
#define Cache(type) kmem_cache_create(#type, sizeof(struct type), 0, \
- SLAB_RECLAIM_ACCOUNT, NULL, NULL)
+ SLAB_RECLAIM_ACCOUNT, NULL)
if ((aufs_cachep[AuCache_DINFO] = Cache(aufs_dinfo))
&& (aufs_cachep[AuCache_ICNTNR] = Cache(aufs_icntnr))
Index: fs/aufs/sysaufs.c
===================================================================
RCS file: /cvsroot/aufs/aufs/fs/aufs/sysaufs.c,v
retrieving revision 1.14
diff -u -r1.14 sysaufs.c
--- fs/aufs/sysaufs.c 30 Jul 2007 04:12:23 -0000 1.14
+++ fs/aufs/sysaufs.c 11 Sep 2007 14:59:13 -0000
@@ -39,7 +39,8 @@
offset, size_t sz, struct sysaufs_args *args);
#define GFunc(name, _index, func) \
-static ssize_t name(struct kobject *kobj, char *buf, loff_t offset, size_t sz)
\
+static ssize_t name(struct kobject *kobj, struct bin_attribute *attr, \
+ char *buf, loff_t offset, size_t sz) \
{ \
struct sysaufs_args args = { \
.index = (_index), \
@@ -89,7 +90,8 @@
}
#define SbFunc(name, _index, func) \
-static ssize_t name(struct kobject *kobj, char *buf, loff_t offset, size_t sz)
\
+static ssize_t name(struct kobject *kobj, struct bin_attribute *attr, \
+ char *buf, loff_t offset, size_t sz) \
{ \
struct sysaufs_args args = { \
.index = (_index), \
@@ -275,7 +277,7 @@
/* ---------------------------------------------------------------------- */
static int make_brs(struct seq_file *seq, struct sysaufs_args *args,
- int *do_size)
+ int *do_free)
{
int err;
struct aufs_sbinfo *sbinfo;
@@ -317,7 +319,7 @@
}
static int make_config(struct seq_file *seq, struct sysaufs_args *args,
- int *do_size)
+ int *do_free)
{
int err;
@@ -388,14 +390,14 @@
}
static int make_stat(struct seq_file *seq, struct sysaufs_args *args,
- int *do_size)
+ int *do_free)
{
int err, i;
TraceEnter();
AuDebugOn(args->index != Stat);
- *do_size = 0;
+ *do_free = 1;
err = seq_puts(seq, "wkq max_busy:");
for (i = 0; !err && i < aufs_nwkq; i++)
err = seq_printf(seq, " %u", au_wkq[i].max_busy);
@@ -408,8 +410,7 @@
/* ---------------------------------------------------------------------- */
-static int make(struct sysaufs_entry *e, struct sysaufs_args *args,
- int *do_size)
+static int make(struct sysaufs_entry *e, struct sysaufs_args *args, int
*do_free)
{
int err;
struct seq_file *seq;
@@ -436,7 +437,7 @@
if (unlikely(Allocated(e) <= 0))
seq->size = PAGE_SIZE << -Allocated(e);
- err = e->ops[args->index](seq, args, do_size);
+ err = e->ops[args->index](seq, args, do_free);
if (!err) {
Len(e) = seq->count;
break; /* success */
@@ -457,27 +458,6 @@
return err;
}
-/* why does sysfs pass my parent kobject? */
-static struct dentry *find_me(struct dentry *parent, struct sysaufs_entry *e)
-{
-#if 1
- struct dentry *dentry;
- const char *name = Name(e);
- const unsigned int len = strlen(name);
-
- spin_lock(&dcache_lock);
- list_for_each_entry(dentry, &parent->d_subdirs, D_CHILD) {
- if (len == dentry->d_name.len
- && !strcmp(dentry->d_name.name, name)) {
- spin_unlock(&dcache_lock);
- return dentry;
- }
- }
- spin_unlock(&dcache_lock);
-#endif
- return NULL;
-}
-
static ssize_t sysaufs_read(struct kobject *kobj, char *buf, loff_t offset,
size_t sz, struct sysaufs_args *args)
{
@@ -485,7 +465,7 @@
loff_t len;
struct dentry *d;
struct sysaufs_entry *e;
- int do_size;
+ int do_free = 0;
LKTRTrace("{%d, %p}, offset %Ld, sz %lu\n",
args->index, args->sb, offset, (unsigned long)sz);
@@ -499,17 +479,11 @@
if (args->sb)
e = stosi(args->sb)->si_sysaufs.array + args->index;
- do_size = 1;
if (args->mtx)
mutex_lock(args->mtx);
if (unlikely(!Priv(e))) {
- err = make(e, args, &do_size);
+ err = make(e, args, &do_free);
AuDebugOn(Len(e) > INT_MAX);
- if (do_size) {
- d = find_me(kobj->dentry, e);
- if (d)
- i_size_write(d->d_inode, Len(e));
- }
}
if (!err) {
@@ -521,7 +495,7 @@
memcpy(buf, Priv(e) + offset, err);
}
- if (!do_size)
+ if (do_free)
free_entry(e);
}
if (args->mtx)
@@ -535,7 +509,6 @@
loff_t offset, size_t sz,
struct sysaufs_args *args)
{
- struct dentry *d;
int allocated, len;
struct sysaufs_entry *e;
@@ -561,10 +534,6 @@
else
Allocated(e)++;
}
-
- d = find_me(kobj->dentry, e);
- if (d && i_size_read(d->d_inode))
- i_size_write(d->d_inode, 0);
}
if (args->mtx)
mutex_unlock(args->mtx);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/