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