|
@@ -1995,10 +1995,10 @@ static int free_io_failure(struct inode *inode, struct io_failure_record *rec)
|
|
* currently, there can be no more than two copies of every data bit. thus,
|
|
* currently, there can be no more than two copies of every data bit. thus,
|
|
* exactly one rewrite is required.
|
|
* exactly one rewrite is required.
|
|
*/
|
|
*/
|
|
-int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,
|
|
|
|
- u64 length, u64 logical, struct page *page,
|
|
|
|
- unsigned int pg_offset, int mirror_num)
|
|
|
|
|
|
+int repair_io_failure(struct inode *inode, u64 start, u64 length, u64 logical,
|
|
|
|
+ struct page *page, unsigned int pg_offset, int mirror_num)
|
|
{
|
|
{
|
|
|
|
+ struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
|
|
struct bio *bio;
|
|
struct bio *bio;
|
|
struct btrfs_device *dev;
|
|
struct btrfs_device *dev;
|
|
u64 map_length = 0;
|
|
u64 map_length = 0;
|
|
@@ -2046,10 +2046,9 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,
|
|
}
|
|
}
|
|
|
|
|
|
printk_ratelimited_in_rcu(KERN_INFO
|
|
printk_ratelimited_in_rcu(KERN_INFO
|
|
- "BTRFS: read error corrected: ino %lu off %llu "
|
|
|
|
- "(dev %s sector %llu)\n", page->mapping->host->i_ino,
|
|
|
|
- start, rcu_str_deref(dev->name), sector);
|
|
|
|
-
|
|
|
|
|
|
+ "BTRFS: read error corrected: ino %llu off %llu (dev %s sector %llu)\n",
|
|
|
|
+ btrfs_ino(inode), start,
|
|
|
|
+ rcu_str_deref(dev->name), sector);
|
|
bio_put(bio);
|
|
bio_put(bio);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -2066,9 +2065,10 @@ int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb,
|
|
|
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
for (i = 0; i < num_pages; i++) {
|
|
struct page *p = extent_buffer_page(eb, i);
|
|
struct page *p = extent_buffer_page(eb, i);
|
|
- ret = repair_io_failure(root->fs_info, start, PAGE_CACHE_SIZE,
|
|
|
|
- start, p, start - page_offset(p),
|
|
|
|
- mirror_num);
|
|
|
|
|
|
+
|
|
|
|
+ ret = repair_io_failure(root->fs_info->btree_inode, start,
|
|
|
|
+ PAGE_CACHE_SIZE, start, p,
|
|
|
|
+ start - page_offset(p), mirror_num);
|
|
if (ret)
|
|
if (ret)
|
|
break;
|
|
break;
|
|
start += PAGE_CACHE_SIZE;
|
|
start += PAGE_CACHE_SIZE;
|
|
@@ -2081,12 +2081,12 @@ int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb,
|
|
* each time an IO finishes, we do a fast check in the IO failure tree
|
|
* each time an IO finishes, we do a fast check in the IO failure tree
|
|
* to see if we need to process or clean up an io_failure_record
|
|
* to see if we need to process or clean up an io_failure_record
|
|
*/
|
|
*/
|
|
-static int clean_io_failure(u64 start, struct page *page)
|
|
|
|
|
|
+static int clean_io_failure(struct inode *inode, u64 start,
|
|
|
|
+ struct page *page, unsigned int pg_offset)
|
|
{
|
|
{
|
|
u64 private;
|
|
u64 private;
|
|
u64 private_failure;
|
|
u64 private_failure;
|
|
struct io_failure_record *failrec;
|
|
struct io_failure_record *failrec;
|
|
- struct inode *inode = page->mapping->host;
|
|
|
|
struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
|
|
struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
|
|
struct extent_state *state;
|
|
struct extent_state *state;
|
|
int num_copies;
|
|
int num_copies;
|
|
@@ -2126,10 +2126,9 @@ static int clean_io_failure(u64 start, struct page *page)
|
|
num_copies = btrfs_num_copies(fs_info, failrec->logical,
|
|
num_copies = btrfs_num_copies(fs_info, failrec->logical,
|
|
failrec->len);
|
|
failrec->len);
|
|
if (num_copies > 1) {
|
|
if (num_copies > 1) {
|
|
- repair_io_failure(fs_info, start, failrec->len,
|
|
|
|
|
|
+ repair_io_failure(inode, start, failrec->len,
|
|
failrec->logical, page,
|
|
failrec->logical, page,
|
|
- start - page_offset(page),
|
|
|
|
- failrec->failed_mirror);
|
|
|
|
|
|
+ pg_offset, failrec->failed_mirror);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2538,7 +2537,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
|
|
if (ret)
|
|
if (ret)
|
|
uptodate = 0;
|
|
uptodate = 0;
|
|
else
|
|
else
|
|
- clean_io_failure(start, page);
|
|
|
|
|
|
+ clean_io_failure(inode, start, page, 0);
|
|
}
|
|
}
|
|
|
|
|
|
if (likely(uptodate))
|
|
if (likely(uptodate))
|