alloc.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  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. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  19. *
  20. * Original code was written by Koji Sato <koji@osrg.net>.
  21. * Two allocators were unified by Ryusuke Konishi <ryusuke@osrg.net>,
  22. * Amagai Yoshiji <amagai@osrg.net>.
  23. */
  24. #include <linux/types.h>
  25. #include <linux/buffer_head.h>
  26. #include <linux/fs.h>
  27. #include <linux/bitops.h>
  28. #include "mdt.h"
  29. #include "alloc.h"
  30. static inline unsigned long
  31. nilfs_palloc_groups_per_desc_block(const struct inode *inode)
  32. {
  33. return (1UL << inode->i_blkbits) /
  34. sizeof(struct nilfs_palloc_group_desc);
  35. }
  36. static inline unsigned long
  37. nilfs_palloc_groups_count(const struct inode *inode)
  38. {
  39. return 1UL << (BITS_PER_LONG - (inode->i_blkbits + 3 /* log2(8) */));
  40. }
  41. int nilfs_palloc_init_blockgroup(struct inode *inode, unsigned entry_size)
  42. {
  43. struct nilfs_mdt_info *mi = NILFS_MDT(inode);
  44. mi->mi_bgl = kmalloc(sizeof(*mi->mi_bgl), GFP_NOFS);
  45. if (!mi->mi_bgl)
  46. return -ENOMEM;
  47. bgl_lock_init(mi->mi_bgl);
  48. nilfs_mdt_set_entry_size(inode, entry_size, 0);
  49. mi->mi_blocks_per_group =
  50. DIV_ROUND_UP(nilfs_palloc_entries_per_group(inode),
  51. mi->mi_entries_per_block) + 1;
  52. /* Number of blocks in a group including entry blocks and
  53. a bitmap block */
  54. mi->mi_blocks_per_desc_block =
  55. nilfs_palloc_groups_per_desc_block(inode) *
  56. mi->mi_blocks_per_group + 1;
  57. /* Number of blocks per descriptor including the
  58. descriptor block */
  59. return 0;
  60. }
  61. static unsigned long nilfs_palloc_group(const struct inode *inode, __u64 nr,
  62. unsigned long *offset)
  63. {
  64. __u64 group = nr;
  65. *offset = do_div(group, nilfs_palloc_entries_per_group(inode));
  66. return group;
  67. }
  68. static unsigned long
  69. nilfs_palloc_desc_blkoff(const struct inode *inode, unsigned long group)
  70. {
  71. unsigned long desc_block =
  72. group / nilfs_palloc_groups_per_desc_block(inode);
  73. return desc_block * NILFS_MDT(inode)->mi_blocks_per_desc_block;
  74. }
  75. static unsigned long
  76. nilfs_palloc_bitmap_blkoff(const struct inode *inode, unsigned long group)
  77. {
  78. unsigned long desc_offset =
  79. group % nilfs_palloc_groups_per_desc_block(inode);
  80. return nilfs_palloc_desc_blkoff(inode, group) + 1 +
  81. desc_offset * NILFS_MDT(inode)->mi_blocks_per_group;
  82. }
  83. static unsigned long
  84. nilfs_palloc_group_desc_nfrees(struct inode *inode, unsigned long group,
  85. const struct nilfs_palloc_group_desc *desc)
  86. {
  87. unsigned long nfree;
  88. spin_lock(nilfs_mdt_bgl_lock(inode, group));
  89. nfree = le32_to_cpu(desc->pg_nfrees);
  90. spin_unlock(nilfs_mdt_bgl_lock(inode, group));
  91. return nfree;
  92. }
  93. static void
  94. nilfs_palloc_group_desc_add_entries(struct inode *inode,
  95. unsigned long group,
  96. struct nilfs_palloc_group_desc *desc,
  97. u32 n)
  98. {
  99. spin_lock(nilfs_mdt_bgl_lock(inode, group));
  100. le32_add_cpu(&desc->pg_nfrees, n);
  101. spin_unlock(nilfs_mdt_bgl_lock(inode, group));
  102. }
  103. static unsigned long
  104. nilfs_palloc_entry_blkoff(const struct inode *inode, __u64 nr)
  105. {
  106. unsigned long group, group_offset;
  107. group = nilfs_palloc_group(inode, nr, &group_offset);
  108. return nilfs_palloc_bitmap_blkoff(inode, group) + 1 +
  109. group_offset / NILFS_MDT(inode)->mi_entries_per_block;
  110. }
  111. static void nilfs_palloc_desc_block_init(struct inode *inode,
  112. struct buffer_head *bh, void *kaddr)
  113. {
  114. struct nilfs_palloc_group_desc *desc = kaddr + bh_offset(bh);
  115. unsigned long n = nilfs_palloc_groups_per_desc_block(inode);
  116. __le32 nfrees;
  117. nfrees = cpu_to_le32(nilfs_palloc_entries_per_group(inode));
  118. while (n-- > 0) {
  119. desc->pg_nfrees = nfrees;
  120. desc++;
  121. }
  122. }
  123. static int nilfs_palloc_get_desc_block(struct inode *inode,
  124. unsigned long group,
  125. int create, struct buffer_head **bhp)
  126. {
  127. return nilfs_mdt_get_block(inode,
  128. nilfs_palloc_desc_blkoff(inode, group),
  129. create, nilfs_palloc_desc_block_init, bhp);
  130. }
  131. static int nilfs_palloc_get_bitmap_block(struct inode *inode,
  132. unsigned long group,
  133. int create, struct buffer_head **bhp)
  134. {
  135. return nilfs_mdt_get_block(inode,
  136. nilfs_palloc_bitmap_blkoff(inode, group),
  137. create, NULL, bhp);
  138. }
  139. int nilfs_palloc_get_entry_block(struct inode *inode, __u64 nr,
  140. int create, struct buffer_head **bhp)
  141. {
  142. return nilfs_mdt_get_block(inode, nilfs_palloc_entry_blkoff(inode, nr),
  143. create, NULL, bhp);
  144. }
  145. static struct nilfs_palloc_group_desc *
  146. nilfs_palloc_block_get_group_desc(const struct inode *inode,
  147. unsigned long group,
  148. const struct buffer_head *bh, void *kaddr)
  149. {
  150. return (struct nilfs_palloc_group_desc *)(kaddr + bh_offset(bh)) +
  151. group % nilfs_palloc_groups_per_desc_block(inode);
  152. }
  153. static unsigned char *
  154. nilfs_palloc_block_get_bitmap(const struct inode *inode,
  155. const struct buffer_head *bh, void *kaddr)
  156. {
  157. return (unsigned char *)(kaddr + bh_offset(bh));
  158. }
  159. void *nilfs_palloc_block_get_entry(const struct inode *inode, __u64 nr,
  160. const struct buffer_head *bh, void *kaddr)
  161. {
  162. unsigned long entry_offset, group_offset;
  163. nilfs_palloc_group(inode, nr, &group_offset);
  164. entry_offset = group_offset % NILFS_MDT(inode)->mi_entries_per_block;
  165. return kaddr + bh_offset(bh) +
  166. entry_offset * NILFS_MDT(inode)->mi_entry_size;
  167. }
  168. static int nilfs_palloc_find_available_slot(struct inode *inode,
  169. unsigned long group,
  170. unsigned long target,
  171. unsigned char *bitmap,
  172. int bsize) /* size in bits */
  173. {
  174. int curr, pos, end, i;
  175. if (target > 0) {
  176. end = (target + BITS_PER_LONG - 1) & ~(BITS_PER_LONG - 1);
  177. if (end > bsize)
  178. end = bsize;
  179. pos = nilfs_find_next_zero_bit(bitmap, end, target);
  180. if (pos < end &&
  181. !nilfs_set_bit_atomic(
  182. nilfs_mdt_bgl_lock(inode, group), pos, bitmap))
  183. return pos;
  184. } else
  185. end = 0;
  186. for (i = 0, curr = end;
  187. i < bsize;
  188. i += BITS_PER_LONG, curr += BITS_PER_LONG) {
  189. /* wrap around */
  190. if (curr >= bsize)
  191. curr = 0;
  192. while (*((unsigned long *)bitmap + curr / BITS_PER_LONG)
  193. != ~0UL) {
  194. end = curr + BITS_PER_LONG;
  195. if (end > bsize)
  196. end = bsize;
  197. pos = nilfs_find_next_zero_bit(bitmap, end, curr);
  198. if ((pos < end) &&
  199. !nilfs_set_bit_atomic(
  200. nilfs_mdt_bgl_lock(inode, group), pos,
  201. bitmap))
  202. return pos;
  203. }
  204. }
  205. return -ENOSPC;
  206. }
  207. static unsigned long
  208. nilfs_palloc_rest_groups_in_desc_block(const struct inode *inode,
  209. unsigned long curr, unsigned long max)
  210. {
  211. return min_t(unsigned long,
  212. nilfs_palloc_groups_per_desc_block(inode) -
  213. curr % nilfs_palloc_groups_per_desc_block(inode),
  214. max - curr + 1);
  215. }
  216. int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
  217. struct nilfs_palloc_req *req)
  218. {
  219. struct buffer_head *desc_bh, *bitmap_bh;
  220. struct nilfs_palloc_group_desc *desc;
  221. unsigned char *bitmap;
  222. void *desc_kaddr, *bitmap_kaddr;
  223. unsigned long group, maxgroup, ngroups;
  224. unsigned long group_offset, maxgroup_offset;
  225. unsigned long n, entries_per_group, groups_per_desc_block;
  226. unsigned long i, j;
  227. int pos, ret;
  228. ngroups = nilfs_palloc_groups_count(inode);
  229. maxgroup = ngroups - 1;
  230. group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
  231. entries_per_group = nilfs_palloc_entries_per_group(inode);
  232. groups_per_desc_block = nilfs_palloc_groups_per_desc_block(inode);
  233. for (i = 0; i < ngroups; i += n) {
  234. if (group >= ngroups) {
  235. /* wrap around */
  236. group = 0;
  237. maxgroup = nilfs_palloc_group(inode, req->pr_entry_nr,
  238. &maxgroup_offset) - 1;
  239. }
  240. ret = nilfs_palloc_get_desc_block(inode, group, 1, &desc_bh);
  241. if (ret < 0)
  242. return ret;
  243. desc_kaddr = kmap(desc_bh->b_page);
  244. desc = nilfs_palloc_block_get_group_desc(
  245. inode, group, desc_bh, desc_kaddr);
  246. n = nilfs_palloc_rest_groups_in_desc_block(inode, group,
  247. maxgroup);
  248. for (j = 0; j < n; j++, desc++, group++) {
  249. if (nilfs_palloc_group_desc_nfrees(inode, group, desc)
  250. > 0) {
  251. ret = nilfs_palloc_get_bitmap_block(
  252. inode, group, 1, &bitmap_bh);
  253. if (ret < 0)
  254. goto out_desc;
  255. bitmap_kaddr = kmap(bitmap_bh->b_page);
  256. bitmap = nilfs_palloc_block_get_bitmap(
  257. inode, bitmap_bh, bitmap_kaddr);
  258. pos = nilfs_palloc_find_available_slot(
  259. inode, group, group_offset, bitmap,
  260. entries_per_group);
  261. if (pos >= 0) {
  262. /* found a free entry */
  263. nilfs_palloc_group_desc_add_entries(
  264. inode, group, desc, -1);
  265. req->pr_entry_nr =
  266. entries_per_group * group + pos;
  267. kunmap(desc_bh->b_page);
  268. kunmap(bitmap_bh->b_page);
  269. req->pr_desc_bh = desc_bh;
  270. req->pr_bitmap_bh = bitmap_bh;
  271. return 0;
  272. }
  273. kunmap(bitmap_bh->b_page);
  274. brelse(bitmap_bh);
  275. }
  276. group_offset = 0;
  277. }
  278. kunmap(desc_bh->b_page);
  279. brelse(desc_bh);
  280. }
  281. /* no entries left */
  282. return -ENOSPC;
  283. out_desc:
  284. kunmap(desc_bh->b_page);
  285. brelse(desc_bh);
  286. return ret;
  287. }
  288. void nilfs_palloc_commit_alloc_entry(struct inode *inode,
  289. struct nilfs_palloc_req *req)
  290. {
  291. nilfs_mdt_mark_buffer_dirty(req->pr_bitmap_bh);
  292. nilfs_mdt_mark_buffer_dirty(req->pr_desc_bh);
  293. nilfs_mdt_mark_dirty(inode);
  294. brelse(req->pr_bitmap_bh);
  295. brelse(req->pr_desc_bh);
  296. }
  297. void nilfs_palloc_commit_free_entry(struct inode *inode,
  298. struct nilfs_palloc_req *req)
  299. {
  300. struct nilfs_palloc_group_desc *desc;
  301. unsigned long group, group_offset;
  302. unsigned char *bitmap;
  303. void *desc_kaddr, *bitmap_kaddr;
  304. group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
  305. desc_kaddr = kmap(req->pr_desc_bh->b_page);
  306. desc = nilfs_palloc_block_get_group_desc(inode, group,
  307. req->pr_desc_bh, desc_kaddr);
  308. bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
  309. bitmap = nilfs_palloc_block_get_bitmap(inode, req->pr_bitmap_bh,
  310. bitmap_kaddr);
  311. if (!nilfs_clear_bit_atomic(nilfs_mdt_bgl_lock(inode, group),
  312. group_offset, bitmap))
  313. printk(KERN_WARNING "%s: entry number %llu already freed\n",
  314. __func__, (unsigned long long)req->pr_entry_nr);
  315. nilfs_palloc_group_desc_add_entries(inode, group, desc, 1);
  316. kunmap(req->pr_bitmap_bh->b_page);
  317. kunmap(req->pr_desc_bh->b_page);
  318. nilfs_mdt_mark_buffer_dirty(req->pr_desc_bh);
  319. nilfs_mdt_mark_buffer_dirty(req->pr_bitmap_bh);
  320. nilfs_mdt_mark_dirty(inode);
  321. brelse(req->pr_bitmap_bh);
  322. brelse(req->pr_desc_bh);
  323. }
  324. void nilfs_palloc_abort_alloc_entry(struct inode *inode,
  325. struct nilfs_palloc_req *req)
  326. {
  327. struct nilfs_palloc_group_desc *desc;
  328. void *desc_kaddr, *bitmap_kaddr;
  329. unsigned char *bitmap;
  330. unsigned long group, group_offset;
  331. group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
  332. desc_kaddr = kmap(req->pr_desc_bh->b_page);
  333. desc = nilfs_palloc_block_get_group_desc(inode, group,
  334. req->pr_desc_bh, desc_kaddr);
  335. bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
  336. bitmap = nilfs_palloc_block_get_bitmap(inode, req->pr_bitmap_bh,
  337. bitmap_kaddr);
  338. if (!nilfs_clear_bit_atomic(nilfs_mdt_bgl_lock(inode, group),
  339. group_offset, bitmap))
  340. printk(KERN_WARNING "%s: entry numer %llu already freed\n",
  341. __func__, (unsigned long long)req->pr_entry_nr);
  342. nilfs_palloc_group_desc_add_entries(inode, group, desc, 1);
  343. kunmap(req->pr_bitmap_bh->b_page);
  344. kunmap(req->pr_desc_bh->b_page);
  345. brelse(req->pr_bitmap_bh);
  346. brelse(req->pr_desc_bh);
  347. req->pr_entry_nr = 0;
  348. req->pr_bitmap_bh = NULL;
  349. req->pr_desc_bh = NULL;
  350. }
  351. int nilfs_palloc_prepare_free_entry(struct inode *inode,
  352. struct nilfs_palloc_req *req)
  353. {
  354. struct buffer_head *desc_bh, *bitmap_bh;
  355. unsigned long group, group_offset;
  356. int ret;
  357. group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
  358. ret = nilfs_palloc_get_desc_block(inode, group, 1, &desc_bh);
  359. if (ret < 0)
  360. return ret;
  361. ret = nilfs_palloc_get_bitmap_block(inode, group, 1, &bitmap_bh);
  362. if (ret < 0) {
  363. brelse(desc_bh);
  364. return ret;
  365. }
  366. req->pr_desc_bh = desc_bh;
  367. req->pr_bitmap_bh = bitmap_bh;
  368. return 0;
  369. }
  370. void nilfs_palloc_abort_free_entry(struct inode *inode,
  371. struct nilfs_palloc_req *req)
  372. {
  373. brelse(req->pr_bitmap_bh);
  374. brelse(req->pr_desc_bh);
  375. req->pr_entry_nr = 0;
  376. req->pr_bitmap_bh = NULL;
  377. req->pr_desc_bh = NULL;
  378. }
  379. static int
  380. nilfs_palloc_group_is_in(struct inode *inode, unsigned long group, __u64 nr)
  381. {
  382. __u64 first, last;
  383. first = group * nilfs_palloc_entries_per_group(inode);
  384. last = first + nilfs_palloc_entries_per_group(inode) - 1;
  385. return (nr >= first) && (nr <= last);
  386. }
  387. int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems)
  388. {
  389. struct buffer_head *desc_bh, *bitmap_bh;
  390. struct nilfs_palloc_group_desc *desc;
  391. unsigned char *bitmap;
  392. void *desc_kaddr, *bitmap_kaddr;
  393. unsigned long group, group_offset;
  394. int i, j, n, ret;
  395. for (i = 0; i < nitems; i += n) {
  396. group = nilfs_palloc_group(inode, entry_nrs[i], &group_offset);
  397. ret = nilfs_palloc_get_desc_block(inode, group, 0, &desc_bh);
  398. if (ret < 0)
  399. return ret;
  400. ret = nilfs_palloc_get_bitmap_block(inode, group, 0,
  401. &bitmap_bh);
  402. if (ret < 0) {
  403. brelse(desc_bh);
  404. return ret;
  405. }
  406. desc_kaddr = kmap(desc_bh->b_page);
  407. desc = nilfs_palloc_block_get_group_desc(
  408. inode, group, desc_bh, desc_kaddr);
  409. bitmap_kaddr = kmap(bitmap_bh->b_page);
  410. bitmap = nilfs_palloc_block_get_bitmap(
  411. inode, bitmap_bh, bitmap_kaddr);
  412. for (j = i, n = 0;
  413. (j < nitems) && nilfs_palloc_group_is_in(inode, group,
  414. entry_nrs[j]);
  415. j++, n++) {
  416. nilfs_palloc_group(inode, entry_nrs[j], &group_offset);
  417. if (!nilfs_clear_bit_atomic(
  418. nilfs_mdt_bgl_lock(inode, group),
  419. group_offset, bitmap)) {
  420. printk(KERN_WARNING
  421. "%s: entry number %llu already freed\n",
  422. __func__,
  423. (unsigned long long)entry_nrs[j]);
  424. }
  425. }
  426. nilfs_palloc_group_desc_add_entries(inode, group, desc, n);
  427. kunmap(bitmap_bh->b_page);
  428. kunmap(desc_bh->b_page);
  429. nilfs_mdt_mark_buffer_dirty(desc_bh);
  430. nilfs_mdt_mark_buffer_dirty(bitmap_bh);
  431. nilfs_mdt_mark_dirty(inode);
  432. brelse(bitmap_bh);
  433. brelse(desc_bh);
  434. }
  435. return 0;
  436. }