diff options
| author | Sunil Mushran <sunil.mushran@oracle.com> | 2009-06-19 17:45:54 -0400 |
|---|---|---|
| committer | Joel Becker <joel.becker@oracle.com> | 2009-06-22 17:24:47 -0400 |
| commit | 94e41ecfe0f202df948fdbb19a53308a58cf2184 (patch) | |
| tree | 00053423e47115dbfb4f95f2a3d778e8488883cd | |
| parent | 1962f39abbb2d5643a7d59169422661a2d58793d (diff) | |
ocfs2: Pin journal head before accessing jh->b_committed_data
This patch adds jbd_lock_bh_state() and jbd_unlock_bh_state() around accessses
to jh->b_committed_data.
Fixes oss bugzilla#1131
http://oss.oracle.com/bugzilla/show_bug.cgi?id=1131
Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
| -rw-r--r-- | fs/ocfs2/suballoc.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 8439f6b324b9..73a16d4666dc 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
| @@ -923,14 +923,23 @@ static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, | |||
| 923 | int nr) | 923 | int nr) |
| 924 | { | 924 | { |
| 925 | struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) bg_bh->b_data; | 925 | struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) bg_bh->b_data; |
| 926 | int ret; | ||
| 926 | 927 | ||
| 927 | if (ocfs2_test_bit(nr, (unsigned long *)bg->bg_bitmap)) | 928 | if (ocfs2_test_bit(nr, (unsigned long *)bg->bg_bitmap)) |
| 928 | return 0; | 929 | return 0; |
| 929 | if (!buffer_jbd(bg_bh) || !bh2jh(bg_bh)->b_committed_data) | 930 | |
| 931 | if (!buffer_jbd(bg_bh)) | ||
| 930 | return 1; | 932 | return 1; |
| 931 | 933 | ||
| 934 | jbd_lock_bh_state(bg_bh); | ||
| 932 | bg = (struct ocfs2_group_desc *) bh2jh(bg_bh)->b_committed_data; | 935 | bg = (struct ocfs2_group_desc *) bh2jh(bg_bh)->b_committed_data; |
| 933 | return !ocfs2_test_bit(nr, (unsigned long *)bg->bg_bitmap); | 936 | if (bg) |
| 937 | ret = !ocfs2_test_bit(nr, (unsigned long *)bg->bg_bitmap); | ||
| 938 | else | ||
| 939 | ret = 1; | ||
| 940 | jbd_unlock_bh_state(bg_bh); | ||
| 941 | |||
| 942 | return ret; | ||
| 934 | } | 943 | } |
| 935 | 944 | ||
| 936 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, | 945 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, |
| @@ -1885,6 +1894,7 @@ static inline int ocfs2_block_group_clear_bits(handle_t *handle, | |||
| 1885 | unsigned int tmp; | 1894 | unsigned int tmp; |
| 1886 | int journal_type = OCFS2_JOURNAL_ACCESS_WRITE; | 1895 | int journal_type = OCFS2_JOURNAL_ACCESS_WRITE; |
| 1887 | struct ocfs2_group_desc *undo_bg = NULL; | 1896 | struct ocfs2_group_desc *undo_bg = NULL; |
| 1897 | int cluster_bitmap = 0; | ||
| 1888 | 1898 | ||
| 1889 | mlog_entry_void(); | 1899 | mlog_entry_void(); |
| 1890 | 1900 | ||
| @@ -1905,18 +1915,28 @@ static inline int ocfs2_block_group_clear_bits(handle_t *handle, | |||
| 1905 | } | 1915 | } |
| 1906 | 1916 | ||
| 1907 | if (ocfs2_is_cluster_bitmap(alloc_inode)) | 1917 | if (ocfs2_is_cluster_bitmap(alloc_inode)) |
| 1908 | undo_bg = (struct ocfs2_group_desc *) bh2jh(group_bh)->b_committed_data; | 1918 | cluster_bitmap = 1; |
| 1919 | |||
| 1920 | if (cluster_bitmap) { | ||
| 1921 | jbd_lock_bh_state(group_bh); | ||
| 1922 | undo_bg = (struct ocfs2_group_desc *) | ||
| 1923 | bh2jh(group_bh)->b_committed_data; | ||
| 1924 | BUG_ON(!undo_bg); | ||
| 1925 | } | ||
| 1909 | 1926 | ||
| 1910 | tmp = num_bits; | 1927 | tmp = num_bits; |
| 1911 | while(tmp--) { | 1928 | while(tmp--) { |
| 1912 | ocfs2_clear_bit((bit_off + tmp), | 1929 | ocfs2_clear_bit((bit_off + tmp), |
| 1913 | (unsigned long *) bg->bg_bitmap); | 1930 | (unsigned long *) bg->bg_bitmap); |
| 1914 | if (ocfs2_is_cluster_bitmap(alloc_inode)) | 1931 | if (cluster_bitmap) |
| 1915 | ocfs2_set_bit(bit_off + tmp, | 1932 | ocfs2_set_bit(bit_off + tmp, |
| 1916 | (unsigned long *) undo_bg->bg_bitmap); | 1933 | (unsigned long *) undo_bg->bg_bitmap); |
| 1917 | } | 1934 | } |
| 1918 | le16_add_cpu(&bg->bg_free_bits_count, num_bits); | 1935 | le16_add_cpu(&bg->bg_free_bits_count, num_bits); |
| 1919 | 1936 | ||
| 1937 | if (cluster_bitmap) | ||
| 1938 | jbd_unlock_bh_state(group_bh); | ||
| 1939 | |||
| 1920 | status = ocfs2_journal_dirty(handle, group_bh); | 1940 | status = ocfs2_journal_dirty(handle, group_bh); |
| 1921 | if (status < 0) | 1941 | if (status < 0) |
| 1922 | mlog_errno(status); | 1942 | mlog_errno(status); |
