diff options
Diffstat (limited to 'fs/gfs2/glock.c')
| -rw-r--r-- | fs/gfs2/glock.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 87778857f099..f92c17704169 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
| @@ -686,21 +686,20 @@ static void delete_work_func(struct work_struct *work) | |||
| 686 | { | 686 | { |
| 687 | struct gfs2_glock *gl = container_of(work, struct gfs2_glock, gl_delete); | 687 | struct gfs2_glock *gl = container_of(work, struct gfs2_glock, gl_delete); |
| 688 | struct gfs2_sbd *sdp = gl->gl_sbd; | 688 | struct gfs2_sbd *sdp = gl->gl_sbd; |
| 689 | struct gfs2_inode *ip = NULL; | 689 | struct gfs2_inode *ip; |
| 690 | struct inode *inode; | 690 | struct inode *inode; |
| 691 | u64 no_addr = 0; | 691 | u64 no_addr = gl->gl_name.ln_number; |
| 692 | |||
| 693 | ip = gl->gl_object; | ||
| 694 | /* Note: Unsafe to dereference ip as we don't hold right refs/locks */ | ||
| 692 | 695 | ||
| 693 | spin_lock(&gl->gl_spin); | ||
| 694 | ip = (struct gfs2_inode *)gl->gl_object; | ||
| 695 | if (ip) | 696 | if (ip) |
| 696 | no_addr = ip->i_no_addr; | ||
| 697 | spin_unlock(&gl->gl_spin); | ||
| 698 | if (ip) { | ||
| 699 | inode = gfs2_ilookup(sdp->sd_vfs, no_addr); | 697 | inode = gfs2_ilookup(sdp->sd_vfs, no_addr); |
| 700 | if (inode) { | 698 | else |
| 701 | d_prune_aliases(inode); | 699 | inode = gfs2_lookup_by_inum(sdp, no_addr, NULL, GFS2_BLKST_UNLINKED); |
| 702 | iput(inode); | 700 | if (inode && !IS_ERR(inode)) { |
| 703 | } | 701 | d_prune_aliases(inode); |
| 702 | iput(inode); | ||
| 704 | } | 703 | } |
| 705 | gfs2_glock_put(gl); | 704 | gfs2_glock_put(gl); |
| 706 | } | 705 | } |
