All of lore.kernel.org
 help / color / mirror / Atom feed
* Failing INOTIFY in 3.6.x?
@ 2012-11-02 18:38 Lluís Batlle i Rossell
  2012-11-04 23:21 ` Failing readdir() on 3.6 (was: Failing INOTIFY in 3.6.x?) Lluís Batlle i Rossell
  0 siblings, 1 reply; 6+ messages in thread
From: Lluís Batlle i Rossell @ 2012-11-02 18:38 UTC (permalink / raw)
  To: linux-mips

Hello,

updating my kernel from 3.4.2 to 3.6.4, I've noticed that upstart deadlocks at
the very start. Stracing, I think it has to do with INOTIFY, because it
deadlocks very early and little more has been done then.

Going 'back' to 3.4.16, makes upstart work fine. I've not tested middle kernels.

I've seen this only on the fuloong minipc (mips n64), but I've done similar
steps with the same distributions on armv5tel, i686 and x86_64, and there all
works fine.

Does anybody know of anything broken around inotify, between 3.4 and 3.6 linux
mips?

Any suggestion on what kernel change could have related to this, and so, get a
clue about what middle version to test?

Regards,
Lluís.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Failing readdir() on 3.6 (was: Failing INOTIFY in 3.6.x?)
  2012-11-02 18:38 Failing INOTIFY in 3.6.x? Lluís Batlle i Rossell
@ 2012-11-04 23:21 ` Lluís Batlle i Rossell
  2012-11-05  7:32   ` Lluís Batlle i Rossell
  0 siblings, 1 reply; 6+ messages in thread
From: Lluís Batlle i Rossell @ 2012-11-04 23:21 UTC (permalink / raw)
  To: linux-mips

I've investigated better the issue.

I found that, in 3.4 vs 3.6.4, the behaviour that changed is that of readdir().

Using the same userland binaries, I've run a little program in both kernels:
-------- prova.c
#include <sys/types.h>
#include <dirent.h>

int main() {
        DIR *d = opendir("/etc/init");

        if (d == NULL) {
                fprintf(stderr, "d NULL\n");
                return -1;
        }

        struct dirent *ent;
        ent = readdir(d);

        if (ent == NULL) {
                fprintf(stderr, "ent NULL\n");
                return -1;
        }
}
-----------


This program does not print anything on 3.4, but on 3.6, it prints "ent NULL".

In both cases, /etc/init is full of symlinks, like this (from a script session
in 3.6.4):
-------
S'ha iniciat l'execució de script a dl 05 nov 2012 00:16:53 CET
sh-4.2# ./prova
ent NULL
sh-4.2# ls -ld /etc/init
drwxr-xr-x 2 root root 4096  5 nov 00:12 /etc/init
sh-4.2# ls -l /etc/init
total 0
lrwxrwxrwx 1 root root 25  5 nov 00:12 atd.conf -> /etc/static/init/atd.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 boot.conf -> /etc/static/init/boot.conf
lrwxrwxrwx 1 root root 40  5 nov 00:12 control-alt-delete.conf -> /etc/static/init/control-alt-delete.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 cron.conf -> /etc/static/init/cron.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 dbus.conf -> /etc/static/init/dbus.conf
lrwxrwxrwx 1 root root 28  5 nov 00:12 dhcpcd.conf -> /etc/static/init/dhcpcd.conf
lrwxrwxrwx 1 root root 37  5 nov 00:12 emergency-shell.conf -> /etc/static/init/emergency-shell.conf
lrwxrwxrwx 1 root root 37  5 nov 00:12 invalidate-nscd.conf -> /etc/static/init/invalidate-nscd.conf
lrwxrwxrwx 1 root root 25  5 nov 00:12 kbd.conf -> /etc/static/init/kbd.conf
lrwxrwxrwx 1 root root 27  5 nov 00:12 klogd.conf -> /etc/static/init/klogd.conf
lrwxrwxrwx 1 root root 25  5 nov 00:12 lvm.conf -> /etc/static/init/lvm.conf
lrwxrwxrwx 1 root root 30  5 nov 00:12 mountall.conf -> /etc/static/init/mountall.conf
lrwxrwxrwx 1 root root 36  5 nov 00:12 mountall-ip-up.conf -> /etc/static/init/mountall-ip-up.conf
lrwxrwxrwx 1 root root 34  5 nov 00:12 mount-failed.conf -> /etc/static/init/mount-failed.conf
lrwxrwxrwx 1 root root 32  5 nov 00:12 networking.conf -> /etc/static/init/networking.conf
lrwxrwxrwx 1 root root 40  5 nov 00:12 network-interfaces.conf -> /etc/static/init/network-interfaces.conf
lrwxrwxrwx 1 root root 32  5 nov 00:12 nix-daemon.conf -> /etc/static/init/nix-daemon.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 nscd.conf -> /etc/static/init/nscd.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 ntpd.conf -> /etc/static/init/ntpd.conf
lrwxrwxrwx 1 root root 30  5 nov 00:12 runlevel.conf -> /etc/static/init/runlevel.conf
lrwxrwxrwx 1 root root 30  5 nov 00:12 shutdown.conf -> /etc/static/init/shutdown.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 sshd.conf -> /etc/static/init/sshd.conf
lrwxrwxrwx 1 root root 29  5 nov 00:12 syslogd.conf -> /etc/static/init/syslogd.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 tty1.conf -> /etc/static/init/tty1.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 tty2.conf -> /etc/static/init/tty2.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 tty3.conf -> /etc/static/init/tty3.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 tty4.conf -> /etc/static/init/tty4.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 tty5.conf -> /etc/static/init/tty5.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 tty6.conf -> /etc/static/init/tty6.conf
lrwxrwxrwx 1 root root 26  5 nov 00:12 udev.conf -> /etc/static/init/udev.conf
lrwxrwxrwx 1 root root 33  5 nov 00:12 udevtrigger.conf -> /etc/static/init/udevtrigger.conf
sh-4.2# exit

S'ha finalitzat l'execució de script a dl 05 nov 2012 00:17:22 CET
--------




On Fri, Nov 02, 2012 at 07:38:28PM +0100, Lluís Batlle i Rossell wrote:
> Hello,
> 
> updating my kernel from 3.4.2 to 3.6.4, I've noticed that upstart deadlocks at
> the very start. Stracing, I think it has to do with INOTIFY, because it
> deadlocks very early and little more has been done then.
> 
> Going 'back' to 3.4.16, makes upstart work fine. I've not tested middle kernels.
> 
> I've seen this only on the fuloong minipc (mips n64), but I've done similar
> steps with the same distributions on armv5tel, i686 and x86_64, and there all
> works fine.
> 
> Does anybody know of anything broken around inotify, between 3.4 and 3.6 linux
> mips?
> 
> Any suggestion on what kernel change could have related to this, and so, get a
> clue about what middle version to test?
> 
> Regards,
> Lluís.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Failing readdir() on 3.6 (was: Failing INOTIFY in 3.6.x?)
  2012-11-04 23:21 ` Failing readdir() on 3.6 (was: Failing INOTIFY in 3.6.x?) Lluís Batlle i Rossell
@ 2012-11-05  7:32   ` Lluís Batlle i Rossell
  2012-11-05 21:20     ` Broken readdir() since 3.5 for ext3 on mips-n32 Lluís Batlle i Rossell
  0 siblings, 1 reply; 6+ messages in thread
From: Lluís Batlle i Rossell @ 2012-11-05  7:32 UTC (permalink / raw)
  To: linux-mips

This same issue below happens to me in 3.5.7 too. So, the change is somewhere
between 3.4 and 3.5.

Regards,
Lluís.

On Mon, Nov 05, 2012 at 12:21:19AM +0100, Lluís Batlle i Rossell wrote:
> I've investigated better the issue.
> 
> I found that, in 3.4 vs 3.6.4, the behaviour that changed is that of readdir().
> 
> Using the same userland binaries, I've run a little program in both kernels:
> -------- prova.c
> #include <sys/types.h>
> #include <dirent.h>
> 
> int main() {
>         DIR *d = opendir("/etc/init");
> 
>         if (d == NULL) {
>                 fprintf(stderr, "d NULL\n");
>                 return -1;
>         }
> 
>         struct dirent *ent;
>         ent = readdir(d);
> 
>         if (ent == NULL) {
>                 fprintf(stderr, "ent NULL\n");
>                 return -1;
>         }
> }
> -----------
> 
> 
> This program does not print anything on 3.4, but on 3.6, it prints "ent NULL".
> 
> In both cases, /etc/init is full of symlinks, like this (from a script session
> in 3.6.4):
> -------
> S'ha iniciat l'execució de script a dl 05 nov 2012 00:16:53 CET
> sh-4.2# ./prova
> ent NULL
> sh-4.2# ls -ld /etc/init
> drwxr-xr-x 2 root root 4096  5 nov 00:12 /etc/init
> sh-4.2# ls -l /etc/init
> total 0
> lrwxrwxrwx 1 root root 25  5 nov 00:12 atd.conf -> /etc/static/init/atd.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 boot.conf -> /etc/static/init/boot.conf
> lrwxrwxrwx 1 root root 40  5 nov 00:12 control-alt-delete.conf -> /etc/static/init/control-alt-delete.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 cron.conf -> /etc/static/init/cron.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 dbus.conf -> /etc/static/init/dbus.conf
> lrwxrwxrwx 1 root root 28  5 nov 00:12 dhcpcd.conf -> /etc/static/init/dhcpcd.conf
> lrwxrwxrwx 1 root root 37  5 nov 00:12 emergency-shell.conf -> /etc/static/init/emergency-shell.conf
> lrwxrwxrwx 1 root root 37  5 nov 00:12 invalidate-nscd.conf -> /etc/static/init/invalidate-nscd.conf
> lrwxrwxrwx 1 root root 25  5 nov 00:12 kbd.conf -> /etc/static/init/kbd.conf
> lrwxrwxrwx 1 root root 27  5 nov 00:12 klogd.conf -> /etc/static/init/klogd.conf
> lrwxrwxrwx 1 root root 25  5 nov 00:12 lvm.conf -> /etc/static/init/lvm.conf
> lrwxrwxrwx 1 root root 30  5 nov 00:12 mountall.conf -> /etc/static/init/mountall.conf
> lrwxrwxrwx 1 root root 36  5 nov 00:12 mountall-ip-up.conf -> /etc/static/init/mountall-ip-up.conf
> lrwxrwxrwx 1 root root 34  5 nov 00:12 mount-failed.conf -> /etc/static/init/mount-failed.conf
> lrwxrwxrwx 1 root root 32  5 nov 00:12 networking.conf -> /etc/static/init/networking.conf
> lrwxrwxrwx 1 root root 40  5 nov 00:12 network-interfaces.conf -> /etc/static/init/network-interfaces.conf
> lrwxrwxrwx 1 root root 32  5 nov 00:12 nix-daemon.conf -> /etc/static/init/nix-daemon.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 nscd.conf -> /etc/static/init/nscd.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 ntpd.conf -> /etc/static/init/ntpd.conf
> lrwxrwxrwx 1 root root 30  5 nov 00:12 runlevel.conf -> /etc/static/init/runlevel.conf
> lrwxrwxrwx 1 root root 30  5 nov 00:12 shutdown.conf -> /etc/static/init/shutdown.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 sshd.conf -> /etc/static/init/sshd.conf
> lrwxrwxrwx 1 root root 29  5 nov 00:12 syslogd.conf -> /etc/static/init/syslogd.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty1.conf -> /etc/static/init/tty1.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty2.conf -> /etc/static/init/tty2.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty3.conf -> /etc/static/init/tty3.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty4.conf -> /etc/static/init/tty4.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty5.conf -> /etc/static/init/tty5.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty6.conf -> /etc/static/init/tty6.conf
> lrwxrwxrwx 1 root root 26  5 nov 00:12 udev.conf -> /etc/static/init/udev.conf
> lrwxrwxrwx 1 root root 33  5 nov 00:12 udevtrigger.conf -> /etc/static/init/udevtrigger.conf
> sh-4.2# exit
> 
> S'ha finalitzat l'execució de script a dl 05 nov 2012 00:17:22 CET
> --------
> 
> 
> 
> 
> On Fri, Nov 02, 2012 at 07:38:28PM +0100, Lluís Batlle i Rossell wrote:
> > Hello,
> > 
> > updating my kernel from 3.4.2 to 3.6.4, I've noticed that upstart deadlocks at
> > the very start. Stracing, I think it has to do with INOTIFY, because it
> > deadlocks very early and little more has been done then.
> > 
> > Going 'back' to 3.4.16, makes upstart work fine. I've not tested middle kernels.
> > 
> > I've seen this only on the fuloong minipc (mips n64), but I've done similar
> > steps with the same distributions on armv5tel, i686 and x86_64, and there all
> > works fine.
> > 
> > Does anybody know of anything broken around inotify, between 3.4 and 3.6 linux
> > mips?
> > 
> > Any suggestion on what kernel change could have related to this, and so, get a
> > clue about what middle version to test?
> > 
> > Regards,
> > Lluís.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Broken readdir() since 3.5 for ext3 on mips-n32
  2012-11-05  7:32   ` Lluís Batlle i Rossell
@ 2012-11-05 21:20     ` Lluís Batlle i Rossell
  2012-11-05 21:23       ` Lluís Batlle i Rossell
  2012-11-05 21:33       ` Lars-Peter Clausen
  0 siblings, 2 replies; 6+ messages in thread
From: Lluís Batlle i Rossell @ 2012-11-05 21:20 UTC (permalink / raw)
  To: linux-mips

Hello,

with the help of Lars on irc, we've tracked down the issue to a broken readdir()
in ext3 in n32, introduced in the kernel 3.5 by this commit:
d7dab39b6e16d5eea78ed3c705d2a2d0772b4f06

That renders ext3 quite useless in mips n32.

In a kernel after that commit, the example program in the 'getdents' man page
returns this:
[root@fu2:~/readdir]# ./getdents 
--------------- nread=116 ---------------
i-node#  file type  d_reclen  d_off   d_name
    3694  regular      20 1780583312  prova.c
 1037850  regular      24 -985956880  getdents.c
 1037848  directory    16 -1999547753  .
 1037849  regular      20  222381689  getdents
  778241  directory    16 -1849228342  ..
    3647  regular      20         -1  prova


I took Lars suggestion of applying the patch I attach (forcing ext3 to think it
is a 32-bit system), and then all works. init (upstart) doesn't deadlock anymore, readdir() works fine, and the getdents info looks right:
[root@fu2:~/readdir]# ./getdents 
--------------- nread=116 ---------------
i-node#  file type  d_reclen  d_off   d_name
    3694  regular      20  334739480  prova.c
 1037850  regular      24  473707228  getdents.c
 1037848  directory    16  824759881  .
 1037849  regular      20  875064456  getdents
  778241  directory    16 1524836457  ..
    3647  regular      20 2147483647  prova

How to solve this, I don't know. But it seems that ext3 thinks that mips-n32
programs can eat some 64-bit words in d_off.

Regards,
Lluís.

On Mon, Nov 05, 2012 at 08:32:21AM +0100, Lluís Batlle i Rossell wrote:
> This same issue below happens to me in 3.5.7 too. So, the change is somewhere
> between 3.4 and 3.5.
> 
> Regards,
> Lluís.
> 
> On Mon, Nov 05, 2012 at 12:21:19AM +0100, Lluís Batlle i Rossell wrote:
> > I've investigated better the issue.
> > 
> > I found that, in 3.4 vs 3.6.4, the behaviour that changed is that of readdir().
> > 
> > Using the same userland binaries, I've run a little program in both kernels:
> > -------- prova.c
> > #include <sys/types.h>
> > #include <dirent.h>
> > 
> > int main() {
> >         DIR *d = opendir("/etc/init");
> > 
> >         if (d == NULL) {
> >                 fprintf(stderr, "d NULL\n");
> >                 return -1;
> >         }
> > 
> >         struct dirent *ent;
> >         ent = readdir(d);
> > 
> >         if (ent == NULL) {
> >                 fprintf(stderr, "ent NULL\n");
> >                 return -1;
> >         }
> > }
> > -----------
> > 
> > 
> > This program does not print anything on 3.4, but on 3.6, it prints "ent NULL".
> > 
> > In both cases, /etc/init is full of symlinks, like this (from a script session
> > in 3.6.4):
> > -------
> > S'ha iniciat l'execució de script a dl 05 nov 2012 00:16:53 CET
> > sh-4.2# ./prova
> > ent NULL
> > sh-4.2# ls -ld /etc/init
> > drwxr-xr-x 2 root root 4096  5 nov 00:12 /etc/init
> > sh-4.2# ls -l /etc/init
> > total 0
> > lrwxrwxrwx 1 root root 25  5 nov 00:12 atd.conf -> /etc/static/init/atd.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 boot.conf -> /etc/static/init/boot.conf
> > lrwxrwxrwx 1 root root 40  5 nov 00:12 control-alt-delete.conf -> /etc/static/init/control-alt-delete.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 cron.conf -> /etc/static/init/cron.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 dbus.conf -> /etc/static/init/dbus.conf
> > lrwxrwxrwx 1 root root 28  5 nov 00:12 dhcpcd.conf -> /etc/static/init/dhcpcd.conf
> > lrwxrwxrwx 1 root root 37  5 nov 00:12 emergency-shell.conf -> /etc/static/init/emergency-shell.conf
> > lrwxrwxrwx 1 root root 37  5 nov 00:12 invalidate-nscd.conf -> /etc/static/init/invalidate-nscd.conf
> > lrwxrwxrwx 1 root root 25  5 nov 00:12 kbd.conf -> /etc/static/init/kbd.conf
> > lrwxrwxrwx 1 root root 27  5 nov 00:12 klogd.conf -> /etc/static/init/klogd.conf
> > lrwxrwxrwx 1 root root 25  5 nov 00:12 lvm.conf -> /etc/static/init/lvm.conf
> > lrwxrwxrwx 1 root root 30  5 nov 00:12 mountall.conf -> /etc/static/init/mountall.conf
> > lrwxrwxrwx 1 root root 36  5 nov 00:12 mountall-ip-up.conf -> /etc/static/init/mountall-ip-up.conf
> > lrwxrwxrwx 1 root root 34  5 nov 00:12 mount-failed.conf -> /etc/static/init/mount-failed.conf
> > lrwxrwxrwx 1 root root 32  5 nov 00:12 networking.conf -> /etc/static/init/networking.conf
> > lrwxrwxrwx 1 root root 40  5 nov 00:12 network-interfaces.conf -> /etc/static/init/network-interfaces.conf
> > lrwxrwxrwx 1 root root 32  5 nov 00:12 nix-daemon.conf -> /etc/static/init/nix-daemon.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 nscd.conf -> /etc/static/init/nscd.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 ntpd.conf -> /etc/static/init/ntpd.conf
> > lrwxrwxrwx 1 root root 30  5 nov 00:12 runlevel.conf -> /etc/static/init/runlevel.conf
> > lrwxrwxrwx 1 root root 30  5 nov 00:12 shutdown.conf -> /etc/static/init/shutdown.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 sshd.conf -> /etc/static/init/sshd.conf
> > lrwxrwxrwx 1 root root 29  5 nov 00:12 syslogd.conf -> /etc/static/init/syslogd.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 tty1.conf -> /etc/static/init/tty1.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 tty2.conf -> /etc/static/init/tty2.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 tty3.conf -> /etc/static/init/tty3.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 tty4.conf -> /etc/static/init/tty4.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 tty5.conf -> /etc/static/init/tty5.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 tty6.conf -> /etc/static/init/tty6.conf
> > lrwxrwxrwx 1 root root 26  5 nov 00:12 udev.conf -> /etc/static/init/udev.conf
> > lrwxrwxrwx 1 root root 33  5 nov 00:12 udevtrigger.conf -> /etc/static/init/udevtrigger.conf
> > sh-4.2# exit
> > 
> > S'ha finalitzat l'execució de script a dl 05 nov 2012 00:17:22 CET
> > --------
> > 
> > 
> > 
> > 
> > On Fri, Nov 02, 2012 at 07:38:28PM +0100, Lluís Batlle i Rossell wrote:
> > > Hello,
> > > 
> > > updating my kernel from 3.4.2 to 3.6.4, I've noticed that upstart deadlocks at
> > > the very start. Stracing, I think it has to do with INOTIFY, because it
> > > deadlocks very early and little more has been done then.
> > > 
> > > Going 'back' to 3.4.16, makes upstart work fine. I've not tested middle kernels.
> > > 
> > > I've seen this only on the fuloong minipc (mips n64), but I've done similar
> > > steps with the same distributions on armv5tel, i686 and x86_64, and there all
> > > works fine.
> > > 
> > > Does anybody know of anything broken around inotify, between 3.4 and 3.6 linux
> > > mips?
> > > 
> > > Any suggestion on what kernel change could have related to this, and so, get a
> > > clue about what middle version to test?
> > > 
> > > Regards,
> > > Lluís.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Broken readdir() since 3.5 for ext3 on mips-n32
  2012-11-05 21:20     ` Broken readdir() since 3.5 for ext3 on mips-n32 Lluís Batlle i Rossell
@ 2012-11-05 21:23       ` Lluís Batlle i Rossell
  2012-11-05 21:33       ` Lars-Peter Clausen
  1 sibling, 0 replies; 6+ messages in thread
From: Lluís Batlle i Rossell @ 2012-11-05 21:23 UTC (permalink / raw)
  To: linux-mips; +Cc: Nikita Karetnikov

[-- Attachment #1: Type: text/plain, Size: 1687 bytes --]

On Mon, Nov 05, 2012 at 10:20:19PM +0100, Lluís Batlle i Rossell wrote:
> Hello,
> 
> with the help of Lars on irc, we've tracked down the issue to a broken readdir()
> in ext3 in n32, introduced in the kernel 3.5 by this commit:
> d7dab39b6e16d5eea78ed3c705d2a2d0772b4f06
> 
> That renders ext3 quite useless in mips n32.
> 
> In a kernel after that commit, the example program in the 'getdents' man page
> returns this:
> [root@fu2:~/readdir]# ./getdents 
> --------------- nread=116 ---------------
> i-node#  file type  d_reclen  d_off   d_name
>     3694  regular      20 1780583312  prova.c
>  1037850  regular      24 -985956880  getdents.c
>  1037848  directory    16 -1999547753  .
>  1037849  regular      20  222381689  getdents
>   778241  directory    16 -1849228342  ..
>     3647  regular      20         -1  prova
> 
> 
> I took Lars suggestion of applying the patch I attach (forcing ext3 to think it
> is a 32-bit system), and then all works. init (upstart) doesn't deadlock anymore, readdir() works fine, and the getdents info looks right:
> [root@fu2:~/readdir]# ./getdents 
> --------------- nread=116 ---------------
> i-node#  file type  d_reclen  d_off   d_name
>     3694  regular      20  334739480  prova.c
>  1037850  regular      24  473707228  getdents.c
>  1037848  directory    16  824759881  .
>  1037849  regular      20  875064456  getdents
>   778241  directory    16 1524836457  ..
>     3647  regular      20 2147483647  prova
> 
> How to solve this, I don't know. But it seems that ext3 thinks that mips-n32
> programs can eat some 64-bit words in d_off.

Now I add the patch I mentioned.
 
Regards,
Lluís.

[-- Attachment #2: ext3-n32.patch --]
[-- Type: text/plain, Size: 249 bytes --]

diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c
index 92490e9..bf63d7b 100644
--- a/fs/ext3/dir.c
+++ b/fs/ext3/dir.c
@@ -228,6 +228,7 @@ out:
 
 static inline int is_32bit_api(void)
 {
+	return 1;
 #ifdef CONFIG_COMPAT
 	return is_compat_task();
 #else

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: Broken readdir() since 3.5 for ext3 on mips-n32
  2012-11-05 21:20     ` Broken readdir() since 3.5 for ext3 on mips-n32 Lluís Batlle i Rossell
  2012-11-05 21:23       ` Lluís Batlle i Rossell
@ 2012-11-05 21:33       ` Lars-Peter Clausen
  1 sibling, 0 replies; 6+ messages in thread
From: Lars-Peter Clausen @ 2012-11-05 21:33 UTC (permalink / raw)
  To: Lluís Batlle i Rossell; +Cc: linux-mips

On 11/05/2012 10:20 PM, Lluís Batlle i Rossell wrote:
> Hello,
> 
> with the help of Lars on irc, we've tracked down the issue to a broken readdir()
> in ext3 in n32, introduced in the kernel 3.5 by this commit:
> d7dab39b6e16d5eea78ed3c705d2a2d0772b4f06
> 
> That renders ext3 quite useless in mips n32.
> 
> In a kernel after that commit, the example program in the 'getdents' man page
> returns this:
> [root@fu2:~/readdir]# ./getdents 
> --------------- nread=116 ---------------
> i-node#  file type  d_reclen  d_off   d_name
>     3694  regular      20 1780583312  prova.c
>  1037850  regular      24 -985956880  getdents.c
>  1037848  directory    16 -1999547753  .
>  1037849  regular      20  222381689  getdents
>   778241  directory    16 -1849228342  ..
>     3647  regular      20         -1  prova
> 
> 
> I took Lars suggestion of applying the patch I attach (forcing ext3 to think it
> is a 32-bit system), and then all works. init (upstart) doesn't deadlock anymore, readdir() works fine, and the getdents info looks right:
> [root@fu2:~/readdir]# ./getdents 
> --------------- nread=116 ---------------
> i-node#  file type  d_reclen  d_off   d_name
>     3694  regular      20  334739480  prova.c
>  1037850  regular      24  473707228  getdents.c
>  1037848  directory    16  824759881  .
>  1037849  regular      20  875064456  getdents
>   778241  directory    16 1524836457  ..
>     3647  regular      20 2147483647  prova
> 
> How to solve this, I don't know. But it seems that ext3 thinks that mips-n32
> programs can eat some 64-bit words in d_off.

I think the issue here is that is_compat_task() returns false if both o32 and
n32 support are built into the kernel.

is_compat_task() is defined is

static inline int is_compat_task(void)
{
    return test_thread_flag(TIF_32BIT);
}

and TIF_32BIT is defined as

#ifdef CONFIG_MIPS32_O32
#define TIF_32BIT TIF_32BIT_REGS
#elif defined(CONFIG_MIPS32_N32)
#define TIF_32BIT _TIF_32BIT_ADDR
#endif /* CONFIG_MIPS32_O32 */

the n32 personality only sets TIF_32BIT_ADDR, so the test will fail. Also
shouldn't it be '#define TIF_32BIT TIF_32BIT_ADDR' instead of '#define
TIF_32BIT _TIF_32BIT_ADDR'?

> 
> Regards,
> Lluís.
> 
> On Mon, Nov 05, 2012 at 08:32:21AM +0100, Lluís Batlle i Rossell wrote:
>> This same issue below happens to me in 3.5.7 too. So, the change is somewhere
>> between 3.4 and 3.5.
>>
>> Regards,
>> Lluís.
>>
>> On Mon, Nov 05, 2012 at 12:21:19AM +0100, Lluís Batlle i Rossell wrote:
>>> I've investigated better the issue.
>>>
>>> I found that, in 3.4 vs 3.6.4, the behaviour that changed is that of readdir().
>>>
>>> Using the same userland binaries, I've run a little program in both kernels:
>>> -------- prova.c
>>> #include <sys/types.h>
>>> #include <dirent.h>
>>>
>>> int main() {
>>>         DIR *d = opendir("/etc/init");
>>>
>>>         if (d == NULL) {
>>>                 fprintf(stderr, "d NULL\n");
>>>                 return -1;
>>>         }
>>>
>>>         struct dirent *ent;
>>>         ent = readdir(d);
>>>
>>>         if (ent == NULL) {
>>>                 fprintf(stderr, "ent NULL\n");
>>>                 return -1;
>>>         }
>>> }
>>> -----------
>>>
>>>
>>> This program does not print anything on 3.4, but on 3.6, it prints "ent NULL".
>>>
>>> In both cases, /etc/init is full of symlinks, like this (from a script session
>>> in 3.6.4):
>>> -------
>>> S'ha iniciat l'execució de script a dl 05 nov 2012 00:16:53 CET
>>> sh-4.2# ./prova
>>> ent NULL
>>> sh-4.2# ls -ld /etc/init
>>> drwxr-xr-x 2 root root 4096  5 nov 00:12 /etc/init
>>> sh-4.2# ls -l /etc/init
>>> total 0
>>> lrwxrwxrwx 1 root root 25  5 nov 00:12 atd.conf -> /etc/static/init/atd.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 boot.conf -> /etc/static/init/boot.conf
>>> lrwxrwxrwx 1 root root 40  5 nov 00:12 control-alt-delete.conf -> /etc/static/init/control-alt-delete.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 cron.conf -> /etc/static/init/cron.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 dbus.conf -> /etc/static/init/dbus.conf
>>> lrwxrwxrwx 1 root root 28  5 nov 00:12 dhcpcd.conf -> /etc/static/init/dhcpcd.conf
>>> lrwxrwxrwx 1 root root 37  5 nov 00:12 emergency-shell.conf -> /etc/static/init/emergency-shell.conf
>>> lrwxrwxrwx 1 root root 37  5 nov 00:12 invalidate-nscd.conf -> /etc/static/init/invalidate-nscd.conf
>>> lrwxrwxrwx 1 root root 25  5 nov 00:12 kbd.conf -> /etc/static/init/kbd.conf
>>> lrwxrwxrwx 1 root root 27  5 nov 00:12 klogd.conf -> /etc/static/init/klogd.conf
>>> lrwxrwxrwx 1 root root 25  5 nov 00:12 lvm.conf -> /etc/static/init/lvm.conf
>>> lrwxrwxrwx 1 root root 30  5 nov 00:12 mountall.conf -> /etc/static/init/mountall.conf
>>> lrwxrwxrwx 1 root root 36  5 nov 00:12 mountall-ip-up.conf -> /etc/static/init/mountall-ip-up.conf
>>> lrwxrwxrwx 1 root root 34  5 nov 00:12 mount-failed.conf -> /etc/static/init/mount-failed.conf
>>> lrwxrwxrwx 1 root root 32  5 nov 00:12 networking.conf -> /etc/static/init/networking.conf
>>> lrwxrwxrwx 1 root root 40  5 nov 00:12 network-interfaces.conf -> /etc/static/init/network-interfaces.conf
>>> lrwxrwxrwx 1 root root 32  5 nov 00:12 nix-daemon.conf -> /etc/static/init/nix-daemon.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 nscd.conf -> /etc/static/init/nscd.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 ntpd.conf -> /etc/static/init/ntpd.conf
>>> lrwxrwxrwx 1 root root 30  5 nov 00:12 runlevel.conf -> /etc/static/init/runlevel.conf
>>> lrwxrwxrwx 1 root root 30  5 nov 00:12 shutdown.conf -> /etc/static/init/shutdown.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 sshd.conf -> /etc/static/init/sshd.conf
>>> lrwxrwxrwx 1 root root 29  5 nov 00:12 syslogd.conf -> /etc/static/init/syslogd.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty1.conf -> /etc/static/init/tty1.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty2.conf -> /etc/static/init/tty2.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty3.conf -> /etc/static/init/tty3.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty4.conf -> /etc/static/init/tty4.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty5.conf -> /etc/static/init/tty5.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 tty6.conf -> /etc/static/init/tty6.conf
>>> lrwxrwxrwx 1 root root 26  5 nov 00:12 udev.conf -> /etc/static/init/udev.conf
>>> lrwxrwxrwx 1 root root 33  5 nov 00:12 udevtrigger.conf -> /etc/static/init/udevtrigger.conf
>>> sh-4.2# exit
>>>
>>> S'ha finalitzat l'execució de script a dl 05 nov 2012 00:17:22 CET
>>> --------
>>>
>>>
>>>
>>>
>>> On Fri, Nov 02, 2012 at 07:38:28PM +0100, Lluís Batlle i Rossell wrote:
>>>> Hello,
>>>>
>>>> updating my kernel from 3.4.2 to 3.6.4, I've noticed that upstart deadlocks at
>>>> the very start. Stracing, I think it has to do with INOTIFY, because it
>>>> deadlocks very early and little more has been done then.
>>>>
>>>> Going 'back' to 3.4.16, makes upstart work fine. I've not tested middle kernels.
>>>>
>>>> I've seen this only on the fuloong minipc (mips n64), but I've done similar
>>>> steps with the same distributions on armv5tel, i686 and x86_64, and there all
>>>> works fine.
>>>>
>>>> Does anybody know of anything broken around inotify, between 3.4 and 3.6 linux
>>>> mips?
>>>>
>>>> Any suggestion on what kernel change could have related to this, and so, get a
>>>> clue about what middle version to test?
>>>>
>>>> Regards,
>>>> Lluís.
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-11-05 21:33 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-02 18:38 Failing INOTIFY in 3.6.x? Lluís Batlle i Rossell
2012-11-04 23:21 ` Failing readdir() on 3.6 (was: Failing INOTIFY in 3.6.x?) Lluís Batlle i Rossell
2012-11-05  7:32   ` Lluís Batlle i Rossell
2012-11-05 21:20     ` Broken readdir() since 3.5 for ext3 on mips-n32 Lluís Batlle i Rossell
2012-11-05 21:23       ` Lluís Batlle i Rossell
2012-11-05 21:33       ` Lars-Peter Clausen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.