Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'for-linus-v3.6-rc7' of git://oss.sgi.com/xfs/xfs

Pull xfs bugfixes from Ben Myers:
- fix a regression related to xfs_sync_worker racing with unmount.
- fix a race while discarding xfs buffers.

* tag 'for-linus-v3.6-rc7' of git://oss.sgi.com/xfs/xfs:
xfs: stop the sync worker before xfs_unmountfs
xfs: fix race while discarding buffers [V4]

+29 -18
+4 -1
fs/xfs/xfs_buf.c
··· 96 96 atomic_inc(&bp->b_hold); 97 97 list_add_tail(&bp->b_lru, &btp->bt_lru); 98 98 btp->bt_lru_nr++; 99 + bp->b_lru_flags &= ~_XBF_LRU_DISPOSE; 99 100 } 100 101 spin_unlock(&btp->bt_lru_lock); 101 102 } ··· 155 154 struct xfs_buftarg *btp = bp->b_target; 156 155 157 156 spin_lock(&btp->bt_lru_lock); 158 - if (!list_empty(&bp->b_lru)) { 157 + if (!list_empty(&bp->b_lru) && 158 + !(bp->b_lru_flags & _XBF_LRU_DISPOSE)) { 159 159 list_del_init(&bp->b_lru); 160 160 btp->bt_lru_nr--; 161 161 atomic_dec(&bp->b_hold); ··· 1503 1501 */ 1504 1502 list_move(&bp->b_lru, &dispose); 1505 1503 btp->bt_lru_nr--; 1504 + bp->b_lru_flags |= _XBF_LRU_DISPOSE; 1506 1505 } 1507 1506 spin_unlock(&btp->bt_lru_lock); 1508 1507
+24 -17
fs/xfs/xfs_buf.h
··· 38 38 XBRW_ZERO = 3, /* Zero target memory */ 39 39 } xfs_buf_rw_t; 40 40 41 - #define XBF_READ (1 << 0) /* buffer intended for reading from device */ 42 - #define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ 43 - #define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */ 44 - #define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ 45 - #define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ 46 - #define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */ 41 + #define XBF_READ (1 << 0) /* buffer intended for reading from device */ 42 + #define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ 43 + #define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */ 44 + #define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ 45 + #define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ 46 + #define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */ 47 47 48 48 /* I/O hints for the BIO layer */ 49 - #define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */ 50 - #define XBF_FUA (1 << 11)/* force cache write through mode */ 51 - #define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */ 49 + #define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */ 50 + #define XBF_FUA (1 << 11)/* force cache write through mode */ 51 + #define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */ 52 52 53 53 /* flags used only as arguments to access routines */ 54 - #define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */ 55 - #define XBF_UNMAPPED (1 << 17)/* do not map the buffer */ 54 + #define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */ 55 + #define XBF_UNMAPPED (1 << 17)/* do not map the buffer */ 56 56 57 57 /* flags used only internally */ 58 - #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */ 59 - #define _XBF_KMEM (1 << 21)/* backed by heap memory */ 60 - #define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */ 61 - #define _XBF_COMPOUND (1 << 23)/* compound buffer */ 58 + #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */ 59 + #define _XBF_KMEM (1 << 21)/* backed by heap memory */ 60 + #define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */ 61 + #define _XBF_COMPOUND (1 << 23)/* compound buffer */ 62 + #define _XBF_LRU_DISPOSE (1 << 24)/* buffer being discarded */ 62 63 63 64 typedef unsigned int xfs_buf_flags_t; 64 65 ··· 73 72 { XBF_SYNCIO, "SYNCIO" }, \ 74 73 { XBF_FUA, "FUA" }, \ 75 74 { XBF_FLUSH, "FLUSH" }, \ 76 - { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\ 75 + { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\ 77 76 { XBF_UNMAPPED, "UNMAPPED" }, /* ditto */\ 78 77 { _XBF_PAGES, "PAGES" }, \ 79 78 { _XBF_KMEM, "KMEM" }, \ 80 79 { _XBF_DELWRI_Q, "DELWRI_Q" }, \ 81 - { _XBF_COMPOUND, "COMPOUND" } 80 + { _XBF_COMPOUND, "COMPOUND" }, \ 81 + { _XBF_LRU_DISPOSE, "LRU_DISPOSE" } 82 82 83 83 typedef struct xfs_buftarg { 84 84 dev_t bt_dev; ··· 126 124 xfs_buf_flags_t b_flags; /* status flags */ 127 125 struct semaphore b_sema; /* semaphore for lockables */ 128 126 127 + /* 128 + * concurrent access to b_lru and b_lru_flags are protected by 129 + * bt_lru_lock and not by b_sema 130 + */ 129 131 struct list_head b_lru; /* lru list */ 132 + xfs_buf_flags_t b_lru_flags; /* internal lru status flags */ 130 133 wait_queue_head_t b_waiters; /* unpin waiters */ 131 134 struct list_head b_list; 132 135 struct xfs_perag *b_pag; /* contains rbtree root */
+1
fs/xfs/xfs_super.c
··· 919 919 struct xfs_mount *mp = XFS_M(sb); 920 920 921 921 xfs_filestream_unmount(mp); 922 + cancel_delayed_work_sync(&mp->m_sync_work); 922 923 xfs_unmountfs(mp); 923 924 xfs_syncd_stop(mp); 924 925 xfs_freesb(mp);