* Added B_WATCH_INTERIM_STAT, and B_STAT_INTERIM_UPDATE definitions to

NodeMonitor.h.
* The latter will be set in "statFields" for interim updates when you have
  asked to get them via the former.
* BFS now uses the B_STAT_INTERIM_UPDATE flag for sending updates to actively
  written files.
* This makes us more compatible with BeOS again; if you only asked for
  B_WATCH_STAT, you will now only receive a notification if the file in
  question has been closed.
* Tracker now uses B_WATCH_INTERIM_STAT to always get all updates (ie.
  downloading a file will update its size and modification time in Tracker
  periodically during the download).
* Wether "needsTrimming" was true or not has no influence on wether or not
  the size index needs to be updated in BFS - only the actual file size is
  stored there, not the on-disk size.
* Added a TODO comment in Inode::WriteAt() that it would actually need to
  update the size index when changing the file size, not when the file has
  been closed (but that's probably too slow).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24114 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-02-25 13:54:30 +00:00
parent ad93c2f5eb
commit 351b7a2d24
5 changed files with 38 additions and 23 deletions
+22 -19
View File
@@ -1,9 +1,9 @@
/*
* Copyright 2003-2008, Haiku Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _NODE_MONITOR_H #ifndef _NODE_MONITOR_H
#define _NODE_MONITOR_H #define _NODE_MONITOR_H
/* Node monitor calls for kernel add-ons
**
** Distributed under the terms of the OpenBeOS License.
*/
#include <StorageDefs.h> #include <StorageDefs.h>
@@ -16,14 +16,15 @@
*/ */
enum { enum {
B_STOP_WATCHING = 0x0000, B_STOP_WATCHING = 0x0000,
B_WATCH_NAME = 0x0001, B_WATCH_NAME = 0x0001,
B_WATCH_STAT = 0x0002, B_WATCH_STAT = 0x0002,
B_WATCH_ATTR = 0x0004, B_WATCH_ATTR = 0x0004,
B_WATCH_DIRECTORY = 0x0008, B_WATCH_DIRECTORY = 0x0008,
B_WATCH_ALL = 0x000f, B_WATCH_ALL = 0x000f,
B_WATCH_MOUNT = 0x0010 B_WATCH_MOUNT = 0x0010,
B_WATCH_INTERIM_STAT = 0x0020
}; };
@@ -53,14 +54,16 @@ enum {
// messages, specifying what parts of the stat data have actually been // messages, specifying what parts of the stat data have actually been
// changed. (Haiku only) // changed. (Haiku only)
enum { enum {
B_STAT_MODE = 0x01, B_STAT_MODE = 0x0001,
B_STAT_UID = 0x02, B_STAT_UID = 0x0002,
B_STAT_GID = 0x04, B_STAT_GID = 0x0004,
B_STAT_SIZE = 0x08, B_STAT_SIZE = 0x0008,
B_STAT_ACCESS_TIME = 0x10, B_STAT_ACCESS_TIME = 0x0010,
B_STAT_MODIFICATION_TIME = 0x20, B_STAT_MODIFICATION_TIME = 0x0020,
B_STAT_CREATION_TIME = 0x40, B_STAT_CREATION_TIME = 0x0040,
B_STAT_CHANGE_TIME = 0x80, B_STAT_CHANGE_TIME = 0x0080,
B_STAT_INTERIM_UPDATE = 0x1000
}; };
@@ -1429,6 +1429,10 @@ Inode::WriteAt(Transaction &transaction, off_t pos, const uint8 *buffer,
*_length = 0; *_length = 0;
RETURN_ERROR(status); RETURN_ERROR(status);
} }
// TODO: In theory we would need to update the file size
// index here as part of the current transaction - this might just
// be a bit too expensive, but worth a try.
// If the position of the write was beyond the file size, we // If the position of the write was beyond the file size, we
// have to fill the gap between that position and the old file // have to fill the gap between that position and the old file
// size with zeros. // size with zeros.
@@ -1233,7 +1233,7 @@ bfs_write(void *_ns, void *_node, void *_cookie, off_t pos, const void *buffer,
if (!inode->IsDeleted() && cookie->last_size != inode->Size() if (!inode->IsDeleted() && cookie->last_size != inode->Size()
&& system_time() > cookie->last_notification + INODE_NOTIFICATION_INTERVAL) { && system_time() > cookie->last_notification + INODE_NOTIFICATION_INTERVAL) {
notify_stat_changed(volume->ID(), inode->ID(), notify_stat_changed(volume->ID(), inode->ID(),
B_STAT_MODIFICATION_TIME | B_STAT_SIZE); B_STAT_MODIFICATION_TIME | B_STAT_SIZE | B_STAT_INTERIM_UPDATE);
cookie->last_size = inode->Size(); cookie->last_size = inode->Size();
cookie->last_notification = system_time(); cookie->last_notification = system_time();
} }
@@ -1306,7 +1306,7 @@ bfs_free_cookie(void *_ns, void *_node, void *_cookie)
status = B_OK; status = B_OK;
} }
} }
if (needsTrimming || inode->OldSize() != inode->Size()) { if (inode->OldSize() != inode->Size()) {
index.UpdateSize(transaction, inode); index.UpdateSize(transaction, inode);
changedSize = true; changedSize = true;
} }
+4
View File
@@ -1038,7 +1038,11 @@ BPoseView::InitDirentIterator(const entry_ref *ref)
uint32 uint32
BPoseView::WatchNewNodeMask() BPoseView::WatchNewNodeMask()
{ {
#ifdef __HAIKU__
return B_WATCH_STAT | B_WATCH_INTERIM_STAT | B_WATCH_ATTR;
#else
return B_WATCH_STAT | B_WATCH_ATTR; return B_WATCH_STAT | B_WATCH_ATTR;
#endif
} }
+6 -2
View File
@@ -1,5 +1,7 @@
/* /*
* Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Copyright 2005-2008, Ingo Weinhold, bonefish@users.sf.net.
*
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -620,8 +622,10 @@ NodeMonitorService::NotifyStatChanged(dev_t device, ino_t node,
// get the lists of all interested listeners // get the lists of all interested listeners
interested_monitor_listener_list interestedListeners[3]; interested_monitor_listener_list interestedListeners[3];
int32 interestedListenerCount = 0; int32 interestedListenerCount = 0;
// ... for the node // ... for the node, depending on wether its an interim update or not
_GetInterestedMonitorListeners(device, node, B_WATCH_STAT, _GetInterestedMonitorListeners(device, node,
(statFields & B_STAT_INTERIM_UPDATE) != 0
? B_WATCH_INTERIM_STAT : B_WATCH_STAT,
interestedListeners, interestedListenerCount); interestedListeners, interestedListenerCount);
if (interestedListenerCount == 0) if (interestedListenerCount == 0)