mrlock.h (1630B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (c) 2000-2006 Silicon Graphics, Inc. 4 * All Rights Reserved. 5 */ 6#ifndef __XFS_SUPPORT_MRLOCK_H__ 7#define __XFS_SUPPORT_MRLOCK_H__ 8 9#include <linux/rwsem.h> 10 11typedef struct { 12 struct rw_semaphore mr_lock; 13#if defined(DEBUG) || defined(XFS_WARN) 14 int mr_writer; 15#endif 16} mrlock_t; 17 18#if defined(DEBUG) || defined(XFS_WARN) 19#define mrinit(mrp, name) \ 20 do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) 21#else 22#define mrinit(mrp, name) \ 23 do { init_rwsem(&(mrp)->mr_lock); } while (0) 24#endif 25 26#define mrlock_init(mrp, t,n,s) mrinit(mrp, n) 27#define mrfree(mrp) do { } while (0) 28 29static inline void mraccess_nested(mrlock_t *mrp, int subclass) 30{ 31 down_read_nested(&mrp->mr_lock, subclass); 32} 33 34static inline void mrupdate_nested(mrlock_t *mrp, int subclass) 35{ 36 down_write_nested(&mrp->mr_lock, subclass); 37#if defined(DEBUG) || defined(XFS_WARN) 38 mrp->mr_writer = 1; 39#endif 40} 41 42static inline int mrtryaccess(mrlock_t *mrp) 43{ 44 return down_read_trylock(&mrp->mr_lock); 45} 46 47static inline int mrtryupdate(mrlock_t *mrp) 48{ 49 if (!down_write_trylock(&mrp->mr_lock)) 50 return 0; 51#if defined(DEBUG) || defined(XFS_WARN) 52 mrp->mr_writer = 1; 53#endif 54 return 1; 55} 56 57static inline void mrunlock_excl(mrlock_t *mrp) 58{ 59#if defined(DEBUG) || defined(XFS_WARN) 60 mrp->mr_writer = 0; 61#endif 62 up_write(&mrp->mr_lock); 63} 64 65static inline void mrunlock_shared(mrlock_t *mrp) 66{ 67 up_read(&mrp->mr_lock); 68} 69 70static inline void mrdemote(mrlock_t *mrp) 71{ 72#if defined(DEBUG) || defined(XFS_WARN) 73 mrp->mr_writer = 0; 74#endif 75 downgrade_write(&mrp->mr_lock); 76} 77 78#endif /* __XFS_SUPPORT_MRLOCK_H__ */