Hi, Okajima,

We run aufs 2.2-39 on top of jffs2. When I run this sequence of
operations repeatedly for a long time (2 to 3 hours, 300+ repeats):
[1] move two folders holder1/ and holder2/ into a folder holder3/ .
create new folders holder1/ and holder2/
[2] untar a tar.gz of 100 files into the newly created holder1/ and holder2/
[3] delete holder3/holder1/ and holder3/holder2
[4] sleep 1 second and go to [1] to repeat the sequence.

The kernel got errors with these messages:

[ 8366.780000] aufs au_xino_do_write:380:tar[814]: I/O Error, write
failed (4294967268)
[ 8366.800000] aufs au_xino_write:416:tar[814]: I/O Error, write failed (-5)
[ 8366.800000] aufs au_set_h_iptr:89:tar[814]: I/O Error, failed
au_xino_write() -5

The first error code 4294967268 is E4, or -28, -ENOSPC. Reading the
jjfs2.pdf from the web, it states: "If there is not enough dirty space
... the kernel thread will sleep, and wirtes will fail with -ENOSPC
errors". Have you seen this before? Do you think I'm hitting this
situation?

I assume the delete and create go through different paths thus the
jffs2 space has not been released when it creates new files. If in
"au_xino_do_write" I let it wait for a while and retry the write,
would it be a reasonable work-around?

I patched the code to reduce the file name length by 1 so that it
builds. Pasted below is the patch. Hope this is not the cause to the
problem. Any comment?

By the way, aufs has been a very thoughtful project in both its design
and implementation. Greatly appreciate your work on it and hope
everything goes well with it!

Thanks.
-Minghua


--- /home/dev/tmpaufs/aufs2-
standalone/include/linux/aufs_type.h
2012-03-21 08:52:46.000000000 -0700
+++ ./include/linux/aufs_type.h    2012-05-16 19:54:52.057374473 -0700
@@ -77,7 +77,7 @@
 #define AUFS_WH_PFX_LEN        ((int)sizeof(AUFS_WH_PFX) - 1)
 #define AUFS_WH_TMP_LEN        4
 /* a limit for rmdir/rename a dir */
-#define AUFS_MAX_NAMELEN    (NAME_MAX \
+#define AUFS_MAX_NAMELEN    ((NAME_MAX-1) \
                 - AUFS_WH_PFX_LEN * 2    /* doubly whiteouted */\
                 - 1            /* dot */\
                 - AUFS_WH_TMP_LEN)    /* hex */

diff -r -u /home/dev2/tmpaufs/aufs2-standalone/fs/aufs/branch.c
./././fs/aufs/branch.c
--- /home/dev2/tmpaufs/aufs2-standalone/fs/aufs/branch.c    2012-03-21
08:52:46.000000000 -0700
+++ ./././fs/aufs/branch.c    2012-05-16 19:56:15.762383914 -0700
@@ -334,7 +334,7 @@
         goto out;
     err = -EINVAL;
     h_dentry = path->dentry;
-    if (kst.f_namelen >= NAME_MAX)
+    if (kst.f_namelen >= (NAME_MAX-1))
         err = au_br_init_wh(sb, br, perm, h_dentry);
     else
         pr_err("%.*s(%s), unsupported namelen %ld\n",
diff -r -u /home/dev/tmpaufs/aufs2-standalone/fs/aufs/debug.c
./././fs/aufs/debug.c
--- /home/dev/tmpaufs/aufs2-standalone/fs/aufs/debug.c    2012-03-21
08:52:46.000000000 -0700
+++ ./././fs/aufs/debug.c    2012-05-16 19:56:51.142385473 -0700
@@ -475,7 +475,7 @@
     AuDebugOn(bindex >= 0);

     destr.len = -1;
-    AuDebugOn(destr.len < NAME_MAX);
+    AuDebugOn(destr.len < (NAME_MAX-1));

 #ifdef CONFIG_4KSTACKS
     pr_warning("CONFIG_4KSTACKS is defined.\n");
diff -r -u /home/dev/tmpaufs/aufs2-standalone/fs/aufs/dir.c ./././fs/aufs/dir.c
--- /home/dev/tmpaufs/aufs2-standalone/fs/aufs/dir.c    2012-03-21
08:52:46.000000000 -0700
+++ ./././fs/aufs/dir.c    2012-05-16 19:57:35.178384341 -0700
@@ -82,8 +82,8 @@
         sz = roundup_pow_of_two(sz);
     if (sz > KMALLOC_MAX_SIZE)
         sz = KMALLOC_MAX_SIZE;
-    else if (sz < NAME_MAX) {
-        BUILD_BUG_ON(AUFS_RDBLK_DEF < NAME_MAX);
+    else if (sz < (NAME_MAX-1)) {
+        BUILD_BUG_ON(AUFS_RDBLK_DEF < (NAME_MAX-1));
         sz = AUFS_RDBLK_DEF;
     }
     return sz;
diff -r -u /home/dev/tmpaufs/aufs2-standalone/fs/aufs/opts.c
./././fs/aufs/opts.c
--- /home/dev/tmpaufs/aufs2-standalone/fs/aufs/opts.c    2012-03-21
08:52:46.000000000 -0700
+++ ./././fs/aufs/opts.c    2012-05-16 19:58:36.045385686 -0700
@@ -1043,9 +1043,9 @@
                 pr_err("bad integer in %s\n", opt_str);
                 break;
             }
-            if (unlikely(n && n < NAME_MAX)) {
+            if (unlikely(n && n < (NAME_MAX-1))) {
                 pr_err("rdblk must be larger than %d\n",
-                       NAME_MAX);
+                       (NAME_MAX-1));
                 break;
             }
             opt->rdblk = n;
diff -r -u /home/dev/tmpaufs/aufs2-standalone/fs/aufs/whout.c
./././fs/aufs/whout.c
--- /home/dev/tmpaufs/aufs2-standalone/fs/aufs/whout.c    2012-03-21
08:52:46.000000000 -0700
+++ ./././fs/aufs/whout.c    2012-05-16 19:59:25.729383695 -0700
@@ -120,7 +120,7 @@
 {
     struct dentry *dentry;
     int i;
-    char defname[NAME_MAX - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN + 1],
+    char defname[(NAME_MAX-1) - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN + 1],
         *name, *p;
     /* strict atomic_t is unnecessary here */
     static unsigned short cnt;
@@ -132,7 +132,7 @@
     qs.len = sizeof(defname) - DNAME_INLINE_LEN + prefix->len - 1;
     if (unlikely(prefix->len > DNAME_INLINE_LEN)) {
         dentry = ERR_PTR(-ENAMETOOLONG);
-        if (unlikely(qs.len > NAME_MAX))
+        if (unlikely(qs.len > (NAME_MAX-1)))
             goto out;
         dentry = ERR_PTR(-ENOMEM);
         name = kmalloc(qs.len + 1, GFP_NOFS);

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev

Reply via email to