Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
3de9d6b6
Commit
3de9d6b6
authored
Aug 04, 2008
by
Chris Mason
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
btrfs_lookup_bio_sums seems broken, go back to the readpage_io_hook for now
Signed-off-by:
Chris Mason
<
chris.mason@oracle.com
>
parent
ea8c2819
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
56 additions
and
7 deletions
+56
-7
fs/btrfs/file-item.c
fs/btrfs/file-item.c
+3
-1
fs/btrfs/inode.c
fs/btrfs/inode.c
+53
-6
No files found.
fs/btrfs/file-item.c
View file @
3de9d6b6
...
...
@@ -134,6 +134,7 @@ int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
return
ret
;
}
#if 0 /* broken */
int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode,
struct bio *bio)
{
...
...
@@ -200,7 +201,7 @@ int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode,
diff = diff * BTRFS_CRC32_SIZE;
read_extent_buffer(path->nodes[0], &sum,
(
unsigned
long
)
item
+
diff
,
(
(unsigned long)item)
+ diff,
BTRFS_CRC32_SIZE);
found:
set_state_private(io_tree, offset, sum);
...
...
@@ -210,6 +211,7 @@ int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode,
btrfs_free_path(path);
return 0;
}
#endif
int
btrfs_csum_one_bio
(
struct
btrfs_root
*
root
,
struct
inode
*
inode
,
struct
bio
*
bio
)
...
...
fs/btrfs/inode.c
View file @
3de9d6b6
...
...
@@ -382,12 +382,6 @@ int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
BUG_ON
(
ret
);
if
(
!
(
rw
&
(
1
<<
BIO_RW
)))
{
if
(
!
btrfs_test_opt
(
root
,
NODATASUM
)
&&
!
btrfs_test_flag
(
inode
,
NODATASUM
))
{
mutex_lock
(
&
BTRFS_I
(
inode
)
->
csum_mutex
);
btrfs_lookup_bio_sums
(
root
,
inode
,
bio
);
mutex_unlock
(
&
BTRFS_I
(
inode
)
->
csum_mutex
);
}
goto
mapit
;
}
...
...
@@ -595,6 +589,58 @@ int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
return
btrfs_finish_ordered_io
(
page
->
mapping
->
host
,
start
,
end
);
}
int
btrfs_readpage_io_hook
(
struct
page
*
page
,
u64
start
,
u64
end
)
{
int
ret
=
0
;
struct
inode
*
inode
=
page
->
mapping
->
host
;
struct
btrfs_root
*
root
=
BTRFS_I
(
inode
)
->
root
;
struct
extent_io_tree
*
io_tree
=
&
BTRFS_I
(
inode
)
->
io_tree
;
struct
btrfs_csum_item
*
item
;
struct
btrfs_path
*
path
=
NULL
;
u32
csum
;
if
(
btrfs_test_opt
(
root
,
NODATASUM
)
||
btrfs_test_flag
(
inode
,
NODATASUM
))
return
0
;
/*
* It is possible there is an ordered extent that has
* not yet finished for this range in the file. If so,
* that extent will have a csum cached, and it will insert
* the sum after all the blocks in the extent are fully
* on disk. So, look for an ordered extent and use the
* sum if found. We have to do this before looking in the
* btree because csum items are pre-inserted based on
* the file size. btrfs_lookup_csum might find an item
* that still hasn't been fully filled.
*/
ret
=
btrfs_find_ordered_sum
(
inode
,
start
,
&
csum
);
if
(
ret
==
0
)
goto
found
;
ret
=
0
;
path
=
btrfs_alloc_path
();
item
=
btrfs_lookup_csum
(
NULL
,
root
,
path
,
inode
->
i_ino
,
start
,
0
);
if
(
IS_ERR
(
item
))
{
ret
=
PTR_ERR
(
item
);
/* a csum that isn't present is a preallocated region. */
if
(
ret
==
-
ENOENT
||
ret
==
-
EFBIG
)
ret
=
0
;
csum
=
0
;
printk
(
"no csum found for inode %lu start %Lu
\n
"
,
inode
->
i_ino
,
start
);
goto
out
;
}
read_extent_buffer
(
path
->
nodes
[
0
],
&
csum
,
(
unsigned
long
)
item
,
BTRFS_CRC32_SIZE
);
found:
set_state_private
(
io_tree
,
start
,
csum
);
out:
if
(
path
)
btrfs_free_path
(
path
);
return
ret
;
}
struct
io_failure_record
{
struct
page
*
page
;
u64
start
;
...
...
@@ -3580,6 +3626,7 @@ static struct extent_io_ops btrfs_extent_io_ops = {
.
fill_delalloc
=
run_delalloc_range
,
.
submit_bio_hook
=
btrfs_submit_bio_hook
,
.
merge_bio_hook
=
btrfs_merge_bio_hook
,
.
readpage_io_hook
=
btrfs_readpage_io_hook
,
.
readpage_end_io_hook
=
btrfs_readpage_end_io_hook
,
.
writepage_end_io_hook
=
btrfs_writepage_end_io_hook
,
.
writepage_start_hook
=
btrfs_writepage_start_hook
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment