int status;
        struct buffer_head *bh = NULL;
        struct ocfs2_quota_recovery *rec;
-       int locked = 0;
+       int locked = 0, global_read = 0;
 
        info->dqi_max_spc_limit = 0x7fffffffffffffffLL;
        info->dqi_max_ino_limit = 0x7fffffffffffffffLL;
        if (!oinfo) {
                mlog(ML_ERROR, "failed to allocate memory for ocfs2 quota"
                               " info.");
+               status = -ENOMEM;
                goto out_err;
        }
        info->dqi_priv = oinfo;
        status = ocfs2_global_read_info(sb, type);
        if (status < 0)
                goto out_err;
+       global_read = 1;
 
        status = ocfs2_inode_lock(lqinode, &oinfo->dqi_lqi_bh, 1);
        if (status < 0) {
                if (locked)
                        ocfs2_inode_unlock(lqinode, 1);
                ocfs2_release_local_quota_bitmaps(&oinfo->dqi_chunk);
+               if (global_read)
+                       cancel_delayed_work_sync(&oinfo->dqi_sync_work);
                kfree(oinfo);
        }
        brelse(bh);
-       return -1;
+       return status;
 }
 
 /* Write local info to quota file */