From 3def6f5e2478bcde7bcb227ab8e7d88dd3852654 Mon Sep 17 00:00:00 2001 From: Olga Kornievskaia Date: Mon, 6 Feb 2012 14:23:47 -0500 Subject: [PATCH] propagating file change attr on getattr --- daemon/getattr.c | 3 +++ daemon/upcall.h | 1 + sys/nfs41_driver.c | 19 +++++++++++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/daemon/getattr.c b/daemon/getattr.c index e56e21f..e9dd924 100644 --- a/daemon/getattr.c +++ b/daemon/getattr.c @@ -104,6 +104,7 @@ static int handle_getattr(nfs41_upcall *upcall) switch (args->query_class) { case FileBasicInformation: nfs_to_basic_info(&info, &args->basic_info); + args->ctime = info.change; break; case FileStandardInformation: nfs_to_standard_info(&info, &args->std_info); @@ -165,6 +166,8 @@ static int marshall_getattr(unsigned char *buffer, uint32_t *length, nfs41_upcal status = 103; goto out; } + status = safe_write(&buffer, length, &args->ctime, sizeof(args->ctime)); + if (status) goto out; out: return status; } diff --git a/daemon/upcall.h b/daemon/upcall.h index 4595b15..5efc7fb 100644 --- a/daemon/upcall.h +++ b/daemon/upcall.h @@ -96,6 +96,7 @@ typedef struct __getattr_upcall_args { int query_class; int buf_len; int query_reply_len; + ULONGLONG ctime; } getattr_upcall_args; typedef struct __setattr_upcall_args { diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c index e868570..97a6f1a 100644 --- a/sys/nfs41_driver.c +++ b/sys/nfs41_driver.c @@ -194,6 +194,7 @@ typedef struct _updowncall_entry { BOOLEAN initial_query; PMDL mdl; PVOID mdl_buf; + ULONGLONG ChangeTime; } QueryFile; struct { PUNICODE_STRING filename; @@ -1636,13 +1637,24 @@ void unmarshal_nfs41_attrget( { ULONG buf_len; RtlCopyMemory(&buf_len, *buf, sizeof(ULONG)); - *buf += sizeof(ULONG); - *attr_len = buf_len; if (buf_len > *attr_len) { cur->status = STATUS_BUFFER_TOO_SMALL; return; } + *buf += sizeof(ULONG); + *attr_len = buf_len; RtlCopyMemory(attr_value, *buf, buf_len); + *buf += buf_len; +} + +void unmarshal_nfs41_getattr( + nfs41_updowncall_entry *cur, + unsigned char **buf) +{ + unmarshal_nfs41_attrget(cur, cur->u.QueryFile.buf, + &cur->u.QueryFile.buf_len, buf); + RtlCopyMemory(&cur->u.QueryFile.ChangeTime, *buf, sizeof(LONGLONG)); + DbgP("[getattr] ChangeTime %llu\n", cur->u.QueryFile.ChangeTime); } NTSTATUS unmarshal_nfs41_getacl( @@ -1772,8 +1784,7 @@ NTSTATUS nfs41_downcall( status = unmarshal_nfs41_dirquery(cur, &buf); break; case NFS41_FILE_QUERY: - unmarshal_nfs41_attrget(cur, cur->u.QueryFile.buf, - &cur->u.QueryFile.buf_len, &buf); + unmarshal_nfs41_getattr(cur, &buf); break; case NFS41_EA_GET: unmarshal_nfs41_attrget(cur, cur->u.QueryEa.buf,