X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=fs%2Fgfs2%2Finode.c;h=4e63fbb63151c495e37043fd373f50f2057d01f6;hb=refs%2Fheads%2Faccepted%2Ftizen_unified_toolchain;hp=0eac0450790471d09b49741fbffad643ba74db85;hpb=2a5a4326e58339a26cd1510259e7310b8c0980ff;p=platform%2Fkernel%2Flinux-rpi.git diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 0eac045..4e63fbb 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -1866,16 +1866,24 @@ out: int gfs2_permission(struct mnt_idmap *idmap, struct inode *inode, int mask) { + int may_not_block = mask & MAY_NOT_BLOCK; struct gfs2_inode *ip; struct gfs2_holder i_gh; + struct gfs2_glock *gl; int error; gfs2_holder_mark_uninitialized(&i_gh); ip = GFS2_I(inode); - if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) { - if (mask & MAY_NOT_BLOCK) + gl = rcu_dereference_check(ip->i_gl, !may_not_block); + if (unlikely(!gl)) { + /* inode is getting torn down, must be RCU mode */ + WARN_ON_ONCE(!may_not_block); + return -ECHILD; + } + if (gfs2_glock_is_locked_by_me(gl) == NULL) { + if (may_not_block) return -ECHILD; - error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); + error = gfs2_glock_nq_init(gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); if (error) return error; }