svn commit: samba r14933 - in branches/SAMBA_4_0/source/ntvfs/posix: .

tridge at samba.org tridge at samba.org
Thu Apr 6 01:56:06 GMT 2006


Author: tridge
Date: 2006-04-06 01:56:04 +0000 (Thu, 06 Apr 2006)
New Revision: 14933

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=14933

Log:

fix the handling of notify filters to be much closer to the behaviour
of w2k3. The behaviour is particularly tricky for rename.

Modified:
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_mkdir.c
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_read.c
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_rename.c
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_setfileinfo.c
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_write.c
   branches/SAMBA_4_0/source/ntvfs/posix/vfs_posix.c


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_mkdir.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_mkdir.c	2006-04-06 01:54:12 UTC (rev 14932)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_mkdir.c	2006-04-06 01:56:04 UTC (rev 14933)
@@ -85,7 +85,7 @@
 
 	notify_trigger(pvfs->notify_context, 
 		       NOTIFY_ACTION_ADDED, 
-		       FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+		       FILE_NOTIFY_CHANGE_DIR_NAME,
 		       name->full_name);
 
 	return NT_STATUS_OK;
@@ -142,7 +142,7 @@
 
 	notify_trigger(pvfs->notify_context, 
 		       NOTIFY_ACTION_ADDED, 
-		       FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+		       FILE_NOTIFY_CHANGE_DIR_NAME,
 		       name->full_name);
 
 	return NT_STATUS_OK;
@@ -184,7 +184,7 @@
 
 	notify_trigger(pvfs->notify_context, 
 		       NOTIFY_ACTION_REMOVED, 
-		       FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+		       FILE_NOTIFY_CHANGE_DIR_NAME,
 		       name->full_name);
 
 	return NT_STATUS_OK;

Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c	2006-04-06 01:54:12 UTC (rev 14932)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c	2006-04-06 01:56:04 UTC (rev 14933)
@@ -380,8 +380,8 @@
 		create_action = NTCREATEX_ACTION_CREATED;
 
 		notify_trigger(pvfs->notify_context, 
-			       NOTIFY_ACTION_REMOVED, 
-			       FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
+			       NOTIFY_ACTION_ADDED, 
+			       FILE_NOTIFY_CHANGE_DIR_NAME,
 			       name->full_name);
 	} else {
 		create_action = NTCREATEX_ACTION_EXISTED;

Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_read.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_read.c	2006-04-06 01:54:12 UTC (rev 14932)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_read.c	2006-04-06 01:56:04 UTC (rev 14933)
@@ -90,10 +90,5 @@
 	rd->readx.out.remaining = 0xFFFF;
 	rd->readx.out.compaction_mode = 0; 
 
-	notify_trigger(pvfs->notify_context, 
-		       NOTIFY_ACTION_MODIFIED, 
-		       FILE_NOTIFY_CHANGE_LAST_ACCESS,
-		       f->handle->name->full_name);
-
 	return NT_STATUS_OK;
 }

Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_rename.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_rename.c	2006-04-06 01:54:12 UTC (rev 14932)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_rename.c	2006-04-06 01:56:04 UTC (rev 14933)
@@ -28,39 +28,46 @@
 /*
   do a file rename, and send any notify triggers
 */
-NTSTATUS pvfs_do_rename(struct pvfs_state *pvfs, const char *name1, const char *name2)
+NTSTATUS pvfs_do_rename(struct pvfs_state *pvfs, const struct pvfs_filename *name1, 
+			const char *name2)
 {
 	const char *r1, *r2;
+	uint32_t mask;
 
-	if (rename(name1, name2) == -1) {
+	if (rename(name1->full_name, name2) == -1) {
 		return pvfs_map_errno(pvfs, errno);
 	}
 
+	if (name1->dos.attrib & FILE_ATTRIBUTE_DIRECTORY) {
+		mask = FILE_NOTIFY_CHANGE_DIR_NAME;
+	} else {
+		mask = FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_CREATION;
+	}
 	/* 
 	   renames to the same directory cause a OLD_NAME->NEW_NAME notify.
 	   renames to a different directory are considered a remove/add 
 	*/
-	r1 = strrchr_m(name1, '/');
+	r1 = strrchr_m(name1->full_name, '/');
 	r2 = strrchr_m(name2, '/');
 
-	if ((r1-name1) != (r2-name2) ||
-	    strncmp(name1, name2, r1-name1) != 0) {
+	if ((r1-name1->full_name) != (r2-name2) ||
+	    strncmp(name1->full_name, name2, r1-name1->full_name) != 0) {
 		notify_trigger(pvfs->notify_context, 
 			       NOTIFY_ACTION_REMOVED, 
-			       FILE_NOTIFY_CHANGE_FILE_NAME,
-			       name1);
+			       mask,
+			       name1->full_name);
 		notify_trigger(pvfs->notify_context, 
 			       NOTIFY_ACTION_ADDED, 
-			       FILE_NOTIFY_CHANGE_FILE_NAME,
+			       mask,
 			       name2);
 	} else {
 		notify_trigger(pvfs->notify_context, 
 			       NOTIFY_ACTION_OLD_NAME, 
-			       FILE_NOTIFY_CHANGE_FILE_NAME,
-			       name1);
+			       mask,
+			       name1->full_name);
 		notify_trigger(pvfs->notify_context, 
 			       NOTIFY_ACTION_NEW_NAME, 
-			       FILE_NOTIFY_CHANGE_FILE_NAME,
+			       mask,
 			       name2);
 	}
 	
@@ -217,7 +224,7 @@
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	status = pvfs_do_rename(pvfs, name1->full_name, fname2);
+	status = pvfs_do_rename(pvfs, name1, fname2);
 
 	if (NT_STATUS_IS_OK(status)) {
 		status = odb_rename(lck, fname2);
@@ -338,7 +345,7 @@
 		return status;
 	}
 
-	status = pvfs_do_rename(pvfs, name1->full_name, name2->full_name);
+	status = pvfs_do_rename(pvfs, name1, name2->full_name);
 	if (NT_STATUS_IS_OK(status)) {
 		status = odb_rename(lck, name2->full_name);
 	}
@@ -411,7 +418,7 @@
 	case RENAME_FLAG_RENAME:
 		status = pvfs_access_check_parent(pvfs, req, name2, SEC_DIR_ADD_FILE);
 		NT_STATUS_NOT_OK_RETURN(status);
-		status = pvfs_do_rename(pvfs, name1->full_name, name2->full_name);
+		status = pvfs_do_rename(pvfs, name1, name2->full_name);
 		NT_STATUS_NOT_OK_RETURN(status);
 		break;
 

Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_setfileinfo.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_setfileinfo.c	2006-04-06 01:54:12 UTC (rev 14932)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_setfileinfo.c	2006-04-06 01:56:04 UTC (rev 14933)
@@ -147,7 +147,7 @@
 		return status;
 	}
 
-	status = pvfs_do_rename(pvfs, name->full_name, name2->full_name);
+	status = pvfs_do_rename(pvfs, name, name2->full_name);
 	if (NT_STATUS_IS_OK(status)) {
 		name->full_name = talloc_steal(name, name2->full_name);
 		name->original_name = talloc_steal(name, name2->original_name);
@@ -292,7 +292,6 @@
 	case RAW_SFILEINFO_STANDARD:
 		if (!null_time(info->setattre.in.create_time)) {
 			unix_to_nt_time(&newstats.dos.create_time, info->setattre.in.create_time);
-			change_mask |= FILE_NOTIFY_CHANGE_CREATION;
 		}
 		if (!null_time(info->setattre.in.access_time)) {
 			unix_to_nt_time(&newstats.dos.access_time, info->setattre.in.access_time);
@@ -311,7 +310,6 @@
 	case RAW_SFILEINFO_BASIC_INFORMATION:
 		if (!null_nttime(info->basic_info.in.create_time)) {
 			newstats.dos.create_time = info->basic_info.in.create_time;
-			change_mask |= FILE_NOTIFY_CHANGE_CREATION;
 		}
 		if (!null_nttime(info->basic_info.in.access_time)) {
 			newstats.dos.access_time = info->basic_info.in.access_time;
@@ -408,6 +406,9 @@
 
 	/* possibly change the file timestamps */
 	ZERO_STRUCT(unix_times);
+	if (newstats.dos.create_time != h->name->dos.create_time) {
+		change_mask |= FILE_NOTIFY_CHANGE_CREATION;
+	}
 	if (newstats.dos.access_time != h->name->dos.access_time) {
 		unix_times.actime = nt_time_to_unix(newstats.dos.access_time);
 		change_mask |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
@@ -494,7 +495,6 @@
 	case RAW_SFILEINFO_STANDARD:
 		if (!null_time(info->setattre.in.create_time)) {
 			unix_to_nt_time(&newstats.dos.create_time, info->setattre.in.create_time);
-			change_mask |= FILE_NOTIFY_CHANGE_CREATION;
 		}
 		if (!null_time(info->setattre.in.access_time)) {
 			unix_to_nt_time(&newstats.dos.access_time, info->setattre.in.access_time);
@@ -513,7 +513,6 @@
 	case RAW_SFILEINFO_BASIC_INFORMATION:
 		if (!null_nttime(info->basic_info.in.create_time)) {
 			newstats.dos.create_time = info->basic_info.in.create_time;
-			change_mask |= FILE_NOTIFY_CHANGE_CREATION;
 		}
 		if (!null_nttime(info->basic_info.in.access_time)) {
 			newstats.dos.access_time = info->basic_info.in.access_time;
@@ -585,11 +584,16 @@
 
 	/* possibly change the file timestamps */
 	ZERO_STRUCT(unix_times);
+	if (newstats.dos.create_time != name->dos.create_time) {
+		change_mask |= FILE_NOTIFY_CHANGE_CREATION;
+	}
 	if (newstats.dos.access_time != name->dos.access_time) {
 		unix_times.actime = nt_time_to_unix(newstats.dos.access_time);
+		change_mask |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
 	}
 	if (newstats.dos.write_time != name->dos.write_time) {
 		unix_times.modtime = nt_time_to_unix(newstats.dos.write_time);
+		change_mask |= FILE_NOTIFY_CHANGE_LAST_WRITE;
 	}
 	if (unix_times.actime != 0 || unix_times.modtime != 0) {
 		if (utime(name->full_name, &unix_times) == -1) {
@@ -604,6 +608,7 @@
 		if (chmod(name->full_name, mode) == -1) {
 			return pvfs_map_errno(pvfs, errno);
 		}
+		change_mask |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
 	}
 
 	*name = newstats;

Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_write.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_write.c	2006-04-06 01:54:12 UTC (rev 14932)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_write.c	2006-04-06 01:56:04 UTC (rev 14933)
@@ -85,10 +85,5 @@
 	wr->writex.out.nwritten = ret;
 	wr->writex.out.remaining = 0; /* should fill this in? */
 
-	notify_trigger(pvfs->notify_context, 
-		       NOTIFY_ACTION_MODIFIED, 
-		       FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE,
-		       f->handle->name->full_name);
-	
 	return NT_STATUS_OK;
 }

Modified: branches/SAMBA_4_0/source/ntvfs/posix/vfs_posix.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/vfs_posix.c	2006-04-06 01:54:12 UTC (rev 14932)
+++ branches/SAMBA_4_0/source/ntvfs/posix/vfs_posix.c	2006-04-06 01:56:04 UTC (rev 14933)
@@ -111,7 +111,7 @@
 	struct pvfs_search_state *s, *sn;
 
 	/* 
-	 * make sure we cleanup files and searches before anythingelse
+	 * make sure we cleanup files and searches before anything else
 	 * because there destructors need to acess the pvfs_state struct
 	 */
 	for (f=pvfs->files.list; f; f=fn) {



More information about the samba-cvs mailing list