mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	gfs2: Save ip from gfs2_glock_nq_init
Before this patch, when a glock was locked by function gfs2_glock_nq_init, it initialized the holder gh_ip (return address) as gfs2_glock_nq_init. That made it extremely difficult to track down problems because many functions call gfs2_glock_nq_init. This patch changes the function so that it saves gh_ip from the caller of gfs2_glock_nq_init, which makes it easy to backtrack which holder took the lock. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
This commit is contained in:
		
							parent
							
								
									a500bd3155
								
							
						
					
					
						commit
						b016d9a84a
					
				
					 2 changed files with 14 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -911,7 +911,7 @@ static void gfs2_glock_poke(struct gfs2_glock *gl)
 | 
			
		|||
	struct gfs2_holder gh;
 | 
			
		||||
	int error;
 | 
			
		||||
 | 
			
		||||
	gfs2_holder_init(gl, LM_ST_SHARED, flags, &gh);
 | 
			
		||||
	__gfs2_holder_init(gl, LM_ST_SHARED, flags, &gh, _RET_IP_);
 | 
			
		||||
	error = gfs2_glock_nq(&gh);
 | 
			
		||||
	if (!error)
 | 
			
		||||
		gfs2_glock_dq(&gh);
 | 
			
		||||
| 
						 | 
				
			
			@ -1208,12 +1208,12 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
 | 
			
		|||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags,
 | 
			
		||||
		      struct gfs2_holder *gh)
 | 
			
		||||
void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags,
 | 
			
		||||
			struct gfs2_holder *gh, unsigned long ip)
 | 
			
		||||
{
 | 
			
		||||
	INIT_LIST_HEAD(&gh->gh_list);
 | 
			
		||||
	gh->gh_gl = gl;
 | 
			
		||||
	gh->gh_ip = _RET_IP_;
 | 
			
		||||
	gh->gh_ip = ip;
 | 
			
		||||
	gh->gh_owner_pid = get_pid(task_pid(current));
 | 
			
		||||
	gh->gh_state = state;
 | 
			
		||||
	gh->gh_flags = flags;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -190,8 +190,15 @@ extern int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
 | 
			
		|||
extern void gfs2_glock_hold(struct gfs2_glock *gl);
 | 
			
		||||
extern void gfs2_glock_put(struct gfs2_glock *gl);
 | 
			
		||||
extern void gfs2_glock_queue_put(struct gfs2_glock *gl);
 | 
			
		||||
extern void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state,
 | 
			
		||||
			     u16 flags, struct gfs2_holder *gh);
 | 
			
		||||
 | 
			
		||||
extern void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state,
 | 
			
		||||
			       u16 flags, struct gfs2_holder *gh,
 | 
			
		||||
			       unsigned long ip);
 | 
			
		||||
static inline void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state,
 | 
			
		||||
				    u16 flags, struct gfs2_holder *gh) {
 | 
			
		||||
	__gfs2_holder_init(gl, state, flags, gh, _RET_IP_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern void gfs2_holder_reinit(unsigned int state, u16 flags,
 | 
			
		||||
			       struct gfs2_holder *gh);
 | 
			
		||||
extern void gfs2_holder_uninit(struct gfs2_holder *gh);
 | 
			
		||||
| 
						 | 
				
			
			@ -241,7 +248,7 @@ static inline int gfs2_glock_nq_init(struct gfs2_glock *gl,
 | 
			
		|||
{
 | 
			
		||||
	int error;
 | 
			
		||||
 | 
			
		||||
	gfs2_holder_init(gl, state, flags, gh);
 | 
			
		||||
	__gfs2_holder_init(gl, state, flags, gh, _RET_IP_);
 | 
			
		||||
 | 
			
		||||
	error = gfs2_glock_nq(gh);
 | 
			
		||||
	if (error)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue