That did it :) the kernel now fails the mounting gracefully as it did before. :)
Thanks!
On Fri, Apr 13, 2012 at 2:45 PM, Josef Bacik <josef@xxxxxxxxxx> wrote:
> On Thu, Apr 12, 2012 at 09:56:30PM +0000, Francesco Cepparo wrote:
>> On Thu, Apr 12, 2012 at 6:20 PM, Josef Bacik <josef@xxxxxxxxxx> wrote:
>> > On Thu, Apr 12, 2012 at 02:15:25PM -0400, Chris Mason wrote:
>> >> On Thu, Apr 12, 2012 at 02:08:37PM -0400, Josef Bacik wrote:
>> >> > On Wed, Apr 11, 2012 at 11:59:43PM +0000, Francesco Cepparo wrote:
>> >> > > I tried your patch but unfortunately the kernel still gives me the
>> >> > > same error message :(
>> >> >
>> >> > Weird, will you apply this patch on top of the one I sent you and send me the
>> >> > dmesg when it panics again? Thanks,
>> >> >
>> >> > Josef
>> >> >
>> >> > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
>> >> > index 2a3ddd2..51efb58 100644
>> >> > --- a/fs/btrfs/disk-io.c
>> >> > +++ b/fs/btrfs/disk-io.c
>> >> > @@ -652,6 +652,8 @@ static int btree_io_failed_hook(struct page *page, int failed_mirror)
>> >> >
>> >> > eb = (struct extent_buffer *)page->private;
>> >> > set_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
>> >> > + WARN_ON(!failed_mirror);
>> >> > + printk(KERN_ERR "io error, failed mirror %d\n");
>> >> ^^^^^
>> >>
>> >> , failed_mirror
>> >>
>> >
>> > pfft compiling debug patches before sending them out is for losers,
>> >
>> > Josef
>>
>> I applied your second patch on top of the first one but the dmesg
>> output stays the same.... before you ask, I'm sure I'm compiling the
>> kernel correctly, as putting the WARN_ON(!failed_mirror) inside the if
>> (!failed_mirror) on line 391 correctly prints the warnings... I'm not
>> sure whether the warnings generated in that place are of any interest
>> but showing them anyway can't hurt:
>>
>
> Oh hah I see what's happening, unapply the last patch I sent you (leave the
> first one in place) and apply this one, it should fix the problem. Thanks,
>
> Josef
>
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 2a3ddd2..dc52f3f 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -390,8 +390,7 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root,
>
> if (!failed_mirror) {
> failed = 1;
> - printk(KERN_ERR "failed mirror was %d\n", eb->failed_mirror);
> - failed_mirror = eb->failed_mirror;
> + failed_mirror = eb->read_mirror;
> }
>
> mirror_num++;
> @@ -564,7 +563,7 @@ struct extent_buffer *find_eb_for_page(struct extent_io_tree *tree,
> }
>
> static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
> - struct extent_state *state)
> + struct extent_state *state, int mirror)
> {
> struct extent_io_tree *tree;
> u64 found_start;
> @@ -589,6 +588,7 @@ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
> if (!reads_done)
> goto err;
>
> + eb->read_mirror = mirror;
> if (test_bit(EXTENT_BUFFER_IOERR, &eb->bflags)) {
> ret = -EIO;
> goto err;
> @@ -652,7 +652,6 @@ static int btree_io_failed_hook(struct page *page, int failed_mirror)
>
> eb = (struct extent_buffer *)page->private;
> set_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
> - eb->failed_mirror = failed_mirror;
> if (test_and_clear_bit(EXTENT_BUFFER_READAHEAD, &eb->bflags))
> btree_readahead_hook(root, eb, eb->start, -EIO);
> return -EIO; /* we fixed nothing */
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 0c3ec00..7c501d3 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -2297,7 +2297,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
> u64 start;
> u64 end;
> int whole_page;
> - int failed_mirror;
> + int mirror;
> int ret;
>
> if (err)
> @@ -2336,20 +2336,18 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
> }
> spin_unlock(&tree->lock);
>
> + mirror = (int)(unsigned long)bio->bi_bdev;
> if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) {
> ret = tree->ops->readpage_end_io_hook(page, start, end,
> - state);
> + state, mirror);
> if (ret)
> uptodate = 0;
> else
> clean_io_failure(start, page);
> }
>
> - if (!uptodate)
> - failed_mirror = (int)(unsigned long)bio->bi_bdev;
> -
> if (!uptodate && tree->ops && tree->ops->readpage_io_failed_hook) {
> - ret = tree->ops->readpage_io_failed_hook(page, failed_mirror);
> + ret = tree->ops->readpage_io_failed_hook(page, mirror);
> if (!ret && !err &&
> test_bit(BIO_UPTODATE, &bio->bi_flags))
> uptodate = 1;
> @@ -2364,8 +2362,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
> * can't handle the error it will return -EIO and we
> * remain responsible for that page.
> */
> - ret = bio_readpage_error(bio, page, start, end,
> - failed_mirror, NULL);
> + ret = bio_readpage_error(bio, page, start, end, mirror, NULL);
> if (ret == 0) {
> uptodate =
> test_bit(BIO_UPTODATE, &bio->bi_flags);
> @@ -4458,7 +4455,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
> }
>
> clear_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
> - eb->failed_mirror = 0;
> + eb->read_mirror = 0;
> atomic_set(&eb->io_pages, num_reads);
> for (i = start_i; i < num_pages; i++) {
> page = extent_buffer_page(eb, i);
> diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
> index faf10eb..b516c3b 100644
> --- a/fs/btrfs/extent_io.h
> +++ b/fs/btrfs/extent_io.h
> @@ -79,7 +79,7 @@ struct extent_io_ops {
> u64 start, u64 end,
> struct extent_state *state);
> int (*readpage_end_io_hook)(struct page *page, u64 start, u64 end,
> - struct extent_state *state);
> + struct extent_state *state, int mirror);
> int (*writepage_end_io_hook)(struct page *page, u64 start, u64 end,
> struct extent_state *state, int uptodate);
> void (*set_bit_hook)(struct inode *inode, struct extent_state *state,
> @@ -135,7 +135,7 @@ struct extent_buffer {
> spinlock_t refs_lock;
> atomic_t refs;
> atomic_t io_pages;
> - int failed_mirror;
> + int read_mirror;
> struct list_head leak_list;
> struct rcu_head rcu_head;
> pid_t lock_owner;
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 261021c..77c2b03 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -1947,7 +1947,7 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
> * extent_io.c will try to find good copies for us.
> */
> static int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end,
> - struct extent_state *state)
> + struct extent_state *state, int mirror)
> {
> size_t offset = start - ((u64)page->index << PAGE_CACHE_SHIFT);
> struct inode *inode = page->mapping->host;
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html