Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.22-rc4 102 lines 2.5 kB view raw
1/* 2 * Copyright (c) 2000-2006 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18#ifndef __XFS_SUPPORT_MRLOCK_H__ 19#define __XFS_SUPPORT_MRLOCK_H__ 20 21#include <linux/rwsem.h> 22 23enum { MR_NONE, MR_ACCESS, MR_UPDATE }; 24 25typedef struct { 26 struct rw_semaphore mr_lock; 27 int mr_writer; 28} mrlock_t; 29 30#define mrinit(mrp, name) \ 31 do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) 32#define mrlock_init(mrp, t,n,s) mrinit(mrp, n) 33#define mrfree(mrp) do { } while (0) 34 35static inline void mraccess(mrlock_t *mrp) 36{ 37 down_read(&mrp->mr_lock); 38} 39 40static inline void mrupdate(mrlock_t *mrp) 41{ 42 down_write(&mrp->mr_lock); 43 mrp->mr_writer = 1; 44} 45 46static inline void mraccess_nested(mrlock_t *mrp, int subclass) 47{ 48 down_read_nested(&mrp->mr_lock, subclass); 49} 50 51static inline void mrupdate_nested(mrlock_t *mrp, int subclass) 52{ 53 down_write_nested(&mrp->mr_lock, subclass); 54 mrp->mr_writer = 1; 55} 56 57 58static inline int mrtryaccess(mrlock_t *mrp) 59{ 60 return down_read_trylock(&mrp->mr_lock); 61} 62 63static inline int mrtryupdate(mrlock_t *mrp) 64{ 65 if (!down_write_trylock(&mrp->mr_lock)) 66 return 0; 67 mrp->mr_writer = 1; 68 return 1; 69} 70 71static inline void mrunlock(mrlock_t *mrp) 72{ 73 if (mrp->mr_writer) { 74 mrp->mr_writer = 0; 75 up_write(&mrp->mr_lock); 76 } else { 77 up_read(&mrp->mr_lock); 78 } 79} 80 81static inline void mrdemote(mrlock_t *mrp) 82{ 83 mrp->mr_writer = 0; 84 downgrade_write(&mrp->mr_lock); 85} 86 87#ifdef DEBUG 88/* 89 * Debug-only routine, without some platform-specific asm code, we can 90 * now only answer requests regarding whether we hold the lock for write 91 * (reader state is outside our visibility, we only track writer state). 92 * Note: means !ismrlocked would give false positives, so don't do that. 93 */ 94static inline int ismrlocked(mrlock_t *mrp, int type) 95{ 96 if (mrp && type == MR_UPDATE) 97 return mrp->mr_writer; 98 return 1; 99} 100#endif 101 102#endif /* __XFS_SUPPORT_MRLOCK_H__ */