if (!al)
                return -ENOMEM;
 
-       error = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+       error = gfs2_quota_lock_check(ip);
        if (error)
                goto out;
 
-       error = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid);
-       if (error)
-               goto out_gunlock_q;
-
        al->al_requested = sdp->sd_max_height + RES_DATA;
 
        error = gfs2_inplace_reserve(ip);
 
        if (!al)
                return -ENOMEM;
 
-       error = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+       error = gfs2_quota_lock_check(ip);
        if (error)
                goto out;
 
-       error = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid);
-       if (error)
-               goto out_gunlock_q;
-
        al->al_requested = blks;
 
        error = gfs2_inplace_reserve(ip);
 
                        goto out_unlock;
                }
 
-               error = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+               error = gfs2_quota_lock_check(ip);
                if (error)
                        goto out_alloc_put;
 
-               error = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid);
-               if (error)
-                       goto out_qunlock;
-
                al->al_requested = data_blocks + ind_blocks;
                error = gfs2_inplace_reserve(ip);
                if (error)
 
        if (al == NULL)
                goto out_unlock;
 
-       ret = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+       ret = gfs2_quota_lock_check(ip);
        if (ret)
                goto out_alloc_put;
-       ret = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid);
-       if (ret)
-               goto out_quota_unlock;
        al->al_requested = data_blocks + ind_blocks;
        ret = gfs2_inplace_reserve(ip);
        if (ret)
 
                        goto out_gunlock;
                }
 
-               error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+               error = gfs2_quota_lock_check(dip);
                if (error)
                        goto out_alloc;
 
-               error = gfs2_quota_check(dip, dip->i_inode.i_uid, dip->i_inode.i_gid);
-               if (error)
-                       goto out_gunlock_q;
-
                al->al_requested = sdp->sd_max_dirres;
 
                error = gfs2_inplace_reserve(dip);
                        goto out_gunlock;
                }
 
-               error = gfs2_quota_lock(ndip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+               error = gfs2_quota_lock_check(ndip);
                if (error)
                        goto out_alloc;
 
-               error = gfs2_quota_check(ndip, ndip->i_inode.i_uid, ndip->i_inode.i_gid);
-               if (error)
-                       goto out_gunlock_q;
-
                al->al_requested = sdp->sd_max_dirres;
 
                error = gfs2_inplace_reserve(ndip);
 
 void gfs2_quota_scan(struct gfs2_sbd *sdp);
 void gfs2_quota_cleanup(struct gfs2_sbd *sdp);
 
+static inline int gfs2_quota_lock_check(struct gfs2_inode *ip)
+{
+       struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
+       int ret;
+       if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
+               return 0;
+       ret = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+       if (ret)
+               return ret;
+       if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
+               return 0;
+       ret = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid);
+       if (ret)
+               gfs2_quota_unlock(ip);
+       return ret;
+}
+
 #endif /* __QUOTA_DOT_H__ */