From 1db58389c64af83a28c0d085ceab09fd8988f7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 14 Apr 2009 17:05:15 +0000 Subject: [PATCH] * {read|write}_pages() does not have a "reenter" argument. This could let both commands run without proper locking. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30160 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/fat/file.c | 26 +++++++--------------- src/add-ons/kernel/file_systems/fat/file.h | 12 +++++----- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/add-ons/kernel/file_systems/fat/file.c b/src/add-ons/kernel/file_systems/fat/file.c index 441a707f8c..8bd9ec8ebf 100644 --- a/src/add-ons/kernel/file_systems/fat/file.c +++ b/src/add-ons/kernel/file_systems/fat/file.c @@ -1504,9 +1504,8 @@ dosfs_can_page(fs_volume *_vol, fs_vnode *_node, void *_cookie) status_t -dosfs_read_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, - off_t pos, const iovec *vecs, size_t count, size_t *_numBytes, - bool reenter) +dosfs_read_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos, + const iovec *vecs, size_t count, size_t *_numBytes) { nspace *vol = (nspace *)_vol->private_volume; vnode *node = (vnode *)_node->private_node; @@ -1522,9 +1521,7 @@ dosfs_read_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, if (node->cache == NULL) return(B_BAD_VALUE); - if (!reenter) { - LOCK_VOL(vol); - } + LOCK_VOL(vol); while (true) { struct file_io_vec fileVecs[8]; @@ -1548,18 +1545,15 @@ dosfs_read_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, bytesLeft -= bytes; } - if (!reenter) { - UNLOCK_VOL(vol); - } + UNLOCK_VOL(vol); return status; } status_t -dosfs_write_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, - off_t pos, const iovec *vecs, size_t count, size_t *_numBytes, - bool reenter) +dosfs_write_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos, + const iovec *vecs, size_t count, size_t *_numBytes) { nspace *vol = (nspace *)_vol->private_volume; vnode *node = (vnode *)_node->private_node; @@ -1575,9 +1569,7 @@ dosfs_write_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, if (node->cache == NULL) return B_BAD_VALUE; - if (!reenter) { - LOCK_VOL(vol); - } + LOCK_VOL(vol); while (true) { struct file_io_vec fileVecs[8]; @@ -1601,9 +1593,7 @@ dosfs_write_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, bytesLeft -= bytes; } - if (!reenter) { - UNLOCK_VOL(vol); - } + UNLOCK_VOL(vol); return status; } diff --git a/src/add-ons/kernel/file_systems/fat/file.h b/src/add-ons/kernel/file_systems/fat/file.h index 94dc1a0753..e119ce3134 100644 --- a/src/add-ons/kernel/file_systems/fat/file.h +++ b/src/add-ons/kernel/file_systems/fat/file.h @@ -2,8 +2,8 @@ Copyright 1999-2001, Be Incorporated. All Rights Reserved. This file may be used under the terms of the Be Sample Code License. */ -#ifndef _DOSFS_FILE_H_ -#define _DOSFS_FILE_H_ +#ifndef FAT_FILE_H +#define FAT_FILE_H mode_t make_mode(nspace *volume, vnode *node); status_t write_vnode_entry(nspace *vol, vnode *node); @@ -37,10 +37,8 @@ status_t dosfs_get_file_map(fs_volume *_vol, fs_vnode *_node, off_t pos, size_t reqLen, struct file_io_vec *vecs, size_t *_count); bool dosfs_can_page(fs_volume *_vol, fs_vnode *_node, void *_cookie); status_t dosfs_read_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, - off_t pos, const iovec *vecs, size_t count, size_t *_numBytes, - bool reenter); + off_t pos, const iovec *vecs, size_t count, size_t *_numBytes); status_t dosfs_write_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie, - off_t pos, const iovec *vecs, size_t count, size_t *_numBytes, - bool reenter); + off_t pos, const iovec *vecs, size_t count, size_t *_numBytes); -#endif +#endif /* FAT_FILE_H */