aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-07-20 03:51:16 -0400
committerAlex Elder <aelder@sgi.com>2010-07-26 14:16:52 -0400
commit939d723b721eef71060201738653a73443ff4510 (patch)
tree3965391cebe9f1e0c1acb0b394c50c1b83312aa3
parenta64afb057b607c04383ab5fb53c51421ba18c434 (diff)
xfs: kill the b_strat callback in xfs_buf
The b_strat callback is used by xfs_buf_iostrategy to perform additional checks before submitting a buffer. It is used in xfs_bwrite and when writing out delayed buffers. In xfs_bwrite it we can de-virtualize the call easily as b_strat is set a few lines above the call to xfs_buf_iostrategy. For the delayed buffers the rationale is a bit more complicated: - there are three callers of xfs_buf_delwri_queue, which places buffers on the delwri list: (1) xfs_bdwrite - this sets up b_strat, so it's fine (2) xfs_buf_iorequest. None of the callers can have XBF_DELWRI set: - xlog_bdstrat is only used for log buffers, which are never delwri - _xfs_buf_read explicitly clears the delwri flag - xfs_buf_iodone_work retries log buffers only - xfsbdstrat - only used for reads, superblock writes without the delwri flag, log I/O and file zeroing with explicitly allocated buffers. - xfs_buf_iostrategy - only calls xfs_buf_iorequest if b_strat is not set (3) xfs_buf_unlock - only puts the buffer on the delwri list if the DELWRI flag is already set. The DELWRI flag is only ever set in xfs_bwrite, xfs_buf_iodone_callbacks, or xfs_trans_log_buf. For xfs_buf_iodone_callbacks and xfs_trans_log_buf we require an initialized buf item, which means b_strat was set to xfs_bdstrat_cb in xfs_buf_item_init. Conclusion: we can just get rid of the callback and replace it with explicit calls to xfs_bdstrat_cb. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.c10
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.h8
-rw-r--r--fs/xfs/xfs_buf_item.c1
-rw-r--r--fs/xfs/xfs_inode.c1
4 files changed, 3 insertions, 17 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index f4d4e708a8d6..ea79072f5210 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -987,13 +987,12 @@ xfs_bwrite(
987{ 987{
988 int error; 988 int error;
989 989
990 bp->b_strat = xfs_bdstrat_cb;
991 bp->b_mount = mp; 990 bp->b_mount = mp;
992 bp->b_flags |= XBF_WRITE; 991 bp->b_flags |= XBF_WRITE;
993 bp->b_flags &= ~(XBF_ASYNC | XBF_READ); 992 bp->b_flags &= ~(XBF_ASYNC | XBF_READ);
994 993
995 xfs_buf_delwri_dequeue(bp); 994 xfs_buf_delwri_dequeue(bp);
996 xfs_buf_iostrategy(bp); 995 xfs_bdstrat_cb(bp);
997 996
998 error = xfs_buf_iowait(bp); 997 error = xfs_buf_iowait(bp);
999 if (error) 998 if (error)
@@ -1009,7 +1008,6 @@ xfs_bdwrite(
1009{ 1008{
1010 trace_xfs_buf_bdwrite(bp, _RET_IP_); 1009 trace_xfs_buf_bdwrite(bp, _RET_IP_);
1011 1010
1012 bp->b_strat = xfs_bdstrat_cb;
1013 bp->b_mount = mp; 1011 bp->b_mount = mp;
1014 1012
1015 bp->b_flags &= ~XBF_READ; 1013 bp->b_flags &= ~XBF_READ;
@@ -1044,7 +1042,6 @@ xfs_bioerror(
1044 XFS_BUF_UNDONE(bp); 1042 XFS_BUF_UNDONE(bp);
1045 XFS_BUF_STALE(bp); 1043 XFS_BUF_STALE(bp);
1046 1044
1047 XFS_BUF_CLR_BDSTRAT_FUNC(bp);
1048 xfs_biodone(bp); 1045 xfs_biodone(bp);
1049 1046
1050 return EIO; 1047 return EIO;
@@ -1074,7 +1071,6 @@ xfs_bioerror_relse(
1074 XFS_BUF_DONE(bp); 1071 XFS_BUF_DONE(bp);
1075 XFS_BUF_STALE(bp); 1072 XFS_BUF_STALE(bp);
1076 XFS_BUF_CLR_IODONE_FUNC(bp); 1073 XFS_BUF_CLR_IODONE_FUNC(bp);
1077 XFS_BUF_CLR_BDSTRAT_FUNC(bp);
1078 if (!(fl & XBF_ASYNC)) { 1074 if (!(fl & XBF_ASYNC)) {
1079 /* 1075 /*
1080 * Mark b_error and B_ERROR _both_. 1076 * Mark b_error and B_ERROR _both_.
@@ -1869,7 +1865,7 @@ xfsbufd(
1869 struct xfs_buf *bp; 1865 struct xfs_buf *bp;
1870 bp = list_first_entry(&tmp, struct xfs_buf, b_list); 1866 bp = list_first_entry(&tmp, struct xfs_buf, b_list);
1871 list_del_init(&bp->b_list); 1867 list_del_init(&bp->b_list);
1872 xfs_buf_iostrategy(bp); 1868 xfs_bdstrat_cb(bp);
1873 count++; 1869 count++;
1874 } 1870 }
1875 if (count) 1871 if (count)
@@ -1916,7 +1912,7 @@ xfs_flush_buftarg(
1916 bp->b_flags &= ~XBF_ASYNC; 1912 bp->b_flags &= ~XBF_ASYNC;
1917 list_add(&bp->b_list, &wait_list); 1913 list_add(&bp->b_list, &wait_list);
1918 } 1914 }
1919 xfs_buf_iostrategy(bp); 1915 xfs_bdstrat_cb(bp);
1920 } 1916 }
1921 1917
1922 if (wait) { 1918 if (wait) {
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h
index 814f9e83b516..d072e5ff923b 100644
--- a/fs/xfs/linux-2.6/xfs_buf.h
+++ b/fs/xfs/linux-2.6/xfs_buf.h
@@ -187,7 +187,6 @@ typedef struct xfs_buf {
187 atomic_t b_io_remaining; /* #outstanding I/O requests */ 187 atomic_t b_io_remaining; /* #outstanding I/O requests */
188 xfs_buf_iodone_t b_iodone; /* I/O completion function */ 188 xfs_buf_iodone_t b_iodone; /* I/O completion function */
189 xfs_buf_relse_t b_relse; /* releasing function */ 189 xfs_buf_relse_t b_relse; /* releasing function */
190 xfs_buf_bdstrat_t b_strat; /* pre-write function */
191 struct completion b_iowait; /* queue for I/O waiters */ 190 struct completion b_iowait; /* queue for I/O waiters */
192 void *b_fspriv; 191 void *b_fspriv;
193 void *b_fspriv2; 192 void *b_fspriv2;
@@ -245,11 +244,6 @@ extern int xfs_buf_iowait(xfs_buf_t *);
245extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, 244extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *,
246 xfs_buf_rw_t); 245 xfs_buf_rw_t);
247 246
248static inline int xfs_buf_iostrategy(xfs_buf_t *bp)
249{
250 return bp->b_strat ? bp->b_strat(bp) : xfs_buf_iorequest(bp);
251}
252
253static inline int xfs_buf_geterror(xfs_buf_t *bp) 247static inline int xfs_buf_geterror(xfs_buf_t *bp)
254{ 248{
255 return bp ? bp->b_error : ENOMEM; 249 return bp ? bp->b_error : ENOMEM;
@@ -321,8 +315,6 @@ extern void xfs_buf_terminate(void);
321#define XFS_BUF_IODONE_FUNC(bp) ((bp)->b_iodone) 315#define XFS_BUF_IODONE_FUNC(bp) ((bp)->b_iodone)
322#define XFS_BUF_SET_IODONE_FUNC(bp, func) ((bp)->b_iodone = (func)) 316#define XFS_BUF_SET_IODONE_FUNC(bp, func) ((bp)->b_iodone = (func))
323#define XFS_BUF_CLR_IODONE_FUNC(bp) ((bp)->b_iodone = NULL) 317#define XFS_BUF_CLR_IODONE_FUNC(bp) ((bp)->b_iodone = NULL)
324#define XFS_BUF_SET_BDSTRAT_FUNC(bp, func) ((bp)->b_strat = (func))
325#define XFS_BUF_CLR_BDSTRAT_FUNC(bp) ((bp)->b_strat = NULL)
326 318
327#define XFS_BUF_FSPRIVATE(bp, type) ((type)(bp)->b_fspriv) 319#define XFS_BUF_FSPRIVATE(bp, type) ((type)(bp)->b_fspriv)
328#define XFS_BUF_SET_FSPRIVATE(bp, val) ((bp)->b_fspriv = (void*)(val)) 320#define XFS_BUF_SET_FSPRIVATE(bp, val) ((bp)->b_fspriv = (void*)(val))
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index 2a9e4ef12110..1b09d7a280df 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -694,7 +694,6 @@ xfs_buf_item_init(
694 */ 694 */
695 if (bp->b_mount != mp) 695 if (bp->b_mount != mp)
696 bp->b_mount = mp; 696 bp->b_mount = mp;
697 XFS_BUF_SET_BDSTRAT_FUNC(bp, xfs_bdstrat_cb);
698 if (XFS_BUF_FSPRIVATE(bp, void *) != NULL) { 697 if (XFS_BUF_FSPRIVATE(bp, void *) != NULL) {
699 lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); 698 lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *);
700 if (lip->li_type == XFS_LI_BUF) { 699 if (lip->li_type == XFS_LI_BUF) {
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index eef211dfca03..68415cb4f23c 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2719,7 +2719,6 @@ cluster_corrupt_out:
2719 * mark it as stale and brelse. 2719 * mark it as stale and brelse.
2720 */ 2720 */
2721 if (XFS_BUF_IODONE_FUNC(bp)) { 2721 if (XFS_BUF_IODONE_FUNC(bp)) {
2722 XFS_BUF_CLR_BDSTRAT_FUNC(bp);
2723 XFS_BUF_UNDONE(bp); 2722 XFS_BUF_UNDONE(bp);
2724 XFS_BUF_STALE(bp); 2723 XFS_BUF_STALE(bp);
2725 XFS_BUF_ERROR(bp,EIO); 2724 XFS_BUF_ERROR(bp,EIO);