* 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.