sync() now also syncs the vnode caches (file data).

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10739 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-01-15 00:38:16 +00:00
parent bcab07add0
commit 849647ec72
+36 -19
View File
@@ -601,10 +601,12 @@ free_vnode(struct vnode *vnode, bool reenter)
{
ASSERT(vnode->ref_count == 0 && vnode->busy);
// write back any changes in this vnode's cache (if present)
// write back any changes in this vnode's cache -- but only
// if the vnode won't be deleted, in which case the changes
// will be discarded
if (vnode->cache && !vnode->delete_me)
vm_cache_write_modified((vm_cache_ref *)vnode->cache);
vm_cache_write_modified(vnode->cache);
if (vnode->delete_me)
FS_CALL(vnode, remove_vnode)(vnode->mount->cookie, vnode->private_node, reenter);
@@ -613,7 +615,7 @@ free_vnode(struct vnode *vnode, bool reenter)
// if we have a vm_cache attached, remove it
if (vnode->cache)
vm_cache_release_ref((vm_cache_ref *)vnode->cache);
vm_cache_release_ref(vnode->cache);
vnode->cache = NULL;
@@ -4376,33 +4378,39 @@ fs_unmount(char *path, uint32 flags, bool kernel)
free(mount->fs_name);
free(mount);
return 0;
return B_OK;
}
static status_t
fs_sync(void)
fs_sync(dev_t device)
{
struct hash_iterator iter;
struct fs_mount *mount;
FUNCTION(("vfs_sync: entry.\n"));
mount = get_mount(device);
if (mount == NULL)
return B_BAD_VALUE;
/* cycle through and call sync on each mounted fs */
recursive_lock_lock(&sMountOpLock);
mutex_lock(&sMountMutex);
hash_open(sMountsTable, &iter);
while ((mount = (struct fs_mount *)hash_next(sMountsTable, &iter))) {
if (FS_MOUNT_CALL(mount, sync))
FS_MOUNT_CALL(mount, sync)(mount->cookie);
}
hash_close(sMountsTable, &iter, false);
status_t status = B_OK;
if (FS_MOUNT_CALL(mount, sync))
status = FS_MOUNT_CALL(mount, sync)(mount->cookie);
mutex_unlock(&sMountMutex);
recursive_lock_unlock(&sMountOpLock);
return 0;
// synchronize all vnodes
recursive_lock_lock(&mount->rlock);
struct vnode *vnode = NULL;
while ((vnode = (struct vnode *)list_get_next_item(&mount->vnodes, vnode)) != NULL) {
if (vnode->cache)
vm_cache_write_modified(vnode->cache);
}
recursive_lock_unlock(&mount->rlock);
put_mount(mount);
return status;
}
@@ -4603,7 +4611,16 @@ _kern_write_fs_info(dev_t device, const struct fs_info *info, int mask)
status_t
_kern_sync(void)
{
return fs_sync();
// Note: _kern_sync() is also called from _user_sync()
int32 cookie = 0;
dev_t device;
while ((device = next_dev(&cookie)) >= 0) {
status_t status = fs_sync(device);
if (status != B_OK && status != B_BAD_VALUE)
dprintf("sync: device %ld couldn't sync: %s\n", device, strerror(status));
}
return B_OK;
}
@@ -5323,7 +5340,7 @@ _user_next_device(int32 *_userCookie)
status_t
_user_sync(void)
{
return fs_sync();
return _kern_sync();
}