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