50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2021. Huawei Technologies Co., Ltd. All rights reserved.
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef EUFS_LOCK_H
|
|
#define EUFS_LOCK_H
|
|
|
|
#include "euler_def.h"
|
|
|
|
static inline void eufs_inode_mark_lock_transferable(struct inode *inode)
|
|
{
|
|
struct eufs_inode_info *vi = EUFS_I(inode);
|
|
|
|
vi->i_lock_transferred = I_TRANS_AVAIL;
|
|
}
|
|
|
|
static inline void eufs_inode_wait_lock_transfer_done(struct inode *inode)
|
|
{
|
|
struct eufs_inode_info *vi = EUFS_I(inode);
|
|
|
|
while (cmpxchg(&vi->i_lock_transferred, I_TRANS_AVAIL, I_TRANS_NONE) !=
|
|
I_TRANS_AVAIL)
|
|
cond_resched();
|
|
}
|
|
|
|
/* return true on success, false on failure */
|
|
static inline bool eufs_inode_mark_lock_transferring(struct inode *inode)
|
|
{
|
|
struct eufs_inode_info *vi = EUFS_I(inode);
|
|
|
|
return (cmpxchg(&vi->i_lock_transferred, I_TRANS_AVAIL,
|
|
I_TRANS_LOCKED) == I_TRANS_AVAIL);
|
|
}
|
|
|
|
static inline void eufs_inode_lock_transfer_done(struct inode *inode)
|
|
{
|
|
eufs_inode_mark_lock_transferable(inode);
|
|
}
|
|
|
|
#endif /* EUFS_LOCK_H */
|