UFSD("EXIT\n");
 }
 
+static void ufs_clear_frags(struct inode *inode, sector_t beg, unsigned int n,
+                           int sync)
+{
+       struct buffer_head *bh;
+       sector_t end = beg + n;
+
+       for (; beg < end; ++beg) {
+               bh = sb_getblk(inode->i_sb, beg);
+               lock_buffer(bh);
+               memset(bh->b_data, 0, inode->i_sb->s_blocksize);
+               set_buffer_uptodate(bh);
+               mark_buffer_dirty(bh);
+               unlock_buffer(bh);
+               if (IS_SYNC(inode) || sync)
+                       sync_dirty_buffer(bh);
+               brelse(bh);
+       }
+}
+
 unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
                           unsigned goal, unsigned count, int * err, struct page *locked_page)
 {
                        *p = cpu_to_fs32(sb, result);
                        *err = 0;
                        UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
+                       ufs_clear_frags(inode, result + oldcount, newcount - oldcount,
+                                       locked_page != NULL);
                }
                unlock_super(sb);
                UFSD("EXIT, result %u\n", result);
        if (result) {
                *err = 0;
                UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
+               ufs_clear_frags(inode, result + oldcount, newcount - oldcount,
+                               locked_page != NULL);
                unlock_super(sb);
                UFSD("EXIT, result %u\n", result);
                return result;
                *p = cpu_to_fs32(sb, result);
                *err = 0;
                UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
+               ufs_clear_frags(inode, result + oldcount, newcount - oldcount,
+                               locked_page != NULL);
                unlock_super(sb);
                if (newcount < request)
                        ufs_free_fragments (inode, result + newcount, request - newcount);
 
        return ret;
 }
 
-static void ufs_clear_frag(struct inode *inode, struct buffer_head *bh)
-{
-       lock_buffer(bh);
-       memset(bh->b_data, 0, inode->i_sb->s_blocksize);
-       set_buffer_uptodate(bh);
-       mark_buffer_dirty(bh);
-       unlock_buffer(bh);
-       if (IS_SYNC(inode))
-               sync_dirty_buffer(bh);
-}
-
-static struct buffer_head *
-ufs_clear_frags(struct inode *inode, sector_t beg,
-               unsigned int n, sector_t want)
-{
-       struct buffer_head *res = NULL, *bh;
-       sector_t end = beg + n;
-
-       for (; beg < end; ++beg) {
-               bh = sb_getblk(inode->i_sb, beg);
-               ufs_clear_frag(inode, bh);
-               if (want != beg)
-                       brelse(bh);
-               else
-                       res = bh;
-       }
-       BUG_ON(!res);
-       return res;
-}
-
 /**
  * ufs_inode_getfrag() - allocate new fragment(s)
  * @inode - pointer to inode
        }
 
        if (!phys) {
-               result = ufs_clear_frags(inode, tmp, required, tmp + blockoff);
+               result = sb_getblk(sb, tmp + blockoff);
        } else {
                *phys = tmp + blockoff;
                result = NULL;
 
 
        if (!phys) {
-               result = ufs_clear_frags(inode, tmp, uspi->s_fpb,
-                                        tmp + blockoff);
+               result = sb_getblk(sb, tmp + blockoff);
        } else {
                *phys = tmp + blockoff;
                *new = 1;
 #define GET_INODE_DATABLOCK(x) \
        ufs_inode_getfrag(inode, x, fragment, 1, &err, &phys, &new, bh_result->b_page)
 #define GET_INODE_PTR(x) \
-       ufs_inode_getfrag(inode, x, fragment, uspi->s_fpb, &err, NULL, NULL, bh_result->b_page)
+       ufs_inode_getfrag(inode, x, fragment, uspi->s_fpb, &err, NULL, NULL, NULL)
 #define GET_INDIRECT_DATABLOCK(x) \
        ufs_inode_getblock(inode, bh, x, fragment,      \
-                         &err, &phys, &new, bh_result->b_page);
+                         &err, &phys, &new, bh_result->b_page)
 #define GET_INDIRECT_PTR(x) \
        ufs_inode_getblock(inode, bh, x, fragment,      \
-                         &err, NULL, NULL, bh_result->b_page);
+                         &err, NULL, NULL, NULL)
 
        if (ptr < UFS_NDIR_FRAGMENT) {
                bh = GET_INODE_DATABLOCK(ptr);