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
nexedi
linux
Commits
155cd433
Commit
155cd433
authored
8 years ago
by
Dave Chinner
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'xfs-4.9-log-recovery-fixes' into for-next
parents
a1f45e66
5cd9cee9
No related merge requests found
Changes
13
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
248 additions
and
98 deletions
+248
-98
fs/xfs/libxfs/xfs_alloc.c
fs/xfs/libxfs/xfs_alloc.c
+12
-11
fs/xfs/libxfs/xfs_alloc.h
fs/xfs/libxfs/xfs_alloc.h
+15
-2
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_bmap.c
+26
-15
fs/xfs/libxfs/xfs_bmap.h
fs/xfs/libxfs/xfs_bmap.h
+1
-1
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_bmap_util.c
+1
-1
fs/xfs/xfs_extent_busy.c
fs/xfs/xfs_extent_busy.c
+1
-1
fs/xfs/xfs_filestream.c
fs/xfs/xfs_filestream.c
+6
-3
fs/xfs/xfs_log_priv.h
fs/xfs/xfs_log_priv.h
+2
-1
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_log_recover.c
+135
-56
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.c
+14
-0
fs/xfs/xfs_super.c
fs/xfs/xfs_super.c
+1
-1
fs/xfs/xfs_super.h
fs/xfs/xfs_super.h
+1
-0
fs/xfs/xfs_trace.h
fs/xfs/xfs_trace.h
+33
-6
No files found.
fs/xfs/libxfs/xfs_alloc.c
View file @
155cd433
...
@@ -258,7 +258,7 @@ xfs_alloc_compute_diff(
...
@@ -258,7 +258,7 @@ xfs_alloc_compute_diff(
xfs_agblock_t
wantbno
,
/* target starting block */
xfs_agblock_t
wantbno
,
/* target starting block */
xfs_extlen_t
wantlen
,
/* target length */
xfs_extlen_t
wantlen
,
/* target length */
xfs_extlen_t
alignment
,
/* target alignment */
xfs_extlen_t
alignment
,
/* target alignment */
char
userdata
,
/* are we allocating data? */
int
datatype
,
/* are we allocating data? */
xfs_agblock_t
freebno
,
/* freespace's starting block */
xfs_agblock_t
freebno
,
/* freespace's starting block */
xfs_extlen_t
freelen
,
/* freespace's length */
xfs_extlen_t
freelen
,
/* freespace's length */
xfs_agblock_t
*
newbnop
)
/* result: best start block from free */
xfs_agblock_t
*
newbnop
)
/* result: best start block from free */
...
@@ -269,6 +269,7 @@ xfs_alloc_compute_diff(
...
@@ -269,6 +269,7 @@ xfs_alloc_compute_diff(
xfs_extlen_t
newlen1
=
0
;
/* length with newbno1 */
xfs_extlen_t
newlen1
=
0
;
/* length with newbno1 */
xfs_extlen_t
newlen2
=
0
;
/* length with newbno2 */
xfs_extlen_t
newlen2
=
0
;
/* length with newbno2 */
xfs_agblock_t
wantend
;
/* end of target extent */
xfs_agblock_t
wantend
;
/* end of target extent */
bool
userdata
=
xfs_alloc_is_userdata
(
datatype
);
ASSERT
(
freelen
>=
wantlen
);
ASSERT
(
freelen
>=
wantlen
);
freeend
=
freebno
+
freelen
;
freeend
=
freebno
+
freelen
;
...
@@ -924,7 +925,7 @@ xfs_alloc_find_best_extent(
...
@@ -924,7 +925,7 @@ xfs_alloc_find_best_extent(
sdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
sdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
args
->
alignment
,
args
->
alignment
,
args
->
userdata
,
*
sbnoa
,
args
->
datatype
,
*
sbnoa
,
*
slena
,
&
new
);
*
slena
,
&
new
);
/*
/*
...
@@ -1108,7 +1109,7 @@ xfs_alloc_ag_vextent_near(
...
@@ -1108,7 +1109,7 @@ xfs_alloc_ag_vextent_near(
if
(
args
->
len
<
blen
)
if
(
args
->
len
<
blen
)
continue
;
continue
;
ltdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
ltdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
args
->
alignment
,
args
->
userdata
,
ltbnoa
,
args
->
alignment
,
args
->
datatype
,
ltbnoa
,
ltlena
,
&
ltnew
);
ltlena
,
&
ltnew
);
if
(
ltnew
!=
NULLAGBLOCK
&&
if
(
ltnew
!=
NULLAGBLOCK
&&
(
args
->
len
>
blen
||
ltdiff
<
bdiff
))
{
(
args
->
len
>
blen
||
ltdiff
<
bdiff
))
{
...
@@ -1261,7 +1262,7 @@ xfs_alloc_ag_vextent_near(
...
@@ -1261,7 +1262,7 @@ xfs_alloc_ag_vextent_near(
args
->
len
=
XFS_EXTLEN_MIN
(
ltlena
,
args
->
maxlen
);
args
->
len
=
XFS_EXTLEN_MIN
(
ltlena
,
args
->
maxlen
);
xfs_alloc_fix_len
(
args
);
xfs_alloc_fix_len
(
args
);
ltdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
ltdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
args
->
alignment
,
args
->
userdata
,
ltbnoa
,
args
->
alignment
,
args
->
datatype
,
ltbnoa
,
ltlena
,
&
ltnew
);
ltlena
,
&
ltnew
);
error
=
xfs_alloc_find_best_extent
(
args
,
error
=
xfs_alloc_find_best_extent
(
args
,
...
@@ -1278,7 +1279,7 @@ xfs_alloc_ag_vextent_near(
...
@@ -1278,7 +1279,7 @@ xfs_alloc_ag_vextent_near(
args
->
len
=
XFS_EXTLEN_MIN
(
gtlena
,
args
->
maxlen
);
args
->
len
=
XFS_EXTLEN_MIN
(
gtlena
,
args
->
maxlen
);
xfs_alloc_fix_len
(
args
);
xfs_alloc_fix_len
(
args
);
gtdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
gtdiff
=
xfs_alloc_compute_diff
(
args
->
agbno
,
args
->
len
,
args
->
alignment
,
args
->
userdata
,
gtbnoa
,
args
->
alignment
,
args
->
datatype
,
gtbnoa
,
gtlena
,
&
gtnew
);
gtlena
,
&
gtnew
);
error
=
xfs_alloc_find_best_extent
(
args
,
error
=
xfs_alloc_find_best_extent
(
args
,
...
@@ -1338,7 +1339,7 @@ xfs_alloc_ag_vextent_near(
...
@@ -1338,7 +1339,7 @@ xfs_alloc_ag_vextent_near(
}
}
rlen
=
args
->
len
;
rlen
=
args
->
len
;
(
void
)
xfs_alloc_compute_diff
(
args
->
agbno
,
rlen
,
args
->
alignment
,
(
void
)
xfs_alloc_compute_diff
(
args
->
agbno
,
rlen
,
args
->
alignment
,
args
->
userdata
,
ltbnoa
,
ltlena
,
&
ltnew
);
args
->
datatype
,
ltbnoa
,
ltlena
,
&
ltnew
);
ASSERT
(
ltnew
>=
ltbno
);
ASSERT
(
ltnew
>=
ltbno
);
ASSERT
(
ltnew
+
rlen
<=
ltbnoa
+
ltlena
);
ASSERT
(
ltnew
+
rlen
<=
ltbnoa
+
ltlena
);
ASSERT
(
ltnew
+
rlen
<=
be32_to_cpu
(
XFS_BUF_TO_AGF
(
args
->
agbp
)
->
agf_length
));
ASSERT
(
ltnew
+
rlen
<=
be32_to_cpu
(
XFS_BUF_TO_AGF
(
args
->
agbp
)
->
agf_length
));
...
@@ -1617,9 +1618,9 @@ xfs_alloc_ag_vextent_small(
...
@@ -1617,9 +1618,9 @@ xfs_alloc_ag_vextent_small(
goto
error0
;
goto
error0
;
if
(
fbno
!=
NULLAGBLOCK
)
{
if
(
fbno
!=
NULLAGBLOCK
)
{
xfs_extent_busy_reuse
(
args
->
mp
,
args
->
agno
,
fbno
,
1
,
xfs_extent_busy_reuse
(
args
->
mp
,
args
->
agno
,
fbno
,
1
,
args
->
userdata
);
xfs_alloc_allow_busy_reuse
(
args
->
datatype
)
);
if
(
args
->
userdata
)
{
if
(
xfs_alloc_is_userdata
(
args
->
datatype
)
)
{
xfs_buf_t
*
bp
;
xfs_buf_t
*
bp
;
bp
=
xfs_btree_get_bufs
(
args
->
mp
,
args
->
tp
,
bp
=
xfs_btree_get_bufs
(
args
->
mp
,
args
->
tp
,
...
@@ -2099,7 +2100,7 @@ xfs_alloc_fix_freelist(
...
@@ -2099,7 +2100,7 @@ xfs_alloc_fix_freelist(
* somewhere else if we are not being asked to try harder at this
* somewhere else if we are not being asked to try harder at this
* point
* point
*/
*/
if
(
pag
->
pagf_metadata
&&
args
->
userdata
&&
if
(
pag
->
pagf_metadata
&&
xfs_alloc_is_userdata
(
args
->
datatype
)
&&
(
flags
&
XFS_ALLOC_FLAG_TRYLOCK
))
{
(
flags
&
XFS_ALLOC_FLAG_TRYLOCK
))
{
ASSERT
(
!
(
flags
&
XFS_ALLOC_FLAG_FREEING
));
ASSERT
(
!
(
flags
&
XFS_ALLOC_FLAG_FREEING
));
goto
out_agbp_relse
;
goto
out_agbp_relse
;
...
@@ -2675,7 +2676,7 @@ xfs_alloc_vextent(
...
@@ -2675,7 +2676,7 @@ xfs_alloc_vextent(
* Try near allocation first, then anywhere-in-ag after
* Try near allocation first, then anywhere-in-ag after
* the first a.g. fails.
* the first a.g. fails.
*/
*/
if
((
args
->
userdata
&
XFS_ALLOC_INITIAL_USER_DATA
)
&&
if
((
args
->
datatype
&
XFS_ALLOC_INITIAL_USER_DATA
)
&&
(
mp
->
m_flags
&
XFS_MOUNT_32BITINODES
))
{
(
mp
->
m_flags
&
XFS_MOUNT_32BITINODES
))
{
args
->
fsbno
=
XFS_AGB_TO_FSB
(
mp
,
args
->
fsbno
=
XFS_AGB_TO_FSB
(
mp
,
((
mp
->
m_agfrotor
/
rotorstep
)
%
((
mp
->
m_agfrotor
/
rotorstep
)
%
...
@@ -2808,7 +2809,7 @@ xfs_alloc_vextent(
...
@@ -2808,7 +2809,7 @@ xfs_alloc_vextent(
#endif
#endif
/* Zero the extent if we were asked to do so */
/* Zero the extent if we were asked to do so */
if
(
args
->
userdata
&
XFS_ALLOC_USERDATA_ZERO
)
{
if
(
args
->
datatype
&
XFS_ALLOC_USERDATA_ZERO
)
{
error
=
xfs_zero_extent
(
args
->
ip
,
args
->
fsbno
,
args
->
len
);
error
=
xfs_zero_extent
(
args
->
ip
,
args
->
fsbno
,
args
->
len
);
if
(
error
)
if
(
error
)
goto
error0
;
goto
error0
;
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/libxfs/xfs_alloc.h
View file @
155cd433
...
@@ -85,20 +85,33 @@ typedef struct xfs_alloc_arg {
...
@@ -85,20 +85,33 @@ typedef struct xfs_alloc_arg {
xfs_extlen_t
len
;
/* output: actual size of extent */
xfs_extlen_t
len
;
/* output: actual size of extent */
xfs_alloctype_t
type
;
/* allocation type XFS_ALLOCTYPE_... */
xfs_alloctype_t
type
;
/* allocation type XFS_ALLOCTYPE_... */
xfs_alloctype_t
otype
;
/* original allocation type */
xfs_alloctype_t
otype
;
/* original allocation type */
int
datatype
;
/* mask defining data type treatment */
char
wasdel
;
/* set if allocation was prev delayed */
char
wasdel
;
/* set if allocation was prev delayed */
char
wasfromfl
;
/* set if allocation is from freelist */
char
wasfromfl
;
/* set if allocation is from freelist */
char
userdata
;
/* mask defining userdata treatment */
xfs_fsblock_t
firstblock
;
/* io first block allocated */
xfs_fsblock_t
firstblock
;
/* io first block allocated */
struct
xfs_owner_info
oinfo
;
/* owner of blocks being allocated */
struct
xfs_owner_info
oinfo
;
/* owner of blocks being allocated */
enum
xfs_ag_resv_type
resv
;
/* block reservation to use */
enum
xfs_ag_resv_type
resv
;
/* block reservation to use */
}
xfs_alloc_arg_t
;
}
xfs_alloc_arg_t
;
/*
/*
* Defines for
userdata
* Defines for
datatype
*/
*/
#define XFS_ALLOC_USERDATA (1 << 0)
/* allocation is for user data*/
#define XFS_ALLOC_USERDATA (1 << 0)
/* allocation is for user data*/
#define XFS_ALLOC_INITIAL_USER_DATA (1 << 1)
/* special case start of file */
#define XFS_ALLOC_INITIAL_USER_DATA (1 << 1)
/* special case start of file */
#define XFS_ALLOC_USERDATA_ZERO (1 << 2)
/* zero extent on allocation */
#define XFS_ALLOC_USERDATA_ZERO (1 << 2)
/* zero extent on allocation */
#define XFS_ALLOC_NOBUSY (1 << 3)
/* Busy extents not allowed */
static
inline
bool
xfs_alloc_is_userdata
(
int
datatype
)
{
return
(
datatype
&
~
XFS_ALLOC_NOBUSY
)
!=
0
;
}
static
inline
bool
xfs_alloc_allow_busy_reuse
(
int
datatype
)
{
return
(
datatype
&
XFS_ALLOC_NOBUSY
)
==
0
;
}
/* freespace limit calculations */
/* freespace limit calculations */
#define XFS_ALLOC_AGFL_RESERVE 4
#define XFS_ALLOC_AGFL_RESERVE 4
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/libxfs/xfs_bmap.c
View file @
155cd433
...
@@ -3348,7 +3348,8 @@ xfs_bmap_adjacent(
...
@@ -3348,7 +3348,8 @@ xfs_bmap_adjacent(
mp
=
ap
->
ip
->
i_mount
;
mp
=
ap
->
ip
->
i_mount
;
nullfb
=
*
ap
->
firstblock
==
NULLFSBLOCK
;
nullfb
=
*
ap
->
firstblock
==
NULLFSBLOCK
;
rt
=
XFS_IS_REALTIME_INODE
(
ap
->
ip
)
&&
ap
->
userdata
;
rt
=
XFS_IS_REALTIME_INODE
(
ap
->
ip
)
&&
xfs_alloc_is_userdata
(
ap
->
datatype
);
fb_agno
=
nullfb
?
NULLAGNUMBER
:
XFS_FSB_TO_AGNO
(
mp
,
*
ap
->
firstblock
);
fb_agno
=
nullfb
?
NULLAGNUMBER
:
XFS_FSB_TO_AGNO
(
mp
,
*
ap
->
firstblock
);
/*
/*
* If allocating at eof, and there's a previous real block,
* If allocating at eof, and there's a previous real block,
...
@@ -3624,7 +3625,7 @@ xfs_bmap_btalloc(
...
@@ -3624,7 +3625,7 @@ xfs_bmap_btalloc(
{
{
xfs_mount_t
*
mp
;
/* mount point structure */
xfs_mount_t
*
mp
;
/* mount point structure */
xfs_alloctype_t
atype
=
0
;
/* type for allocation routines */
xfs_alloctype_t
atype
=
0
;
/* type for allocation routines */
xfs_extlen_t
align
;
/* minimum allocation alignment */
xfs_extlen_t
align
=
0
;
/* minimum allocation alignment */
xfs_agnumber_t
fb_agno
;
/* ag number of ap->firstblock */
xfs_agnumber_t
fb_agno
;
/* ag number of ap->firstblock */
xfs_agnumber_t
ag
;
xfs_agnumber_t
ag
;
xfs_alloc_arg_t
args
;
xfs_alloc_arg_t
args
;
...
@@ -3647,7 +3648,8 @@ xfs_bmap_btalloc(
...
@@ -3647,7 +3648,8 @@ xfs_bmap_btalloc(
else
if
(
mp
->
m_dalign
)
else
if
(
mp
->
m_dalign
)
stripe_align
=
mp
->
m_dalign
;
stripe_align
=
mp
->
m_dalign
;
align
=
ap
->
userdata
?
xfs_get_extsz_hint
(
ap
->
ip
)
:
0
;
if
(
xfs_alloc_is_userdata
(
ap
->
datatype
))
align
=
xfs_get_extsz_hint
(
ap
->
ip
);
if
(
unlikely
(
align
))
{
if
(
unlikely
(
align
))
{
error
=
xfs_bmap_extsize_align
(
mp
,
&
ap
->
got
,
&
ap
->
prev
,
error
=
xfs_bmap_extsize_align
(
mp
,
&
ap
->
got
,
&
ap
->
prev
,
align
,
0
,
ap
->
eof
,
0
,
ap
->
conv
,
align
,
0
,
ap
->
eof
,
0
,
ap
->
conv
,
...
@@ -3660,7 +3662,8 @@ xfs_bmap_btalloc(
...
@@ -3660,7 +3662,8 @@ xfs_bmap_btalloc(
nullfb
=
*
ap
->
firstblock
==
NULLFSBLOCK
;
nullfb
=
*
ap
->
firstblock
==
NULLFSBLOCK
;
fb_agno
=
nullfb
?
NULLAGNUMBER
:
XFS_FSB_TO_AGNO
(
mp
,
*
ap
->
firstblock
);
fb_agno
=
nullfb
?
NULLAGNUMBER
:
XFS_FSB_TO_AGNO
(
mp
,
*
ap
->
firstblock
);
if
(
nullfb
)
{
if
(
nullfb
)
{
if
(
ap
->
userdata
&&
xfs_inode_is_filestream
(
ap
->
ip
))
{
if
(
xfs_alloc_is_userdata
(
ap
->
datatype
)
&&
xfs_inode_is_filestream
(
ap
->
ip
))
{
ag
=
xfs_filestream_lookup_ag
(
ap
->
ip
);
ag
=
xfs_filestream_lookup_ag
(
ap
->
ip
);
ag
=
(
ag
!=
NULLAGNUMBER
)
?
ag
:
0
;
ag
=
(
ag
!=
NULLAGNUMBER
)
?
ag
:
0
;
ap
->
blkno
=
XFS_AGB_TO_FSB
(
mp
,
ag
,
0
);
ap
->
blkno
=
XFS_AGB_TO_FSB
(
mp
,
ag
,
0
);
...
@@ -3700,7 +3703,8 @@ xfs_bmap_btalloc(
...
@@ -3700,7 +3703,8 @@ xfs_bmap_btalloc(
* enough for the request. If one isn't found, then adjust
* enough for the request. If one isn't found, then adjust
* the minimum allocation size to the largest space found.
* the minimum allocation size to the largest space found.
*/
*/
if
(
ap
->
userdata
&&
xfs_inode_is_filestream
(
ap
->
ip
))
if
(
xfs_alloc_is_userdata
(
ap
->
datatype
)
&&
xfs_inode_is_filestream
(
ap
->
ip
))
error
=
xfs_bmap_btalloc_filestreams
(
ap
,
&
args
,
&
blen
);
error
=
xfs_bmap_btalloc_filestreams
(
ap
,
&
args
,
&
blen
);
else
else
error
=
xfs_bmap_btalloc_nullfb
(
ap
,
&
args
,
&
blen
);
error
=
xfs_bmap_btalloc_nullfb
(
ap
,
&
args
,
&
blen
);
...
@@ -3784,8 +3788,8 @@ xfs_bmap_btalloc(
...
@@ -3784,8 +3788,8 @@ xfs_bmap_btalloc(
args
.
minleft
=
ap
->
minleft
;
args
.
minleft
=
ap
->
minleft
;
args
.
wasdel
=
ap
->
wasdel
;
args
.
wasdel
=
ap
->
wasdel
;
args
.
resv
=
XFS_AG_RESV_NONE
;
args
.
resv
=
XFS_AG_RESV_NONE
;
args
.
userdata
=
ap
->
userdata
;
args
.
datatype
=
ap
->
datatype
;
if
(
ap
->
userdata
&
XFS_ALLOC_USERDATA_ZERO
)
if
(
ap
->
datatype
&
XFS_ALLOC_USERDATA_ZERO
)
args
.
ip
=
ap
->
ip
;
args
.
ip
=
ap
->
ip
;
error
=
xfs_alloc_vextent
(
&
args
);
error
=
xfs_alloc_vextent
(
&
args
);
...
@@ -3879,7 +3883,8 @@ STATIC int
...
@@ -3879,7 +3883,8 @@ STATIC int
xfs_bmap_alloc
(
xfs_bmap_alloc
(
struct
xfs_bmalloca
*
ap
)
/* bmap alloc argument struct */
struct
xfs_bmalloca
*
ap
)
/* bmap alloc argument struct */
{
{
if
(
XFS_IS_REALTIME_INODE
(
ap
->
ip
)
&&
ap
->
userdata
)
if
(
XFS_IS_REALTIME_INODE
(
ap
->
ip
)
&&
xfs_alloc_is_userdata
(
ap
->
datatype
))
return
xfs_bmap_rtalloc
(
ap
);
return
xfs_bmap_rtalloc
(
ap
);
return
xfs_bmap_btalloc
(
ap
);
return
xfs_bmap_btalloc
(
ap
);
}
}
...
@@ -4204,15 +4209,21 @@ xfs_bmapi_allocate(
...
@@ -4204,15 +4209,21 @@ xfs_bmapi_allocate(
}
}
/*
/*
* Indicate if this is the first user data in the file, or just any
* Set the data type being allocated. For the data fork, the first data
* user data. And if it is userdata, indicate whether it needs to
* in the file is treated differently to all other allocations. For the
* be initialised to zero during allocation.
* attribute fork, we only need to ensure the allocated range is not on
* the busy list.
*/
*/
if
(
!
(
bma
->
flags
&
XFS_BMAPI_METADATA
))
{
if
(
!
(
bma
->
flags
&
XFS_BMAPI_METADATA
))
{
bma
->
userdata
=
(
bma
->
offset
==
0
)
?
bma
->
datatype
=
XFS_ALLOC_NOBUSY
;
XFS_ALLOC_INITIAL_USER_DATA
:
XFS_ALLOC_USERDATA
;
if
(
whichfork
==
XFS_DATA_FORK
)
{
if
(
bma
->
offset
==
0
)
bma
->
datatype
|=
XFS_ALLOC_INITIAL_USER_DATA
;
else
bma
->
datatype
|=
XFS_ALLOC_USERDATA
;
}
if
(
bma
->
flags
&
XFS_BMAPI_ZERO
)
if
(
bma
->
flags
&
XFS_BMAPI_ZERO
)
bma
->
userdata
|=
XFS_ALLOC_USERDATA_ZERO
;
bma
->
datatype
|=
XFS_ALLOC_USERDATA_ZERO
;
}
}
bma
->
minlen
=
(
bma
->
flags
&
XFS_BMAPI_CONTIG
)
?
bma
->
length
:
1
;
bma
->
minlen
=
(
bma
->
flags
&
XFS_BMAPI_CONTIG
)
?
bma
->
length
:
1
;
...
@@ -4482,7 +4493,7 @@ xfs_bmapi_write(
...
@@ -4482,7 +4493,7 @@ xfs_bmapi_write(
bma
.
tp
=
tp
;
bma
.
tp
=
tp
;
bma
.
ip
=
ip
;
bma
.
ip
=
ip
;
bma
.
total
=
total
;
bma
.
total
=
total
;
bma
.
userdata
=
0
;
bma
.
datatype
=
0
;
bma
.
dfops
=
dfops
;
bma
.
dfops
=
dfops
;
bma
.
firstblock
=
firstblock
;
bma
.
firstblock
=
firstblock
;
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/libxfs/xfs_bmap.h
View file @
155cd433
...
@@ -54,7 +54,7 @@ struct xfs_bmalloca {
...
@@ -54,7 +54,7 @@ struct xfs_bmalloca {
bool
wasdel
;
/* replacing a delayed allocation */
bool
wasdel
;
/* replacing a delayed allocation */
bool
aeof
;
/* allocated space at eof */
bool
aeof
;
/* allocated space at eof */
bool
conv
;
/* overwriting unwritten extents */
bool
conv
;
/* overwriting unwritten extents */
char
userdata
;
/* userdata mask
*/
int
datatype
;
/* data type being allocated
*/
int
flags
;
int
flags
;
};
};
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_bmap_util.c
View file @
155cd433
...
@@ -182,7 +182,7 @@ xfs_bmap_rtalloc(
...
@@ -182,7 +182,7 @@ xfs_bmap_rtalloc(
XFS_TRANS_DQ_RTBCOUNT
,
(
long
)
ralen
);
XFS_TRANS_DQ_RTBCOUNT
,
(
long
)
ralen
);
/* Zero the extent if we were asked to do so */
/* Zero the extent if we were asked to do so */
if
(
ap
->
userdata
&
XFS_ALLOC_USERDATA_ZERO
)
{
if
(
ap
->
datatype
&
XFS_ALLOC_USERDATA_ZERO
)
{
error
=
xfs_zero_extent
(
ap
->
ip
,
ap
->
blkno
,
ap
->
length
);
error
=
xfs_zero_extent
(
ap
->
ip
,
ap
->
blkno
,
ap
->
length
);
if
(
error
)
if
(
error
)
return
error
;
return
error
;
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_extent_busy.c
View file @
155cd433
...
@@ -384,7 +384,7 @@ xfs_extent_busy_trim(
...
@@ -384,7 +384,7 @@ xfs_extent_busy_trim(
* If this is a metadata allocation, try to reuse the busy
* If this is a metadata allocation, try to reuse the busy
* extent instead of trimming the allocation.
* extent instead of trimming the allocation.
*/
*/
if
(
!
args
->
userdata
&&
if
(
!
xfs_alloc_is_userdata
(
args
->
datatype
)
&&
!
(
busyp
->
flags
&
XFS_EXTENT_BUSY_DISCARDED
))
{
!
(
busyp
->
flags
&
XFS_EXTENT_BUSY_DISCARDED
))
{
if
(
!
xfs_extent_busy_update_extent
(
args
->
mp
,
args
->
pag
,
if
(
!
xfs_extent_busy_update_extent
(
args
->
mp
,
args
->
pag
,
busyp
,
fbno
,
flen
,
busyp
,
fbno
,
flen
,
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_filestream.c
View file @
155cd433
...
@@ -371,7 +371,8 @@ xfs_filestream_new_ag(
...
@@ -371,7 +371,8 @@ xfs_filestream_new_ag(
struct
xfs_mount
*
mp
=
ip
->
i_mount
;
struct
xfs_mount
*
mp
=
ip
->
i_mount
;
xfs_extlen_t
minlen
=
ap
->
length
;
xfs_extlen_t
minlen
=
ap
->
length
;
xfs_agnumber_t
startag
=
0
;
xfs_agnumber_t
startag
=
0
;
int
flags
,
err
=
0
;
int
flags
=
0
;
int
err
=
0
;
struct
xfs_mru_cache_elem
*
mru
;
struct
xfs_mru_cache_elem
*
mru
;
*
agp
=
NULLAGNUMBER
;
*
agp
=
NULLAGNUMBER
;
...
@@ -387,8 +388,10 @@ xfs_filestream_new_ag(
...
@@ -387,8 +388,10 @@ xfs_filestream_new_ag(
startag
=
(
item
->
ag
+
1
)
%
mp
->
m_sb
.
sb_agcount
;
startag
=
(
item
->
ag
+
1
)
%
mp
->
m_sb
.
sb_agcount
;
}
}
flags
=
(
ap
->
userdata
?
XFS_PICK_USERDATA
:
0
)
|
if
(
xfs_alloc_is_userdata
(
ap
->
datatype
))
(
ap
->
dfops
->
dop_low
?
XFS_PICK_LOWSPACE
:
0
);
flags
|=
XFS_PICK_USERDATA
;
if
(
ap
->
dfops
->
dop_low
)
flags
|=
XFS_PICK_LOWSPACE
;
err
=
xfs_filestream_pick_ag
(
pip
,
startag
,
agp
,
flags
,
minlen
);
err
=
xfs_filestream_pick_ag
(
pip
,
startag
,
agp
,
flags
,
minlen
);
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_log_priv.h
View file @
155cd433
...
@@ -413,7 +413,8 @@ struct xlog {
...
@@ -413,7 +413,8 @@ struct xlog {
/* log record crc error injection factor */
/* log record crc error injection factor */
uint32_t
l_badcrc_factor
;
uint32_t
l_badcrc_factor
;
#endif
#endif
/* log recovery lsn tracking (for buffer submission */
xfs_lsn_t
l_recovery_lsn
;
};
};
#define XLOG_BUF_CANCEL_BUCKET(log, blkno) \
#define XLOG_BUF_CANCEL_BUCKET(log, blkno) \
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_log_recover.c
View file @
155cd433
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_mount.c
View file @
155cd433
...
@@ -933,6 +933,20 @@ xfs_mountfs(
...
@@ -933,6 +933,20 @@ xfs_mountfs(
goto
out_rtunmount
;
goto
out_rtunmount
;
}
}
/*
* Now the log is fully replayed, we can transition to full read-only
* mode for read-only mounts. This will sync all the metadata and clean
* the log so that the recovery we just performed does not have to be
* replayed again on the next mount.
*
* We use the same quiesce mechanism as the rw->ro remount, as they are
* semantically identical operations.
*/
if
((
mp
->
m_flags
&
(
XFS_MOUNT_RDONLY
|
XFS_MOUNT_NORECOVERY
))
==
XFS_MOUNT_RDONLY
)
{
xfs_quiesce_attr
(
mp
);
}
/*
/*
* Complete the quota initialisation, post-log-replay component.
* Complete the quota initialisation, post-log-replay component.
*/
*/
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_super.c
View file @
155cd433
...
@@ -1137,7 +1137,7 @@ xfs_restore_resvblks(struct xfs_mount *mp)
...
@@ -1137,7 +1137,7 @@ xfs_restore_resvblks(struct xfs_mount *mp)
* Note: xfs_log_quiesce() stops background log work - the callers must ensure
* Note: xfs_log_quiesce() stops background log work - the callers must ensure
* it is started again when appropriate.
* it is started again when appropriate.
*/
*/
static
void
void
xfs_quiesce_attr
(
xfs_quiesce_attr
(
struct
xfs_mount
*
mp
)
struct
xfs_mount
*
mp
)
{
{
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_super.h
View file @
155cd433
...
@@ -61,6 +61,7 @@ struct xfs_mount;
...
@@ -61,6 +61,7 @@ struct xfs_mount;
struct
xfs_buftarg
;
struct
xfs_buftarg
;
struct
block_device
;
struct
block_device
;
extern
void
xfs_quiesce_attr
(
struct
xfs_mount
*
mp
);
extern
void
xfs_flush_inodes
(
struct
xfs_mount
*
mp
);
extern
void
xfs_flush_inodes
(
struct
xfs_mount
*
mp
);
extern
void
xfs_blkdev_issue_flush
(
struct
xfs_buftarg
*
);
extern
void
xfs_blkdev_issue_flush
(
struct
xfs_buftarg
*
);
extern
xfs_agnumber_t
xfs_set_inode_alloc
(
struct
xfs_mount
*
,
extern
xfs_agnumber_t
xfs_set_inode_alloc
(
struct
xfs_mount
*
,
...
...
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_trace.h
View file @
155cd433
...
@@ -1624,7 +1624,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
...
@@ -1624,7 +1624,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
__field
(
char
,
wasdel
)
__field
(
char
,
wasdel
)
__field
(
char
,
wasfromfl
)
__field
(
char
,
wasfromfl
)
__field
(
int
,
resv
)
__field
(
int
,
resv
)
__field
(
char
,
userdata
)
__field
(
int
,
datatype
)
__field
(
xfs_fsblock_t
,
firstblock
)
__field
(
xfs_fsblock_t
,
firstblock
)
),
),
TP_fast_assign
(
TP_fast_assign
(
...
@@ -1645,13 +1645,13 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
...
@@ -1645,13 +1645,13 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
__entry
->
wasdel
=
args
->
wasdel
;
__entry
->
wasdel
=
args
->
wasdel
;
__entry
->
wasfromfl
=
args
->
wasfromfl
;
__entry
->
wasfromfl
=
args
->
wasfromfl
;
__entry
->
resv
=
args
->
resv
;
__entry
->
resv
=
args
->
resv
;
__entry
->
userdata
=
args
->
userdata
;
__entry
->
datatype
=
args
->
datatype
;
__entry
->
firstblock
=
args
->
firstblock
;
__entry
->
firstblock
=
args
->
firstblock
;
),
),
TP_printk
(
"dev %d:%d agno %u agbno %u minlen %u maxlen %u mod %u "
TP_printk
(
"dev %d:%d agno %u agbno %u minlen %u maxlen %u mod %u "
"prod %u minleft %u total %u alignment %u minalignslop %u "
"prod %u minleft %u total %u alignment %u minalignslop %u "
"len %u type %s otype %s wasdel %d wasfromfl %d resv %d "
"len %u type %s otype %s wasdel %d wasfromfl %d resv %d "
"
userdata %d
firstblock 0x%llx"
,
"
datatype 0x%x
firstblock 0x%llx"
,
MAJOR
(
__entry
->
dev
),
MINOR
(
__entry
->
dev
),
MAJOR
(
__entry
->
dev
),
MINOR
(
__entry
->
dev
),
__entry
->
agno
,
__entry
->
agno
,
__entry
->
agbno
,
__entry
->
agbno
,
...
@@ -1669,7 +1669,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
...
@@ -1669,7 +1669,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class,
__entry
->
wasdel
,
__entry
->
wasdel
,
__entry
->
wasfromfl
,
__entry
->
wasfromfl
,
__entry
->
resv
,
__entry
->
resv
,
__entry
->
userdata
,
__entry
->
datatype
,
(
unsigned
long
long
)
__entry
->
firstblock
)
(
unsigned
long
long
)
__entry
->
firstblock
)
)
)
...
@@ -1985,6 +1985,29 @@ DEFINE_EVENT(xfs_swap_extent_class, name, \
...
@@ -1985,6 +1985,29 @@ DEFINE_EVENT(xfs_swap_extent_class, name, \
DEFINE_SWAPEXT_EVENT
(
xfs_swap_extent_before
);
DEFINE_SWAPEXT_EVENT
(
xfs_swap_extent_before
);
DEFINE_SWAPEXT_EVENT
(
xfs_swap_extent_after
);
DEFINE_SWAPEXT_EVENT
(
xfs_swap_extent_after
);
TRACE_EVENT
(
xfs_log_recover_record
,
TP_PROTO
(
struct
xlog
*
log
,
struct
xlog_rec_header
*
rhead
,
int
pass
),
TP_ARGS
(
log
,
rhead
,
pass
),
TP_STRUCT__entry
(
__field
(
dev_t
,
dev
)
__field
(
xfs_lsn_t
,
lsn
)
__field
(
int
,
len
)
__field
(
int
,
num_logops
)
__field
(
int
,
pass
)
),
TP_fast_assign
(
__entry
->
dev
=
log
->
l_mp
->
m_super
->
s_dev
;
__entry
->
lsn
=
be64_to_cpu
(
rhead
->
h_lsn
);
__entry
->
len
=
be32_to_cpu
(
rhead
->
h_len
);
__entry
->
num_logops
=
be32_to_cpu
(
rhead
->
h_num_logops
);
__entry
->
pass
=
pass
;
),
TP_printk
(
"dev %d:%d lsn 0x%llx len 0x%x num_logops 0x%x pass %d"
,
MAJOR
(
__entry
->
dev
),
MINOR
(
__entry
->
dev
),
__entry
->
lsn
,
__entry
->
len
,
__entry
->
num_logops
,
__entry
->
pass
)
)
DECLARE_EVENT_CLASS
(
xfs_log_recover_item_class
,
DECLARE_EVENT_CLASS
(
xfs_log_recover_item_class
,
TP_PROTO
(
struct
xlog
*
log
,
struct
xlog_recover
*
trans
,
TP_PROTO
(
struct
xlog
*
log
,
struct
xlog_recover
*
trans
,
struct
xlog_recover_item
*
item
,
int
pass
),
struct
xlog_recover_item
*
item
,
int
pass
),
...
@@ -1993,6 +2016,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class,
...
@@ -1993,6 +2016,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class,
__field
(
dev_t
,
dev
)
__field
(
dev_t
,
dev
)
__field
(
unsigned
long
,
item
)
__field
(
unsigned
long
,
item
)
__field
(
xlog_tid_t
,
tid
)
__field
(
xlog_tid_t
,
tid
)
__field
(
xfs_lsn_t
,
lsn
)
__field
(
int
,
type
)
__field
(
int
,
type
)
__field
(
int
,
pass
)
__field
(
int
,
pass
)
__field
(
int
,
count
)
__field
(
int
,
count
)
...
@@ -2002,15 +2026,17 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class,
...
@@ -2002,15 +2026,17 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class,
__entry
->
dev
=
log
->
l_mp
->
m_super
->
s_dev
;
__entry
->
dev
=
log
->
l_mp
->
m_super
->
s_dev
;
__entry
->
item
=
(
unsigned
long
)
item
;
__entry
->
item
=
(
unsigned
long
)
item
;
__entry
->
tid
=
trans
->
r_log_tid
;
__entry
->
tid
=
trans
->
r_log_tid
;
__entry
->
lsn
=
trans
->
r_lsn
;
__entry
->
type
=
ITEM_TYPE
(
item
);
__entry
->
type
=
ITEM_TYPE
(
item
);
__entry
->
pass
=
pass
;
__entry
->
pass
=
pass
;
__entry
->
count
=
item
->
ri_cnt
;
__entry
->
count
=
item
->
ri_cnt
;
__entry
->
total
=
item
->
ri_total
;
__entry
->
total
=
item
->
ri_total
;
),
),
TP_printk
(
"dev %d:%d t
rans 0x%x, pass %d, item 0x%p, item type %s
"
TP_printk
(
"dev %d:%d t
id 0x%x lsn 0x%llx, pass %d, item 0x%p,
"
"item region count/total %d/%d"
,
"item
type %s item
region count/total %d/%d"
,
MAJOR
(
__entry
->
dev
),
MINOR
(
__entry
->
dev
),
MAJOR
(
__entry
->
dev
),
MINOR
(
__entry
->
dev
),
__entry
->
tid
,
__entry
->
tid
,
__entry
->
lsn
,
__entry
->
pass
,
__entry
->
pass
,
(
void
*
)
__entry
->
item
,
(
void
*
)
__entry
->
item
,
__print_symbolic
(
__entry
->
type
,
XFS_LI_TYPE_DESC
),
__print_symbolic
(
__entry
->
type
,
XFS_LI_TYPE_DESC
),
...
@@ -2069,6 +2095,7 @@ DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel);
...
@@ -2069,6 +2095,7 @@ DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_cancel_add
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_cancel_add
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_cancel_ref_inc
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_cancel_ref_inc
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_recover
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_recover
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_skip
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_inode_buf
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_inode_buf
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_reg_buf
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_reg_buf
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_dquot_buf
);
DEFINE_LOG_RECOVER_BUF_ITEM
(
xfs_log_recover_buf_dquot_buf
);
...
...
This diff is collapsed.
Click to expand it.
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