Commit 6f5de180 authored by Dave Chinner's avatar Dave Chinner Committed by Darrick J. Wong

xfs: use direct calls for dquot IO completion

Similar to inodes, we can call the dquot IO completion functions
directly from the buffer completion code, removing another user of
log item callbacks for IO completion processing.
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent aac855ab
...@@ -15,6 +15,9 @@ ...@@ -15,6 +15,9 @@
#include "xfs_buf_item.h" #include "xfs_buf_item.h"
#include "xfs_inode.h" #include "xfs_inode.h"
#include "xfs_inode_item.h" #include "xfs_inode_item.h"
#include "xfs_quota.h"
#include "xfs_dquot_item.h"
#include "xfs_dquot.h"
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
#include "xfs_trace.h" #include "xfs_trace.h"
#include "xfs_log.h" #include "xfs_log.h"
...@@ -1209,7 +1212,20 @@ void ...@@ -1209,7 +1212,20 @@ void
xfs_buf_dquot_iodone( xfs_buf_dquot_iodone(
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
xfs_buf_run_callbacks(bp); struct xfs_buf_log_item *blip = bp->b_log_item;
struct xfs_log_item *lip;
if (xfs_buf_had_callback_errors(bp))
return;
/* a newly allocated dquot buffer might have a log item attached */
if (blip) {
lip = &blip->bli_item;
lip->li_cb(bp, lip);
bp->b_log_item = NULL;
}
xfs_dquot_done(bp);
xfs_buf_ioend_finish(bp); xfs_buf_ioend_finish(bp);
} }
......
...@@ -1048,9 +1048,8 @@ xfs_qm_dqrele( ...@@ -1048,9 +1048,8 @@ xfs_qm_dqrele(
* from the AIL if it has not been re-logged, and unlocking the dquot's * from the AIL if it has not been re-logged, and unlocking the dquot's
* flush lock. This behavior is very similar to that of inodes.. * flush lock. This behavior is very similar to that of inodes..
*/ */
STATIC void static void
xfs_qm_dqflush_done( xfs_qm_dqflush_done(
struct xfs_buf *bp,
struct xfs_log_item *lip) struct xfs_log_item *lip)
{ {
struct xfs_dq_logitem *qip = (struct xfs_dq_logitem *)lip; struct xfs_dq_logitem *qip = (struct xfs_dq_logitem *)lip;
...@@ -1091,6 +1090,18 @@ xfs_qm_dqflush_done( ...@@ -1091,6 +1090,18 @@ xfs_qm_dqflush_done(
xfs_dqfunlock(dqp); xfs_dqfunlock(dqp);
} }
void
xfs_dquot_done(
struct xfs_buf *bp)
{
struct xfs_log_item *lip, *n;
list_for_each_entry_safe(lip, n, &bp->b_li_list, li_bio_list) {
list_del_init(&lip->li_bio_list);
xfs_qm_dqflush_done(lip);
}
}
/* /*
* Write a modified dquot to disk. * Write a modified dquot to disk.
* The dquot must be locked and the flush lock too taken by caller. * The dquot must be locked and the flush lock too taken by caller.
...@@ -1180,8 +1191,7 @@ xfs_qm_dqflush( ...@@ -1180,8 +1191,7 @@ xfs_qm_dqflush(
* AIL and release the flush lock once the dquot is synced to disk. * AIL and release the flush lock once the dquot is synced to disk.
*/ */
bp->b_flags |= _XBF_DQUOTS; bp->b_flags |= _XBF_DQUOTS;
xfs_buf_attach_iodone(bp, xfs_qm_dqflush_done, xfs_buf_attach_iodone(bp, NULL, &dqp->q_logitem.qli_item);
&dqp->q_logitem.qli_item);
/* /*
* If the buffer is pinned then push on the log so we won't * If the buffer is pinned then push on the log so we won't
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
*/ */
struct xfs_trans; struct xfs_trans;
struct xfs_buf;
/* /*
* This check is done typically without holding the inode lock; * This check is done typically without holding the inode lock;
...@@ -107,6 +108,8 @@ extern void xfs_qm_mount_quotas(struct xfs_mount *); ...@@ -107,6 +108,8 @@ 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 *);
extern void xfs_qm_unmount_quotas(struct xfs_mount *); extern void xfs_qm_unmount_quotas(struct xfs_mount *);
void xfs_dquot_done(struct xfs_buf *);
#else #else
static inline int static inline int
xfs_qm_vop_dqalloc(struct xfs_inode *ip, kuid_t kuid, kgid_t kgid, xfs_qm_vop_dqalloc(struct xfs_inode *ip, kuid_t kuid, kgid_t kgid,
...@@ -148,6 +151,12 @@ static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, ...@@ -148,6 +151,12 @@ static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp,
#define xfs_qm_mount_quotas(mp) #define xfs_qm_mount_quotas(mp)
#define xfs_qm_unmount(mp) #define xfs_qm_unmount(mp)
#define xfs_qm_unmount_quotas(mp) #define xfs_qm_unmount_quotas(mp)
static inline void xfs_dquot_done(struct xfs_buf *bp)
{
return;
}
#endif /* CONFIG_XFS_QUOTA */ #endif /* CONFIG_XFS_QUOTA */
#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ #define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \
......
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