{
        struct inode *inode = file_inode(file);
        handle_t *handle;
-       int ret = 0;
-       int ret2 = 0, ret3 = 0;
+       int ret, ret2 = 0, ret3 = 0;
        int retries = 0;
        int depth = 0;
        struct ext4_map_blocks map;
        depth = ext_depth(inode);
 
 retry:
-       while (ret >= 0 && len) {
+       while (len) {
                /*
                 * Recalculate credits when extent tree depth changes.
                 */
                                   inode->i_ino, map.m_lblk,
                                   map.m_len, ret);
                        ext4_mark_inode_dirty(handle, inode);
-                       ret2 = ext4_journal_stop(handle);
+                       ext4_journal_stop(handle);
                        break;
                }
+               /*
+                * allow a full retry cycle for any remaining allocations
+                */
+               retries = 0;
                map.m_lblk += ret;
                map.m_len = len = len - ret;
                epos = (loff_t)map.m_lblk << inode->i_blkbits;
                if (unlikely(ret2))
                        break;
        }
-       if (ret == -ENOSPC &&
-                       ext4_should_retry_alloc(inode->i_sb, &retries)) {
-               ret = 0;
+       if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
                goto retry;
-       }
 
        return ret > 0 ? ret2 : ret;
 }