* 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

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
#define _NODE_MONITOR_H
/* Node monitor calls for kernel add-ons
**
** Distributed under the terms of the OpenBeOS License.
*/
#include <StorageDefs.h>
@ -16,14 +16,15 @@
*/
enum {
B_STOP_WATCHING = 0x0000,
B_WATCH_NAME = 0x0001,
B_WATCH_STAT = 0x0002,
B_WATCH_ATTR = 0x0004,
B_WATCH_DIRECTORY = 0x0008,
B_WATCH_ALL = 0x000f,
B_STOP_WATCHING = 0x0000,
B_WATCH_NAME = 0x0001,
B_WATCH_STAT = 0x0002,
B_WATCH_ATTR = 0x0004,
B_WATCH_DIRECTORY = 0x0008,
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
// changed. (Haiku only)
enum {
B_STAT_MODE = 0x01,
B_STAT_UID = 0x02,
B_STAT_GID = 0x04,
B_STAT_SIZE = 0x08,
B_STAT_ACCESS_TIME = 0x10,
B_STAT_MODIFICATION_TIME = 0x20,
B_STAT_CREATION_TIME = 0x40,
B_STAT_CHANGE_TIME = 0x80,
B_STAT_MODE = 0x0001,
B_STAT_UID = 0x0002,
B_STAT_GID = 0x0004,
B_STAT_SIZE = 0x0008,
B_STAT_ACCESS_TIME = 0x0010,
B_STAT_MODIFICATION_TIME = 0x0020,
B_STAT_CREATION_TIME = 0x0040,
B_STAT_CHANGE_TIME = 0x0080,
B_STAT_INTERIM_UPDATE = 0x1000
};

View File

@ -1429,6 +1429,10 @@ Inode::WriteAt(Transaction &transaction, off_t pos, const uint8 *buffer,
*_length = 0;
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
// have to fill the gap between that position and the old file
// size with zeros.

View File

@ -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()
&& system_time() > cookie->last_notification + INODE_NOTIFICATION_INTERVAL) {
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_notification = system_time();
}
@ -1306,7 +1306,7 @@ bfs_free_cookie(void *_ns, void *_node, void *_cookie)
status = B_OK;
}
}
if (needsTrimming || inode->OldSize() != inode->Size()) {
if (inode->OldSize() != inode->Size()) {
index.UpdateSize(transaction, inode);
changedSize = true;
}

View File

@ -1038,7 +1038,11 @@ BPoseView::InitDirentIterator(const entry_ref *ref)
uint32
BPoseView::WatchNewNodeMask()
{
#ifdef __HAIKU__
return B_WATCH_STAT | B_WATCH_INTERIM_STAT | B_WATCH_ATTR;
#else
return B_WATCH_STAT | B_WATCH_ATTR;
#endif
}

View File

@ -1,5 +1,7 @@
/*
* 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.
*/
@ -620,8 +622,10 @@ NodeMonitorService::NotifyStatChanged(dev_t device, ino_t node,
// get the lists of all interested listeners
interested_monitor_listener_list interestedListeners[3];
int32 interestedListenerCount = 0;
// ... for the node
_GetInterestedMonitorListeners(device, node, B_WATCH_STAT,
// ... for the node, depending on wether its an interim update or not
_GetInterestedMonitorListeners(device, node,
(statFields & B_STAT_INTERIM_UPDATE) != 0
? B_WATCH_INTERIM_STAT : B_WATCH_STAT,
interestedListeners, interestedListenerCount);
if (interestedListenerCount == 0)