|
@@ -46,10 +46,12 @@
|
|
|
#include "trace_gfs2.h"
|
|
|
|
|
|
struct gfs2_glock_iter {
|
|
|
- int hash; /* hash bucket index */
|
|
|
- struct gfs2_sbd *sdp; /* incore superblock */
|
|
|
- struct gfs2_glock *gl; /* current glock struct */
|
|
|
- char string[512]; /* scratch space */
|
|
|
+ int hash; /* hash bucket index */
|
|
|
+ unsigned nhash; /* Index within current bucket */
|
|
|
+ struct gfs2_sbd *sdp; /* incore superblock */
|
|
|
+ struct gfs2_glock *gl; /* current glock struct */
|
|
|
+ loff_t last_pos; /* last position */
|
|
|
+ char string[512]; /* scratch space */
|
|
|
};
|
|
|
|
|
|
typedef void (*glock_examiner) (struct gfs2_glock * gl);
|
|
@@ -950,7 +952,7 @@ void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...)
|
|
|
if (seq) {
|
|
|
struct gfs2_glock_iter *gi = seq->private;
|
|
|
vsprintf(gi->string, fmt, args);
|
|
|
- seq_printf(seq, gi->string);
|
|
|
+ seq_puts(seq, gi->string);
|
|
|
} else {
|
|
|
vaf.fmt = fmt;
|
|
|
vaf.va = &args;
|
|
@@ -1854,8 +1856,14 @@ static int gfs2_glock_iter_next(struct gfs2_glock_iter *gi)
|
|
|
gl = gi->gl;
|
|
|
if (gl) {
|
|
|
gi->gl = glock_hash_next(gl);
|
|
|
+ gi->nhash++;
|
|
|
} else {
|
|
|
+ if (gi->hash >= GFS2_GL_HASH_SIZE) {
|
|
|
+ rcu_read_unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
gi->gl = glock_hash_chain(gi->hash);
|
|
|
+ gi->nhash = 0;
|
|
|
}
|
|
|
while (gi->gl == NULL) {
|
|
|
gi->hash++;
|
|
@@ -1864,6 +1872,7 @@ static int gfs2_glock_iter_next(struct gfs2_glock_iter *gi)
|
|
|
return 1;
|
|
|
}
|
|
|
gi->gl = glock_hash_chain(gi->hash);
|
|
|
+ gi->nhash = 0;
|
|
|
}
|
|
|
/* Skip entries for other sb and dead entries */
|
|
|
} while (gi->sdp != gi->gl->gl_sbd || atomic_read(&gi->gl->gl_ref) == 0);
|
|
@@ -1876,7 +1885,12 @@ static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
|
|
|
struct gfs2_glock_iter *gi = seq->private;
|
|
|
loff_t n = *pos;
|
|
|
|
|
|
- gi->hash = 0;
|
|
|
+ if (gi->last_pos <= *pos)
|
|
|
+ n = gi->nhash + (*pos - gi->last_pos);
|
|
|
+ else
|
|
|
+ gi->hash = 0;
|
|
|
+
|
|
|
+ gi->nhash = 0;
|
|
|
rcu_read_lock();
|
|
|
|
|
|
do {
|
|
@@ -1884,6 +1898,7 @@ static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
|
|
|
return NULL;
|
|
|
} while (n--);
|
|
|
|
|
|
+ gi->last_pos = *pos;
|
|
|
return gi->gl;
|
|
|
}
|
|
|
|
|
@@ -1893,7 +1908,7 @@ static void *gfs2_glock_seq_next(struct seq_file *seq, void *iter_ptr,
|
|
|
struct gfs2_glock_iter *gi = seq->private;
|
|
|
|
|
|
(*pos)++;
|
|
|
-
|
|
|
+ gi->last_pos = *pos;
|
|
|
if (gfs2_glock_iter_next(gi))
|
|
|
return NULL;
|
|
|
|