From: paul <pal...@ea...> - 2006-05-03 13:43:45
|
Any progress on fixing fuse for the Linksys NSLU2? (A linux-based network h= ard drive controller). Fuse has been working well in the Linksys routers, and people have been bui= lding monitoring stations using OWFS over fuse for 1-wire sensors. It would= be great to support the NSLU2 as well. Paul Alfille ----------------------- On 4/25/06, Christian Magnusson <chr...@ru...> wrote: =20 Hi there=E2=80=A6 =20 I have tried to compile and use fuse on the Linksys NSLU2, but I have n= ever got it work properly. Everything compiles, but it hangs when I try to access a mounted fuse-p= ath. I have tried both 2.4.2 and 2.6.0-pre2, and they both seem to have the = same problem. =20 # insmod fuse Using /lib/modules/2.4.22-xfs/kernel/fs/fuse/fuse.o # ./hello /tmp/hello -d -s =20 unique: 0, opcode: ??? (0), nodeid: 0, insize: 56 unique: 1, error: -5 (Input/output error), outsize: 16 fuse: writing device: Invalid argument (accessing /tmp/hello will hang the hello-process now, including =E2=80= =9Cdf=E2=80=9D which hangs until /tmp/hello is unmounted) # dmesg | grep fuse fuse init (API version 7.2) fuse distribution version: 2.4.2 fuse exit fuse init (API version 7.6) fuse distribution version: 2.6.0-pre2 # cat /proc/cpuinfo Processor : XScale-IXP425/IXC1100 rev 1 (v5b) BogoMIPS : 131.48 Features : swp half thumb fastmult edsp =20 Hardware : Intel IXDP425 Development Platform Revision : 0000 Serial : 0000000000000000 =20 =20 Has anyone made any successfully tests on this platform? =20 /Christian =20 =20 =20 BTW: I had some problem with 2.6.0-pre2 since CLOCK_MONOTONIC isn=E2=80= =99t defined in /opt/nslu2/unslung_6.8/tmp/work/glibc-2.2.5-r5/glibc-2.2.5/= sysdeps/generic/bits/time.h=E2=80=A6 Only CLOCK_REALTIME exists for this gl= ibc version. Could you add some patch for this in your next pre-release? =20 static void curr_time(struct timespec *now) { #ifdef CLOCK_MONOTONIC static clockid_t clockid =3D CLOCK_MONOTONIC; int res =3D clock_gettime(clockid, now); if (res =3D=3D -1 && errno =3D=3D EINVAL) { clockid =3D CLOCK_REALTIME; res =3D clock_gettime(clockid, now); } #else static clockid_t clockid; int res; clockid =3D CLOCK_REALTIME; res =3D clock_gettime(clockid, now); #endif if (res =3D=3D -1) { perror("fuse: clock_gettime"); abort(); } } =20 |
From: Miklos S. <mi...@sz...> - 2006-05-03 15:05:12
|
> > Any progress on fixing fuse for the Linksys NSLU2? (A linux-based > network hard drive controller). > > Fuse has been working well in the Linksys routers, and people have > been building monitoring stations using OWFS over fuse for 1-wire > sensors. I think this is the same CPU cache problem which has been discussed recently. I haven't found the time to create/submit a proper fix to the ARM architecture, but here's a workaround in fuse that should help. Miklos Index: linux/fs/fuse/dev.c =================================================================== --- linux.orig/fs/fuse/dev.c 2006-04-12 19:24:43.000000000 +0200 +++ linux/fs/fuse/dev.c 2006-04-13 09:10:32.000000000 +0200 @@ -410,6 +410,7 @@ static void fuse_copy_finish(struct fuse static int fuse_copy_fill(struct fuse_copy_state *cs) { unsigned long offset; + struct vm_area_struct *vma; int err; unlock_request(cs->fc, cs->req); @@ -423,13 +424,14 @@ static int fuse_copy_fill(struct fuse_co } down_read(¤t->mm->mmap_sem); err = get_user_pages(current, current->mm, cs->addr, 1, cs->write, 0, - &cs->pg, NULL); + &cs->pg, &vma); up_read(¤t->mm->mmap_sem); if (err < 0) return err; BUG_ON(err != 1); offset = cs->addr % PAGE_SIZE; cs->mapaddr = kmap_atomic(cs->pg, KM_USER0); + flush_cache_page(vma, cs->addr, page_to_pfn(cs->pg)); cs->buf = cs->mapaddr + offset; cs->len = min(PAGE_SIZE - offset, cs->seglen); cs->seglen -= cs->len; |
From: Christian M. <ma...@ma...> - 2006-05-03 18:38:17
|
It's definately some problem with the CPU cache as you said... I'm running 2.4.22 kernel on the Linksys NSLU2, and flush_cache_page() = is a #define with only two arguments there... Include/asm/cache.h #define flush_cache_page(_vma,_vmaddr) = \ do { = \ if ((_vma)->vm_mm =3D=3D current->active_mm) { = \ unsigned long _addr =3D (_vmaddr) & PAGE_MASK; = \ cpu_cache_clean_invalidate_range(_addr, = \ _addr + PAGE_SIZE, = \ ((_vma)->vm_flags & VM_EXEC)); = \ } \ =20 } while (0) I applied this patch to fuse-2.6.0-pre2/kernel/dev.c # diff -u dev.c.org dev.c --- dev.c.org 2006-05-03 17:12:39.000000000 +0200 +++ dev.c 2006-05-03 17:24:53.000000000 +0200 @@ -489,6 +489,7 @@ static int fuse_copy_fill(struct fuse_copy_state *cs) { unsigned long offset; + struct vm_area_struct *vma; int err; =20 unlock_request(cs->fc, cs->req); @@ -502,13 +503,14 @@ } down_read(¤t->mm->mmap_sem); err =3D get_user_pages(current, current->mm, cs->addr, 1, = cs->write, 0, - &cs->pg, NULL); + &cs->pg, &vma); up_read(¤t->mm->mmap_sem); if (err < 0) return err; BUG_ON(err !=3D 1); offset =3D cs->addr % PAGE_SIZE; cs->mapaddr =3D kmap_atomic(cs->pg, KM_USER0); + flush_cache_page(vma, cs->addr); //, page_to_pfn(cs->pg)); cs->buf =3D cs->mapaddr + offset; cs->len =3D min(PAGE_SIZE - offset, cs->seglen); cs->seglen -=3D cs->len; And example/hello worked now at least... Haven't tried the other example apps yet, but I guess they work as well. Owfs doesn't work correctly yet... I get some segmentation fault when I = try to do a directory-listing, but I will try to find the problem in owfs instead. It might be possible to use the latest 2.6.0 version with this minor patch for me... I'll tell you if I find any problems in fuse or owfs later. /Christian > -----Ursprungligt meddelande----- > Fr=E5n: fus...@li... [mailto:fuse-devel- > ad...@li...] F=F6r Miklos Szeredi > Skickat: den 3 maj 2006 17:05 > Till: pal...@ea... > Kopia: fus...@li... > =C4mne: Re: [fuse-devel] RE: fuse on Linksys NSLU2 >=20 > > > > Any progress on fixing fuse for the Linksys NSLU2? (A linux-based > > network hard drive controller). > > > > Fuse has been working well in the Linksys routers, and people have > > been building monitoring stations using OWFS over fuse for 1-wire > > sensors. >=20 > I think this is the same CPU cache problem which has been discussed > recently. I haven't found the time to create/submit a proper fix to > the ARM architecture, but here's a workaround in fuse that should > help. >=20 > Miklos >=20 > Index: linux/fs/fuse/dev.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux.orig/fs/fuse/dev.c 2006-04-12 19:24:43.000000000 +0200 > +++ linux/fs/fuse/dev.c 2006-04-13 09:10:32.000000000 +0200 > @@ -410,6 +410,7 @@ static void fuse_copy_finish(struct fuse > static int fuse_copy_fill(struct fuse_copy_state *cs) > { > unsigned long offset; > + struct vm_area_struct *vma; > int err; >=20 > unlock_request(cs->fc, cs->req); > @@ -423,13 +424,14 @@ static int fuse_copy_fill(struct fuse_co > } > down_read(¤t->mm->mmap_sem); > err =3D get_user_pages(current, current->mm, cs->addr, 1, cs- > >write, 0, > - &cs->pg, NULL); > + &cs->pg, &vma); > up_read(¤t->mm->mmap_sem); > if (err < 0) > return err; > BUG_ON(err !=3D 1); > offset =3D cs->addr % PAGE_SIZE; > cs->mapaddr =3D kmap_atomic(cs->pg, KM_USER0); > + flush_cache_page(vma, cs->addr, page_to_pfn(cs->pg)); > cs->buf =3D cs->mapaddr + offset; > cs->len =3D min(PAGE_SIZE - offset, cs->seglen); > cs->seglen -=3D cs->len; >=20 >=20 >=20 > ------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, = security? > Get stuff done quickly with pre-integrated technology to make your job > easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache = Geronimo > = http://sel.as-us.falkag.net/sel?cmd=3Dlnk&kid=3D120709&bid=3D263057&dat=3D= 121642 > _______________________________________________ > fuse-devel mailing list > fus...@li... > https://lists.sourceforge.net/lists/listinfo/fuse-devel |
From: Christian M. <ma...@ma...> - 2006-05-04 21:57:06
|
I managed to get owfs-2.3p4 and fuse-2.6.0-pre2 to run on my Linksys NSLU2. The minor patch to fuse worked for me, and I will try to make a correct ipkg-package of fuse which could be used for Unslung and openslug distributions. /Christian > > And example/hello worked now at least... Haven't tried the other example > apps yet, but I guess they work as well. > > Owfs doesn't work correctly yet... I get some segmentation fault when I > try > to do a directory-listing, but I will try to find the problem in owfs > instead. It might be possible to use the latest 2.6.0 version with this > minor patch for me... > > I'll tell you if I find any problems in fuse or owfs later. > > /Christian > |