Date: Sun, 5 Aug 2001 15:51:25 +0200 (CEST) From: Michael Reifenberger <root@nihil.plaut.de> To: Poul-Henning Kamp <phk@critter.freebsd.dk> Cc: FreeBSD-Current <current@FreeBSD.ORG> Subject: Re: Linux ls fails on DEVFS /dev Message-ID: <20010805154901.H1909-200000@nihil> In-Reply-To: <29406.997004479@critter>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Sun, 5 Aug 2001, Poul-Henning Kamp wrote:
...
> Open a PR so I don't forget and please include how I can reproduce it
> while I test.
Done.
In the meantime a first (but yet untested) patch to devfs_vnops.c is
attached.
Bye!
----
Michael Reifenberger
^.*Plaut.*$, IT, R/3 Basis, GPS
[-- Attachment #2 --]
--- devfs_vnops.c.orig Sun Aug 5 14:08:13 2001
+++ devfs_vnops.c Sun Aug 5 15:45:41 2001
@@ -500,12 +500,12 @@
struct devfs_dirent *de;
struct devfs_mount *dmp;
- off_t off;
+ off_t off, oldoff;
+ int ncookies = 0;
+ u_long *cookiebuf, *cookiep;
+ struct dirent *dps, *dpe;
if (ap->a_vp->v_type != VDIR)
return (ENOTDIR);
- if (ap->a_ncookies)
- return (EOPNOTSUPP);
-
uio = ap->a_uio;
if (uio->uio_offset < 0)
@@ -518,4 +518,5 @@
de = ap->a_vp->v_data;
off = 0;
+ oldoff = uio->uio_offset;
TAILQ_FOREACH(dd, &de->de_dlist, de_list) {
if (dd->de_flags & DE_WHITEOUT)
@@ -530,4 +531,5 @@
dp->d_fileno = de->de_inode;
if (off >= uio->uio_offset) {
+ ncookies++;
error = uiomove((caddr_t)dp, dp->d_reclen, uio);
if (error)
@@ -536,4 +538,20 @@
off += dp->d_reclen;
}
+ if( !error && ap->a_ncookies != NULL && ap->a_cookies != NULL ) {
+ MALLOC(cookiebuf, u_long *, ncookies * sizeof(u_long),
+ M_TEMP, M_WAITOK);
+ cookiep = cookiebuf;
+ dps = (struct dirent *)
+ (uio->uio_iov->iov_base - (uio->uio_offset - oldoff));
+ dpe = (struct dirent *) uio->uio_iov->iov_base;
+ for( dp = dps;
+ dp < dpe;
+ dp = (struct dirent *)((caddr_t) dp + dp->d_reclen)) {
+ oldoff += dp->d_reclen;
+ *cookiep++ = (u_long) oldoff;
+ }
+ *ap->a_ncookies = ncookies;
+ *ap->a_cookies = cookiebuf;
+ }
lockmgr(&dmp->dm_lock, LK_RELEASE, 0, curproc);
uio->uio_offset = off;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010805154901.H1909-200000>
