Commit 29ad0de2 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs

* 'for-linus' of git://oss.sgi.com/xfs/xfs: (22 commits)
  xfs: mark the xfssyncd workqueue as non-reentrant
  xfs: simplify xfs_qm_detach_gdquots
  xfs: fix acl count validation in xfs_acl_from_disk()
  xfs: remove unused XBT_FORCE_SLEEP bit
  xfs: remove XFS_QMOPT_DQSUSER
  xfs: kill xfs_qm_idtodq
  xfs: merge xfs_qm_dqinit_core into the only caller
  xfs: add a xfs_dqhold helper
  xfs: simplify xfs_qm_dqattach_grouphint
  xfs: nest qm_dqfrlist_lock inside the dquot qlock
  xfs: flatten the dquot lock ordering
  xfs: implement lazy removal for the dquot freelist
  xfs: remove XFS_DQ_INACTIVE
  xfs: cleanup xfs_qm_dqlookup
  xfs: cleanup dquot locking helpers
  xfs: remove the sync_mode argument to xfs_qm_dqflush_all
  xfs: remove xfs_qm_sync
  xfs: make sure to really flush all dquots in xfs_qm_quotacheck
  xfs: untangle SYNC_WAIT and SYNC_TRYLOCK meanings for xfs_qm_dqflush
  xfs: remove the lid_size field in struct log_item_desc
  ...

Fix up trivial conflict in fs/xfs/xfs_sync.c
parents 972b2c71 40d344ec
...@@ -39,7 +39,7 @@ xfs_acl_from_disk(struct xfs_acl *aclp) ...@@ -39,7 +39,7 @@ xfs_acl_from_disk(struct xfs_acl *aclp)
struct posix_acl_entry *acl_e; struct posix_acl_entry *acl_e;
struct posix_acl *acl; struct posix_acl *acl;
struct xfs_acl_entry *ace; struct xfs_acl_entry *ace;
int count, i; unsigned int count, i;
count = be32_to_cpu(aclp->acl_cnt); count = be32_to_cpu(aclp->acl_cnt);
if (count > XFS_ACL_MAX_ENTRIES) if (count > XFS_ACL_MAX_ENTRIES)
......
...@@ -1701,12 +1701,8 @@ xfsbufd( ...@@ -1701,12 +1701,8 @@ xfsbufd(
struct list_head tmp; struct list_head tmp;
struct blk_plug plug; struct blk_plug plug;
if (unlikely(freezing(current))) { if (unlikely(freezing(current)))
set_bit(XBT_FORCE_SLEEP, &target->bt_flags);
refrigerator(); refrigerator();
} else {
clear_bit(XBT_FORCE_SLEEP, &target->bt_flags);
}
/* sleep for a long time if there is nothing to do. */ /* sleep for a long time if there is nothing to do. */
if (list_empty(&target->bt_delwri_queue)) if (list_empty(&target->bt_delwri_queue))
......
...@@ -90,8 +90,7 @@ typedef unsigned int xfs_buf_flags_t; ...@@ -90,8 +90,7 @@ typedef unsigned int xfs_buf_flags_t;
{ _XBF_DELWRI_Q, "DELWRI_Q" } { _XBF_DELWRI_Q, "DELWRI_Q" }
typedef enum { typedef enum {
XBT_FORCE_SLEEP = 0, XBT_FORCE_FLUSH = 0,
XBT_FORCE_FLUSH = 1,
} xfs_buftarg_flags_t; } xfs_buftarg_flags_t;
typedef struct xfs_buftarg { typedef struct xfs_buftarg {
......
This diff is collapsed.
...@@ -80,8 +80,6 @@ enum { ...@@ -80,8 +80,6 @@ enum {
XFS_QLOCK_NESTED, XFS_QLOCK_NESTED,
}; };
#define XFS_DQHOLD(dqp) ((dqp)->q_nrefs++)
/* /*
* Manage the q_flush completion queue embedded in the dquot. This completion * Manage the q_flush completion queue embedded in the dquot. This completion
* queue synchronizes processes attempting to flush the in-core dquot back to * queue synchronizes processes attempting to flush the in-core dquot back to
...@@ -102,6 +100,21 @@ static inline void xfs_dqfunlock(xfs_dquot_t *dqp) ...@@ -102,6 +100,21 @@ static inline void xfs_dqfunlock(xfs_dquot_t *dqp)
complete(&dqp->q_flush); complete(&dqp->q_flush);
} }
static inline int xfs_dqlock_nowait(struct xfs_dquot *dqp)
{
return mutex_trylock(&dqp->q_qlock);
}
static inline void xfs_dqlock(struct xfs_dquot *dqp)
{
mutex_lock(&dqp->q_qlock);
}
static inline void xfs_dqunlock_nonotify(struct xfs_dquot *dqp)
{
mutex_unlock(&dqp->q_qlock);
}
#define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock)))
#define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY)
#define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER)
...@@ -116,12 +129,12 @@ static inline void xfs_dqfunlock(xfs_dquot_t *dqp) ...@@ -116,12 +129,12 @@ static inline void xfs_dqfunlock(xfs_dquot_t *dqp)
(XFS_IS_UQUOTA_ON((d)->q_mount)) : \ (XFS_IS_UQUOTA_ON((d)->q_mount)) : \
(XFS_IS_OQUOTA_ON((d)->q_mount)))) (XFS_IS_OQUOTA_ON((d)->q_mount))))
extern int xfs_qm_dqread(struct xfs_mount *, xfs_dqid_t, uint,
uint, struct xfs_dquot **);
extern void xfs_qm_dqdestroy(xfs_dquot_t *); extern void xfs_qm_dqdestroy(xfs_dquot_t *);
extern int xfs_qm_dqflush(xfs_dquot_t *, uint); extern int xfs_qm_dqflush(xfs_dquot_t *, uint);
extern int xfs_qm_dqpurge(xfs_dquot_t *); extern void xfs_qm_dqpurge(xfs_dquot_t *);
extern void xfs_qm_dqunpin_wait(xfs_dquot_t *); extern void xfs_qm_dqunpin_wait(xfs_dquot_t *);
extern int xfs_qm_dqlock_nowait(xfs_dquot_t *);
extern void xfs_qm_dqflock_pushbuf_wait(xfs_dquot_t *dqp);
extern void xfs_qm_adjust_dqtimers(xfs_mount_t *, extern void xfs_qm_adjust_dqtimers(xfs_mount_t *,
xfs_disk_dquot_t *); xfs_disk_dquot_t *);
extern void xfs_qm_adjust_dqlimits(xfs_mount_t *, extern void xfs_qm_adjust_dqlimits(xfs_mount_t *,
...@@ -129,9 +142,17 @@ extern void xfs_qm_adjust_dqlimits(xfs_mount_t *, ...@@ -129,9 +142,17 @@ extern void xfs_qm_adjust_dqlimits(xfs_mount_t *,
extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *,
xfs_dqid_t, uint, uint, xfs_dquot_t **); xfs_dqid_t, uint, uint, xfs_dquot_t **);
extern void xfs_qm_dqput(xfs_dquot_t *); extern void xfs_qm_dqput(xfs_dquot_t *);
extern void xfs_dqlock(xfs_dquot_t *);
extern void xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *); extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *);
extern void xfs_dqunlock(xfs_dquot_t *); extern void xfs_dqunlock(struct xfs_dquot *);
extern void xfs_dqunlock_nonotify(xfs_dquot_t *); extern void xfs_dqflock_pushbuf_wait(struct xfs_dquot *dqp);
static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp)
{
xfs_dqlock(dqp);
dqp->q_nrefs++;
xfs_dqunlock(dqp);
return dqp;
}
#endif /* __XFS_DQUOT_H__ */ #endif /* __XFS_DQUOT_H__ */
...@@ -73,7 +73,6 @@ xfs_qm_dquot_logitem_format( ...@@ -73,7 +73,6 @@ xfs_qm_dquot_logitem_format(
logvec->i_len = sizeof(xfs_disk_dquot_t); logvec->i_len = sizeof(xfs_disk_dquot_t);
logvec->i_type = XLOG_REG_TYPE_DQUOT; logvec->i_type = XLOG_REG_TYPE_DQUOT;
ASSERT(2 == lip->li_desc->lid_size);
qlip->qli_format.qlf_size = 2; qlip->qli_format.qlf_size = 2;
} }
...@@ -134,7 +133,7 @@ xfs_qm_dquot_logitem_push( ...@@ -134,7 +133,7 @@ xfs_qm_dquot_logitem_push(
* lock without sleeping, then there must not have been * lock without sleeping, then there must not have been
* anyone in the process of flushing the dquot. * anyone in the process of flushing the dquot.
*/ */
error = xfs_qm_dqflush(dqp, 0); error = xfs_qm_dqflush(dqp, SYNC_TRYLOCK);
if (error) if (error)
xfs_warn(dqp->q_mount, "%s: push error %d on dqp %p", xfs_warn(dqp->q_mount, "%s: push error %d on dqp %p",
__func__, error, dqp); __func__, error, dqp);
...@@ -237,7 +236,7 @@ xfs_qm_dquot_logitem_trylock( ...@@ -237,7 +236,7 @@ xfs_qm_dquot_logitem_trylock(
if (atomic_read(&dqp->q_pincount) > 0) if (atomic_read(&dqp->q_pincount) > 0)
return XFS_ITEM_PINNED; return XFS_ITEM_PINNED;
if (!xfs_qm_dqlock_nowait(dqp)) if (!xfs_dqlock_nowait(dqp))
return XFS_ITEM_LOCKED; return XFS_ITEM_LOCKED;
if (!xfs_dqflock_nowait(dqp)) { if (!xfs_dqflock_nowait(dqp)) {
......
...@@ -437,7 +437,6 @@ xfs_inode_item_format( ...@@ -437,7 +437,6 @@ xfs_inode_item_format(
* Assert that no attribute-related log flags are set. * Assert that no attribute-related log flags are set.
*/ */
if (!XFS_IFORK_Q(ip)) { if (!XFS_IFORK_Q(ip)) {
ASSERT(nvecs == lip->li_desc->lid_size);
iip->ili_format.ilf_size = nvecs; iip->ili_format.ilf_size = nvecs;
ASSERT(!(iip->ili_format.ilf_fields & ASSERT(!(iip->ili_format.ilf_fields &
(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT))); (XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT)));
...@@ -521,7 +520,6 @@ xfs_inode_item_format( ...@@ -521,7 +520,6 @@ xfs_inode_item_format(
break; break;
} }
ASSERT(nvecs == lip->li_desc->lid_size);
iip->ili_format.ilf_size = nvecs; iip->ili_format.ilf_size = nvecs;
} }
......
...@@ -760,38 +760,6 @@ xfs_log_item_init( ...@@ -760,38 +760,6 @@ xfs_log_item_init(
INIT_LIST_HEAD(&item->li_cil); INIT_LIST_HEAD(&item->li_cil);
} }
/*
* Write region vectors to log. The write happens using the space reservation
* of the ticket (tic). It is not a requirement that all writes for a given
* transaction occur with one call to xfs_log_write(). However, it is important
* to note that the transaction reservation code makes an assumption about the
* number of log headers a transaction requires that may be violated if you
* don't pass all the transaction vectors in one call....
*/
int
xfs_log_write(
struct xfs_mount *mp,
struct xfs_log_iovec reg[],
int nentries,
struct xlog_ticket *tic,
xfs_lsn_t *start_lsn)
{
struct log *log = mp->m_log;
int error;
struct xfs_log_vec vec = {
.lv_niovecs = nentries,
.lv_iovecp = reg,
};
if (XLOG_FORCED_SHUTDOWN(log))
return XFS_ERROR(EIO);
error = xlog_write(log, &vec, tic, start_lsn, NULL, 0);
if (error)
xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR);
return error;
}
void void
xfs_log_move_tail(xfs_mount_t *mp, xfs_log_move_tail(xfs_mount_t *mp,
xfs_lsn_t tail_lsn) xfs_lsn_t tail_lsn)
...@@ -1685,7 +1653,7 @@ xlog_print_tic_res( ...@@ -1685,7 +1653,7 @@ xlog_print_tic_res(
}; };
xfs_warn(mp, xfs_warn(mp,
"xfs_log_write: reservation summary:\n" "xlog_write: reservation summary:\n"
" trans type = %s (%u)\n" " trans type = %s (%u)\n"
" unit res = %d bytes\n" " unit res = %d bytes\n"
" current res = %d bytes\n" " current res = %d bytes\n"
...@@ -1714,7 +1682,7 @@ xlog_print_tic_res( ...@@ -1714,7 +1682,7 @@ xlog_print_tic_res(
} }
xfs_alert_tag(mp, XFS_PTAG_LOGRES, xfs_alert_tag(mp, XFS_PTAG_LOGRES,
"xfs_log_write: reservation ran out. Need to up reservation"); "xlog_write: reservation ran out. Need to up reservation");
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
} }
...@@ -1968,23 +1936,21 @@ xlog_write( ...@@ -1968,23 +1936,21 @@ xlog_write(
*start_lsn = 0; *start_lsn = 0;
len = xlog_write_calc_vec_length(ticket, log_vector); len = xlog_write_calc_vec_length(ticket, log_vector);
if (log->l_cilp) {
/*
* Region headers and bytes are already accounted for.
* We only need to take into account start records and
* split regions in this function.
*/
if (ticket->t_flags & XLOG_TIC_INITED)
ticket->t_curr_res -= sizeof(xlog_op_header_t);
/* /*
* Commit record headers need to be accounted for. These * Region headers and bytes are already accounted for.
* come in as separate writes so are easy to detect. * We only need to take into account start records and
*/ * split regions in this function.
if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS)) */
ticket->t_curr_res -= sizeof(xlog_op_header_t); if (ticket->t_flags & XLOG_TIC_INITED)
} else ticket->t_curr_res -= sizeof(xlog_op_header_t);
ticket->t_curr_res -= len;
/*
* Commit record headers need to be accounted for. These
* come in as separate writes so are easy to detect.
*/
if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS))
ticket->t_curr_res -= sizeof(xlog_op_header_t);
if (ticket->t_curr_res < 0) if (ticket->t_curr_res < 0)
xlog_print_tic_res(log->l_mp, ticket); xlog_print_tic_res(log->l_mp, ticket);
...@@ -2931,8 +2897,7 @@ _xfs_log_force( ...@@ -2931,8 +2897,7 @@ _xfs_log_force(
XFS_STATS_INC(xs_log_force); XFS_STATS_INC(xs_log_force);
if (log->l_cilp) xlog_cil_force(log);
xlog_cil_force(log);
spin_lock(&log->l_icloglock); spin_lock(&log->l_icloglock);
...@@ -3081,11 +3046,9 @@ _xfs_log_force_lsn( ...@@ -3081,11 +3046,9 @@ _xfs_log_force_lsn(
XFS_STATS_INC(xs_log_force); XFS_STATS_INC(xs_log_force);
if (log->l_cilp) { lsn = xlog_cil_force_lsn(log, lsn);
lsn = xlog_cil_force_lsn(log, lsn); if (lsn == NULLCOMMITLSN)
if (lsn == NULLCOMMITLSN) return 0;
return 0;
}
try_again: try_again:
spin_lock(&log->l_icloglock); spin_lock(&log->l_icloglock);
...@@ -3653,7 +3616,7 @@ xfs_log_force_umount( ...@@ -3653,7 +3616,7 @@ xfs_log_force_umount(
* completed transactions are flushed to disk with the xfs_log_force() * completed transactions are flushed to disk with the xfs_log_force()
* call below. * call below.
*/ */
if (!logerror && (mp->m_flags & XFS_MOUNT_DELAYLOG)) if (!logerror)
xlog_cil_force(log); xlog_cil_force(log);
/* /*
......
...@@ -174,11 +174,6 @@ int xfs_log_reserve(struct xfs_mount *mp, ...@@ -174,11 +174,6 @@ int xfs_log_reserve(struct xfs_mount *mp,
__uint8_t clientid, __uint8_t clientid,
uint flags, uint flags,
uint t_type); uint t_type);
int xfs_log_write(struct xfs_mount *mp,
xfs_log_iovec_t region[],
int nentries,
struct xlog_ticket *ticket,
xfs_lsn_t *start_lsn);
int xfs_log_unmount_write(struct xfs_mount *mp); int xfs_log_unmount_write(struct xfs_mount *mp);
void xfs_log_unmount(struct xfs_mount *mp); void xfs_log_unmount(struct xfs_mount *mp);
int xfs_log_force_umount(struct xfs_mount *mp, int logerror); int xfs_log_force_umount(struct xfs_mount *mp, int logerror);
...@@ -189,8 +184,7 @@ void xlog_iodone(struct xfs_buf *); ...@@ -189,8 +184,7 @@ void xlog_iodone(struct xfs_buf *);
struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
void xfs_log_ticket_put(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket);
void xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp,
struct xfs_log_vec *log_vector,
xfs_lsn_t *commit_lsn, int flags); xfs_lsn_t *commit_lsn, int flags);
bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip);
......
...@@ -32,10 +32,7 @@ ...@@ -32,10 +32,7 @@
#include "xfs_discard.h" #include "xfs_discard.h"
/* /*
* Perform initial CIL structure initialisation. If the CIL is not * Perform initial CIL structure initialisation.
* enabled in this filesystem, ensure the log->l_cilp is null so
* we can check this conditional to determine if we are doing delayed
* logging or not.
*/ */
int int
xlog_cil_init( xlog_cil_init(
...@@ -44,10 +41,6 @@ xlog_cil_init( ...@@ -44,10 +41,6 @@ xlog_cil_init(
struct xfs_cil *cil; struct xfs_cil *cil;
struct xfs_cil_ctx *ctx; struct xfs_cil_ctx *ctx;
log->l_cilp = NULL;
if (!(log->l_mp->m_flags & XFS_MOUNT_DELAYLOG))
return 0;
cil = kmem_zalloc(sizeof(*cil), KM_SLEEP|KM_MAYFAIL); cil = kmem_zalloc(sizeof(*cil), KM_SLEEP|KM_MAYFAIL);
if (!cil) if (!cil)
return ENOMEM; return ENOMEM;
...@@ -80,9 +73,6 @@ void ...@@ -80,9 +73,6 @@ void
xlog_cil_destroy( xlog_cil_destroy(
struct log *log) struct log *log)
{ {
if (!log->l_cilp)
return;
if (log->l_cilp->xc_ctx) { if (log->l_cilp->xc_ctx) {
if (log->l_cilp->xc_ctx->ticket) if (log->l_cilp->xc_ctx->ticket)
xfs_log_ticket_put(log->l_cilp->xc_ctx->ticket); xfs_log_ticket_put(log->l_cilp->xc_ctx->ticket);
...@@ -137,9 +127,6 @@ void ...@@ -137,9 +127,6 @@ void
xlog_cil_init_post_recovery( xlog_cil_init_post_recovery(
struct log *log) struct log *log)
{ {
if (!log->l_cilp)
return;
log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log); log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log);
log->l_cilp->xc_ctx->sequence = 1; log->l_cilp->xc_ctx->sequence = 1;
log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle, log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle,
...@@ -172,37 +159,73 @@ xlog_cil_init_post_recovery( ...@@ -172,37 +159,73 @@ xlog_cil_init_post_recovery(
* format the regions into the iclog as though they are being formatted * format the regions into the iclog as though they are being formatted
* directly out of the objects themselves. * directly out of the objects themselves.
*/ */
static void static struct xfs_log_vec *
xlog_cil_format_items( xlog_cil_prepare_log_vecs(
struct log *log, struct xfs_trans *tp)
struct xfs_log_vec *log_vector)
{ {
struct xfs_log_vec *lv; struct xfs_log_item_desc *lidp;
struct xfs_log_vec *lv = NULL;
struct xfs_log_vec *ret_lv = NULL;
ASSERT(log_vector);
for (lv = log_vector; lv; lv = lv->lv_next) { /* Bail out if we didn't find a log item. */
if (list_empty(&tp->t_items)) {
ASSERT(0);
return NULL;
}
list_for_each_entry(lidp, &tp->t_items, lid_trans) {
struct xfs_log_vec *new_lv;
void *ptr; void *ptr;
int index; int index;
int len = 0; int len = 0;
uint niovecs;
/* Skip items which aren't dirty in this transaction. */
if (!(lidp->lid_flags & XFS_LID_DIRTY))
continue;
/* Skip items that do not have any vectors for writing */
niovecs = IOP_SIZE(lidp->lid_item);
if (!niovecs)
continue;
new_lv = kmem_zalloc(sizeof(*new_lv) +
niovecs * sizeof(struct xfs_log_iovec),
KM_SLEEP);
/* The allocated iovec region lies beyond the log vector. */
new_lv->lv_iovecp = (struct xfs_log_iovec *)&new_lv[1];
new_lv->lv_niovecs = niovecs;
new_lv->lv_item = lidp->lid_item;
/* build the vector array and calculate it's length */ /* build the vector array and calculate it's length */
IOP_FORMAT(lv->lv_item, lv->lv_iovecp); IOP_FORMAT(new_lv->lv_item, new_lv->lv_iovecp);
for (index = 0; index < lv->lv_niovecs; index++) for (index = 0; index < new_lv->lv_niovecs; index++)
len += lv->lv_iovecp[index].i_len; len += new_lv->lv_iovecp[index].i_len;
lv->lv_buf_len = len; new_lv->lv_buf_len = len;
lv->lv_buf = kmem_alloc(lv->lv_buf_len, KM_SLEEP|KM_NOFS); new_lv->lv_buf = kmem_alloc(new_lv->lv_buf_len,
ptr = lv->lv_buf; KM_SLEEP|KM_NOFS);
ptr = new_lv->lv_buf;
for (index = 0; index < lv->lv_niovecs; index++) { for (index = 0; index < new_lv->lv_niovecs; index++) {
struct xfs_log_iovec *vec = &lv->lv_iovecp[index]; struct xfs_log_iovec *vec = &new_lv->lv_iovecp[index];
memcpy(ptr, vec->i_addr, vec->i_len); memcpy(ptr, vec->i_addr, vec->i_len);
vec->i_addr = ptr; vec->i_addr = ptr;
ptr += vec->i_len; ptr += vec->i_len;
} }
ASSERT(ptr == lv->lv_buf + lv->lv_buf_len); ASSERT(ptr == new_lv->lv_buf + new_lv->lv_buf_len);
if (!ret_lv)
ret_lv = new_lv;
else
lv->lv_next = new_lv;
lv = new_lv;
} }
return ret_lv;
} }
/* /*
...@@ -635,28 +658,30 @@ xlog_cil_push( ...@@ -635,28 +658,30 @@ xlog_cil_push(
* background commit, returns without it held once background commits are * background commit, returns without it held once background commits are
* allowed again. * allowed again.
*/ */
void int
xfs_log_commit_cil( xfs_log_commit_cil(
struct xfs_mount *mp, struct xfs_mount *mp,
struct xfs_trans *tp, struct xfs_trans *tp,
struct xfs_log_vec *log_vector,
xfs_lsn_t *commit_lsn, xfs_lsn_t *commit_lsn,
int flags) int flags)
{ {
struct log *log = mp->m_log; struct log *log = mp->m_log;
int log_flags = 0; int log_flags = 0;
int push = 0; int push = 0;
struct xfs_log_vec *log_vector;
if (flags & XFS_TRANS_RELEASE_LOG_RES) if (flags & XFS_TRANS_RELEASE_LOG_RES)
log_flags = XFS_LOG_REL_PERM_RESERV; log_flags = XFS_LOG_REL_PERM_RESERV;
/* /*
* do all the hard work of formatting items (including memory * Do all the hard work of formatting items (including memory
* allocation) outside the CIL context lock. This prevents stalling CIL * allocation) outside the CIL context lock. This prevents stalling CIL
* pushes when we are low on memory and a transaction commit spends a * pushes when we are low on memory and a transaction commit spends a
* lot of time in memory reclaim. * lot of time in memory reclaim.
*/ */
xlog_cil_format_items(log, log_vector); log_vector = xlog_cil_prepare_log_vecs(tp);
if (!log_vector)
return ENOMEM;
/* lock out background commit */ /* lock out background commit */
down_read(&log->l_cilp->xc_ctx_lock); down_read(&log->l_cilp->xc_ctx_lock);
...@@ -709,6 +734,7 @@ xfs_log_commit_cil( ...@@ -709,6 +734,7 @@ xfs_log_commit_cil(
*/ */
if (push) if (push)
xlog_cil_push(log, 0); xlog_cil_push(log, 0);
return 0;
} }
/* /*
...@@ -786,8 +812,6 @@ xfs_log_item_in_current_chkpt( ...@@ -786,8 +812,6 @@ xfs_log_item_in_current_chkpt(
{ {
struct xfs_cil_ctx *ctx; struct xfs_cil_ctx *ctx;
if (!(lip->li_mountp->m_flags & XFS_MOUNT_DELAYLOG))
return false;
if (list_empty(&lip->li_cil)) if (list_empty(&lip->li_cil))
return false; return false;
......
...@@ -219,7 +219,6 @@ typedef struct xfs_mount { ...@@ -219,7 +219,6 @@ typedef struct xfs_mount {
#define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops
must be synchronous except must be synchronous except
for space allocations */ for space allocations */
#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */
#define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_WAS_CLEAN (1ULL << 3)
#define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem
operations, typically for operations, typically for
......
This diff is collapsed.
...@@ -32,12 +32,6 @@ extern struct xfs_qm *xfs_Gqm; ...@@ -32,12 +32,6 @@ extern struct xfs_qm *xfs_Gqm;
extern kmem_zone_t *qm_dqzone; extern kmem_zone_t *qm_dqzone;
extern kmem_zone_t *qm_dqtrxzone; extern kmem_zone_t *qm_dqtrxzone;
/*
* Used in xfs_qm_sync called by xfs_sync to count the max times that it can
* iterate over the mountpt's dquot list in one call.
*/
#define XFS_QM_SYNC_MAX_RESTARTS 7
/* /*
* Ditto, for xfs_qm_dqreclaim_one. * Ditto, for xfs_qm_dqreclaim_one.
*/ */
......
...@@ -87,8 +87,7 @@ typedef struct xfs_dqblk { ...@@ -87,8 +87,7 @@ typedef struct xfs_dqblk {
#define XFS_DQ_PROJ 0x0002 /* project quota */ #define XFS_DQ_PROJ 0x0002 /* project quota */
#define XFS_DQ_GROUP 0x0004 /* a group quota */ #define XFS_DQ_GROUP 0x0004 /* a group quota */
#define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ #define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */
#define XFS_DQ_WANT 0x0010 /* for lookup/reclaim race */ #define XFS_DQ_FREEING 0x0010 /* dquot is beeing torn down */
#define XFS_DQ_INACTIVE 0x0020 /* dq off mplist & hashlist */
#define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP)
...@@ -97,8 +96,7 @@ typedef struct xfs_dqblk { ...@@ -97,8 +96,7 @@ typedef struct xfs_dqblk {
{ XFS_DQ_PROJ, "PROJ" }, \ { XFS_DQ_PROJ, "PROJ" }, \
{ XFS_DQ_GROUP, "GROUP" }, \ { XFS_DQ_GROUP, "GROUP" }, \
{ XFS_DQ_DIRTY, "DIRTY" }, \ { XFS_DQ_DIRTY, "DIRTY" }, \
{ XFS_DQ_WANT, "WANT" }, \ { XFS_DQ_FREEING, "FREEING" }
{ XFS_DQ_INACTIVE, "INACTIVE" }
/* /*
* In the worst case, when both user and group quotas are on, * In the worst case, when both user and group quotas are on,
...@@ -199,7 +197,6 @@ typedef struct xfs_qoff_logformat { ...@@ -199,7 +197,6 @@ typedef struct xfs_qoff_logformat {
#define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ #define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */
#define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ #define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */
#define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ #define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */
#define XFS_QMOPT_DQSUSER 0x0000020 /* don't cache super users dquot */
#define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */
#define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */ #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */
#define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */
...@@ -326,7 +323,6 @@ extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint); ...@@ -326,7 +323,6 @@ extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint);
extern void xfs_qm_dqdetach(struct xfs_inode *); extern void xfs_qm_dqdetach(struct xfs_inode *);
extern void xfs_qm_dqrele(struct xfs_dquot *); extern void xfs_qm_dqrele(struct xfs_dquot *);
extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
extern int xfs_qm_sync(struct xfs_mount *, int);
extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
extern void xfs_qm_mount_quotas(struct xfs_mount *); extern void xfs_qm_mount_quotas(struct xfs_mount *);
extern void xfs_qm_unmount(struct xfs_mount *); extern void xfs_qm_unmount(struct xfs_mount *);
...@@ -366,10 +362,6 @@ static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, ...@@ -366,10 +362,6 @@ static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp,
#define xfs_qm_dqdetach(ip) #define xfs_qm_dqdetach(ip)
#define xfs_qm_dqrele(d) #define xfs_qm_dqrele(d)
#define xfs_qm_statvfs(ip, s) #define xfs_qm_statvfs(ip, s)
static inline int xfs_qm_sync(struct xfs_mount *mp, int flags)
{
return 0;
}
#define xfs_qm_newmount(mp, a, b) (0) #define xfs_qm_newmount(mp, a, b) (0)
#define xfs_qm_mount_quotas(mp) #define xfs_qm_mount_quotas(mp)
#define xfs_qm_unmount(mp) #define xfs_qm_unmount(mp)
......
...@@ -199,7 +199,6 @@ xfs_parseargs( ...@@ -199,7 +199,6 @@ xfs_parseargs(
mp->m_flags |= XFS_MOUNT_BARRIER; mp->m_flags |= XFS_MOUNT_BARRIER;
mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE;
mp->m_flags |= XFS_MOUNT_SMALL_INUMS; mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
mp->m_flags |= XFS_MOUNT_DELAYLOG;
/* /*
* These can be overridden by the mount option parsing. * These can be overridden by the mount option parsing.
...@@ -353,11 +352,11 @@ xfs_parseargs( ...@@ -353,11 +352,11 @@ xfs_parseargs(
mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE);
mp->m_qflags &= ~XFS_OQUOTA_ENFD; mp->m_qflags &= ~XFS_OQUOTA_ENFD;
} else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) {
mp->m_flags |= XFS_MOUNT_DELAYLOG; xfs_warn(mp,
"delaylog is the default now, option is deprecated.");
} else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) {
mp->m_flags &= ~XFS_MOUNT_DELAYLOG;
xfs_warn(mp, xfs_warn(mp,
"nodelaylog is deprecated and will be removed in Linux 3.3"); "nodelaylog support has been removed, option is deprecated.");
} else if (!strcmp(this_char, MNTOPT_DISCARD)) { } else if (!strcmp(this_char, MNTOPT_DISCARD)) {
mp->m_flags |= XFS_MOUNT_DISCARD; mp->m_flags |= XFS_MOUNT_DISCARD;
} else if (!strcmp(this_char, MNTOPT_NODISCARD)) { } else if (!strcmp(this_char, MNTOPT_NODISCARD)) {
...@@ -395,13 +394,6 @@ xfs_parseargs( ...@@ -395,13 +394,6 @@ xfs_parseargs(
return EINVAL; return EINVAL;
} }
if ((mp->m_flags & XFS_MOUNT_DISCARD) &&
!(mp->m_flags & XFS_MOUNT_DELAYLOG)) {
xfs_warn(mp,
"the discard option is incompatible with the nodelaylog option");
return EINVAL;
}
#ifndef CONFIG_XFS_QUOTA #ifndef CONFIG_XFS_QUOTA
if (XFS_IS_QUOTA_RUNNING(mp)) { if (XFS_IS_QUOTA_RUNNING(mp)) {
xfs_warn(mp, "quota support not available in this kernel."); xfs_warn(mp, "quota support not available in this kernel.");
...@@ -501,7 +493,6 @@ xfs_showargs( ...@@ -501,7 +493,6 @@ xfs_showargs(
{ XFS_MOUNT_ATTR2, "," MNTOPT_ATTR2 }, { XFS_MOUNT_ATTR2, "," MNTOPT_ATTR2 },
{ XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM },
{ XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID },
{ XFS_MOUNT_DELAYLOG, "," MNTOPT_DELAYLOG },
{ XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD }, { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD },
{ 0, NULL } { 0, NULL }
}; };
...@@ -1014,17 +1005,10 @@ xfs_fs_sync_fs( ...@@ -1014,17 +1005,10 @@ xfs_fs_sync_fs(
int error; int error;
/* /*
* Not much we can do for the first async pass. Writing out the * Doing anything during the async pass would be counterproductive.
* superblock would be counter-productive as we are going to redirty
* when writing out other data and metadata (and writing out a single
* block is quite fast anyway).
*
* Try to asynchronously kick off quota syncing at least.
*/ */
if (!wait) { if (!wait)
xfs_qm_sync(mp, SYNC_TRYLOCK);
return 0; return 0;
}
error = xfs_quiesce_data(mp); error = xfs_quiesce_data(mp);
if (error) if (error)
...@@ -1621,12 +1605,12 @@ STATIC int __init ...@@ -1621,12 +1605,12 @@ STATIC int __init
xfs_init_workqueues(void) xfs_init_workqueues(void)
{ {
/* /*
* max_active is set to 8 to give enough concurency to allow * We never want to the same work item to run twice, reclaiming inodes
* multiple work operations on each CPU to run. This allows multiple * or idling the log is not going to get any faster by multiple CPUs
* filesystems to be running sync work concurrently, and scales with * competing for ressources. Use the default large max_active value
* the number of CPUs in the system. * so that even lots of filesystems can perform these task in parallel.
*/ */
xfs_syncd_wq = alloc_workqueue("xfssyncd", WQ_CPU_INTENSIVE, 8); xfs_syncd_wq = alloc_workqueue("xfssyncd", WQ_NON_REENTRANT, 0);
if (!xfs_syncd_wq) if (!xfs_syncd_wq)
return -ENOMEM; return -ENOMEM;
return 0; return 0;
......
...@@ -395,10 +395,7 @@ xfs_quiesce_data( ...@@ -395,10 +395,7 @@ xfs_quiesce_data(
*/ */
xfs_inode_ag_iterator(mp, xfs_log_dirty_inode, 0); xfs_inode_ag_iterator(mp, xfs_log_dirty_inode, 0);
xfs_qm_sync(mp, SYNC_TRYLOCK); /* force out the log */
xfs_qm_sync(mp, SYNC_WAIT);
/* force out the newly dirtied log buffers */
xfs_log_force(mp, XFS_LOG_SYNC); xfs_log_force(mp, XFS_LOG_SYNC);
/* write superblock and hoover up shutdown errors */ /* write superblock and hoover up shutdown errors */
...@@ -506,7 +503,6 @@ xfs_sync_worker( ...@@ -506,7 +503,6 @@ xfs_sync_worker(
error = xfs_fs_log_dummy(mp); error = xfs_fs_log_dummy(mp);
else else
xfs_log_force(mp, 0); xfs_log_force(mp, 0);
error = xfs_qm_sync(mp, SYNC_TRYLOCK);
/* start pushing all the metadata that is currently dirty */ /* start pushing all the metadata that is currently dirty */
xfs_ail_push_all(mp->m_ail); xfs_ail_push_all(mp->m_ail);
......
...@@ -743,8 +743,6 @@ DEFINE_DQUOT_EVENT(xfs_dqtobp_read); ...@@ -743,8 +743,6 @@ DEFINE_DQUOT_EVENT(xfs_dqtobp_read);
DEFINE_DQUOT_EVENT(xfs_dqread); DEFINE_DQUOT_EVENT(xfs_dqread);
DEFINE_DQUOT_EVENT(xfs_dqread_fail); DEFINE_DQUOT_EVENT(xfs_dqread_fail);
DEFINE_DQUOT_EVENT(xfs_dqlookup_found); DEFINE_DQUOT_EVENT(xfs_dqlookup_found);
DEFINE_DQUOT_EVENT(xfs_dqlookup_want);
DEFINE_DQUOT_EVENT(xfs_dqlookup_freelist);
DEFINE_DQUOT_EVENT(xfs_dqlookup_done); DEFINE_DQUOT_EVENT(xfs_dqlookup_done);
DEFINE_DQUOT_EVENT(xfs_dqget_hit); DEFINE_DQUOT_EVENT(xfs_dqget_hit);
DEFINE_DQUOT_EVENT(xfs_dqget_miss); DEFINE_DQUOT_EVENT(xfs_dqget_miss);
......
This diff is collapsed.
...@@ -163,9 +163,8 @@ typedef struct xfs_trans_header { ...@@ -163,9 +163,8 @@ typedef struct xfs_trans_header {
*/ */
struct xfs_log_item_desc { struct xfs_log_item_desc {
struct xfs_log_item *lid_item; struct xfs_log_item *lid_item;
ushort lid_size;
unsigned char lid_flags;
struct list_head lid_trans; struct list_head lid_trans;
unsigned char lid_flags;
}; };
#define XFS_LID_DIRTY 0x1 #define XFS_LID_DIRTY 0x1
......
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