Commit ab94f5d0 authored by Marc Dionne's avatar Marc Dionne Committed by David Howells

afs: Populate and use client modification time

The inode timestamps should be set from the client time
in the status received from the server, rather than the
server time which is meant for internal server use.

Set AFS_SET_MTIME and populate the mtime for operations
that take an input status, such as file/dir creation
and StoreData.  If an input time is not provided the
server will set the vnode times based on the current server
time.

In a situation where the server has some skew with the
client, this could lead to the client seeing a timestamp
in the future for a file that it just created or wrote.
Signed-off-by: default avatarMarc Dionne <marc.dionne@auristor.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 70af0e3b
...@@ -111,7 +111,7 @@ static void xdr_decode_AFSFetchStatus(const __be32 **_bp, ...@@ -111,7 +111,7 @@ static void xdr_decode_AFSFetchStatus(const __be32 **_bp,
vnode->vfs_inode.i_mode = mode; vnode->vfs_inode.i_mode = mode;
} }
vnode->vfs_inode.i_ctime.tv_sec = status->mtime_server; vnode->vfs_inode.i_ctime.tv_sec = status->mtime_client;
vnode->vfs_inode.i_mtime = vnode->vfs_inode.i_ctime; vnode->vfs_inode.i_mtime = vnode->vfs_inode.i_ctime;
vnode->vfs_inode.i_atime = vnode->vfs_inode.i_ctime; vnode->vfs_inode.i_atime = vnode->vfs_inode.i_ctime;
vnode->vfs_inode.i_version = data_version; vnode->vfs_inode.i_version = data_version;
...@@ -734,8 +734,8 @@ int afs_fs_create(struct afs_server *server, ...@@ -734,8 +734,8 @@ int afs_fs_create(struct afs_server *server,
memset(bp, 0, padsz); memset(bp, 0, padsz);
bp = (void *) bp + padsz; bp = (void *) bp + padsz;
} }
*bp++ = htonl(AFS_SET_MODE); *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
*bp++ = 0; /* mtime */ *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
*bp++ = 0; /* owner */ *bp++ = 0; /* owner */
*bp++ = 0; /* group */ *bp++ = 0; /* group */
*bp++ = htonl(mode & S_IALLUGO); /* unix mode */ *bp++ = htonl(mode & S_IALLUGO); /* unix mode */
...@@ -1003,8 +1003,8 @@ int afs_fs_symlink(struct afs_server *server, ...@@ -1003,8 +1003,8 @@ int afs_fs_symlink(struct afs_server *server,
memset(bp, 0, c_padsz); memset(bp, 0, c_padsz);
bp = (void *) bp + c_padsz; bp = (void *) bp + c_padsz;
} }
*bp++ = htonl(AFS_SET_MODE); *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME);
*bp++ = 0; /* mtime */ *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
*bp++ = 0; /* owner */ *bp++ = 0; /* owner */
*bp++ = 0; /* group */ *bp++ = 0; /* group */
*bp++ = htonl(S_IRWXUGO); /* unix mode */ *bp++ = htonl(S_IRWXUGO); /* unix mode */
...@@ -1203,8 +1203,8 @@ static int afs_fs_store_data64(struct afs_server *server, ...@@ -1203,8 +1203,8 @@ static int afs_fs_store_data64(struct afs_server *server,
*bp++ = htonl(vnode->fid.vnode); *bp++ = htonl(vnode->fid.vnode);
*bp++ = htonl(vnode->fid.unique); *bp++ = htonl(vnode->fid.unique);
*bp++ = 0; /* mask */ *bp++ = htonl(AFS_SET_MTIME); /* mask */
*bp++ = 0; /* mtime */ *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
*bp++ = 0; /* owner */ *bp++ = 0; /* owner */
*bp++ = 0; /* group */ *bp++ = 0; /* group */
*bp++ = 0; /* unix mode */ *bp++ = 0; /* unix mode */
...@@ -1280,8 +1280,8 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb, ...@@ -1280,8 +1280,8 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb,
*bp++ = htonl(vnode->fid.vnode); *bp++ = htonl(vnode->fid.vnode);
*bp++ = htonl(vnode->fid.unique); *bp++ = htonl(vnode->fid.unique);
*bp++ = 0; /* mask */ *bp++ = htonl(AFS_SET_MTIME); /* mask */
*bp++ = 0; /* mtime */ *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */
*bp++ = 0; /* owner */ *bp++ = 0; /* owner */
*bp++ = 0; /* group */ *bp++ = 0; /* group */
*bp++ = 0; /* unix mode */ *bp++ = 0; /* unix mode */
......
...@@ -85,7 +85,7 @@ static int afs_inode_map_status(struct afs_vnode *vnode, struct key *key) ...@@ -85,7 +85,7 @@ static int afs_inode_map_status(struct afs_vnode *vnode, struct key *key)
inode->i_uid = vnode->status.owner; inode->i_uid = vnode->status.owner;
inode->i_gid = vnode->status.group; inode->i_gid = vnode->status.group;
inode->i_size = vnode->status.size; inode->i_size = vnode->status.size;
inode->i_ctime.tv_sec = vnode->status.mtime_server; inode->i_ctime.tv_sec = vnode->status.mtime_client;
inode->i_ctime.tv_nsec = 0; inode->i_ctime.tv_nsec = 0;
inode->i_atime = inode->i_mtime = inode->i_ctime; inode->i_atime = inode->i_mtime = inode->i_ctime;
inode->i_blocks = 0; inode->i_blocks = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment