diff options
Diffstat (limited to 'fs/xfs/xfs_trans.c')
-rw-r--r-- | fs/xfs/xfs_trans.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index bedc5a5133a5..912b42f5fe4a 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c | |||
@@ -259,6 +259,14 @@ xfs_trans_alloc( | |||
259 | struct xfs_trans *tp; | 259 | struct xfs_trans *tp; |
260 | int error; | 260 | int error; |
261 | 261 | ||
262 | /* | ||
263 | * Allocate the handle before we do our freeze accounting and setting up | ||
264 | * GFP_NOFS allocation context so that we avoid lockdep false positives | ||
265 | * by doing GFP_KERNEL allocations inside sb_start_intwrite(). | ||
266 | */ | ||
267 | tp = kmem_zone_zalloc(xfs_trans_zone, | ||
268 | (flags & XFS_TRANS_NOFS) ? KM_NOFS : KM_SLEEP); | ||
269 | |||
262 | if (!(flags & XFS_TRANS_NO_WRITECOUNT)) | 270 | if (!(flags & XFS_TRANS_NO_WRITECOUNT)) |
263 | sb_start_intwrite(mp->m_super); | 271 | sb_start_intwrite(mp->m_super); |
264 | 272 | ||
@@ -270,8 +278,6 @@ xfs_trans_alloc( | |||
270 | mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE); | 278 | mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE); |
271 | atomic_inc(&mp->m_active_trans); | 279 | atomic_inc(&mp->m_active_trans); |
272 | 280 | ||
273 | tp = kmem_zone_zalloc(xfs_trans_zone, | ||
274 | (flags & XFS_TRANS_NOFS) ? KM_NOFS : KM_SLEEP); | ||
275 | tp->t_magic = XFS_TRANS_HEADER_MAGIC; | 281 | tp->t_magic = XFS_TRANS_HEADER_MAGIC; |
276 | tp->t_flags = flags; | 282 | tp->t_flags = flags; |
277 | tp->t_mountp = mp; | 283 | tp->t_mountp = mp; |