-----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/

Reply via email to