svn commit: r192260 - in head/sys: kern sys ufs/ffs

Alan Cox alc at FreeBSD.org
Sun May 17 20:26:01 UTC 2009


Author: alc
Date: Sun May 17 20:26:00 2009
New Revision: 192260
URL: http://svn.freebsd.org/changeset/base/192260

Log:
  Introduce vfs_bio_set_valid() and use it from ffs_realloccg().  This
  eliminates the misuse of vfs_bio_clrbuf() by ffs_realloccg().
  
  In collaboration with:	tegge

Modified:
  head/sys/kern/vfs_bio.c
  head/sys/sys/buf.h
  head/sys/ufs/ffs/ffs_alloc.c

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c	Sun May 17 20:16:38 2009	(r192259)
+++ head/sys/kern/vfs_bio.c	Sun May 17 20:26:00 2009	(r192260)
@@ -3625,6 +3625,44 @@ vfs_clean_pages(struct buf *bp)
 }
 
 /*
+ *	vfs_bio_set_valid:
+ *
+ *	Set the range within the buffer to valid.  The range is
+ *	relative to the beginning of the buffer, b_offset.  Note that
+ *	b_offset itself may be offset from the beginning of the first
+ *	page.
+ */
+void   
+vfs_bio_set_valid(struct buf *bp, int base, int size)
+{
+	int i, n;
+	vm_page_t m;
+
+	if (!(bp->b_flags & B_VMIO))
+		return;
+
+	/*
+	 * Fixup base to be relative to beginning of first page.
+	 * Set initial n to be the maximum number of bytes in the
+	 * first page that can be validated.
+	 */
+	base += (bp->b_offset & PAGE_MASK);
+	n = PAGE_SIZE - (base & PAGE_MASK);
+
+	VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
+	for (i = base / PAGE_SIZE; size > 0 && i < bp->b_npages; ++i) {
+		m = bp->b_pages[i];
+		if (n > size)
+			n = size;
+		vm_page_set_valid(m, base & PAGE_MASK, n);
+		base += n;
+		size -= n;
+		n = PAGE_SIZE;
+	}
+	VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
+}
+
+/*
  *	vfs_bio_set_validclean:
  *
  *	Set the range within the buffer to valid and clean.  The range is 

Modified: head/sys/sys/buf.h
==============================================================================
--- head/sys/sys/buf.h	Sun May 17 20:16:38 2009	(r192259)
+++ head/sys/sys/buf.h	Sun May 17 20:26:00 2009	(r192260)
@@ -498,6 +498,7 @@ int	cluster_read(struct vnode *, u_quad_
 	    struct ucred *, long, int, struct buf **);
 int	cluster_wbuild(struct vnode *, long, daddr_t, int);
 void	cluster_write(struct vnode *, struct buf *, u_quad_t, int);
+void	vfs_bio_set_valid(struct buf *, int base, int size);
 void	vfs_bio_set_validclean(struct buf *, int base, int size);
 void	vfs_bio_clrbuf(struct buf *);
 void	vfs_busy_pages(struct buf *, int clear_modify);

Modified: head/sys/ufs/ffs/ffs_alloc.c
==============================================================================
--- head/sys/ufs/ffs/ffs_alloc.c	Sun May 17 20:16:38 2009	(r192259)
+++ head/sys/ufs/ffs/ffs_alloc.c	Sun May 17 20:26:00 2009	(r192260)
@@ -326,10 +326,9 @@ retry:
 			ip->i_flag |= IN_CHANGE | IN_UPDATE;
 		allocbuf(bp, nsize);
 		bp->b_flags |= B_DONE;
-		if ((bp->b_flags & (B_MALLOC | B_VMIO)) != B_VMIO)
-			bzero((char *)bp->b_data + osize, nsize - osize);
-		else
-			vfs_bio_clrbuf(bp);
+		bzero(bp->b_data + osize, nsize - osize);
+		if ((bp->b_flags & (B_MALLOC | B_VMIO)) == B_VMIO)
+			vfs_bio_set_valid(bp, osize, nsize - osize);
 		*bpp = bp;
 		return (0);
 	}
@@ -404,10 +403,9 @@ retry:
 			ip->i_flag |= IN_CHANGE | IN_UPDATE;
 		allocbuf(bp, nsize);
 		bp->b_flags |= B_DONE;
-		if ((bp->b_flags & (B_MALLOC | B_VMIO)) != B_VMIO)
-			bzero((char *)bp->b_data + osize, nsize - osize);
-		else
-			vfs_bio_clrbuf(bp);
+		bzero(bp->b_data + osize, nsize - osize);
+		if ((bp->b_flags & (B_MALLOC | B_VMIO)) == B_VMIO)
+			vfs_bio_set_valid(bp, osize, nsize - osize);
 		*bpp = bp;
 		return (0);
 	}


More information about the svn-src-head mailing list