Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
  3  * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
  4  *
  5  * This copyrighted material is made available to anyone wishing to use,
  6  * modify, copy, or redistribute it subject to the terms and conditions
  7  * of the GNU General Public License version 2.
  8  */
  9 
 10 #ifndef __GLOCK_DOT_H__
 11 #define __GLOCK_DOT_H__
 12 
 13 #include <linux/sched.h>
 14 #include "incore.h"
 15 
 16 /* Flags for lock requests; used in gfs2_holder gh_flag field.
 17    From lm_interface.h:
 18 #define LM_FLAG_TRY             0x00000001
 19 #define LM_FLAG_TRY_1CB         0x00000002
 20 #define LM_FLAG_NOEXP           0x00000004
 21 #define LM_FLAG_ANY             0x00000008
 22 #define LM_FLAG_PRIORITY        0x00000010 */
 23 
 24 #define GL_ASYNC                0x00000040
 25 #define GL_EXACT                0x00000080
 26 #define GL_SKIP                 0x00000100
 27 #define GL_ATIME                0x00000200
 28 #define GL_NOCACHE              0x00000400
 29 #define GL_FLOCK                0x00000800
 30 #define GL_NOCANCEL             0x00001000
 31 
 32 #define GLR_TRYFAILED           13
 33 #define GLR_CANCELED            14
 34 
 35 static inline int gfs2_glock_is_locked_by_me(struct gfs2_glock *gl)
 36 {
 37         struct gfs2_holder *gh;
 38         int locked = 0;
 39         struct pid *pid;
 40 
 41         /* Look in glock's list of holders for one with current task as owner */
 42         spin_lock(&gl->gl_spin);
 43         pid = task_pid(current);
 44         list_for_each_entry(gh, &gl->gl_holders, gh_list) {
 45                 if (gh->gh_owner_pid == pid) {
 46                         locked = 1;
 47                         break;
 48                 }
 49         }
 50         spin_unlock(&gl->gl_spin);
 51 
 52         return locked;
 53 }
 54 
 55 static inline int gfs2_glock_is_held_excl(struct gfs2_glock *gl)
 56 {
 57         return gl->gl_state == LM_ST_EXCLUSIVE;
 58 }
 59 
 60 static inline int gfs2_glock_is_held_dfrd(struct gfs2_glock *gl)
 61 {
 62         return gl->gl_state == LM_ST_DEFERRED;
 63 }
 64 
 65 static inline int gfs2_glock_is_held_shrd(struct gfs2_glock *gl)
 66 {
 67         return gl->gl_state == LM_ST_SHARED;
 68 }
 69 
 70 static inline int gfs2_glock_is_blocking(struct gfs2_glock *gl)
 71 {
 72         int ret;
 73         spin_lock(&gl->gl_spin);
 74         ret = test_bit(GLF_DEMOTE, &gl->gl_flags) || !list_empty(&gl->gl_waiters3);
 75         spin_unlock(&gl->gl_spin);
 76         return ret;
 77 }
 78 
 79 int gfs2_glock_get(struct gfs2_sbd *sdp,
 80                    u64 number, const struct gfs2_glock_operations *glops,
 81                    int create, struct gfs2_glock **glp);
 82 void gfs2_glock_hold(struct gfs2_glock *gl);
 83 int gfs2_glock_put(struct gfs2_glock *gl);
 84 void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, unsigned flags,
 85                       struct gfs2_holder *gh);
 86 void gfs2_holder_reinit(unsigned int state, unsigned flags,
 87                         struct gfs2_holder *gh);
 88 void gfs2_holder_uninit(struct gfs2_holder *gh);
 89 int gfs2_glock_nq(struct gfs2_holder *gh);
 90 int gfs2_glock_poll(struct gfs2_holder *gh);
 91 int gfs2_glock_wait(struct gfs2_holder *gh);
 92 void gfs2_glock_dq(struct gfs2_holder *gh);
 93 void gfs2_glock_dq_wait(struct gfs2_holder *gh);
 94 
 95 void gfs2_glock_dq_uninit(struct gfs2_holder *gh);
 96 int gfs2_glock_nq_num(struct gfs2_sbd *sdp,
 97                       u64 number, const struct gfs2_glock_operations *glops,
 98                       unsigned int state, int flags, struct gfs2_holder *gh);
 99 
100 int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs);
101 void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs);
102 void gfs2_glock_dq_uninit_m(unsigned int num_gh, struct gfs2_holder *ghs);
103 
104 /**
105  * gfs2_glock_nq_init - intialize a holder and enqueue it on a glock
106  * @gl: the glock
107  * @state: the state we're requesting
108  * @flags: the modifier flags
109  * @gh: the holder structure
110  *
111  * Returns: 0, GLR_*, or errno
112  */
113 
114 static inline int gfs2_glock_nq_init(struct gfs2_glock *gl,
115                                      unsigned int state, int flags,
116                                      struct gfs2_holder *gh)
117 {
118         int error;
119 
120         gfs2_holder_init(gl, state, flags, gh);
121 
122         error = gfs2_glock_nq(gh);
123         if (error)
124                 gfs2_holder_uninit(gh);
125 
126         return error;
127 }
128 
129 /*  Lock Value Block functions  */
130 
131 int gfs2_lvb_hold(struct gfs2_glock *gl);
132 void gfs2_lvb_unhold(struct gfs2_glock *gl);
133 
134 void gfs2_glock_cb(void *cb_data, unsigned int type, void *data);
135 
136 void gfs2_glock_schedule_for_reclaim(struct gfs2_glock *gl);
137 void gfs2_reclaim_glock(struct gfs2_sbd *sdp);
138 void gfs2_gl_hash_clear(struct gfs2_sbd *sdp, int wait);
139 
140 int __init gfs2_glock_init(void);
141 void gfs2_glock_exit(void);
142 
143 int gfs2_create_debugfs_file(struct gfs2_sbd *sdp);
144 void gfs2_delete_debugfs_file(struct gfs2_sbd *sdp);
145 int gfs2_register_debugfs(void);
146 void gfs2_unregister_debugfs(void);
147 
148 #endif /* __GLOCK_DOT_H__ */
149 
  This page was automatically generated by the LXR engine.