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
4922be51
Commit
4922be51
authored
Jan 05, 2016
by
Dave Chinner
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'xfs-dax-fixes-for-4.5' into for-next
parents
7eeabbd4
a6d7636e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
24 additions
and
12 deletions
+24
-12
fs/xfs/xfs_file.c
fs/xfs/xfs_file.c
+16
-9
fs/xfs/xfs_iomap.c
fs/xfs/xfs_iomap.c
+8
-3
No files found.
fs/xfs/xfs_file.c
View file @
4922be51
...
...
@@ -402,19 +402,26 @@ xfs_file_splice_read(
if
(
XFS_FORCED_SHUTDOWN
(
ip
->
i_mount
))
return
-
EIO
;
xfs_rw_ilock
(
ip
,
XFS_IOLOCK_SHARED
);
trace_xfs_file_splice_read
(
ip
,
count
,
*
ppos
,
ioflags
);
/* for dax, we need to avoid the page cache */
if
(
IS_DAX
(
VFS_I
(
ip
)))
ret
=
default_file_splice_read
(
infilp
,
ppos
,
pipe
,
count
,
flags
);
else
ret
=
generic_file_splice_read
(
infilp
,
ppos
,
pipe
,
count
,
flags
);
if
(
ret
>
0
)
XFS_STATS_ADD
(
ip
->
i_mount
,
xs_read_bytes
,
ret
);
/*
* DAX inodes cannot ues the page cache for splice, so we have to push
* them through the VFS IO path. This means it goes through
* ->read_iter, which for us takes the XFS_IOLOCK_SHARED. Hence we
* cannot lock the splice operation at this level for DAX inodes.
*/
if
(
IS_DAX
(
VFS_I
(
ip
)))
{
ret
=
default_file_splice_read
(
infilp
,
ppos
,
pipe
,
count
,
flags
);
goto
out
;
}
xfs_rw_ilock
(
ip
,
XFS_IOLOCK_SHARED
);
ret
=
generic_file_splice_read
(
infilp
,
ppos
,
pipe
,
count
,
flags
);
xfs_rw_iunlock
(
ip
,
XFS_IOLOCK_SHARED
);
out:
if
(
ret
>
0
)
XFS_STATS_ADD
(
ip
->
i_mount
,
xs_read_bytes
,
ret
);
return
ret
;
}
...
...
fs/xfs/xfs_iomap.c
View file @
4922be51
...
...
@@ -203,15 +203,20 @@ xfs_iomap_write_direct(
* this outside the transaction context, but if we commit and then crash
* we may not have zeroed the blocks and this will be exposed on
* recovery of the allocation. Hence we must zero before commit.
*
* Further, if we are mapping unwritten extents here, we need to zero
* and convert them to written so that we don't need an unwritten extent
* callback for DAX. This also means that we need to be able to dip into
* the reserve block pool
if there is no space left but we need to do
* unwritten extent conversion.
* the reserve block pool
for bmbt block allocation if there is no space
*
left but we need to do
unwritten extent conversion.
*/
if
(
IS_DAX
(
VFS_I
(
ip
)))
{
bmapi_flags
=
XFS_BMAPI_CONVERT
|
XFS_BMAPI_ZERO
;
tp
->
t_flags
|=
XFS_TRANS_RESERVE
;
if
(
ISUNWRITTEN
(
imap
))
{
tp
->
t_flags
|=
XFS_TRANS_RESERVE
;
resblks
=
XFS_DIOSTRAT_SPACE_RES
(
mp
,
0
)
<<
1
;
}
}
error
=
xfs_trans_reserve
(
tp
,
&
M_RES
(
mp
)
->
tr_write
,
resblks
,
resrtextents
);
...
...
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