PERFORCE change 200144 for review
John Baldwin
jhb at FreeBSD.org
Thu Oct 13 12:26:37 UTC 2011
http://p4web.freebsd.org/@@200144?ac=10
Change 200144 by jhb at jhb_jhbbsd on 2011/10/13 12:26:33
- Store (start, end) rather than (start, len) for the
fadvise range. This makes some of the logic simpler.
- Properly handle a length of 0 (means to EOF) for FADV_*NEED.
Affected files ...
.. //depot/projects/fadvise/sys/kern/vfs_syscalls.c#3 edit
.. //depot/projects/fadvise/sys/sys/file.h#3 edit
Differences ...
==== //depot/projects/fadvise/sys/kern/vfs_syscalls.c#3 (text+ko) ====
@@ -4895,14 +4895,18 @@
error = ENODEV;
goto out;
}
+ if (uap->len == 0)
+ end = OFF_MAX;
+ else
+ end = uap->offset + uap->len - 1;
switch (uap->advice) {
case FADV_SEQUENTIAL:
case FADV_RANDOM:
case FADV_NOREUSE:
mtx_pool_lock(mtxpool_sleep, fp);
fp->f_advice = uap->advice;
- fp->f_adviceoff = uap->offset;
- fp->f_advicelen = uap->len;
+ fp->f_advstart = uap->offset;
+ fp->f_advend = end;
mtx_pool_unlock(mtxpool_sleep, fp);
break;
case FADV_NORMAL:
@@ -4913,34 +4917,26 @@
*/
mtx_pool_lock(mtxpool_sleep, fp);
if (fp->f_advice != FADV_NORMAL) {
- if (uap->len == 0 && fp->f_advicelen == 0) {
- if (uap->offset > fp->f_adviceoff)
- fp->f_advicelen =
- uap->offset - fp->f_adviceoff;
- else
- fp->f_advice = FADV_NORMAL;
- } else if (uap->len == 0) {
- if (uap->offset <= fp->f_adviceoff)
- fp->f_advice = FADV_NORMAL;
- else if (fp->f_adviceoff + fp->f_advicelen >
- uap->offset)
- fp->f_advicelen =
- uap->offset - fp->f_adviceoff;
- } else if (fp->f_advicelen == 0) {
- if (uap->offset + uap->len > fp->f_adviceoff)
- fp->f_adviceoff =
- uap->offset + uap->len;
- } else if (fp->f_adviceoff < uap->offset + uap->len &&
- fp->f_adviceoff + fp->f_advicelen > uap->offset)
- fp->f_advicelen =
- uap->offset - fp->f_adviceoff;
- else if (uap->offset <
- fp->f_adviceoff + fp->f_advicelen &&
- uap->offset + uap->len > fp->f_adviceoff) {
- newoff = uap->offset + uap->len
- fp->f_advicelen -= (fp->f_adviceoff - newoff);
- fp->f_adviceoff = newoff;
- }
+ if (uap->offset <= fp->f_advstart &&
+ end >= fp->f_advend)
+ fp->f_advice = FADV_NORMAL;
+ else if (uap->offset >= fp->f_advstart &&
+ end <= fp->f_advend)
+ /*
+ * If the "normal" region is a middle
+ * portion of the existing
+ * non-standard region, just remove
+ * the whole thing rather than picking
+ * one side or the other to
+ * preserve.
+ */
+ fp->f_advice = FADV_NORMAL;
+ else if (uap->offset <= fp->f_advstart &&
+ end >= fp->f_advstart)
+ fp->f_advstart = end + 1;
+ else if (uap->offset <= fp->f_advend &&
+ end >= fp->f_advstart)
+ fp->f_advend = uap->offset - 1;
}
mtx_pool_unlock(mtxpool_sleep, fp);
break;
@@ -4952,7 +4948,7 @@
* madvise(2) constants.
*/
start = trunc_page(uap->offset);
- end = round_page(uap->offset + uap->len - 1);
+ end = round_page(end);
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
vn_lock(vp, LK_SHARED | LK_RETRY);
if (vp->v_object != NULL)
==== //depot/projects/fadvise/sys/sys/file.h#3 (text+ko) ====
@@ -138,8 +138,8 @@
off_t f_nextoff; /* next expected read/write offset. */
struct cdev_privdata *f_cdevpriv; /* (d) Private data for the cdev. */
int f_advice; /* (f) FADV_* type. */
- off_t f_adviceoff; /* (f) fadvice regionoffset. */
- off_t f_advicelen; /* (f) fadvice region length. */
+ off_t f_advstart; /* (f) fadvice region start. */
+ off_t f_advend; /* (f) fadvice region end. */
/*
* DFLAG_SEEKABLE specific fields
*/
More information about the p4-projects
mailing list