From owner-freebsd-bugs@FreeBSD.ORG Sun Sep 23 16:00:08 2007 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2FEA716A419 for ; Sun, 23 Sep 2007 16:00:08 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id F316013C455 for ; Sun, 23 Sep 2007 16:00:07 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.1/8.14.1) with ESMTP id l8NG07vj092881 for ; Sun, 23 Sep 2007 16:00:07 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.1/8.14.1/Submit) id l8NG07p5092880; Sun, 23 Sep 2007 16:00:07 GMT (envelope-from gnats) Resent-Date: Sun, 23 Sep 2007 16:00:07 GMT Resent-Message-Id: <200709231600.l8NG07p5092880@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Karl Andersson Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 37AD016A417 for ; Sun, 23 Sep 2007 15:51:16 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id F165E13C45D for ; Sun, 23 Sep 2007 15:51:15 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.1/8.14.1) with ESMTP id l8NFpFOW091780 for ; Sun, 23 Sep 2007 15:51:15 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.1/8.14.1/Submit) id l8NFpFmm091779; Sun, 23 Sep 2007 15:51:15 GMT (envelope-from nobody) Message-Id: <200709231551.l8NFpFmm091779@www.freebsd.org> Date: Sun, 23 Sep 2007 15:51:15 GMT From: Karl Andersson To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: kern/116583: System freezes for short time when using mmap on full filesystem X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 23 Sep 2007 16:00:08 -0000 >Number: 116583 >Category: kern >Synopsis: System freezes for short time when using mmap on full filesystem >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Sep 23 16:00:07 GMT 2007 >Closed-Date: >Last-Modified: >Originator: Karl Andersson >Release: FreeBSD 6.2-RELEASE-p7 i386 >Organization: >Environment: FreeBSD tiron.iiice.net 6.2-RELEASE-p7 FreeBSD 6.2-RELEASE-p7 #1: Thu Se p 20 17:12:47 CEST 2007 i386 >Description: When trying to write to a memorymapped file on a filesystem that is full the sys tem locks up as the syncer tries to put the page on disk. As far as I can see there is no error returned to the userapplication when runin g msync, so there is no way for the application to know that something is wrong. The logs fill up with: Sep 23 17:23:44 tiron kernel: pid 25573 (mmap_testing), uid 0 inumber 4 on /tmp/ mnt: filesystem full Sep 23 17:23:44 tiron kernel: vnode_pager_putpages: I/O error 28 Sep 23 17:23:44 tiron kernel: vnode_pager_putpages: residual I/O 32768 at 4512 Sep 23 17:23:44 tiron kernel: pid 25573 (mmap_testing), uid 0 inumber 4 on /tmp/ mnt: filesystem full Sep 23 17:23:44 tiron kernel: vnode_pager_putpages: I/O error 28 Sep 23 17:23:44 tiron kernel: vnode_pager_putpages: residual I/O 65536 at 5003 The problem resulted in a server being almost inaccessable. >How-To-Repeat: Using the following code on a filesystem with less then 20MB free space. (Could be a memorydisk/vnodedisk) #include #include #include #include #include #include int main(int argc, char** argv) { int fp; void *p; size_t len = 90 * 1024 * 1024; int ret; fp = open(argv[1], O_RDWR); if(fp == 0) { perror("open failed"); exit(1); } p = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_SHARED, fp, 0); if(p == NULL) { perror("mmap failed"); exit(2); } // write at least 20MB of data const size_t bufsize = 1024*1024; char buf[bufsize]; for(int i = 0; i < bufsize; i++) { buf[i] = rand(); } for(int i = 0; i < 25; i++) { printf("memcpy(%p + %i = %p, %p, %d)\n", p, i * bufsize, p + i * bufsize, buf, bufsize); memcpy(p + i * bufsize, buf, bufsize); } printf("syncing pages\n"); ret = msync(p, 0, MS_SYNC); if(ret != 0) { perror("msync failed"); exit(3); } ret = munmap(p, len); if(ret != 0) { perror("munmap failed"); exit(3); } ret = close(fp); if(ret != 0) { perror("fclose failed"); exit(4); } return 0; } >Fix: Possibly letting msync return an error when the disk is full, or not having sync er sync at so low prio. >Release-Note: >Audit-Trail: >Unformatted: