Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Oct 2011 12:26:36 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 200144 for review
Message-ID:  <201110131226.p9DCQaOs052683@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@200144?ac=10

Change 200144 by jhb@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
 	 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110131226.p9DCQaOs052683>