Merge tag 'gcc-plugins-v4.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / fs / nilfs2 / alloc.c
1 /*
2  * alloc.c - NILFS dat/inode allocator
3  *
4  * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * Originally written by Koji Sato.
17  * Two allocators were unified by Ryusuke Konishi and Amagai Yoshiji.
18  */
19
20 #include <linux/types.h>
21 #include <linux/buffer_head.h>
22 #include <linux/fs.h>
23 #include <linux/bitops.h>
24 #include <linux/slab.h>
25 #include "mdt.h"
26 #include "alloc.h"
27
28
29 /**
30  * nilfs_palloc_groups_per_desc_block - get the number of groups that a group
31  *                                      descriptor block can maintain
32  * @inode: inode of metadata file using this allocator
33  */
34 static inline unsigned long
35 nilfs_palloc_groups_per_desc_block(const struct inode *inode)
36 {
37         return (1UL << inode->i_blkbits) /
38                 sizeof(struct nilfs_palloc_group_desc);
39 }
40
41 /**
42  * nilfs_palloc_groups_count - get maximum number of groups
43  * @inode: inode of metadata file using this allocator
44  */
45 static inline unsigned long
46 nilfs_palloc_groups_count(const struct inode *inode)
47 {
48         return 1UL << (BITS_PER_LONG - (inode->i_blkbits + 3 /* log2(8) */));
49 }
50
51 /**
52  * nilfs_palloc_init_blockgroup - initialize private variables for allocator
53  * @inode: inode of metadata file using this allocator
54  * @entry_size: size of the persistent object
55  */
56 int nilfs_palloc_init_blockgroup(struct inode *inode, unsigned int entry_size)
57 {
58         struct nilfs_mdt_info *mi = NILFS_MDT(inode);
59
60         mi->mi_bgl = kmalloc(sizeof(*mi->mi_bgl), GFP_NOFS);
61         if (!mi->mi_bgl)
62                 return -ENOMEM;
63
64         bgl_lock_init(mi->mi_bgl);
65
66         nilfs_mdt_set_entry_size(inode, entry_size, 0);
67
68         mi->mi_blocks_per_group =
69                 DIV_ROUND_UP(nilfs_palloc_entries_per_group(inode),
70                              mi->mi_entries_per_block) + 1;
71                 /*
72                  * Number of blocks in a group including entry blocks
73                  * and a bitmap block
74                  */
75         mi->mi_blocks_per_desc_block =
76                 nilfs_palloc_groups_per_desc_block(inode) *
77                 mi->mi_blocks_per_group + 1;
78                 /*
79                  * Number of blocks per descriptor including the
80                  * descriptor block
81                  */
82         return 0;
83 }
84
85 /**
86  * nilfs_palloc_group - get group number and offset from an entry number
87  * @inode: inode of metadata file using this allocator
88  * @nr: serial number of the entry (e.g. inode number)
89  * @offset: pointer to store offset number in the group
90  */
91 static unsigned long nilfs_palloc_group(const struct inode *inode, __u64 nr,
92                                         unsigned long *offset)
93 {
94         __u64 group = nr;
95
96         *offset = do_div(group, nilfs_palloc_entries_per_group(inode));
97         return group;
98 }
99
100 /**
101  * nilfs_palloc_desc_blkoff - get block offset of a group descriptor block
102  * @inode: inode of metadata file using this allocator
103  * @group: group number
104  *
105  * nilfs_palloc_desc_blkoff() returns block offset of the descriptor
106  * block which contains a descriptor of the specified group.
107  */
108 static unsigned long
109 nilfs_palloc_desc_blkoff(const struct inode *inode, unsigned long group)
110 {
111         unsigned long desc_block =
112                 group / nilfs_palloc_groups_per_desc_block(inode);
113         return desc_block * NILFS_MDT(inode)->mi_blocks_per_desc_block;
114 }
115
116 /**
117  * nilfs_palloc_bitmap_blkoff - get block offset of a bitmap block
118  * @inode: inode of metadata file using this allocator
119  * @group: group number
120  *
121  * nilfs_palloc_bitmap_blkoff() returns block offset of the bitmap
122  * block used to allocate/deallocate entries in the specified group.
123  */
124 static unsigned long
125 nilfs_palloc_bitmap_blkoff(const struct inode *inode, unsigned long group)
126 {
127         unsigned long desc_offset =
128                 group % nilfs_palloc_groups_per_desc_block(inode);
129         return nilfs_palloc_desc_blkoff(inode, group) + 1 +
130                 desc_offset * NILFS_MDT(inode)->mi_blocks_per_group;
131 }
132
133 /**
134  * nilfs_palloc_group_desc_nfrees - get the number of free entries in a group
135  * @desc: pointer to descriptor structure for the group
136  * @lock: spin lock protecting @desc
137  */
138 static unsigned long
139 nilfs_palloc_group_desc_nfrees(const struct nilfs_palloc_group_desc *desc,
140                                spinlock_t *lock)
141 {
142         unsigned long nfree;
143
144         spin_lock(lock);
145         nfree = le32_to_cpu(desc->pg_nfrees);
146         spin_unlock(lock);
147         return nfree;
148 }
149
150 /**
151  * nilfs_palloc_group_desc_add_entries - adjust count of free entries
152  * @desc: pointer to descriptor structure for the group
153  * @lock: spin lock protecting @desc
154  * @n: delta to be added
155  */
156 static u32
157 nilfs_palloc_group_desc_add_entries(struct nilfs_palloc_group_desc *desc,
158                                     spinlock_t *lock, u32 n)
159 {
160         u32 nfree;
161
162         spin_lock(lock);
163         le32_add_cpu(&desc->pg_nfrees, n);
164         nfree = le32_to_cpu(desc->pg_nfrees);
165         spin_unlock(lock);
166         return nfree;
167 }
168
169 /**
170  * nilfs_palloc_entry_blkoff - get block offset of an entry block
171  * @inode: inode of metadata file using this allocator
172  * @nr: serial number of the entry (e.g. inode number)
173  */
174 static unsigned long
175 nilfs_palloc_entry_blkoff(const struct inode *inode, __u64 nr)
176 {
177         unsigned long group, group_offset;
178
179         group = nilfs_palloc_group(inode, nr, &group_offset);
180
181         return nilfs_palloc_bitmap_blkoff(inode, group) + 1 +
182                 group_offset / NILFS_MDT(inode)->mi_entries_per_block;
183 }
184
185 /**
186  * nilfs_palloc_desc_block_init - initialize buffer of a group descriptor block
187  * @inode: inode of metadata file
188  * @bh: buffer head of the buffer to be initialized
189  * @kaddr: kernel address mapped for the page including the buffer
190  */
191 static void nilfs_palloc_desc_block_init(struct inode *inode,
192                                          struct buffer_head *bh, void *kaddr)
193 {
194         struct nilfs_palloc_group_desc *desc = kaddr + bh_offset(bh);
195         unsigned long n = nilfs_palloc_groups_per_desc_block(inode);
196         __le32 nfrees;
197
198         nfrees = cpu_to_le32(nilfs_palloc_entries_per_group(inode));
199         while (n-- > 0) {
200                 desc->pg_nfrees = nfrees;
201                 desc++;
202         }
203 }
204
205 static int nilfs_palloc_get_block(struct inode *inode, unsigned long blkoff,
206                                   int create,
207                                   void (*init_block)(struct inode *,
208                                                      struct buffer_head *,
209                                                      void *),
210                                   struct buffer_head **bhp,
211                                   struct nilfs_bh_assoc *prev,
212                                   spinlock_t *lock)
213 {
214         int ret;
215
216         spin_lock(lock);
217         if (prev->bh && blkoff == prev->blkoff) {
218                 get_bh(prev->bh);
219                 *bhp = prev->bh;
220                 spin_unlock(lock);
221                 return 0;
222         }
223         spin_unlock(lock);
224
225         ret = nilfs_mdt_get_block(inode, blkoff, create, init_block, bhp);
226         if (!ret) {
227                 spin_lock(lock);
228                 /*
229                  * The following code must be safe for change of the
230                  * cache contents during the get block call.
231                  */
232                 brelse(prev->bh);
233                 get_bh(*bhp);
234                 prev->bh = *bhp;
235                 prev->blkoff = blkoff;
236                 spin_unlock(lock);
237         }
238         return ret;
239 }
240
241 /**
242  * nilfs_palloc_delete_block - delete a block on the persistent allocator file
243  * @inode: inode of metadata file using this allocator
244  * @blkoff: block offset
245  * @prev: nilfs_bh_assoc struct of the last used buffer
246  * @lock: spin lock protecting @prev
247  */
248 static int nilfs_palloc_delete_block(struct inode *inode, unsigned long blkoff,
249                                      struct nilfs_bh_assoc *prev,
250                                      spinlock_t *lock)
251 {
252         spin_lock(lock);
253         if (prev->bh && blkoff == prev->blkoff) {
254                 brelse(prev->bh);
255                 prev->bh = NULL;
256         }
257         spin_unlock(lock);
258         return nilfs_mdt_delete_block(inode, blkoff);
259 }
260
261 /**
262  * nilfs_palloc_get_desc_block - get buffer head of a group descriptor block
263  * @inode: inode of metadata file using this allocator
264  * @group: group number
265  * @create: create flag
266  * @bhp: pointer to store the resultant buffer head
267  */
268 static int nilfs_palloc_get_desc_block(struct inode *inode,
269                                        unsigned long group,
270                                        int create, struct buffer_head **bhp)
271 {
272         struct nilfs_palloc_cache *cache = NILFS_MDT(inode)->mi_palloc_cache;
273
274         return nilfs_palloc_get_block(inode,
275                                       nilfs_palloc_desc_blkoff(inode, group),
276                                       create, nilfs_palloc_desc_block_init,
277                                       bhp, &cache->prev_desc, &cache->lock);
278 }
279
280 /**
281  * nilfs_palloc_get_bitmap_block - get buffer head of a bitmap block
282  * @inode: inode of metadata file using this allocator
283  * @group: group number
284  * @create: create flag
285  * @bhp: pointer to store the resultant buffer head
286  */
287 static int nilfs_palloc_get_bitmap_block(struct inode *inode,
288                                          unsigned long group,
289                                          int create, struct buffer_head **bhp)
290 {
291         struct nilfs_palloc_cache *cache = NILFS_MDT(inode)->mi_palloc_cache;
292
293         return nilfs_palloc_get_block(inode,
294                                       nilfs_palloc_bitmap_blkoff(inode, group),
295                                       create, NULL, bhp,
296                                       &cache->prev_bitmap, &cache->lock);
297 }
298
299 /**
300  * nilfs_palloc_delete_bitmap_block - delete a bitmap block
301  * @inode: inode of metadata file using this allocator
302  * @group: group number
303  */
304 static int nilfs_palloc_delete_bitmap_block(struct inode *inode,
305                                             unsigned long group)
306 {
307         struct nilfs_palloc_cache *cache = NILFS_MDT(inode)->mi_palloc_cache;
308
309         return nilfs_palloc_delete_block(inode,
310                                          nilfs_palloc_bitmap_blkoff(inode,
311                                                                     group),
312                                          &cache->prev_bitmap, &cache->lock);
313 }
314
315 /**
316  * nilfs_palloc_get_entry_block - get buffer head of an entry block
317  * @inode: inode of metadata file using this allocator
318  * @nr: serial number of the entry (e.g. inode number)
319  * @create: create flag
320  * @bhp: pointer to store the resultant buffer head
321  */
322 int nilfs_palloc_get_entry_block(struct inode *inode, __u64 nr,
323                                  int create, struct buffer_head **bhp)
324 {
325         struct nilfs_palloc_cache *cache = NILFS_MDT(inode)->mi_palloc_cache;
326
327         return nilfs_palloc_get_block(inode,
328                                       nilfs_palloc_entry_blkoff(inode, nr),
329                                       create, NULL, bhp,
330                                       &cache->prev_entry, &cache->lock);
331 }
332
333 /**
334  * nilfs_palloc_delete_entry_block - delete an entry block
335  * @inode: inode of metadata file using this allocator
336  * @nr: serial number of the entry
337  */
338 static int nilfs_palloc_delete_entry_block(struct inode *inode, __u64 nr)
339 {
340         struct nilfs_palloc_cache *cache = NILFS_MDT(inode)->mi_palloc_cache;
341
342         return nilfs_palloc_delete_block(inode,
343                                          nilfs_palloc_entry_blkoff(inode, nr),
344                                          &cache->prev_entry, &cache->lock);
345 }
346
347 /**
348  * nilfs_palloc_block_get_group_desc - get kernel address of a group descriptor
349  * @inode: inode of metadata file using this allocator
350  * @group: group number
351  * @bh: buffer head of the buffer storing the group descriptor block
352  * @kaddr: kernel address mapped for the page including the buffer
353  */
354 static struct nilfs_palloc_group_desc *
355 nilfs_palloc_block_get_group_desc(const struct inode *inode,
356                                   unsigned long group,
357                                   const struct buffer_head *bh, void *kaddr)
358 {
359         return (struct nilfs_palloc_group_desc *)(kaddr + bh_offset(bh)) +
360                 group % nilfs_palloc_groups_per_desc_block(inode);
361 }
362
363 /**
364  * nilfs_palloc_block_get_entry - get kernel address of an entry
365  * @inode: inode of metadata file using this allocator
366  * @nr: serial number of the entry (e.g. inode number)
367  * @bh: buffer head of the buffer storing the entry block
368  * @kaddr: kernel address mapped for the page including the buffer
369  */
370 void *nilfs_palloc_block_get_entry(const struct inode *inode, __u64 nr,
371                                    const struct buffer_head *bh, void *kaddr)
372 {
373         unsigned long entry_offset, group_offset;
374
375         nilfs_palloc_group(inode, nr, &group_offset);
376         entry_offset = group_offset % NILFS_MDT(inode)->mi_entries_per_block;
377
378         return kaddr + bh_offset(bh) +
379                 entry_offset * NILFS_MDT(inode)->mi_entry_size;
380 }
381
382 /**
383  * nilfs_palloc_find_available_slot - find available slot in a group
384  * @bitmap: bitmap of the group
385  * @target: offset number of an entry in the group (start point)
386  * @bsize: size in bits
387  * @lock: spin lock protecting @bitmap
388  */
389 static int nilfs_palloc_find_available_slot(unsigned char *bitmap,
390                                             unsigned long target,
391                                             unsigned int bsize,
392                                             spinlock_t *lock)
393 {
394         int pos, end = bsize;
395
396         if (likely(target < bsize)) {
397                 pos = target;
398                 do {
399                         pos = nilfs_find_next_zero_bit(bitmap, end, pos);
400                         if (pos >= end)
401                                 break;
402                         if (!nilfs_set_bit_atomic(lock, pos, bitmap))
403                                 return pos;
404                 } while (++pos < end);
405
406                 end = target;
407         }
408
409         /* wrap around */
410         for (pos = 0; pos < end; pos++) {
411                 pos = nilfs_find_next_zero_bit(bitmap, end, pos);
412                 if (pos >= end)
413                         break;
414                 if (!nilfs_set_bit_atomic(lock, pos, bitmap))
415                         return pos;
416         }
417
418         return -ENOSPC;
419 }
420
421 /**
422  * nilfs_palloc_rest_groups_in_desc_block - get the remaining number of groups
423  *                                          in a group descriptor block
424  * @inode: inode of metadata file using this allocator
425  * @curr: current group number
426  * @max: maximum number of groups
427  */
428 static unsigned long
429 nilfs_palloc_rest_groups_in_desc_block(const struct inode *inode,
430                                        unsigned long curr, unsigned long max)
431 {
432         return min_t(unsigned long,
433                      nilfs_palloc_groups_per_desc_block(inode) -
434                      curr % nilfs_palloc_groups_per_desc_block(inode),
435                      max - curr + 1);
436 }
437
438 /**
439  * nilfs_palloc_count_desc_blocks - count descriptor blocks number
440  * @inode: inode of metadata file using this allocator
441  * @desc_blocks: descriptor blocks number [out]
442  */
443 static int nilfs_palloc_count_desc_blocks(struct inode *inode,
444                                             unsigned long *desc_blocks)
445 {
446         __u64 blknum;
447         int ret;
448
449         ret = nilfs_bmap_last_key(NILFS_I(inode)->i_bmap, &blknum);
450         if (likely(!ret))
451                 *desc_blocks = DIV_ROUND_UP(
452                         (unsigned long)blknum,
453                         NILFS_MDT(inode)->mi_blocks_per_desc_block);
454         return ret;
455 }
456
457 /**
458  * nilfs_palloc_mdt_file_can_grow - check potential opportunity for
459  *                                      MDT file growing
460  * @inode: inode of metadata file using this allocator
461  * @desc_blocks: known current descriptor blocks count
462  */
463 static inline bool nilfs_palloc_mdt_file_can_grow(struct inode *inode,
464                                                     unsigned long desc_blocks)
465 {
466         return (nilfs_palloc_groups_per_desc_block(inode) * desc_blocks) <
467                         nilfs_palloc_groups_count(inode);
468 }
469
470 /**
471  * nilfs_palloc_count_max_entries - count max number of entries that can be
472  *                                      described by descriptor blocks count
473  * @inode: inode of metadata file using this allocator
474  * @nused: current number of used entries
475  * @nmaxp: max number of entries [out]
476  */
477 int nilfs_palloc_count_max_entries(struct inode *inode, u64 nused, u64 *nmaxp)
478 {
479         unsigned long desc_blocks = 0;
480         u64 entries_per_desc_block, nmax;
481         int err;
482
483         err = nilfs_palloc_count_desc_blocks(inode, &desc_blocks);
484         if (unlikely(err))
485                 return err;
486
487         entries_per_desc_block = (u64)nilfs_palloc_entries_per_group(inode) *
488                                 nilfs_palloc_groups_per_desc_block(inode);
489         nmax = entries_per_desc_block * desc_blocks;
490
491         if (nused == nmax &&
492                         nilfs_palloc_mdt_file_can_grow(inode, desc_blocks))
493                 nmax += entries_per_desc_block;
494
495         if (nused > nmax)
496                 return -ERANGE;
497
498         *nmaxp = nmax;
499         return 0;
500 }
501
502 /**
503  * nilfs_palloc_prepare_alloc_entry - prepare to allocate a persistent object
504  * @inode: inode of metadata file using this allocator
505  * @req: nilfs_palloc_req structure exchanged for the allocation
506  */
507 int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
508                                      struct nilfs_palloc_req *req)
509 {
510         struct buffer_head *desc_bh, *bitmap_bh;
511         struct nilfs_palloc_group_desc *desc;
512         unsigned char *bitmap;
513         void *desc_kaddr, *bitmap_kaddr;
514         unsigned long group, maxgroup, ngroups;
515         unsigned long group_offset, maxgroup_offset;
516         unsigned long n, entries_per_group;
517         unsigned long i, j;
518         spinlock_t *lock;
519         int pos, ret;
520
521         ngroups = nilfs_palloc_groups_count(inode);
522         maxgroup = ngroups - 1;
523         group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
524         entries_per_group = nilfs_palloc_entries_per_group(inode);
525
526         for (i = 0; i < ngroups; i += n) {
527                 if (group >= ngroups) {
528                         /* wrap around */
529                         group = 0;
530                         maxgroup = nilfs_palloc_group(inode, req->pr_entry_nr,
531                                                       &maxgroup_offset) - 1;
532                 }
533                 ret = nilfs_palloc_get_desc_block(inode, group, 1, &desc_bh);
534                 if (ret < 0)
535                         return ret;
536                 desc_kaddr = kmap(desc_bh->b_page);
537                 desc = nilfs_palloc_block_get_group_desc(
538                         inode, group, desc_bh, desc_kaddr);
539                 n = nilfs_palloc_rest_groups_in_desc_block(inode, group,
540                                                            maxgroup);
541                 for (j = 0; j < n; j++, desc++, group++) {
542                         lock = nilfs_mdt_bgl_lock(inode, group);
543                         if (nilfs_palloc_group_desc_nfrees(desc, lock) > 0) {
544                                 ret = nilfs_palloc_get_bitmap_block(
545                                         inode, group, 1, &bitmap_bh);
546                                 if (ret < 0)
547                                         goto out_desc;
548                                 bitmap_kaddr = kmap(bitmap_bh->b_page);
549                                 bitmap = bitmap_kaddr + bh_offset(bitmap_bh);
550                                 pos = nilfs_palloc_find_available_slot(
551                                         bitmap, group_offset,
552                                         entries_per_group, lock);
553                                 if (pos >= 0) {
554                                         /* found a free entry */
555                                         nilfs_palloc_group_desc_add_entries(
556                                                 desc, lock, -1);
557                                         req->pr_entry_nr =
558                                                 entries_per_group * group + pos;
559                                         kunmap(desc_bh->b_page);
560                                         kunmap(bitmap_bh->b_page);
561
562                                         req->pr_desc_bh = desc_bh;
563                                         req->pr_bitmap_bh = bitmap_bh;
564                                         return 0;
565                                 }
566                                 kunmap(bitmap_bh->b_page);
567                                 brelse(bitmap_bh);
568                         }
569
570                         group_offset = 0;
571                 }
572
573                 kunmap(desc_bh->b_page);
574                 brelse(desc_bh);
575         }
576
577         /* no entries left */
578         return -ENOSPC;
579
580  out_desc:
581         kunmap(desc_bh->b_page);
582         brelse(desc_bh);
583         return ret;
584 }
585
586 /**
587  * nilfs_palloc_commit_alloc_entry - finish allocation of a persistent object
588  * @inode: inode of metadata file using this allocator
589  * @req: nilfs_palloc_req structure exchanged for the allocation
590  */
591 void nilfs_palloc_commit_alloc_entry(struct inode *inode,
592                                      struct nilfs_palloc_req *req)
593 {
594         mark_buffer_dirty(req->pr_bitmap_bh);
595         mark_buffer_dirty(req->pr_desc_bh);
596         nilfs_mdt_mark_dirty(inode);
597
598         brelse(req->pr_bitmap_bh);
599         brelse(req->pr_desc_bh);
600 }
601
602 /**
603  * nilfs_palloc_commit_free_entry - finish deallocating a persistent object
604  * @inode: inode of metadata file using this allocator
605  * @req: nilfs_palloc_req structure exchanged for the removal
606  */
607 void nilfs_palloc_commit_free_entry(struct inode *inode,
608                                     struct nilfs_palloc_req *req)
609 {
610         struct nilfs_palloc_group_desc *desc;
611         unsigned long group, group_offset;
612         unsigned char *bitmap;
613         void *desc_kaddr, *bitmap_kaddr;
614         spinlock_t *lock;
615
616         group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
617         desc_kaddr = kmap(req->pr_desc_bh->b_page);
618         desc = nilfs_palloc_block_get_group_desc(inode, group,
619                                                  req->pr_desc_bh, desc_kaddr);
620         bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
621         bitmap = bitmap_kaddr + bh_offset(req->pr_bitmap_bh);
622         lock = nilfs_mdt_bgl_lock(inode, group);
623
624         if (!nilfs_clear_bit_atomic(lock, group_offset, bitmap))
625                 nilfs_msg(inode->i_sb, KERN_WARNING,
626                           "%s (ino=%lu): entry number %llu already freed",
627                           __func__, inode->i_ino,
628                           (unsigned long long)req->pr_entry_nr);
629         else
630                 nilfs_palloc_group_desc_add_entries(desc, lock, 1);
631
632         kunmap(req->pr_bitmap_bh->b_page);
633         kunmap(req->pr_desc_bh->b_page);
634
635         mark_buffer_dirty(req->pr_desc_bh);
636         mark_buffer_dirty(req->pr_bitmap_bh);
637         nilfs_mdt_mark_dirty(inode);
638
639         brelse(req->pr_bitmap_bh);
640         brelse(req->pr_desc_bh);
641 }
642
643 /**
644  * nilfs_palloc_abort_alloc_entry - cancel allocation of a persistent object
645  * @inode: inode of metadata file using this allocator
646  * @req: nilfs_palloc_req structure exchanged for the allocation
647  */
648 void nilfs_palloc_abort_alloc_entry(struct inode *inode,
649                                     struct nilfs_palloc_req *req)
650 {
651         struct nilfs_palloc_group_desc *desc;
652         void *desc_kaddr, *bitmap_kaddr;
653         unsigned char *bitmap;
654         unsigned long group, group_offset;
655         spinlock_t *lock;
656
657         group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
658         desc_kaddr = kmap(req->pr_desc_bh->b_page);
659         desc = nilfs_palloc_block_get_group_desc(inode, group,
660                                                  req->pr_desc_bh, desc_kaddr);
661         bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
662         bitmap = bitmap_kaddr + bh_offset(req->pr_bitmap_bh);
663         lock = nilfs_mdt_bgl_lock(inode, group);
664
665         if (!nilfs_clear_bit_atomic(lock, group_offset, bitmap))
666                 nilfs_msg(inode->i_sb, KERN_WARNING,
667                           "%s (ino=%lu): entry number %llu already freed",
668                           __func__, inode->i_ino,
669                           (unsigned long long)req->pr_entry_nr);
670         else
671                 nilfs_palloc_group_desc_add_entries(desc, lock, 1);
672
673         kunmap(req->pr_bitmap_bh->b_page);
674         kunmap(req->pr_desc_bh->b_page);
675
676         brelse(req->pr_bitmap_bh);
677         brelse(req->pr_desc_bh);
678
679         req->pr_entry_nr = 0;
680         req->pr_bitmap_bh = NULL;
681         req->pr_desc_bh = NULL;
682 }
683
684 /**
685  * nilfs_palloc_prepare_free_entry - prepare to deallocate a persistent object
686  * @inode: inode of metadata file using this allocator
687  * @req: nilfs_palloc_req structure exchanged for the removal
688  */
689 int nilfs_palloc_prepare_free_entry(struct inode *inode,
690                                     struct nilfs_palloc_req *req)
691 {
692         struct buffer_head *desc_bh, *bitmap_bh;
693         unsigned long group, group_offset;
694         int ret;
695
696         group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
697         ret = nilfs_palloc_get_desc_block(inode, group, 1, &desc_bh);
698         if (ret < 0)
699                 return ret;
700         ret = nilfs_palloc_get_bitmap_block(inode, group, 1, &bitmap_bh);
701         if (ret < 0) {
702                 brelse(desc_bh);
703                 return ret;
704         }
705
706         req->pr_desc_bh = desc_bh;
707         req->pr_bitmap_bh = bitmap_bh;
708         return 0;
709 }
710
711 /**
712  * nilfs_palloc_abort_free_entry - cancel deallocating a persistent object
713  * @inode: inode of metadata file using this allocator
714  * @req: nilfs_palloc_req structure exchanged for the removal
715  */
716 void nilfs_palloc_abort_free_entry(struct inode *inode,
717                                    struct nilfs_palloc_req *req)
718 {
719         brelse(req->pr_bitmap_bh);
720         brelse(req->pr_desc_bh);
721
722         req->pr_entry_nr = 0;
723         req->pr_bitmap_bh = NULL;
724         req->pr_desc_bh = NULL;
725 }
726
727 /**
728  * nilfs_palloc_freev - deallocate a set of persistent objects
729  * @inode: inode of metadata file using this allocator
730  * @entry_nrs: array of entry numbers to be deallocated
731  * @nitems: number of entries stored in @entry_nrs
732  */
733 int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems)
734 {
735         struct buffer_head *desc_bh, *bitmap_bh;
736         struct nilfs_palloc_group_desc *desc;
737         unsigned char *bitmap;
738         void *desc_kaddr, *bitmap_kaddr;
739         unsigned long group, group_offset;
740         __u64 group_min_nr, last_nrs[8];
741         const unsigned long epg = nilfs_palloc_entries_per_group(inode);
742         const unsigned int epb = NILFS_MDT(inode)->mi_entries_per_block;
743         unsigned int entry_start, end, pos;
744         spinlock_t *lock;
745         int i, j, k, ret;
746         u32 nfree;
747
748         for (i = 0; i < nitems; i = j) {
749                 int change_group = false;
750                 int nempties = 0, n = 0;
751
752                 group = nilfs_palloc_group(inode, entry_nrs[i], &group_offset);
753                 ret = nilfs_palloc_get_desc_block(inode, group, 0, &desc_bh);
754                 if (ret < 0)
755                         return ret;
756                 ret = nilfs_palloc_get_bitmap_block(inode, group, 0,
757                                                     &bitmap_bh);
758                 if (ret < 0) {
759                         brelse(desc_bh);
760                         return ret;
761                 }
762
763                 /* Get the first entry number of the group */
764                 group_min_nr = (__u64)group * epg;
765
766                 bitmap_kaddr = kmap(bitmap_bh->b_page);
767                 bitmap = bitmap_kaddr + bh_offset(bitmap_bh);
768                 lock = nilfs_mdt_bgl_lock(inode, group);
769
770                 j = i;
771                 entry_start = rounddown(group_offset, epb);
772                 do {
773                         if (!nilfs_clear_bit_atomic(lock, group_offset,
774                                                     bitmap)) {
775                                 nilfs_msg(inode->i_sb, KERN_WARNING,
776                                           "%s (ino=%lu): entry number %llu already freed",
777                                           __func__, inode->i_ino,
778                                           (unsigned long long)entry_nrs[j]);
779                         } else {
780                                 n++;
781                         }
782
783                         j++;
784                         if (j >= nitems || entry_nrs[j] < group_min_nr ||
785                             entry_nrs[j] >= group_min_nr + epg) {
786                                 change_group = true;
787                         } else {
788                                 group_offset = entry_nrs[j] - group_min_nr;
789                                 if (group_offset >= entry_start &&
790                                     group_offset < entry_start + epb) {
791                                         /* This entry is in the same block */
792                                         continue;
793                                 }
794                         }
795
796                         /* Test if the entry block is empty or not */
797                         end = entry_start + epb;
798                         pos = nilfs_find_next_bit(bitmap, end, entry_start);
799                         if (pos >= end) {
800                                 last_nrs[nempties++] = entry_nrs[j - 1];
801                                 if (nempties >= ARRAY_SIZE(last_nrs))
802                                         break;
803                         }
804
805                         if (change_group)
806                                 break;
807
808                         /* Go on to the next entry block */
809                         entry_start = rounddown(group_offset, epb);
810                 } while (true);
811
812                 kunmap(bitmap_bh->b_page);
813                 mark_buffer_dirty(bitmap_bh);
814                 brelse(bitmap_bh);
815
816                 for (k = 0; k < nempties; k++) {
817                         ret = nilfs_palloc_delete_entry_block(inode,
818                                                               last_nrs[k]);
819                         if (ret && ret != -ENOENT)
820                                 nilfs_msg(inode->i_sb, KERN_WARNING,
821                                           "error %d deleting block that object (entry=%llu, ino=%lu) belongs to",
822                                           ret, (unsigned long long)last_nrs[k],
823                                           inode->i_ino);
824                 }
825
826                 desc_kaddr = kmap_atomic(desc_bh->b_page);
827                 desc = nilfs_palloc_block_get_group_desc(
828                         inode, group, desc_bh, desc_kaddr);
829                 nfree = nilfs_palloc_group_desc_add_entries(desc, lock, n);
830                 kunmap_atomic(desc_kaddr);
831                 mark_buffer_dirty(desc_bh);
832                 nilfs_mdt_mark_dirty(inode);
833                 brelse(desc_bh);
834
835                 if (nfree == nilfs_palloc_entries_per_group(inode)) {
836                         ret = nilfs_palloc_delete_bitmap_block(inode, group);
837                         if (ret && ret != -ENOENT)
838                                 nilfs_msg(inode->i_sb, KERN_WARNING,
839                                           "error %d deleting bitmap block of group=%lu, ino=%lu",
840                                           ret, group, inode->i_ino);
841                 }
842         }
843         return 0;
844 }
845
846 void nilfs_palloc_setup_cache(struct inode *inode,
847                               struct nilfs_palloc_cache *cache)
848 {
849         NILFS_MDT(inode)->mi_palloc_cache = cache;
850         spin_lock_init(&cache->lock);
851 }
852
853 void nilfs_palloc_clear_cache(struct inode *inode)
854 {
855         struct nilfs_palloc_cache *cache = NILFS_MDT(inode)->mi_palloc_cache;
856
857         spin_lock(&cache->lock);
858         brelse(cache->prev_desc.bh);
859         brelse(cache->prev_bitmap.bh);
860         brelse(cache->prev_entry.bh);
861         cache->prev_desc.bh = NULL;
862         cache->prev_bitmap.bh = NULL;
863         cache->prev_entry.bh = NULL;
864         spin_unlock(&cache->lock);
865 }
866
867 void nilfs_palloc_destroy_cache(struct inode *inode)
868 {
869         nilfs_palloc_clear_cache(inode);
870         NILFS_MDT(inode)->mi_palloc_cache = NULL;
871 }