From: Yu Kuai yukuai3@huawei.com
hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I40JRR CVE: NA
--------------------------------------
Signed-off-by: Hou Tao houtao1@huawei.com Signed-off-by: Yu Kuai yukuai3@huawei.com Reviewed-by: Hou Tao houtao1@huawei.com Signed-off-by: Zheng Zengkai zhengzengkai@huawei.com --- fs/eulerfs/lock.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 fs/eulerfs/lock.h
diff --git a/fs/eulerfs/lock.h b/fs/eulerfs/lock.h new file mode 100644 index 000000000000..6c4fe7734ac6 --- /dev/null +++ b/fs/eulerfs/lock.h @@ -0,0 +1,49 @@ +/* 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 */