mirror of
https://github.com/versity/scoutfs.git
synced 2026-05-01 10:25:43 +00:00
Write locks are given an increasing version number as they're granted which makes its way into items in the log btrees and is used to find the most recent version of an item. The initialization of the lock server's next write_version for granted locks dates back to the initial prototype of the forest of log btrees. It is only initialized to zero as the module is loaded. This means that reloading the module, perhaps by rebooting, resets all the item versions to 0 and can lead to newly written items being ignored in favour of older existing items with greater versions from a previous mount. To fix this we initialize the lock server's write_version to the greatest of all the versions in items in log btrees. We add a field to the log_trees struct which records the greatest version which is maintained as we write out items in transactions. These are read by the server as it starts. Then lock recovery needs to include the write_version so that the lock_server can be sure to set the next write_version past the greatest version in the currently granted locks. Signed-off-by: Zach Brown <zab@versity.com>
20 lines
771 B
C
20 lines
771 B
C
#ifndef _SCOUTFS_LOCK_SERVER_H_
|
|
#define _SCOUTFS_LOCK_SERVER_H_
|
|
|
|
int scoutfs_lock_server_recover_response(struct super_block *sb, u64 rid,
|
|
struct scoutfs_net_lock_recover *nlr);
|
|
int scoutfs_lock_server_request(struct super_block *sb, u64 rid,
|
|
u64 net_id, struct scoutfs_net_lock *nl);
|
|
int scoutfs_lock_server_greeting(struct super_block *sb, u64 rid,
|
|
bool should_exist);
|
|
int scoutfs_lock_server_response(struct super_block *sb, u64 rid,
|
|
struct scoutfs_net_lock *nl);
|
|
int scoutfs_lock_server_farewell(struct super_block *sb, u64 rid);
|
|
|
|
int scoutfs_lock_server_setup(struct super_block *sb,
|
|
struct scoutfs_alloc *alloc,
|
|
struct scoutfs_block_writer *wri, u64 max_vers);
|
|
void scoutfs_lock_server_destroy(struct super_block *sb);
|
|
|
|
#endif
|