POSIX locking.

Jeremy Allison jeremy at valinux.com
Fri May 5 18:10:34 GMT 2000


Just an update. I've now been running the new byte range -> POSIX
locking code overnight using the new locktest torture tester
between two different smbd's, one that maps byte range locks
to POSIX locks, and one that doesn't.

The results are identical (and it doesn't leak memory either,
I'm running with insure :-), so it looks like the problem
of mapping Win32 byte range locks to POSIX locks is solved
for Samba (famous last words :-).

Funnyly enough we can't run the locktester against a Samba
share and an NT share due to a trivial locking bug that
NT exhibits :-). I've attached sample Win32 code that
demonstrates this even against a local filesystem :-).

Cheers,

	Jeremy Allison,
	Samba Team.

----------------cut here--------------------------------
#include <windows.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
	OVERLAPPED ov;
	HANDLE fh0 = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE,
				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
				FILE_ATTRIBUTE_NORMAL,NULL);
	HANDLE fh1 = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE,
				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
				FILE_ATTRIBUTE_NORMAL,NULL);

	if (argc != 2) {
		fprintf(stderr, "Usage : %s filename\n", argv[0]);
		return -1;
	}

	if (fh0 == INVALID_HANDLE_VALUE || fh0 == INVALID_HANDLE_VALUE) {
		fprintf(stderr, "Open failed.\n");
		return -1;
	}

        memset(&ov, '\0', sizeof(ov));

	if (LockFileEx(fh0, LOCKFILE_FAIL_IMMEDIATELY, 0, 8, 0, &ov) == 0) {
		fprintf(stderr, "READ lock failed.\n");
		return -1;
	}

	if (LockFileEx(fh1, LOCKFILE_FAIL_IMMEDIATELY, 0, 1, 0, &ov) == 0) {
		fprintf(stderr, "READ lock failed.\n");
		return -1;
	}

	if(CloseHandle(fh0) == 0) {
		fprintf(stderr, "CloseHandle failed.\n");
		return -1;
	}

	fh0 = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE,
			 FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
			 FILE_ATTRIBUTE_NORMAL,NULL);

	if (fh0 == INVALID_HANDLE_VALUE) {
		fprintf(stderr, "Open failed.\n");
		return -1;
	}

	/* This next lock should succeed and it fails ! */
	ov.Offset = 7;
	if (LockFileEx(fh0, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, 0, 1, 0, &ov) == 0) {
		fprintf(stderr, "WRITE lock failed: %x.\n", GetLastError() );
		return -1;
	}
	
	printf("Lock succeeded\n");

	return 0;
}
----------------cut here--------------------------------
-- 
--------------------------------------------------------
Buying an operating system without source is like buying
a self-assembly Space Shuttle with no instructions.
--------------------------------------------------------


More information about the samba-technical mailing list