|
@@ -38,27 +38,28 @@ typedef enum {
|
|
|
XBRW_ZERO = 3, /* Zero target memory */
|
|
|
} xfs_buf_rw_t;
|
|
|
|
|
|
-#define XBF_READ (1 << 0) /* buffer intended for reading from device */
|
|
|
-#define XBF_WRITE (1 << 1) /* buffer intended for writing to device */
|
|
|
-#define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */
|
|
|
-#define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */
|
|
|
-#define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */
|
|
|
-#define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */
|
|
|
+#define XBF_READ (1 << 0) /* buffer intended for reading from device */
|
|
|
+#define XBF_WRITE (1 << 1) /* buffer intended for writing to device */
|
|
|
+#define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */
|
|
|
+#define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */
|
|
|
+#define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */
|
|
|
+#define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */
|
|
|
|
|
|
/* I/O hints for the BIO layer */
|
|
|
-#define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */
|
|
|
-#define XBF_FUA (1 << 11)/* force cache write through mode */
|
|
|
-#define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */
|
|
|
+#define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */
|
|
|
+#define XBF_FUA (1 << 11)/* force cache write through mode */
|
|
|
+#define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */
|
|
|
|
|
|
/* flags used only as arguments to access routines */
|
|
|
-#define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */
|
|
|
-#define XBF_UNMAPPED (1 << 17)/* do not map the buffer */
|
|
|
+#define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */
|
|
|
+#define XBF_UNMAPPED (1 << 17)/* do not map the buffer */
|
|
|
|
|
|
/* flags used only internally */
|
|
|
-#define _XBF_PAGES (1 << 20)/* backed by refcounted pages */
|
|
|
-#define _XBF_KMEM (1 << 21)/* backed by heap memory */
|
|
|
-#define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */
|
|
|
-#define _XBF_COMPOUND (1 << 23)/* compound buffer */
|
|
|
+#define _XBF_PAGES (1 << 20)/* backed by refcounted pages */
|
|
|
+#define _XBF_KMEM (1 << 21)/* backed by heap memory */
|
|
|
+#define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */
|
|
|
+#define _XBF_COMPOUND (1 << 23)/* compound buffer */
|
|
|
+#define _XBF_LRU_DISPOSE (1 << 24)/* buffer being discarded */
|
|
|
|
|
|
typedef unsigned int xfs_buf_flags_t;
|
|
|
|
|
@@ -72,12 +73,13 @@ typedef unsigned int xfs_buf_flags_t;
|
|
|
{ XBF_SYNCIO, "SYNCIO" }, \
|
|
|
{ XBF_FUA, "FUA" }, \
|
|
|
{ XBF_FLUSH, "FLUSH" }, \
|
|
|
- { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\
|
|
|
+ { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\
|
|
|
{ XBF_UNMAPPED, "UNMAPPED" }, /* ditto */\
|
|
|
{ _XBF_PAGES, "PAGES" }, \
|
|
|
{ _XBF_KMEM, "KMEM" }, \
|
|
|
{ _XBF_DELWRI_Q, "DELWRI_Q" }, \
|
|
|
- { _XBF_COMPOUND, "COMPOUND" }
|
|
|
+ { _XBF_COMPOUND, "COMPOUND" }, \
|
|
|
+ { _XBF_LRU_DISPOSE, "LRU_DISPOSE" }
|
|
|
|
|
|
typedef struct xfs_buftarg {
|
|
|
dev_t bt_dev;
|
|
@@ -124,7 +126,12 @@ typedef struct xfs_buf {
|
|
|
xfs_buf_flags_t b_flags; /* status flags */
|
|
|
struct semaphore b_sema; /* semaphore for lockables */
|
|
|
|
|
|
+ /*
|
|
|
+ * concurrent access to b_lru and b_lru_flags are protected by
|
|
|
+ * bt_lru_lock and not by b_sema
|
|
|
+ */
|
|
|
struct list_head b_lru; /* lru list */
|
|
|
+ xfs_buf_flags_t b_lru_flags; /* internal lru status flags */
|
|
|
wait_queue_head_t b_waiters; /* unpin waiters */
|
|
|
struct list_head b_list;
|
|
|
struct xfs_perag *b_pag; /* contains rbtree root */
|