Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Feb 2001 15:58:41 -0800 (PST)
From:      ikqumei@computer.org
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   i386/24886: Cant msync memory mapped file onto desk.
Message-ID:  <200102052358.f15Nwfi06015@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         24886
>Category:       i386
>Synopsis:       Cant msync memory mapped file onto desk.
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Feb 05 16:00:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Iyad Qumei
>Release:        4.0
>Organization:
Digital Transit, Inc.
>Environment:
FreeBSD freebsd.irntdomain.com 4.0-RELEASE FreeBSD 4.0-RELEASE #0: Mon Mar 20 22:50:22 GMT 2000     root@monster.cdrom.com:/usr/src/sys/compile/GENERIC  i386

>Description:
I wrote a simple program to demonstrate the problem.  Basically, I use mmap to exchange information between files. After this is done, I try to msync the information back to desk.  The new information does not seem to be saved. The return value from msync is 0, and no error registed through errno.

I used simple text files with this program.

< source code begin >
#include <stdio.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <limits.h>
#include <errno.h>
#include <unistd.h>

bool ResizeFile( int fd, int new_sz  );

int main()
{

	int hOldFile=0, hNewFile=0;
	char *ofbuf=NULL, *nfbuf=NULL;
	long new_sz=155, ofsz=133;
	char *ofile="oldf.txt";
	char *nfile="newf.txt";

	hOldFile = open( ofile, O_RDWR );
	hNewFile = open( nfile, O_RDWR );

	if( hOldFile )
		ofbuf = (char*)mmap(NULL, ofsz, PROT_READ|PROT_WRITE, /*MAP_DENYWRITE*/MAP_PRIVATE, hOldFile, 0);

	if ( !ResizeFile( hOldFile, new_sz ) )
	{
	        close(hOldFile);
        	close(hNewFile);
		return 1;
	}

	nfbuf = (char*) mmap(NULL, new_sz, PROT_READ|PROT_WRITE, MAP_PRIVATE, hNewFile, 0);

	for( int i=0; i<new_sz; i++ )
		ofbuf[i] = nfbuf[i];

	if ( msync( ofbuf, /*MPPH.new_sz*/ 0 , MS_SYNC)  )
		perror( "Error msync ofbuf" );
	munmap( ofbuf, new_sz );
	close(hOldFile);

	if( msync( nfbuf, new_sz, MS_SYNC ) )
		perror( "Error msync nfbuf" );
	munmap( nfbuf, new_sz );
	close(hNewFile);
}


bool SetEndOfFile( int fd )
{
	long int new_size;

	new_size = lseek(fd,0L,SEEK_CUR);
	if( -1 ==  new_size )
		return ( -1 );
	
	if ( write( fd, "\0", 1)   <= 0 )
        	return ( -1 );

 	if( ftruncate(fd, new_size) != -1 )
		   return true;
	return false;
}

bool ResizeFile( int fd, int new_sz  )
{
	if ( new_sz != lseek( fd, new_sz, SEEK_SET ) )
        	return false;
	
	if (!SetEndOfFile(fd) )
        	return false;

	if ( 0 != lseek(fd,0,SEEK_SET))
        	return false;

	return true;
}


>How-To-Repeat:
I used two text files, 
<oldf.txt, 133bytes>
auto testing: 

Functional spec and Software design spec as guide to features testing.

Generator testing:
command line testing.
<newf.txt, 155bytes>
auto testing: 

Functional spec and Software design spec as guide to features testing.

Generator testing:
command line testing.

Just added a line.
>Fix:


>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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