/* Create buffers for the specified block device block's page. If that page was dirty, the buffers are set dirty also.  */
static int grow_buffers(struct block_device *bdev, sector_t block, int size)
/* Create buffers for the specified block device block's page. If that page was dirty, the buffers are set dirty also.  */
static int grow_buffers(struct block_device *bdev, sector_t block, int size)
{
	struct page *page;
	pgoff_t index;
	int sizebits;
	sizebits = -1;
	do {
		sizebits++;
	} while ((size << sizebits) < PAGE_SIZE);
	index = block >> sizebits;
	if (unlikely(index != block >> sizebits)) {
		char b[BDEVNAME_SIZE];
		printk(KERN_ERR "%s: requested out-of-range block %llu for "
			"device %s\n",
			__func__, (unsigned long long)block,
			bdevname(bdev, b));
		return -EIO;
	}
	block = index << sizebits;
	page = grow_dev_page(bdev, block, index, size);
	if (!page)
		return 0;
	unlock_page(page);
	page_cache_release(page);
	return 1;
}