[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

acab (none) acab at 1337ness.
Sun Apr 4 01:02:25 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit 9d2a56bc3593f7cfb9715f6b0bb5c95b3323c63f
Author: acab <acab at 1337ness.(none)>
Date:   Thu Aug 27 18:29:03 2009 +0200

    squash preads

diff --git a/libclamav/fmap.c b/libclamav/fmap.c
index 148b54e..732de30 100644
--- a/libclamav/fmap.c
+++ b/libclamav/fmap.c
@@ -48,10 +48,10 @@
 */
 
 /* FIXME: tune this stuff */
-#define UNPAGE_THRSHLD_LO 4*1024
-#define UNPAGE_THRSHLD_HI 8*1024
+#define UNPAGE_THRSHLD_LO 4*1024*1024
+#define UNPAGE_THRSHLD_HI 8*1024*1024
 
-//#define READAHEAD_PAGES 4
+#define READAHEAD_PAGES 4
 
 struct F_MAP {
     int fd;
@@ -184,71 +184,99 @@ static void fmap_aging(struct F_MAP *m) {
 }
 
 
-static int fmap_readpage(struct F_MAP *m, unsigned int page, int lock) {
-    size_t readsz, got;
-    char *pptr;
-    uint32_t s = m->bitmap[page];
-
-    if(s & FM_MASK_PAGED) {
-	/* page already paged */
-	if(lock) {
-	    /* we want locking */
-	    if(s & FM_MASK_LOCKED) {
-		/* page already locked */
-		s &= FM_MASK_COUNT;
-		if(s == FM_MASK_COUNT) { /* lock count already at max: fial! */
-		    cli_errmsg("fmap_readpage: lock count exceeded\n");
-		    return 1;
+static int fmap_readpage(struct F_MAP *m, unsigned int first_page, unsigned int count, unsigned int lock_count) {
+    size_t readsz = 0, got;
+    char *pptr = NULL;
+    uint32_t s;
+    unsigned int i, page = first_page, force_read = 0;
+
+    for(i=0; i<=count; i++, page++) {
+	int lock;
+	if(lock_count) {
+	    lock_count--;
+	    lock = 1;
+	} else lock = 0;
+	if(i == count) {
+	    /* we count one page too much to flush pending reads */
+	    if(!pptr) return 0; /* if we have any */
+	    force_read = 1;
+	} else if((s=m->bitmap[page]) & FM_MASK_PAGED) {
+	    /* page already paged */
+	    if(lock) {
+		/* we want locking */
+		if(s & FM_MASK_LOCKED) {
+		    /* page already locked */
+		    s &= FM_MASK_COUNT;
+		    if(s == FM_MASK_COUNT) { /* lock count already at max: fial! */
+			cli_errmsg("fmap_readpage: lock count exceeded\n");
+			return 1;
+		    }
+		    /* acceptable lock count: inc lock count */
+		    m->bitmap[page]++;
+		} else /* page not currently locked: set lock count = 1 */
+		    m->bitmap[page] = 1 | FM_MASK_LOCKED | FM_MASK_PAGED;
+	    } else {
+		/* we don't want locking */
+		if(!(s & FM_MASK_LOCKED)) {
+		    /* page is not locked: we reset aging to max */
+		    m->bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
 		}
-		/* acceptable lock count: inc lock count */
-		m->bitmap[page]++;
-	    } else /* page not currently locked: set lock count = 1 */
-		m->bitmap[page] = 1 | FM_MASK_LOCKED | FM_MASK_PAGED;
-	} else {
-	    /* we don't want locking */
-	    if(!(s & FM_MASK_LOCKED)) {
-		/* page is not locked: we reset aging to max */
-		m->bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
 	    }
+	    if(!pptr) continue;
+	    force_read = 1;
 	}
-	return 0;
-    }
 
-    /* page is not already paged */
-    pptr = (char *)m + page * m->pgsz + m->hdrsz;
-    if((page == m->pages - 1) && (m->len % m->pgsz))
-	readsz = m->len % m->pgsz;
-    else
-	readsz = m->pgsz;
-    if(s & FM_MASK_SEEN) {
-	/* page we've seen before: check mtime */
-	struct stat st;
-
-	if(fstat(m->fd, &st)) {
-	    cli_warnmsg("fmap_readpage: fstat failed\n");
-	    return 1;
+	if(force_read) {
+	    /* we have some pending reads to perform */
+	    unsigned int j;
+	    for(j=first_page; j<page; j++) {
+		if(m->bitmap[j] & FM_MASK_SEEN) {
+		    /* page we've seen before: check mtime */
+		    struct stat st;
+		    if(fstat(m->fd, &st)) {
+			cli_warnmsg("fmap_readpage: fstat failed\n");
+			return 1;
+		    }
+		    if(m->mtime != st.st_mtime) {
+			cli_warnmsg("fmap_readpage: file changed as we read it\n");
+			return 1;
+		    }
+		    break;
+		}
+	    }
+
+	    if((got=pread(m->fd, pptr, readsz, m->offset + first_page * m->pgsz)) != readsz) {
+		cli_warnmsg("pread fail: page %u pages %u map-offset %lu - asked for %lu bytes, got %lu\n", first_page, m->pages, (long unsigned int)m->offset, (long unsigned int)readsz, (long unsigned int)got);
+		return 1;
+	    }
+	    pptr = NULL;
+	    force_read = 0;
+	    readsz = 0;
+	    continue;
 	}
-	if(m->mtime != st.st_mtime) {
-	    cli_warnmsg("fmap_readpage: file changed as we read it\n");
-	    return 1;
+
+	/* page is not already paged */
+	if(!pptr) {
+	    /* set a new start for pending reads if we don't have one */
+	    pptr = (char *)m + page * m->pgsz + m->hdrsz;
+	    first_page = page;
 	}
+	if((page == m->pages - 1) && (m->len % m->pgsz))
+	    readsz += m->len % m->pgsz;
+	else
+	    readsz += m->pgsz;
+	if(lock) /* lock requested: set paged, lock page and set lock count to 1 */
+	    m->bitmap[page] = FM_MASK_PAGED | FM_MASK_LOCKED | 1;
+	else /* no locking: set paged and set aging to max */
+	    m->bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
+	m->paged++;
     }
-    if((got=pread(m->fd, pptr, readsz, m->offset + page * m->pgsz)) != readsz) {
-	cli_warnmsg("pread fail: page %u pages %u map-offset %lu - asked for %lu bytes, got %lu\n", page, m->pages, (long unsigned int)m->offset, (long unsigned int)readsz, (long unsigned int)got);
-	return 1;
-    }
-
-    if(lock) /* lock requested: set paged, lock page and set lock count to 1 */
-	m->bitmap[page] = FM_MASK_PAGED | FM_MASK_LOCKED | 1;
-    else /* no locking: set paged and set aging to max */
-	m->bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
-    m->paged++;
     return 0;
 }
 
 
 static void *fmap_need(struct F_MAP *m, size_t at, size_t len, int lock) {
-    unsigned int i, first_page, last_page, rahead_page;
+    unsigned int i, first_page, last_page, lock_count;
     char *ret;
 
     if(!len) {
@@ -265,21 +293,16 @@ static void *fmap_need(struct F_MAP *m, size_t at, size_t len, int lock) {
 
     first_page = fmap_which_page(m, at);
     last_page = fmap_which_page(m, at + len - 1);
+    lock_count = (lock!=0) * (last_page-first_page+1);
 #ifdef READAHED_PAGES
-    rahead_page = last_page;
     last_page += READAHED_PAGES;
     if(last_page >= m->pages) last_page = m->pages - 1;
 #endif
 
 //    cli_errmsg("FMAPDBG: +++ map %p - len %u lock: %d (page %u to %u)\n", m, len, lock, first_page, last_page);
 
-    for(i=first_page; i<=last_page; i++) {
-	if(fmap_readpage(m, i, lock))
-	    return NULL;
-#ifdef READAHED_PAGES
-	if(i==rahead_page) lock = 0;
-#endif
-    }
+    if(fmap_readpage(m, first_page, last_page-first_page+1, lock_count))
+	return NULL;
 
     ret = (char *)m;
     ret += at + m->hdrsz;
@@ -327,7 +350,7 @@ void *fmap_need_str(struct F_MAP *m, void *ptr, size_t len) {
 
 //	cli_errmsg("FMAPDBG: +s+ map %p - (page %u)\n", m, i);
 
-	if(fmap_readpage(m, i, 1))
+	if(fmap_readpage(m, i, 1, 1))
 	    return NULL;
 	if(i == first_page) {
 	    scanat = at % m->pgsz;

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list