{
                        i = -1;
                        oepos.block = epos.block;
-                       udf_release_data(oepos.bh);
-                       atomic_inc(&epos.bh->b_count);
+                       brelse(oepos.bh);
+                       get_bh(epos.bh);
                        oepos.bh = epos.bh;
                        oepos.offset = 0;
                }
                        adsize = sizeof(long_ad);
                else
                {
-                       udf_release_data(oepos.bh);
-                       udf_release_data(epos.bh);
+                       brelse(oepos.bh);
+                       brelse(epos.bh);
                        goto error_return;
                }
 
                        char *sptr, *dptr;
                        int loffset;
        
-                       udf_release_data(oepos.bh);
+                       brelse(oepos.bh);
                        oepos = epos;
 
                        /* Steal a block from the extent being free'd */
                        if (!(epos.bh = udf_tread(sb,
                                udf_get_lb_pblock(sb, epos.block, 0))))
                        {
-                               udf_release_data(oepos.bh);
+                               brelse(oepos.bh);
                                goto error_return;
                        }
                        aed = (struct allocExtDesc *)(epos.bh->b_data);
                }
        }
 
-       udf_release_data(epos.bh);
-       udf_release_data(oepos.bh);
+       brelse(epos.bh);
+       brelse(oepos.bh);
 
 error_return:
        sb->s_dirt = 1;
        else
                alloc_count = 0;
 
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
 
        if (alloc_count && UDF_SB_LVIDBH(sb))
        {
                        spread = nspread;
                        if (goal_epos.bh != epos.bh)
                        {
-                               udf_release_data(goal_epos.bh);
+                               brelse(goal_epos.bh);
                                goal_epos.bh = epos.bh;
-                               atomic_inc(&goal_epos.bh->b_count);
+                               get_bh(goal_epos.bh);
                        }
                        goal_epos.block = epos.block;
                        goal_epos.offset = epos.offset - adsize;
                }
        }
 
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
 
        if (spread == 0xFFFFFFFF)
        {
-               udf_release_data(goal_epos.bh);
+               brelse(goal_epos.bh);
                mutex_unlock(&sbi->s_alloc_mutex);
                return 0;
        }
 
        if (inode && DQUOT_ALLOC_BLOCK(inode, 1))
        {
-               udf_release_data(goal_epos.bh);
+               brelse(goal_epos.bh);
                mutex_unlock(&sbi->s_alloc_mutex);
                *err = -EDQUOT;
                return 0;
                udf_write_aext(table, &goal_epos, goal_eloc, goal_elen, 1);
        else
                udf_delete_aext(table, goal_epos, goal_eloc, goal_elen);
-       udf_release_data(goal_epos.bh);
+       brelse(goal_epos.bh);
 
        if (UDF_SB_LVIDBH(sb))
        {
        struct inode * inode,
        uint16_t partition, uint32_t goal, int *err)
 {
+       int ret;
+
        if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP)
        {
-               return udf_bitmap_new_block(sb, inode,
+               ret = udf_bitmap_new_block(sb, inode,
                        UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_bitmap,
                        partition, goal, err);
+               return ret;
        }
        else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE)
        {
 
 
                if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block)))
                {
-                       udf_release_data(epos.bh);
+                       brelse(epos.bh);
                        return -EIO;
                }
        
        }
        else
        {
-               udf_release_data(epos.bh);
+               brelse(epos.bh);
                return -ENOENT;
        }
 
                if (!fi)
                {
                        if (fibh.sbh != fibh.ebh)
-                               udf_release_data(fibh.ebh);
-                       udf_release_data(fibh.sbh);
-                       udf_release_data(epos.bh);
+                               brelse(fibh.ebh);
+                       brelse(fibh.sbh);
+                       brelse(epos.bh);
                        return 0;
                }
 
                        if (filldir(dirent, fname, flen, filp->f_pos, iblock, dt_type) < 0)
                        {
                                if (fibh.sbh != fibh.ebh)
-                                       udf_release_data(fibh.ebh);
-                               udf_release_data(fibh.sbh);
-                               udf_release_data(epos.bh);
+                                       brelse(fibh.ebh);
+                               brelse(fibh.sbh);
+                               brelse(epos.bh);
                                return 0;
                        }
                }
        filp->f_pos = nf_pos + 1;
 
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
-       udf_release_data(epos.bh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
+       brelse(epos.bh);
 
        return 0;
 }
 
 
        if (!ad)
        {
-               udf_release_data(*bh);
+               brelse(*bh);
                *error = 1;
                return NULL;
        }
 
        if (*offset == dir->i_sb->s_blocksize)
        {
-               udf_release_data(*bh);
+               brelse(*bh);
                block = udf_get_lb_pblock(dir->i_sb, fe_loc, ++*pos);
                if (!block)
                        return NULL;
                remainder = dir->i_sb->s_blocksize - loffset;
                memcpy((uint8_t *)ad, (*bh)->b_data + loffset, remainder);
 
-               udf_release_data(*bh);
+               brelse(*bh);
                block = udf_get_lb_pblock(dir->i_sb, fe_loc, ++*pos);
                if (!block)
                        return NULL;
                else
                        epos->offset = lextoffset;
 
-               udf_release_data(fibh->sbh);
+               brelse(fibh->sbh);
                if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block)))
                        return NULL;
                fibh->soffset = fibh->eoffset = 0;
        }
        else if (fibh->sbh != fibh->ebh)
        {
-               udf_release_data(fibh->sbh);
+               brelse(fibh->sbh);
                fibh->sbh = fibh->ebh;
        }
 
 
                sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, NULL, NULL, NULL);
                if (!sfi)
                {
-                       udf_release_data(dbh);
+                       brelse(dbh);
                        return NULL;
                }
                UDF_I_ALLOCTYPE(inode) = alloctype;
                        sfi->fileIdent + le16_to_cpu(sfi->lengthOfImpUse)))
                {
                        UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB;
-                       udf_release_data(dbh);
+                       brelse(dbh);
                        return NULL;
                }
        }
        udf_add_aext(inode, &epos, eloc, elen, 0);
        /* UniqueID stuff */
 
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
        mark_inode_dirty(inode);
        return dbh;
 }
        {
                if (prev_epos.bh != cur_epos.bh)
                {
-                       udf_release_data(prev_epos.bh);
-                       atomic_inc(&cur_epos.bh->b_count);
+                       brelse(prev_epos.bh);
+                       get_bh(cur_epos.bh);
                        prev_epos.bh = cur_epos.bh;
                }
                if (cur_epos.bh != next_epos.bh)
                {
-                       udf_release_data(cur_epos.bh);
-                       atomic_inc(&next_epos.bh->b_count);
+                       brelse(cur_epos.bh);
+                       get_bh(next_epos.bh);
                        cur_epos.bh = next_epos.bh;
                }
 
                                ~(inode->i_sb->s_blocksize - 1));
                        etype = udf_write_aext(inode, &cur_epos, eloc, elen, 1);
                }
-               udf_release_data(prev_epos.bh);
-               udf_release_data(cur_epos.bh);
-               udf_release_data(next_epos.bh);
+               brelse(prev_epos.bh);
+               brelse(cur_epos.bh);
+               brelse(next_epos.bh);
                newblock = udf_get_lb_pblock(inode->i_sb, eloc, offset);
                *phys = newblock;
                return NULL;
                else
                        lastblock = 1;
        }
-       udf_release_data(cur_epos.bh);
-       udf_release_data(next_epos.bh);
+       brelse(cur_epos.bh);
+       brelse(next_epos.bh);
 
        /* if the current extent is not recorded but allocated, get the
                block in the extent corresponding to the requested block */
                if (!(newblocknum = udf_new_block(inode->i_sb, inode,
                        UDF_I_LOCATION(inode).partitionReferenceNum, goal, err)))
                {
-                       udf_release_data(prev_epos.bh);
+                       brelse(prev_epos.bh);
                        *err = -ENOSPC;
                        return NULL;
                }
        the new number of extents is less than the old number */
        udf_update_extents(inode, laarr, startnum, endnum, &prev_epos);
 
-       udf_release_data(prev_epos.bh);
+       brelse(prev_epos.bh);
 
        if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum,
                UDF_I_LOCATION(inode).partitionReferenceNum, 0)))
        {
                printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed ident=%d\n",
                        inode->i_ino, ident);
-               udf_release_data(bh);
+               brelse(bh);
                make_bad_inode(inode);
                return;
        }
                                                ident == TAG_IDENT_EFE)
                                        {
                                                memcpy(&UDF_I_LOCATION(inode), &loc, sizeof(kernel_lb_addr));
-                                               udf_release_data(bh);
-                                               udf_release_data(ibh);
-                                               udf_release_data(nbh);
+                                               brelse(bh);
+                                               brelse(ibh);
+                                               brelse(nbh);
                                                __udf_read_inode(inode);
                                                return;
                                        }
                                        else
                                        {
-                                               udf_release_data(nbh);
-                                               udf_release_data(ibh);
+                                               brelse(nbh);
+                                               brelse(ibh);
                                        }
                                }
                                else
-                                       udf_release_data(ibh);
+                                       brelse(ibh);
                        }
                }
                else
-                       udf_release_data(ibh);
+                       brelse(ibh);
        }
        else if (le16_to_cpu(fe->icbTag.strategyType) != 4)
        {
                printk(KERN_ERR "udf: unsupported strategy type: %d\n",
                        le16_to_cpu(fe->icbTag.strategyType));
-               udf_release_data(bh);
+               brelse(bh);
                make_bad_inode(inode);
                return;
        }
        udf_fill_inode(inode, bh);
-       udf_release_data(bh);
+       brelse(bh);
 }
 
 static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                                use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i];
 
                mark_buffer_dirty(bh);
-               udf_release_data(bh);
+               brelse(bh);
                return err;
        }
 
                        err = -EIO;
                }
        }
-       udf_release_data(bh);
+       brelse(bh);
        return err;
 }
 
                        else
                                udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc));
                        mark_buffer_dirty_inode(epos->bh, inode);
-                       udf_release_data(epos->bh);
+                       brelse(epos->bh);
                }
                else
                        mark_inode_dirty(inode);
        {
                epos->block = *eloc;
                epos->offset = sizeof(struct allocExtDesc);
-               udf_release_data(epos->bh);
+               brelse(epos->bh);
                if (!(epos->bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, epos->block, 0))))
                {
                        udf_debug("reading block %d failed!\n",
        int8_t etype;
 
        if (epos.bh)
-               atomic_inc(&epos.bh->b_count);
+               get_bh(epos.bh);
 
        while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1)
        {
                nelen = (etype << 30) | oelen;
        }
        udf_add_aext(inode, &epos, neloc, nelen, 1);
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
        return (nelen >> 30);
 }
 
 
        if (epos.bh)
        {
-               atomic_inc(&epos.bh->b_count);
-               atomic_inc(&epos.bh->b_count);
+               get_bh(epos.bh);
+               get_bh(epos.bh);
        }
 
        if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
                if (oepos.bh != epos.bh)
                {
                        oepos.block = epos.block;
-                       udf_release_data(oepos.bh);
-                       atomic_inc(&epos.bh->b_count);
+                       brelse(oepos.bh);
+                       get_bh(epos.bh);
                        oepos.bh = epos.bh;
                        oepos.offset = epos.offset - adsize;
                }
                }
        }
        
-       udf_release_data(epos.bh);
-       udf_release_data(oepos.bh);
+       brelse(epos.bh);
+       brelse(oepos.bh);
        return (elen >> 30);
 }
 
                ret = 0;
 
        unlock_kernel();
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
 
        if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
                return udf_fixed_to_variable(ret);
 
                loc.logicalBlockNum + offset, ident);
 }
 
-void udf_release_data(struct buffer_head *bh)
-{
-       if (bh)
-               brelse(bh);
-}
-
 void udf_update_tag(char *data, int length)
 {
        tag *tptr = (tag *)data;
 
 
                if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block)))
                {
-                       udf_release_data(epos.bh);
+                       brelse(epos.bh);
                        return NULL;
                }
        }
        else
        {
-               udf_release_data(epos.bh);
+               brelse(epos.bh);
                return NULL;
        }
 
                if (!fi)
                {
                        if (fibh->sbh != fibh->ebh)
-                               udf_release_data(fibh->ebh);
-                       udf_release_data(fibh->sbh);
-                       udf_release_data(epos.bh);
+                               brelse(fibh->ebh);
+                       brelse(fibh->sbh);
+                       brelse(epos.bh);
                        return NULL;
                }
 
                {
                        if (udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name))
                        {
-                               udf_release_data(epos.bh);
+                               brelse(epos.bh);
                                return fi;
                        }
                }
        }
        if (fibh->sbh != fibh->ebh)
-               udf_release_data(fibh->ebh);
-       udf_release_data(fibh->sbh);
-       udf_release_data(epos.bh);
+               brelse(fibh->ebh);
+       brelse(fibh->sbh);
+       brelse(epos.bh);
        return NULL;
 }
 
        if (udf_find_entry(dir, dentry, &fibh, &cfi))
        {
                if (fibh.sbh != fibh.ebh)
-                       udf_release_data(fibh.ebh);
-               udf_release_data(fibh.sbh);
+                       brelse(fibh.ebh);
+               brelse(fibh.sbh);
 
                inode = udf_iget(dir->i_sb, lelb_to_cpu(cfi.icb.extLocation));
                if ( !inode )
 
                if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block)))
                {
-                       udf_release_data(epos.bh);
+                       brelse(epos.bh);
                        *err = -EIO;
                        return NULL;
                }
                if (!fi)
                {
                        if (fibh->sbh != fibh->ebh)
-                               udf_release_data(fibh->ebh);
-                       udf_release_data(fibh->sbh);
-                       udf_release_data(epos.bh);
+                               brelse(fibh->ebh);
+                       brelse(fibh->sbh);
+                       brelse(epos.bh);
                        *err = -EIO;
                        return NULL;
                }
                {
                        if (((sizeof(struct fileIdentDesc) + liu + lfi + 3) & ~3) == nfidlen)
                        {
-                               udf_release_data(epos.bh);
+                               brelse(epos.bh);
                                cfi->descTag.tagSerialNum = cpu_to_le16(1);
                                cfi->fileVersionNum = cpu_to_le16(1);
                                cfi->fileCharacteristics = 0;
                        udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name))
                {
                        if (fibh->sbh != fibh->ebh)
-                               udf_release_data(fibh->ebh);
-                       udf_release_data(fibh->sbh);
-                       udf_release_data(epos.bh);
+                               brelse(fibh->ebh);
+                       brelse(fibh->sbh);
+                       brelse(epos.bh);
                        *err = -EEXIST;
                        return NULL;
                }
        if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB &&
                sb->s_blocksize - fibh->eoffset < nfidlen)
        {
-               udf_release_data(epos.bh);
+               brelse(epos.bh);
                epos.bh = NULL;
                fibh->soffset -= udf_ext0_offset(dir);
                fibh->eoffset -= udf_ext0_offset(dir);
                f_pos -= (udf_ext0_offset(dir) >> 2);
                if (fibh->sbh != fibh->ebh)
-                       udf_release_data(fibh->ebh);
-               udf_release_data(fibh->sbh);
+                       brelse(fibh->ebh);
+               brelse(fibh->sbh);
                if (!(fibh->sbh = fibh->ebh = udf_expand_dir_adinicb(dir, &block, err)))
                        return NULL;
                epos.block = UDF_I_LOCATION(dir);
                fibh->eoffset += nfidlen;
                if (fibh->sbh != fibh->ebh)
                {
-                       udf_release_data(fibh->sbh);
+                       brelse(fibh->sbh);
                        fibh->sbh = fibh->ebh;
                }
 
                fibh->eoffset += nfidlen - sb->s_blocksize;
                if (fibh->sbh != fibh->ebh)
                {
-                       udf_release_data(fibh->sbh);
+                       brelse(fibh->sbh);
                        fibh->sbh = fibh->ebh;
                }
 
 
                if (!(fibh->ebh = udf_bread(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 1, err)))
                {
-                       udf_release_data(epos.bh);
-                       udf_release_data(fibh->sbh);
+                       brelse(epos.bh);
+                       brelse(fibh->sbh);
                        return NULL;
                }
 
                        else
                                block ++;
 
-                       udf_release_data(fibh->sbh);
+                       brelse(fibh->sbh);
                        fibh->sbh = fibh->ebh;
                        fi = (struct fileIdentDesc *)(fibh->sbh->b_data);
                }
        cfi->lengthOfImpUse = cpu_to_le16(0);
        if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name))
        {
-               udf_release_data(epos.bh);
+               brelse(epos.bh);
                dir->i_size += nfidlen;
                if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB)
                        UDF_I_LENALLOC(dir) += nfidlen;
        }
        else
        {
-               udf_release_data(epos.bh);
+               brelse(epos.bh);
                if (fibh->sbh != fibh->ebh)
-                       udf_release_data(fibh->ebh);
-               udf_release_data(fibh->sbh);
+                       brelse(fibh->ebh);
+               brelse(fibh->sbh);
                *err = -EIO;
                return NULL;
        }
                mark_inode_dirty(dir);
        }
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
        unlock_kernel();
        d_instantiate(dentry, inode);
        return 0;
        mark_inode_dirty(inode);
 
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
        d_instantiate(dentry, inode);
        err = 0;
 out:
                cpu_to_le32(UDF_I_UNIQUE(dir) & 0x00000000FFFFFFFFUL);
        cfi.fileCharacteristics = FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT;
        udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL);
-       udf_release_data(fibh.sbh);
+       brelse(fibh.sbh);
        inode->i_mode = S_IFDIR | mode;
        if (dir->i_mode & S_ISGID)
                inode->i_mode |= S_ISGID;
        mark_inode_dirty(dir);
        d_instantiate(dentry, inode);
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
        err = 0;
 out:
        unlock_kernel();
 
                if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block)))
                {
-                       udf_release_data(epos.bh);
+                       brelse(epos.bh);
                        return 0;
                }
        }
        else
        {
-               udf_release_data(epos.bh);
+               brelse(epos.bh);
                return 0;
        }
 
                if (!fi)
                {
                        if (fibh.sbh != fibh.ebh)
-                               udf_release_data(fibh.ebh);
-                       udf_release_data(fibh.sbh);
-                       udf_release_data(epos.bh);
+                               brelse(fibh.ebh);
+                       brelse(fibh.sbh);
+                       brelse(epos.bh);
                        return 0;
                }
 
                if (cfi.lengthFileIdent && (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0)
                {
                        if (fibh.sbh != fibh.ebh)
-                               udf_release_data(fibh.ebh);
-                       udf_release_data(fibh.sbh);
-                       udf_release_data(epos.bh);
+                               brelse(fibh.ebh);
+                       brelse(fibh.sbh);
+                       brelse(epos.bh);
                        return 0;
                }
        }
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
-       udf_release_data(epos.bh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
+       brelse(epos.bh);
        return 1;
 }
 
 
 end_rmdir:
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
 out:
        unlock_kernel();
        return retval;
 
 end_unlink:
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
 out:
        unlock_kernel();
        return retval;
                elen = inode->i_sb->s_blocksize;
                UDF_I_LENEXTENTS(inode) = elen;
                udf_add_aext(inode, &epos, eloc, elen, 0);
-               udf_release_data(epos.bh);
+               brelse(epos.bh);
 
                block = udf_get_pblock(inode->i_sb, block,
                        UDF_I_LOCATION(inode).partitionReferenceNum, 0);
                }
        }
 
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
        inode->i_size = elen;
        if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
                UDF_I_LENALLOC(inode) = inode->i_size;
                mark_inode_dirty(dir);
        }
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
        d_instantiate(dentry, inode);
        err = 0;
 
                mark_inode_dirty(dir);
        }
        if (fibh.sbh != fibh.ebh)
-               udf_release_data(fibh.ebh);
-       udf_release_data(fibh.sbh);
+               brelse(fibh.ebh);
+       brelse(fibh.sbh);
        inc_nlink(inode);
        inode->i_ctime = current_fs_time(inode->i_sb);
        mark_inode_dirty(inode);
        if ((ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi)))
        {
                if (ofibh.sbh != ofibh.ebh)
-                       udf_release_data(ofibh.ebh);
-               udf_release_data(ofibh.sbh);
+                       brelse(ofibh.ebh);
+               brelse(ofibh.sbh);
        }
        tloc = lelb_to_cpu(ocfi.icb.extLocation);
        if (!ofi || udf_get_lb_pblock(old_dir->i_sb, tloc, 0)
                if (!new_inode)
                {
                        if (nfibh.sbh != nfibh.ebh)
-                               udf_release_data(nfibh.ebh);
-                       udf_release_data(nfibh.sbh);
+                               brelse(nfibh.ebh);
+                       brelse(nfibh.sbh);
                        nfi = NULL;
                }
        }
        if (ofi)
        {
                if (ofibh.sbh != ofibh.ebh)
-                       udf_release_data(ofibh.ebh);
-               udf_release_data(ofibh.sbh);
+                       brelse(ofibh.ebh);
+               brelse(ofibh.sbh);
        }
 
        retval = 0;
 
 end_rename:
-       udf_release_data(dir_bh);
+       brelse(dir_bh);
        if (nfi)
        {
                if (nfibh.sbh != nfibh.ebh)
-                       udf_release_data(nfibh.ebh);
-               udf_release_data(nfibh.sbh);
+                       brelse(nfibh.ebh);
+               brelse(nfibh.sbh);
        }
        unlock_kernel();
        return retval;
 
 
        loc = le32_to_cpu(((__le32 *)bh->b_data)[index]);
 
-       udf_release_data(bh);
+       brelse(bh);
 
        if (UDF_I_LOCATION(UDF_SB_VAT(sb)).partitionReferenceNum == partition)
        {
 
 
                if (vsd->stdIdent[0] == 0)
                {
-                       udf_release_data(bh);
+                       brelse(bh);
                        break;
                }
                else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, VSD_STD_ID_LEN))
                }
                else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01, VSD_STD_ID_LEN))
                {
-                       udf_release_data(bh);
+                       brelse(bh);
                        break;
                }
                else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02, VSD_STD_ID_LEN))
                {
                        nsr03 = sector;
                }
-               udf_release_data(bh);
+               brelse(bh);
        }
 
        if (nsr03)
                        {
                                ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
                                location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
-                               udf_release_data(bh);
+                               brelse(bh);
                        }
 
                        if (ident == TAG_IDENT_AVDP)
                                {
                                        ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
                                        location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
-                                       udf_release_data(bh);
+                                       brelse(bh);
                                }
        
                                if (ident == TAG_IDENT_AVDP &&
                                        {
                                                ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
                                                location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
-                                               udf_release_data(bh);
+                                               brelse(bh);
                                        }
        
                                        if (ident == TAG_IDENT_AVDP &&
                {
                        ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
                        location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
-                       udf_release_data(bh);
+                       brelse(bh);
 
                        if (ident == TAG_IDENT_AVDP && location == 256)
                                UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
                        }
                        else
                        {
-                               udf_release_data(bh);
+                               brelse(bh);
                                if ((ident != TAG_IDENT_AVDP) && (i ||
                                        (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE)))
                                {
                        return 1;
                else if (ident != TAG_IDENT_FSD)
                {
-                       udf_release_data(bh);
+                       brelse(bh);
                        return 1;
                }
                        
                                                newfileset.logicalBlockNum += 1 +
                                                        ((le32_to_cpu(sp->numOfBytes) + sizeof(struct spaceBitmapDesc) - 1)
                                                                >> sb->s_blocksize_bits);
-                                               udf_release_data(bh);
+                                               brelse(bh);
                                                break;
                                        }
                                        case TAG_IDENT_FSD:
                                        default:
                                        {
                                                newfileset.logicalBlockNum ++;
-                                               udf_release_data(bh);
+                                               brelse(bh);
                                                bh = NULL;
                                                break;
                                        }
 
                UDF_SB_PARTITION(sb) = fileset->partitionReferenceNum;
                udf_load_fileset(sb, bh, root);
-               udf_release_data(bh);
+               brelse(bh);
                return 0;
        }
        return 1;
                                                if (ident != 0 ||
                                                        strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING)))
                                                {
-                                                       udf_release_data(UDF_SB_TYPESPAR(sb,i).s_spar_map[j]);
+                                                       brelse(UDF_SB_TYPESPAR(sb,i).s_spar_map[j]);
                                                        UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = NULL;
                                                }
                                        }
                        udf_load_logicalvolint(sb, leea_to_cpu(UDF_SB_LVID(sb)->nextIntegrityExt));
                
                if (UDF_SB_LVIDBH(sb) != bh)
-                       udf_release_data(bh);
+                       brelse(bh);
                loc.extLength -= sb->s_blocksize;
                loc.extLocation ++;
        }
        if (UDF_SB_LVIDBH(sb) != bh)
-               udf_release_data(bh);
+               brelse(bh);
 }
 
 /*
                                        done = 1;
                                break;
                }
-               udf_release_data(bh);
+               brelse(bh);
        }
        for (i=0; i<VDS_POS_LENGTH; i++)
        {
                                        gd = (struct generic_desc *)bh2->b_data;
                                        if (ident == TAG_IDENT_PD)
                                                udf_load_partdesc(sb, bh2);
-                                       udf_release_data(bh2);
+                                       brelse(bh2);
                                }
                        }
-                       udf_release_data(bh);
+                       brelse(bh);
                }
        }
 
                        reserve_e = reserve_e >> sb->s_blocksize_bits;
                        reserve_e += reserve_s;
 
-                       udf_release_data(bh);
+                       brelse(bh);
 
                        /* Process the main & reserve sequences */
                        /* responsible for finding the PartitionDesc(s) */
                                                        udf_ext0_offset(UDF_SB_VAT(sb));
                                        UDF_SB_TYPEVIRT(sb,i).s_num_entries = (UDF_SB_VAT(sb)->i_size -
                                                UDF_SB_TYPEVIRT(sb,i).s_start_offset) >> 2;
-                                       udf_release_data(bh);
+                                       brelse(bh);
                                }
                                UDF_SB_PARTROOT(sb,i) = udf_get_pblock(sb, 0, i, 0);
                                UDF_SB_PARTLEN(sb,i) = UDF_SB_PARTLEN(sb,ino.partitionReferenceNum);
                if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15)
                {
                        for (i=0; i<4; i++)
-                               udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
+                               brelse(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
                }
        }
 #ifdef CONFIG_UDF_NLS
 #endif
        if (!(sb->s_flags & MS_RDONLY))
                udf_close_lvid(sb);
-       udf_release_data(UDF_SB_LVIDBH(sb));
+       brelse(UDF_SB_LVIDBH(sb));
        UDF_SB_FREE(sb);
        kfree(sbi);
        sb->s_fs_info = NULL;
                if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15)
                {
                        for (i=0; i<4; i++)
-                               udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
+                               brelse(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
                }
        }
 #ifdef CONFIG_UDF_NLS
 #endif
        if (!(sb->s_flags & MS_RDONLY))
                udf_close_lvid(sb);
-       udf_release_data(UDF_SB_LVIDBH(sb));
+       brelse(UDF_SB_LVIDBH(sb));
        UDF_SB_FREE(sb);
        kfree(sb->s_fs_info);
        sb->s_fs_info = NULL;
        }
        else if (ident != TAG_IDENT_SBD)
        {
-               udf_release_data(bh);
+               brelse(bh);
                printk(KERN_ERR "udf: udf_count_free failed\n");
                goto out;
        }
                }
                if ( bytes )
                {
-                       udf_release_data(bh);
+                       brelse(bh);
                        newblock = udf_get_lb_pblock(sb, loc, ++block);
                        bh = udf_tread(sb, newblock);
                        if (!bh)
                        ptr = (uint8_t *)bh->b_data;
                }
        }
-       udf_release_data(bh);
+       brelse(bh);
 
 out:
        unlock_kernel();
 
        while ((etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1)
                accum += (elen >> table->i_sb->s_blocksize_bits);
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
 
        unlock_kernel();
 
 
        }
 
        udf_pc_to_char(inode->i_sb, symlink, inode->i_size, p);
-       udf_release_data(bh);
+       brelse(bh);
 
        unlock_kernel();
        SetPageUptodate(page);
 
        }
        UDF_I_LENEXTENTS(inode) = lbcount;
 
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
 }
 
 void udf_truncate_extents(struct inode * inode)
        }
        UDF_I_LENEXTENTS(inode) = inode->i_size;
 
-       udf_release_data(epos.bh);
+       brelse(epos.bh);
 }
 
        for (i=0; i<nr_groups; i++)\
        {\
                if (UDF_SB_BITMAP(X,Y,Z,i))\
-                       udf_release_data(UDF_SB_BITMAP(X,Y,Z,i));\
+                       brelse(UDF_SB_BITMAP(X,Y,Z,i));\
        }\
        if (size <= PAGE_SIZE)\
                kfree(UDF_SB_PARTMAPS(X)[Y].Z.s_bitmap);\
 
 extern void udf_clear_inode(struct inode *);
 extern int udf_write_inode(struct inode *, int);
 extern long udf_block_map(struct inode *, sector_t);
+extern int udf_extend_file(struct inode *, struct extent_position *, kernel_long_ad *, sector_t);
 extern int8_t inode_bmap(struct inode *, sector_t, struct extent_position *, kernel_lb_addr *, uint32_t *, sector_t *);
 extern int8_t udf_add_aext(struct inode *, struct extent_position *, kernel_lb_addr, uint32_t, int);
 extern int8_t udf_write_aext(struct inode *, struct extent_position *, kernel_lb_addr, uint32_t, int);
 extern struct genericFormat *udf_get_extendedattr(struct inode *, uint32_t, uint8_t);
 extern struct buffer_head *udf_read_tagged(struct super_block *, uint32_t, uint32_t, uint16_t *);
 extern struct buffer_head *udf_read_ptagged(struct super_block *, kernel_lb_addr, uint32_t, uint16_t *);
-extern void udf_release_data(struct buffer_head *);
 extern void udf_update_tag(char *, int);
 extern void udf_new_tag(char *, uint16_t, uint16_t, uint16_t, uint32_t, int);