On Fri, Feb 08, 2013 at 04:58:09PM -0700, Ian Lepore wrote: > I discovered today that fcntl(fd, F_READAHEAD, 0) doesn't work as > advertised. It's supposed to disable readahead, but instead it restores > the default readahead behavior (if it had previously been changed), and > there is no way to disable readahead.[1] I think the attached patch > fixes it, but it's not immediately clear from the patch why; here's the > deal... > > The amount of readahead is calculated by sequential_heuristic() in > vfs_vnops.c. If the FRDAHEAD flag is set on the file it uses the value > stored in the file's f_seqcount, otherwise it calculates a value (and > updates f_seqcount, which doesn't ever happen when FRDAHEAD is set). > > So the patch causes the FRDAHEAD flag to be set even in the case of the > readahead amount being zero. Because it seems like a useful concept, it > still allows the readahead to be restored to default behavior, now by > passing a negative value. > > Does this look right to those of you who understand this part of the > system better than I do? It looks correct.
I do wonder if it better to keep the actual behaviour as is and set the readahead amount to default on the arg == 0, disabling readahead for arg < 0. It is too exteme, most likely, please proceed. > > -- Ian > > [1] No way using F_READAHEAD; I know about POSIX_FADV_RANDOM. > Index: sys/kern/kern_descrip.c > =================================================================== > --- sys/kern/kern_descrip.c (revision 246337) > +++ sys/kern/kern_descrip.c (working copy) > @@ -776,7 +776,7 @@ > } > fhold(fp); > FILEDESC_SUNLOCK(fdp); > - if (arg != 0) { > + if (arg >= 0) { > vp = fp->f_vnode; > error = vn_lock(vp, LK_SHARED); > if (error != 0) { > Index: lib/libc/sys/fcntl.2 > =================================================================== > --- lib/libc/sys/fcntl.2 (revision 246337) > +++ lib/libc/sys/fcntl.2 (working copy) > @@ -28,7 +28,7 @@ > .\" @(#)fcntl.2 8.2 (Berkeley) 1/12/94 > .\" $FreeBSD$ > .\" > -.Dd July 27, 2012 > +.Dd February 8, 2013 > .Dt FCNTL 2 > .Os > .Sh NAME > @@ -171,7 +171,7 @@ > which is rounded up to the nearest block size. > A zero value in > .Fa arg > -turns off read ahead. > +turns off read ahead, a negative value restores the system default. > .It Dv F_RDAHEAD > Equivalent to Darwin counterpart which sets read ahead amount of 128KB > when the third argument, > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"
pgp_z8JoFEici.pgp
Description: PGP signature