Pull request from git://github.com/prasad-joshi/logfs_upstream.git
There are few important bug fixes for LogFS9f0bbd8
logfs: query block device for number of pages to send with bio This BUG was found when LogFS was used on KVM. The patch fixes the problem by asking for underlaying block device the number of pages to send with each BIO.41b93bc
logfs: maintain the ordering of meta-inode destruction LogFS maintains file system meta-data in special inodes. These inodes are releated to each other, therefore they must be destroyed in a proper order.ddb24bb
logfs: create a pagecache page if it is not presentcd8bfa9
logfs: initialize the number of iovecs in bio LogFS used to panic when it was created on an encrypted LVM volume. The patch fixes the problem by properly initializing the BIO.d2dcd90
logfs: destroy the reserved inodes while unmounting Diffstat: fs/logfs/dev_bdev.c | 15 ++++++++------- fs/logfs/inode.c | 18 +----------------- fs/logfs/journal.c | 2 +- fs/logfs/readwrite.c | 1 + fs/logfs/segment.c | 2 +- 5 files changed, 12 insertions(+), 26 deletions(-) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJQNmnnAAoJEDFA/f+3K+ZNhc0QAJWWtcvqCIU2UHKw0DaQieH8 X+YwoqdH5UBR0vylyoHCgCRSoRuttYEy47DYDhkpUdqad60atDhwIwhFaknlNZbt +hv2ve6hZTzcs42HZhu+0WUzMkUs0s6Xjuu9JlZND59zk1wWBfttDlKI2/SdjMlm GnW0nx5gLFZ1rmpaL8bdRpyLXxUvb9FmUc+YWsuinj8A2Lnqg5bNOmJZ3CiMYNVk UvbHDYJmNaMZndbYeXZtxXtUo9Uk4HsU+7whpmgD+OPz7h+VMOgfXnwkpsgmtbY2 qTXAjyFVpN23zhBTbpCMXvpfbrffdBJBfkEW+2sXqpr9IHbMX0Y9cb/XJ3Ub1Qz+ HRLdBh0iAZewWVRsGOKG2OU1WUrTNzKUAJ795QFL0c0bZsODzQ+5OlcD7rBzEMpq ioN49UtJWlmckWaott6PinSl/OKWlvz771Zayh9+ttuL3Dvt6coV7K3ns5MI6glN M9DTMd8GAW2Kdz80EyAjZYWw2M3lbs0/GghJB4ozYg3mrDpBq1w5ouEvSNw8PuJw yoUEe2xLGpLZdzQDouKMlrai8kohCyMoHKH1Kimx+iG4LZkYLy8VJepY1mfzQbEY 1zSB1nCV/c67qI3fxRdPNmJ7YtjTC9ero0qOouXwSJWwZ+OEikGXOKWnjRutcY1C Jfbfg6gNqOrZZbYWp1ke =eS/c -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://github.com/prasad-joshi/logfs_upstream Pull LogFS bugfixes from Prasad Joshi: - "logfs: query block device for number of pages to send with bio" This BUG was found when LogFS was used on KVM. The patch fixes the problem by asking for underlaying block device the number of pages to send with each BIO. - "logfs: maintain the ordering of meta-inode destruction" LogFS maintains file system meta-data in special inodes. These inodes are releated to each other, therefore they must be destroyed in a proper order. - "logfs: initialize the number of iovecs in bio" LogFS used to panic when it was created on an encrypted LVM volume. The patch fixes the problem by properly initializing the BIO. Plus a couple more: - logfs: create a pagecache page if it is not present - logfs: destroy the reserved inodes while unmounting * tag 'for-linus' of git://github.com/prasad-joshi/logfs_upstream: logfs: query block device for number of pages to send with bio logfs: maintain the ordering of meta-inode destruction logfs: create a pagecache page if it is not present logfs: initialize the number of iovecs in bio logfs: destroy the reserved inodes while unmounting
This commit is contained in:
commit
89a897fbd8
5 changed files with 26 additions and 12 deletions
|
@ -26,6 +26,7 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw)
|
||||||
struct completion complete;
|
struct completion complete;
|
||||||
|
|
||||||
bio_init(&bio);
|
bio_init(&bio);
|
||||||
|
bio.bi_max_vecs = 1;
|
||||||
bio.bi_io_vec = &bio_vec;
|
bio.bi_io_vec = &bio_vec;
|
||||||
bio_vec.bv_page = page;
|
bio_vec.bv_page = page;
|
||||||
bio_vec.bv_len = PAGE_SIZE;
|
bio_vec.bv_len = PAGE_SIZE;
|
||||||
|
@ -95,12 +96,11 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index,
|
||||||
struct address_space *mapping = super->s_mapping_inode->i_mapping;
|
struct address_space *mapping = super->s_mapping_inode->i_mapping;
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
struct request_queue *q = bdev_get_queue(sb->s_bdev);
|
unsigned int max_pages;
|
||||||
unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9);
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (max_pages > BIO_MAX_PAGES)
|
max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev));
|
||||||
max_pages = BIO_MAX_PAGES;
|
|
||||||
bio = bio_alloc(GFP_NOFS, max_pages);
|
bio = bio_alloc(GFP_NOFS, max_pages);
|
||||||
BUG_ON(!bio);
|
BUG_ON(!bio);
|
||||||
|
|
||||||
|
@ -190,12 +190,11 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index,
|
||||||
{
|
{
|
||||||
struct logfs_super *super = logfs_super(sb);
|
struct logfs_super *super = logfs_super(sb);
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
struct request_queue *q = bdev_get_queue(sb->s_bdev);
|
unsigned int max_pages;
|
||||||
unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9);
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (max_pages > BIO_MAX_PAGES)
|
max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev));
|
||||||
max_pages = BIO_MAX_PAGES;
|
|
||||||
bio = bio_alloc(GFP_NOFS, max_pages);
|
bio = bio_alloc(GFP_NOFS, max_pages);
|
||||||
BUG_ON(!bio);
|
BUG_ON(!bio);
|
||||||
|
|
||||||
|
|
|
@ -156,10 +156,26 @@ static void __logfs_destroy_inode(struct inode *inode)
|
||||||
call_rcu(&inode->i_rcu, logfs_i_callback);
|
call_rcu(&inode->i_rcu, logfs_i_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __logfs_destroy_meta_inode(struct inode *inode)
|
||||||
|
{
|
||||||
|
struct logfs_inode *li = logfs_inode(inode);
|
||||||
|
BUG_ON(li->li_block);
|
||||||
|
call_rcu(&inode->i_rcu, logfs_i_callback);
|
||||||
|
}
|
||||||
|
|
||||||
static void logfs_destroy_inode(struct inode *inode)
|
static void logfs_destroy_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
struct logfs_inode *li = logfs_inode(inode);
|
struct logfs_inode *li = logfs_inode(inode);
|
||||||
|
|
||||||
|
if (inode->i_ino < LOGFS_RESERVED_INOS) {
|
||||||
|
/*
|
||||||
|
* The reserved inodes are never destroyed unless we are in
|
||||||
|
* unmont path.
|
||||||
|
*/
|
||||||
|
__logfs_destroy_meta_inode(inode);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
BUG_ON(list_empty(&li->li_freeing_list));
|
BUG_ON(list_empty(&li->li_freeing_list));
|
||||||
spin_lock(&logfs_inode_lock);
|
spin_lock(&logfs_inode_lock);
|
||||||
li->li_refcount--;
|
li->li_refcount--;
|
||||||
|
@ -373,8 +389,8 @@ static void logfs_put_super(struct super_block *sb)
|
||||||
{
|
{
|
||||||
struct logfs_super *super = logfs_super(sb);
|
struct logfs_super *super = logfs_super(sb);
|
||||||
/* kill the meta-inodes */
|
/* kill the meta-inodes */
|
||||||
iput(super->s_master_inode);
|
|
||||||
iput(super->s_segfile_inode);
|
iput(super->s_segfile_inode);
|
||||||
|
iput(super->s_master_inode);
|
||||||
iput(super->s_mapping_inode);
|
iput(super->s_mapping_inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -565,7 +565,7 @@ static void write_wbuf(struct super_block *sb, struct logfs_area *area,
|
||||||
index = ofs >> PAGE_SHIFT;
|
index = ofs >> PAGE_SHIFT;
|
||||||
page_ofs = ofs & (PAGE_SIZE - 1);
|
page_ofs = ofs & (PAGE_SIZE - 1);
|
||||||
|
|
||||||
page = find_lock_page(mapping, index);
|
page = find_or_create_page(mapping, index, GFP_NOFS);
|
||||||
BUG_ON(!page);
|
BUG_ON(!page);
|
||||||
memcpy(wbuf, page_address(page) + page_ofs, super->s_writesize);
|
memcpy(wbuf, page_address(page) + page_ofs, super->s_writesize);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
|
|
|
@ -2189,7 +2189,6 @@ void logfs_evict_inode(struct inode *inode)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BUG_ON(inode->i_ino < LOGFS_RESERVED_INOS);
|
|
||||||
page = inode_to_page(inode);
|
page = inode_to_page(inode);
|
||||||
BUG_ON(!page); /* FIXME: Use emergency page */
|
BUG_ON(!page); /* FIXME: Use emergency page */
|
||||||
logfs_put_write_page(page);
|
logfs_put_write_page(page);
|
||||||
|
|
|
@ -886,7 +886,7 @@ static struct logfs_area *alloc_area(struct super_block *sb)
|
||||||
|
|
||||||
static void map_invalidatepage(struct page *page, unsigned long l)
|
static void map_invalidatepage(struct page *page, unsigned long l)
|
||||||
{
|
{
|
||||||
BUG();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int map_releasepage(struct page *page, gfp_t g)
|
static int map_releasepage(struct page *page, gfp_t g)
|
||||||
|
|
Loading…
Reference in a new issue