diff --git a/src/add-ons/kernel/file_systems/nfs4/Delegation.cpp b/src/add-ons/kernel/file_systems/nfs4/Delegation.cpp index 299cf2143e..7d64adba61 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Delegation.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Delegation.cpp @@ -20,20 +20,16 @@ Delegation::Delegation(const OpenDelegationData& data, Inode* inode, fData(data), fInode(inode) { - rw_lock_init(&fLock, NULL); } -Delegation::~Delegation() -{ - rw_lock_destroy(&fLock); -} - status_t Delegation::GiveUp(bool truncate) { if (!truncate) { - // save buffers + fInode->SyncAndCommit(true); + + // TODO: claim locks } ReturnDelegation(); diff --git a/src/add-ons/kernel/file_systems/nfs4/Delegation.h b/src/add-ons/kernel/file_systems/nfs4/Delegation.h index 27099e2281..9d67afb371 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Delegation.h +++ b/src/add-ons/kernel/file_systems/nfs4/Delegation.h @@ -22,7 +22,6 @@ class Delegation : public NFS4Object, public: Delegation(const OpenDelegationData& data, Inode* inode, uint64 clientID); - ~Delegation(); // TODO: locks @@ -38,8 +37,6 @@ private: uint64 fClientID; OpenDelegationData fData; Inode* fInode; - - rw_lock fLock; }; diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index e56fdc9998..e2362da7fb 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -648,8 +648,7 @@ Inode::AcquireLock(OpenFileCookie* cookie, const struct flock* lock, status_t Inode::ReleaseLock(OpenFileCookie* cookie, const struct flock* lock) { - file_cache_sync(fFileCache); - Commit(); + SyncAndCommit(); LockInfo* prev = NULL; @@ -699,8 +698,7 @@ Inode::ReleaseLock(OpenFileCookie* cookie, const struct flock* lock) status_t Inode::ReleaseAllLocks(OpenFileCookie* cookie) { - file_cache_sync(fFileCache); - Commit(); + SyncAndCommit(); OpenState* state = cookie->fOpenState; MutexLocker _(state->fLocksLock); @@ -790,3 +788,14 @@ Inode::RecallDelegation(bool truncate) fDelegation = NULL; } + +status_t +Inode::SyncAndCommit(bool force) +{ + if (!force && fDelegation != NULL) + return B_OK; + + file_cache_sync(fFileCache); + return Commit(); +} + diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index 4c56e75289..e5d90c267e 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -42,6 +42,7 @@ public: status_t Access(int mode); status_t Commit(); + status_t SyncAndCommit(bool force = false); status_t CreateObject(const char* name, const char* path, int mode, FileType type); diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp index 76e4820af7..0056512c9e 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp @@ -146,8 +146,7 @@ Inode::Open(int mode, OpenFileCookie* cookie) status_t Inode::Close(OpenFileCookie* cookie) { - file_cache_sync(fFileCache); - Commit(); + SyncAndCommit(); MutexLocker _(fStateLock); if (cookie->fOpenState != NULL) { diff --git a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp index 4804c6cce7..6da6cd15f1 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -308,11 +308,7 @@ static status_t nfs4_fsync(fs_volume* volume, fs_vnode* vnode) { Inode* inode = reinterpret_cast(vnode->private_node); - status_t result = file_cache_sync(inode->FileCache()); - if (result != B_OK) - return result; - - return inode->Commit(); + return inode->SyncAndCommit(); }