linux/fs/xfs/mrlock.h
<<
>>
Prefs
   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__ */
  79