#define GLR_TRYFAILED          13
 #define GLR_CANCELED           14
 
-static inline int gfs2_glock_is_locked_by_me(struct gfs2_glock *gl)
+static inline struct gfs2_holder *gfs2_glock_is_locked_by_me(struct gfs2_glock *gl)
 {
        struct gfs2_holder *gh;
-       int locked = 0;
        struct pid *pid;
 
        /* Look in glock's list of holders for one with current task as owner */
        spin_lock(&gl->gl_spin);
        pid = task_pid(current);
        list_for_each_entry(gh, &gl->gl_holders, gh_list) {
-               if (gh->gh_owner_pid == pid) {
-                       locked = 1;
-                       break;
-               }
+               if (gh->gh_owner_pid == pid)
+                       goto out;
        }
+       gh = NULL;
+out:
        spin_unlock(&gl->gl_spin);
 
-       return locked;
+       return gh;
 }
 
 static inline int gfs2_glock_is_held_excl(struct gfs2_glock *gl)
 
                return dir;
        }
 
-       if (gfs2_glock_is_locked_by_me(dip->i_gl) == 0) {
+       if (gfs2_glock_is_locked_by_me(dip->i_gl) == NULL) {
                error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
                if (error)
                        return ERR_PTR(error);
 
 static int gfs2_readpage(struct file *file, struct page *page)
 {
        struct gfs2_inode *ip = GFS2_I(page->mapping->host);
-       struct gfs2_holder gh;
+       struct gfs2_holder *gh;
        int error;
 
-       gfs2_holder_init(ip->i_gl, LM_ST_SHARED, GL_ATIME|LM_FLAG_TRY_1CB, &gh);
-       error = gfs2_glock_nq_atime(&gh);
-       if (unlikely(error)) {
+       gh = gfs2_glock_is_locked_by_me(ip->i_gl);
+       if (!gh) {
+               gh = kmalloc(sizeof(struct gfs2_holder), GFP_NOFS);
+               if (!gh)
+                       return -ENOBUFS;
+               gfs2_holder_init(ip->i_gl, LM_ST_SHARED, GL_ATIME, gh);
                unlock_page(page);
-               goto out;
+               error = gfs2_glock_nq_atime(gh);
+               if (likely(error != 0))
+                       goto out;
+               return AOP_TRUNCATED_PAGE;
        }
        error = __gfs2_readpage(file, page);
-       gfs2_glock_dq(&gh);
+       gfs2_glock_dq(gh);
 out:
-       gfs2_holder_uninit(&gh);
-       if (error == GLR_TRYFAILED) {
-               yield();
-               return AOP_TRUNCATED_PAGE;
-       }
+       gfs2_holder_uninit(gh);
+       kfree(gh);
        return error;
 }
 
        unsigned int to = from + len;
        int ret;
 
-       BUG_ON(gfs2_glock_is_locked_by_me(ip->i_gl) == 0);
+       BUG_ON(gfs2_glock_is_locked_by_me(ip->i_gl) == NULL);
 
        ret = gfs2_meta_inode_buffer(ip, &dibh);
        if (unlikely(ret)) {
 
        struct gfs2_holder d_gh;
        struct gfs2_inode *ip = NULL;
        int error;
-       int had_lock=0;
+       int had_lock = 0;
 
        if (inode) {
                if (is_bad_inode(inode))
        if (sdp->sd_args.ar_localcaching)
                goto valid;
 
-       had_lock = gfs2_glock_is_locked_by_me(dip->i_gl);
+       had_lock = (gfs2_glock_is_locked_by_me(dip->i_gl) != NULL);
        if (!had_lock) {
                error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
                if (error)
 
        int error;
        int unlock = 0;
 
-       if (gfs2_glock_is_locked_by_me(ip->i_gl) == 0) {
+       if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
                error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
                if (error)
                        return error;
        int error;
        int unlock = 0;
 
-       if (gfs2_glock_is_locked_by_me(ip->i_gl) == 0) {
+       if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
                error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
                if (error)
                        return error;