* write_stat() should not add/update the last modification time of directories.
Reported by Robert Szeleney. * Fixed an endian problem in write_stat() in the R5 version of BFS. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19121 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -741,7 +741,11 @@ bfs_write_stat(void *_ns, void *_node, const struct stat *stat, uint32 mask)
|
|||||||
node.gid = HOST_ENDIAN_TO_BFS_INT32(stat->st_gid);
|
node.gid = HOST_ENDIAN_TO_BFS_INT32(stat->st_gid);
|
||||||
|
|
||||||
if (mask & B_STAT_MODIFICATION_TIME) {
|
if (mask & B_STAT_MODIFICATION_TIME) {
|
||||||
if (!inode->IsDeleted()) {
|
if (inode->IsDirectory()) {
|
||||||
|
// directory modification times are not part of the index
|
||||||
|
node.last_modified_time = HOST_ENDIAN_TO_BFS_INT64(
|
||||||
|
(bigtime_t)stat->st_mtime << INODE_TIME_SHIFT);
|
||||||
|
} else if (!inode->IsDeleted()) {
|
||||||
// Index::UpdateLastModified() will set the new time in the inode
|
// Index::UpdateLastModified() will set the new time in the inode
|
||||||
Index index(volume);
|
Index index(volume);
|
||||||
index.UpdateLastModified(transaction, inode,
|
index.UpdateLastModified(transaction, inode,
|
||||||
@@ -749,7 +753,8 @@ bfs_write_stat(void *_ns, void *_node, const struct stat *stat, uint32 mask)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mask & B_STAT_CREATION_TIME) {
|
if (mask & B_STAT_CREATION_TIME) {
|
||||||
node.create_time = HOST_ENDIAN_TO_BFS_INT64((bigtime_t)stat->st_crtime << INODE_TIME_SHIFT);
|
node.create_time = HOST_ENDIAN_TO_BFS_INT64(
|
||||||
|
(bigtime_t)stat->st_crtime << INODE_TIME_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((status = inode->WriteBack(transaction)) == B_OK)
|
if ((status = inode->WriteBack(transaction)) == B_OK)
|
||||||
|
|||||||
@@ -98,6 +98,8 @@ class Inode : public CachedBlock {
|
|||||||
bool IsIndex() const { return (Mode() & (S_INDEX_DIR | 0777)) == S_INDEX_DIR; }
|
bool IsIndex() const { return (Mode() & (S_INDEX_DIR | 0777)) == S_INDEX_DIR; }
|
||||||
// that's a stupid check, but AFAIK the only possible method...
|
// that's a stupid check, but AFAIK the only possible method...
|
||||||
|
|
||||||
|
bool IsDeleted() const { return (Flags() & INODE_DELETED) != 0; }
|
||||||
|
|
||||||
bool IsAttributeDirectory() const { return (Mode() & S_ATTR_DIR) != 0; }
|
bool IsAttributeDirectory() const { return (Mode() & S_ATTR_DIR) != 0; }
|
||||||
bool IsAttribute() const { return Mode() & S_ATTR; }
|
bool IsAttribute() const { return Mode() & S_ATTR; }
|
||||||
bool IsFile() const { return (Mode() & (S_IFMT | S_ATTR)) == S_FILE; }
|
bool IsFile() const { return (Mode() & (S_IFMT | S_ATTR)) == S_FILE; }
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* kernel_interface - file system interface to BeOS' vnode layer
|
/* kernel_interface - file system interface to BeOS' vnode layer
|
||||||
*
|
*
|
||||||
* Copyright 2001-2005, Axel Dörfler, axeld@pinc-software.de
|
* Copyright 2001-2006, Axel Dörfler, axeld@pinc-software.de
|
||||||
* This file may be used under the terms of the MIT License.
|
* This file may be used under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -967,13 +967,20 @@ bfs_write_stat(void *_ns, void *_node, struct stat *stat, long mask)
|
|||||||
node->gid = stat->st_gid;
|
node->gid = stat->st_gid;
|
||||||
|
|
||||||
if (mask & WSTAT_MTIME) {
|
if (mask & WSTAT_MTIME) {
|
||||||
// Index::UpdateLastModified() will set the new time in the inode
|
if (inode->IsDirectory()) {
|
||||||
Index index(volume);
|
// directory modification times are not part of the index
|
||||||
index.UpdateLastModified(&transaction, inode,
|
node->last_modified_time = HOST_ENDIAN_TO_BFS_INT64(
|
||||||
(bigtime_t)stat->st_mtime << INODE_TIME_SHIFT);
|
(bigtime_t)stat->st_mtime << INODE_TIME_SHIFT);
|
||||||
|
} else if (!inode->IsDeleted()) {
|
||||||
|
// Index::UpdateLastModified() will set the new time in the inode
|
||||||
|
Index index(volume);
|
||||||
|
index.UpdateLastModified(&transaction, inode,
|
||||||
|
(bigtime_t)stat->st_mtime << INODE_TIME_SHIFT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (mask & WSTAT_CRTIME) {
|
if (mask & WSTAT_CRTIME) {
|
||||||
node->create_time = (bigtime_t)stat->st_crtime << INODE_TIME_SHIFT;
|
node->create_time = HOST_ENDIAN_TO_BFS_INT64(
|
||||||
|
(bigtime_t)stat->st_crtime << INODE_TIME_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((status = inode->WriteBack(&transaction)) == B_OK)
|
if ((status = inode->WriteBack(&transaction)) == B_OK)
|
||||||
|
|||||||
Reference in New Issue
Block a user