* @target: offset number of an entry in the group (start point)
  * @bsize: size in bits
  * @lock: spin lock protecting @bitmap
+ * @wrap: whether to wrap around
  */
 static int nilfs_palloc_find_available_slot(unsigned char *bitmap,
                                            unsigned long target,
                                            unsigned int bsize,
-                                           spinlock_t *lock)
+                                           spinlock_t *lock, bool wrap)
 {
        int pos, end = bsize;
 
 
                end = target;
        }
+       if (!wrap)
+               return -ENOSPC;
 
        /* wrap around */
        for (pos = 0; pos < end; pos++) {
  * nilfs_palloc_prepare_alloc_entry - prepare to allocate a persistent object
  * @inode: inode of metadata file using this allocator
  * @req: nilfs_palloc_req structure exchanged for the allocation
+ * @wrap: whether to wrap around
  */
 int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
-                                    struct nilfs_palloc_req *req)
+                                    struct nilfs_palloc_req *req, bool wrap)
 {
        struct buffer_head *desc_bh, *bitmap_bh;
        struct nilfs_palloc_group_desc *desc;
        entries_per_group = nilfs_palloc_entries_per_group(inode);
 
        for (i = 0; i < ngroups; i += n) {
-               if (group >= ngroups) {
+               if (group >= ngroups && wrap) {
                        /* wrap around */
                        group = 0;
                        maxgroup = nilfs_palloc_group(inode, req->pr_entry_nr,
                        bitmap_kaddr = kmap_local_page(bitmap_bh->b_page);
                        bitmap = bitmap_kaddr + bh_offset(bitmap_bh);
                        pos = nilfs_palloc_find_available_slot(
-                               bitmap, group_offset, entries_per_group, lock);
+                               bitmap, group_offset, entries_per_group, lock,
+                               wrap);
+                       /*
+                        * Since the search for a free slot in the second and
+                        * subsequent bitmap blocks always starts from the
+                        * beginning, the wrap flag only has an effect on the
+                        * first search.
+                        */
                        kunmap_local(bitmap_kaddr);
                        if (pos >= 0)
                                goto found;
 
        struct buffer_head *pr_entry_bh;
 };
 
-int nilfs_palloc_prepare_alloc_entry(struct inode *,
-                                    struct nilfs_palloc_req *);
+int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
+                                    struct nilfs_palloc_req *req, bool wrap);
 void nilfs_palloc_commit_alloc_entry(struct inode *,
                                     struct nilfs_palloc_req *);
 void nilfs_palloc_abort_alloc_entry(struct inode *, struct nilfs_palloc_req *);
 
        struct nilfs_palloc_req req;
        int ret;
 
-       req.pr_entry_nr = 0;  /*
-                              * 0 says find free inode from beginning
-                              * of a group. dull code!!
-                              */
+       req.pr_entry_nr = NILFS_FIRST_INO(ifile->i_sb);
        req.pr_entry_bh = NULL;
 
-       ret = nilfs_palloc_prepare_alloc_entry(ifile, &req);
+       ret = nilfs_palloc_prepare_alloc_entry(ifile, &req, false);
        if (!ret) {
                ret = nilfs_palloc_get_entry_block(ifile, req.pr_entry_nr, 1,
                                                   &req.pr_entry_bh);