mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-24 13:13:57 +08:00
xfs: refactor unmount record write
Refactor the writing of the unmount record into a separate helper. No functionality changes. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
2e9e6481e2
commit
53235f2215
@ -77,6 +77,19 @@ static inline uint xlog_get_cycle(char *ptr)
|
||||
|
||||
#define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */
|
||||
|
||||
/*
|
||||
* Log item for unmount records.
|
||||
*
|
||||
* The unmount record used to have a string "Unmount filesystem--" in the
|
||||
* data section where the "Un" was really a magic number (XLOG_UNMOUNT_TYPE).
|
||||
* We just write the magic number now; see xfs_log_unmount_write.
|
||||
*/
|
||||
struct xfs_unmount_log_format {
|
||||
uint16_t magic; /* XLOG_UNMOUNT_TYPE */
|
||||
uint16_t pad1;
|
||||
uint32_t pad2; /* may as well make it 64 bits */
|
||||
};
|
||||
|
||||
/* Region types for iovec's i_type */
|
||||
#define XLOG_REG_TYPE_BFORMAT 1
|
||||
#define XLOG_REG_TYPE_BCHUNK 2
|
||||
|
131
fs/xfs/xfs_log.c
131
fs/xfs/xfs_log.c
@ -826,6 +826,74 @@ xfs_log_mount_cancel(
|
||||
* deallocation must not be done until source-end.
|
||||
*/
|
||||
|
||||
/* Actually write the unmount record to disk. */
|
||||
static void
|
||||
xfs_log_write_unmount_record(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
/* the data section must be 32 bit size aligned */
|
||||
struct xfs_unmount_log_format magic = {
|
||||
.magic = XLOG_UNMOUNT_TYPE,
|
||||
};
|
||||
struct xfs_log_iovec reg = {
|
||||
.i_addr = &magic,
|
||||
.i_len = sizeof(magic),
|
||||
.i_type = XLOG_REG_TYPE_UNMOUNT,
|
||||
};
|
||||
struct xfs_log_vec vec = {
|
||||
.lv_niovecs = 1,
|
||||
.lv_iovecp = ®,
|
||||
};
|
||||
struct xlog *log = mp->m_log;
|
||||
struct xlog_in_core *iclog;
|
||||
struct xlog_ticket *tic = NULL;
|
||||
xfs_lsn_t lsn;
|
||||
int error;
|
||||
|
||||
error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0);
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
/* remove inited flag, and account for space used */
|
||||
tic->t_flags = 0;
|
||||
tic->t_curr_res -= sizeof(magic);
|
||||
error = xlog_write(log, &vec, tic, &lsn, NULL, XLOG_UNMOUNT_TRANS);
|
||||
/*
|
||||
* At this point, we're umounting anyway, so there's no point in
|
||||
* transitioning log state to IOERROR. Just continue...
|
||||
*/
|
||||
out_err:
|
||||
if (error)
|
||||
xfs_alert(mp, "%s: unmount record failed", __func__);
|
||||
|
||||
spin_lock(&log->l_icloglock);
|
||||
iclog = log->l_iclog;
|
||||
atomic_inc(&iclog->ic_refcnt);
|
||||
xlog_state_want_sync(log, iclog);
|
||||
spin_unlock(&log->l_icloglock);
|
||||
error = xlog_state_release_iclog(log, iclog);
|
||||
|
||||
spin_lock(&log->l_icloglock);
|
||||
switch (iclog->ic_state) {
|
||||
default:
|
||||
if (!XLOG_FORCED_SHUTDOWN(log)) {
|
||||
xlog_wait(&iclog->ic_force_wait, &log->l_icloglock);
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case XLOG_STATE_ACTIVE:
|
||||
case XLOG_STATE_DIRTY:
|
||||
spin_unlock(&log->l_icloglock);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tic) {
|
||||
trace_xfs_log_umount_write(log, tic);
|
||||
xlog_ungrant_log_space(log, tic);
|
||||
xfs_log_ticket_put(tic);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Unmount record used to have a string "Unmount filesystem--" in the
|
||||
* data section where the "Un" was really a magic number (XLOG_UNMOUNT_TYPE).
|
||||
@ -842,8 +910,6 @@ xfs_log_unmount_write(xfs_mount_t *mp)
|
||||
#ifdef DEBUG
|
||||
xlog_in_core_t *first_iclog;
|
||||
#endif
|
||||
xlog_ticket_t *tic = NULL;
|
||||
xfs_lsn_t lsn;
|
||||
int error;
|
||||
|
||||
/*
|
||||
@ -870,66 +936,7 @@ xfs_log_unmount_write(xfs_mount_t *mp)
|
||||
} while (iclog != first_iclog);
|
||||
#endif
|
||||
if (! (XLOG_FORCED_SHUTDOWN(log))) {
|
||||
error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0);
|
||||
if (!error) {
|
||||
/* the data section must be 32 bit size aligned */
|
||||
struct {
|
||||
uint16_t magic;
|
||||
uint16_t pad1;
|
||||
uint32_t pad2; /* may as well make it 64 bits */
|
||||
} magic = {
|
||||
.magic = XLOG_UNMOUNT_TYPE,
|
||||
};
|
||||
struct xfs_log_iovec reg = {
|
||||
.i_addr = &magic,
|
||||
.i_len = sizeof(magic),
|
||||
.i_type = XLOG_REG_TYPE_UNMOUNT,
|
||||
};
|
||||
struct xfs_log_vec vec = {
|
||||
.lv_niovecs = 1,
|
||||
.lv_iovecp = ®,
|
||||
};
|
||||
|
||||
/* remove inited flag, and account for space used */
|
||||
tic->t_flags = 0;
|
||||
tic->t_curr_res -= sizeof(magic);
|
||||
error = xlog_write(log, &vec, tic, &lsn,
|
||||
NULL, XLOG_UNMOUNT_TRANS);
|
||||
/*
|
||||
* At this point, we're umounting anyway,
|
||||
* so there's no point in transitioning log state
|
||||
* to IOERROR. Just continue...
|
||||
*/
|
||||
}
|
||||
|
||||
if (error)
|
||||
xfs_alert(mp, "%s: unmount record failed", __func__);
|
||||
|
||||
|
||||
spin_lock(&log->l_icloglock);
|
||||
iclog = log->l_iclog;
|
||||
atomic_inc(&iclog->ic_refcnt);
|
||||
xlog_state_want_sync(log, iclog);
|
||||
spin_unlock(&log->l_icloglock);
|
||||
error = xlog_state_release_iclog(log, iclog);
|
||||
|
||||
spin_lock(&log->l_icloglock);
|
||||
if (!(iclog->ic_state == XLOG_STATE_ACTIVE ||
|
||||
iclog->ic_state == XLOG_STATE_DIRTY)) {
|
||||
if (!XLOG_FORCED_SHUTDOWN(log)) {
|
||||
xlog_wait(&iclog->ic_force_wait,
|
||||
&log->l_icloglock);
|
||||
} else {
|
||||
spin_unlock(&log->l_icloglock);
|
||||
}
|
||||
} else {
|
||||
spin_unlock(&log->l_icloglock);
|
||||
}
|
||||
if (tic) {
|
||||
trace_xfs_log_umount_write(log, tic);
|
||||
xlog_ungrant_log_space(log, tic);
|
||||
xfs_log_ticket_put(tic);
|
||||
}
|
||||
xfs_log_write_unmount_record(mp);
|
||||
} else {
|
||||
/*
|
||||
* We're already in forced_shutdown mode, couldn't
|
||||
|
Loading…
Reference in New Issue
Block a user