Commit 82fa9012 authored by David Chinner's avatar David Chinner Committed by Lachlan McIlroy

[XFS] Allocate the struct xfs_ail

Rather than embedding the struct xfs_ail in the struct xfs_mount, allocate
it during AIL initialisation. Add a back pointer to the struct xfs_ail so
that we can pass around the xfs_ail and still be able to access the
xfs_mount if need be. This is th first step involved in isolating the AIL
implementation from the surrounding filesystem code.

SGI-PV: 988143

SGI-Modid: xfs-linux-melb:xfs-kern:32346a
Signed-off-by: default avatarDavid Chinner <david@fromorbit.com>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
parent a7444053
...@@ -814,18 +814,18 @@ xfs_setup_devices( ...@@ -814,18 +814,18 @@ xfs_setup_devices(
*/ */
void void
xfsaild_wakeup( xfsaild_wakeup(
xfs_mount_t *mp, struct xfs_ail *ailp,
xfs_lsn_t threshold_lsn) xfs_lsn_t threshold_lsn)
{ {
mp->m_ail.xa_target = threshold_lsn; ailp->xa_target = threshold_lsn;
wake_up_process(mp->m_ail.xa_task); wake_up_process(ailp->xa_task);
} }
int int
xfsaild( xfsaild(
void *data) void *data)
{ {
xfs_mount_t *mp = (xfs_mount_t *)data; struct xfs_ail *ailp = data;
xfs_lsn_t last_pushed_lsn = 0; xfs_lsn_t last_pushed_lsn = 0;
long tout = 0; long tout = 0;
...@@ -837,11 +837,11 @@ xfsaild( ...@@ -837,11 +837,11 @@ xfsaild(
/* swsusp */ /* swsusp */
try_to_freeze(); try_to_freeze();
ASSERT(mp->m_log); ASSERT(ailp->xa_mount->m_log);
if (XFS_FORCED_SHUTDOWN(mp)) if (XFS_FORCED_SHUTDOWN(ailp->xa_mount))
continue; continue;
tout = xfsaild_push(mp, &last_pushed_lsn); tout = xfsaild_push(ailp, &last_pushed_lsn);
} }
return 0; return 0;
...@@ -849,20 +849,20 @@ xfsaild( ...@@ -849,20 +849,20 @@ xfsaild(
int int
xfsaild_start( xfsaild_start(
xfs_mount_t *mp) struct xfs_ail *ailp)
{ {
mp->m_ail.xa_target = 0; ailp->xa_target = 0;
mp->m_ail.xa_task = kthread_run(xfsaild, mp, "xfsaild"); ailp->xa_task = kthread_run(xfsaild, ailp, "xfsaild");
if (IS_ERR(mp->m_ail.xa_task)) if (IS_ERR(ailp->xa_task))
return -PTR_ERR(mp->m_ail.xa_task); return -PTR_ERR(ailp->xa_task);
return 0; return 0;
} }
void void
xfsaild_stop( xfsaild_stop(
xfs_mount_t *mp) struct xfs_ail *ailp)
{ {
kthread_stop(mp->m_ail.xa_task); kthread_stop(ailp->xa_task);
} }
......
...@@ -63,6 +63,7 @@ struct xfs_extdelta; ...@@ -63,6 +63,7 @@ struct xfs_extdelta;
struct xfs_swapext; struct xfs_swapext;
struct xfs_mru_cache; struct xfs_mru_cache;
struct xfs_nameops; struct xfs_nameops;
struct xfs_ail;
/* /*
* Prototypes and functions for the Data Migration subsystem. * Prototypes and functions for the Data Migration subsystem.
...@@ -224,18 +225,11 @@ extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); ...@@ -224,18 +225,11 @@ extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int);
#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) #define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0)
#endif #endif
typedef struct xfs_ail {
struct list_head xa_ail;
uint xa_gen;
struct task_struct *xa_task;
xfs_lsn_t xa_target;
} xfs_ail_t;
typedef struct xfs_mount { typedef struct xfs_mount {
struct super_block *m_super; struct super_block *m_super;
xfs_tid_t m_tid; /* next unused tid for fs */ xfs_tid_t m_tid; /* next unused tid for fs */
spinlock_t m_ail_lock; /* fs AIL mutex */ spinlock_t m_ail_lock; /* fs AIL mutex */
xfs_ail_t m_ail; /* fs active log item list */ struct xfs_ail *m_ail; /* fs active log item list */
xfs_sb_t m_sb; /* copy of fs superblock */ xfs_sb_t m_sb; /* copy of fs superblock */
spinlock_t m_sb_lock; /* sb counter lock */ spinlock_t m_sb_lock; /* sb counter lock */
struct xfs_buf *m_sb_bp; /* buffer for superblock */ struct xfs_buf *m_sb_bp; /* buffer for superblock */
......
...@@ -28,13 +28,13 @@ ...@@ -28,13 +28,13 @@
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
#include "xfs_error.h" #include "xfs_error.h"
STATIC void xfs_ail_insert(xfs_ail_t *, xfs_log_item_t *); STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *);
STATIC xfs_log_item_t * xfs_ail_delete(xfs_ail_t *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *);
STATIC xfs_log_item_t * xfs_ail_min(xfs_ail_t *); STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *);
STATIC xfs_log_item_t * xfs_ail_next(xfs_ail_t *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_next(struct xfs_ail *, xfs_log_item_t *);
#ifdef DEBUG #ifdef DEBUG
STATIC void xfs_ail_check(xfs_ail_t *, xfs_log_item_t *); STATIC void xfs_ail_check(struct xfs_ail *, xfs_log_item_t *);
#else #else
#define xfs_ail_check(a,l) #define xfs_ail_check(a,l)
#endif /* DEBUG */ #endif /* DEBUG */
...@@ -57,7 +57,7 @@ xfs_trans_tail_ail( ...@@ -57,7 +57,7 @@ xfs_trans_tail_ail(
xfs_log_item_t *lip; xfs_log_item_t *lip;
spin_lock(&mp->m_ail_lock); spin_lock(&mp->m_ail_lock);
lip = xfs_ail_min(&mp->m_ail); lip = xfs_ail_min(mp->m_ail);
if (lip == NULL) { if (lip == NULL) {
lsn = (xfs_lsn_t)0; lsn = (xfs_lsn_t)0;
} else { } else {
...@@ -91,10 +91,10 @@ xfs_trans_push_ail( ...@@ -91,10 +91,10 @@ xfs_trans_push_ail(
{ {
xfs_log_item_t *lip; xfs_log_item_t *lip;
lip = xfs_ail_min(&mp->m_ail); lip = xfs_ail_min(mp->m_ail);
if (lip && !XFS_FORCED_SHUTDOWN(mp)) { if (lip && !XFS_FORCED_SHUTDOWN(mp)) {
if (XFS_LSN_CMP(threshold_lsn, mp->m_ail.xa_target) > 0) if (XFS_LSN_CMP(threshold_lsn, mp->m_ail->xa_target) > 0)
xfsaild_wakeup(mp, threshold_lsn); xfsaild_wakeup(mp->m_ail, threshold_lsn);
} }
} }
...@@ -111,12 +111,12 @@ xfs_trans_first_push_ail( ...@@ -111,12 +111,12 @@ xfs_trans_first_push_ail(
{ {
xfs_log_item_t *lip; xfs_log_item_t *lip;
lip = xfs_ail_min(&mp->m_ail); lip = xfs_ail_min(mp->m_ail);
*gen = (int)mp->m_ail.xa_gen; *gen = (int)mp->m_ail->xa_gen;
if (lsn == 0) if (lsn == 0)
return lip; return lip;
list_for_each_entry(lip, &mp->m_ail.xa_ail, li_ail) { list_for_each_entry(lip, &mp->m_ail->xa_ail, li_ail) {
if (XFS_LSN_CMP(lip->li_lsn, lsn) >= 0) if (XFS_LSN_CMP(lip->li_lsn, lsn) >= 0)
return lip; return lip;
} }
...@@ -129,17 +129,18 @@ xfs_trans_first_push_ail( ...@@ -129,17 +129,18 @@ xfs_trans_first_push_ail(
*/ */
long long
xfsaild_push( xfsaild_push(
xfs_mount_t *mp, struct xfs_ail *ailp,
xfs_lsn_t *last_lsn) xfs_lsn_t *last_lsn)
{ {
long tout = 1000; /* milliseconds */ long tout = 1000; /* milliseconds */
xfs_lsn_t last_pushed_lsn = *last_lsn; xfs_lsn_t last_pushed_lsn = *last_lsn;
xfs_lsn_t target = mp->m_ail.xa_target; xfs_lsn_t target = ailp->xa_target;
xfs_lsn_t lsn; xfs_lsn_t lsn;
xfs_log_item_t *lip; xfs_log_item_t *lip;
int gen; int gen;
int restarts; int restarts;
int flush_log, count, stuck; int flush_log, count, stuck;
xfs_mount_t *mp = ailp->xa_mount;
#define XFS_TRANS_PUSH_AIL_RESTARTS 10 #define XFS_TRANS_PUSH_AIL_RESTARTS 10
...@@ -331,7 +332,7 @@ xfs_trans_unlocked_item( ...@@ -331,7 +332,7 @@ xfs_trans_unlocked_item(
* the call to xfs_log_move_tail() doesn't do anything if there's * the call to xfs_log_move_tail() doesn't do anything if there's
* not enough free space to wake people up so we're safe calling it. * not enough free space to wake people up so we're safe calling it.
*/ */
min_lip = xfs_ail_min(&mp->m_ail); min_lip = xfs_ail_min(mp->m_ail);
if (min_lip == lip) if (min_lip == lip)
xfs_log_move_tail(mp, 1); xfs_log_move_tail(mp, 1);
...@@ -362,10 +363,10 @@ xfs_trans_update_ail( ...@@ -362,10 +363,10 @@ xfs_trans_update_ail(
xfs_log_item_t *dlip=NULL; xfs_log_item_t *dlip=NULL;
xfs_log_item_t *mlip; /* ptr to minimum lip */ xfs_log_item_t *mlip; /* ptr to minimum lip */
mlip = xfs_ail_min(&mp->m_ail); mlip = xfs_ail_min(mp->m_ail);
if (lip->li_flags & XFS_LI_IN_AIL) { if (lip->li_flags & XFS_LI_IN_AIL) {
dlip = xfs_ail_delete(&mp->m_ail, lip); dlip = xfs_ail_delete(mp->m_ail, lip);
ASSERT(dlip == lip); ASSERT(dlip == lip);
} else { } else {
lip->li_flags |= XFS_LI_IN_AIL; lip->li_flags |= XFS_LI_IN_AIL;
...@@ -373,11 +374,11 @@ xfs_trans_update_ail( ...@@ -373,11 +374,11 @@ xfs_trans_update_ail(
lip->li_lsn = lsn; lip->li_lsn = lsn;
xfs_ail_insert(&mp->m_ail, lip); xfs_ail_insert(mp->m_ail, lip);
mp->m_ail.xa_gen++; mp->m_ail->xa_gen++;
if (mlip == dlip) { if (mlip == dlip) {
mlip = xfs_ail_min(&mp->m_ail); mlip = xfs_ail_min(mp->m_ail);
spin_unlock(&mp->m_ail_lock); spin_unlock(&mp->m_ail_lock);
xfs_log_move_tail(mp, mlip->li_lsn); xfs_log_move_tail(mp, mlip->li_lsn);
} else { } else {
...@@ -411,17 +412,17 @@ xfs_trans_delete_ail( ...@@ -411,17 +412,17 @@ xfs_trans_delete_ail(
xfs_log_item_t *mlip; xfs_log_item_t *mlip;
if (lip->li_flags & XFS_LI_IN_AIL) { if (lip->li_flags & XFS_LI_IN_AIL) {
mlip = xfs_ail_min(&mp->m_ail); mlip = xfs_ail_min(mp->m_ail);
dlip = xfs_ail_delete(&mp->m_ail, lip); dlip = xfs_ail_delete(mp->m_ail, lip);
ASSERT(dlip == lip); ASSERT(dlip == lip);
lip->li_flags &= ~XFS_LI_IN_AIL; lip->li_flags &= ~XFS_LI_IN_AIL;
lip->li_lsn = 0; lip->li_lsn = 0;
mp->m_ail.xa_gen++; mp->m_ail->xa_gen++;
if (mlip == dlip) { if (mlip == dlip) {
mlip = xfs_ail_min(&mp->m_ail); mlip = xfs_ail_min(mp->m_ail);
spin_unlock(&mp->m_ail_lock); spin_unlock(&mp->m_ail_lock);
xfs_log_move_tail(mp, (mlip ? mlip->li_lsn : 0)); xfs_log_move_tail(mp, (mlip ? mlip->li_lsn : 0));
} else { } else {
...@@ -459,8 +460,8 @@ xfs_trans_first_ail( ...@@ -459,8 +460,8 @@ xfs_trans_first_ail(
{ {
xfs_log_item_t *lip; xfs_log_item_t *lip;
lip = xfs_ail_min(&mp->m_ail); lip = xfs_ail_min(mp->m_ail);
*gen = (int)mp->m_ail.xa_gen; *gen = (int)mp->m_ail->xa_gen;
return lip; return lip;
} }
...@@ -482,11 +483,11 @@ xfs_trans_next_ail( ...@@ -482,11 +483,11 @@ xfs_trans_next_ail(
xfs_log_item_t *nlip; xfs_log_item_t *nlip;
ASSERT(mp && lip && gen); ASSERT(mp && lip && gen);
if (mp->m_ail.xa_gen == *gen) { if (mp->m_ail->xa_gen == *gen) {
nlip = xfs_ail_next(&mp->m_ail, lip); nlip = xfs_ail_next(mp->m_ail, lip);
} else { } else {
nlip = xfs_ail_min(&mp->m_ail); nlip = xfs_ail_min(mp->m_ail);
*gen = (int)mp->m_ail.xa_gen; *gen = (int)mp->m_ail->xa_gen;
if (restarts != NULL) { if (restarts != NULL) {
XFS_STATS_INC(xs_push_ail_restarts); XFS_STATS_INC(xs_push_ail_restarts);
(*restarts)++; (*restarts)++;
...@@ -515,15 +516,25 @@ int ...@@ -515,15 +516,25 @@ int
xfs_trans_ail_init( xfs_trans_ail_init(
xfs_mount_t *mp) xfs_mount_t *mp)
{ {
INIT_LIST_HEAD(&mp->m_ail.xa_ail); struct xfs_ail *ailp;
return xfsaild_start(mp);
ailp = kmem_zalloc(sizeof(struct xfs_ail), KM_MAYFAIL);
if (!ailp)
return ENOMEM;
ailp->xa_mount = mp;
INIT_LIST_HEAD(&ailp->xa_ail);
return xfsaild_start(ailp);
} }
void void
xfs_trans_ail_destroy( xfs_trans_ail_destroy(
xfs_mount_t *mp) xfs_mount_t *mp)
{ {
xfsaild_stop(mp); struct xfs_ail *ailp = mp->m_ail;
xfsaild_stop(ailp);
kmem_free(ailp);
} }
/* /*
...@@ -534,7 +545,7 @@ xfs_trans_ail_destroy( ...@@ -534,7 +545,7 @@ xfs_trans_ail_destroy(
*/ */
STATIC void STATIC void
xfs_ail_insert( xfs_ail_insert(
xfs_ail_t *ailp, struct xfs_ail *ailp,
xfs_log_item_t *lip) xfs_log_item_t *lip)
/* ARGSUSED */ /* ARGSUSED */
{ {
...@@ -568,7 +579,7 @@ xfs_ail_insert( ...@@ -568,7 +579,7 @@ xfs_ail_insert(
/*ARGSUSED*/ /*ARGSUSED*/
STATIC xfs_log_item_t * STATIC xfs_log_item_t *
xfs_ail_delete( xfs_ail_delete(
xfs_ail_t *ailp, struct xfs_ail *ailp,
xfs_log_item_t *lip) xfs_log_item_t *lip)
/* ARGSUSED */ /* ARGSUSED */
{ {
...@@ -585,7 +596,7 @@ xfs_ail_delete( ...@@ -585,7 +596,7 @@ xfs_ail_delete(
*/ */
STATIC xfs_log_item_t * STATIC xfs_log_item_t *
xfs_ail_min( xfs_ail_min(
xfs_ail_t *ailp) struct xfs_ail *ailp)
/* ARGSUSED */ /* ARGSUSED */
{ {
if (list_empty(&ailp->xa_ail)) if (list_empty(&ailp->xa_ail))
...@@ -601,7 +612,7 @@ xfs_ail_min( ...@@ -601,7 +612,7 @@ xfs_ail_min(
*/ */
STATIC xfs_log_item_t * STATIC xfs_log_item_t *
xfs_ail_next( xfs_ail_next(
xfs_ail_t *ailp, struct xfs_ail *ailp,
xfs_log_item_t *lip) xfs_log_item_t *lip)
/* ARGSUSED */ /* ARGSUSED */
{ {
...@@ -617,7 +628,7 @@ xfs_ail_next( ...@@ -617,7 +628,7 @@ xfs_ail_next(
*/ */
STATIC void STATIC void
xfs_ail_check( xfs_ail_check(
xfs_ail_t *ailp, struct xfs_ail *ailp,
xfs_log_item_t *lip) xfs_log_item_t *lip)
{ {
xfs_log_item_t *prev_lip; xfs_log_item_t *prev_lip;
......
...@@ -56,13 +56,20 @@ struct xfs_log_item *xfs_trans_first_ail(struct xfs_mount *, int *); ...@@ -56,13 +56,20 @@ struct xfs_log_item *xfs_trans_first_ail(struct xfs_mount *, int *);
struct xfs_log_item *xfs_trans_next_ail(struct xfs_mount *, struct xfs_log_item *xfs_trans_next_ail(struct xfs_mount *,
struct xfs_log_item *, int *, int *); struct xfs_log_item *, int *, int *);
/* /*
* AIL push thread support * AIL push thread support
*/ */
long xfsaild_push(struct xfs_mount *, xfs_lsn_t *); struct xfs_ail {
void xfsaild_wakeup(struct xfs_mount *, xfs_lsn_t); struct xfs_mount *xa_mount;
int xfsaild_start(struct xfs_mount *); struct list_head xa_ail;
void xfsaild_stop(struct xfs_mount *); uint xa_gen;
struct task_struct *xa_task;
xfs_lsn_t xa_target;
};
long xfsaild_push(struct xfs_ail *, xfs_lsn_t *);
void xfsaild_wakeup(struct xfs_ail *, xfs_lsn_t);
int xfsaild_start(struct xfs_ail *);
void xfsaild_stop(struct xfs_ail *);
#endif /* __XFS_TRANS_PRIV_H__ */ #endif /* __XFS_TRANS_PRIV_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment