diff options
-rw-r--r-- | fs/gfs2/glock.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index d2e3094c40f8..b075f9359c60 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
@@ -1765,15 +1765,20 @@ static void gfs2_print_symbol(struct glock_iter *gi, const char *fmt, | |||
1765 | { | 1765 | { |
1766 | /* when sprint_symbol becomes available in the new kernel, replace this */ | 1766 | /* when sprint_symbol becomes available in the new kernel, replace this */ |
1767 | /* function with: | 1767 | /* function with: |
1768 | char buffer[KSYM_SYMBOL_LEN]; | 1768 | char buffer[KSYM_SYMBOL_LEN]; |
1769 | 1769 | ||
1770 | sprint_symbol(buffer, address); | 1770 | sprint_symbol(buffer, address); |
1771 | print_dbg(gi, fmt, buffer); | 1771 | print_dbg(gi, fmt, buffer); |
1772 | */ | 1772 | */ |
1773 | if (gi) | 1773 | char buffer[256]; |
1774 | print_dbg(gi, fmt, address); | 1774 | |
1775 | else | 1775 | if (gi) { |
1776 | print_symbol(fmt, address); | 1776 | memset(buffer, 0, sizeof(buffer)); |
1777 | sprintf(buffer, "%p", address); | ||
1778 | print_dbg(gi, fmt, buffer); | ||
1779 | } | ||
1780 | else | ||
1781 | print_symbol(fmt, address); | ||
1777 | } | 1782 | } |
1778 | 1783 | ||
1779 | /** | 1784 | /** |
@@ -1993,14 +1998,19 @@ int __init gfs2_glock_init(void) | |||
1993 | 1998 | ||
1994 | static int gfs2_glock_iter_next(struct glock_iter *gi) | 1999 | static int gfs2_glock_iter_next(struct glock_iter *gi) |
1995 | { | 2000 | { |
2001 | read_lock(gl_lock_addr(gi->hash)); | ||
1996 | while (1) { | 2002 | while (1) { |
1997 | if (!gi->hb_list) { /* If we don't have a hash bucket yet */ | 2003 | if (!gi->hb_list) { /* If we don't have a hash bucket yet */ |
1998 | gi->hb_list = &gl_hash_table[gi->hash].hb_list; | 2004 | gi->hb_list = &gl_hash_table[gi->hash].hb_list; |
1999 | if (hlist_empty(gi->hb_list)) { | 2005 | if (hlist_empty(gi->hb_list)) { |
2006 | read_unlock(gl_lock_addr(gi->hash)); | ||
2000 | gi->hash++; | 2007 | gi->hash++; |
2008 | read_lock(gl_lock_addr(gi->hash)); | ||
2001 | gi->hb_list = NULL; | 2009 | gi->hb_list = NULL; |
2002 | if (gi->hash >= GFS2_GL_HASH_SIZE) | 2010 | if (gi->hash >= GFS2_GL_HASH_SIZE) { |
2011 | read_unlock(gl_lock_addr(gi->hash)); | ||
2003 | return 1; | 2012 | return 1; |
2013 | } | ||
2004 | else | 2014 | else |
2005 | continue; | 2015 | continue; |
2006 | } | 2016 | } |
@@ -2011,7 +2021,9 @@ static int gfs2_glock_iter_next(struct glock_iter *gi) | |||
2011 | } | 2021 | } |
2012 | } else { | 2022 | } else { |
2013 | if (gi->gl->gl_list.next == NULL) { | 2023 | if (gi->gl->gl_list.next == NULL) { |
2024 | read_unlock(gl_lock_addr(gi->hash)); | ||
2014 | gi->hash++; | 2025 | gi->hash++; |
2026 | read_lock(gl_lock_addr(gi->hash)); | ||
2015 | gi->hb_list = NULL; | 2027 | gi->hb_list = NULL; |
2016 | continue; | 2028 | continue; |
2017 | } | 2029 | } |
@@ -2021,6 +2033,7 @@ static int gfs2_glock_iter_next(struct glock_iter *gi) | |||
2021 | if (gi->gl) | 2033 | if (gi->gl) |
2022 | break; | 2034 | break; |
2023 | } | 2035 | } |
2036 | read_unlock(gl_lock_addr(gi->hash)); | ||
2024 | return 0; | 2037 | return 0; |
2025 | } | 2038 | } |
2026 | 2039 | ||