Blame gfs2/glocktop/glocktop.c

Packit Service 360c39
#include "clusterautoconfig.h"
Packit Service 360c39
/**
Packit Service 360c39
 * glocktop.c - list/print the top GFS2 glock waiters
Packit Service 360c39
 */
Packit Service 360c39
#include <stdio.h>
Packit Service 360c39
#include <string.h>
Packit Service 360c39
#include <stdlib.h>
Packit Service 360c39
#include <sys/types.h>
Packit Service 360c39
#include <sys/stat.h>
Packit Service 360c39
#include <fcntl.h>
Packit Service 360c39
#include <unistd.h>
Packit Service 360c39
#include <time.h>
Packit Service 360c39
#include <limits.h>
Packit Service 360c39
#include <sys/wait.h>
Packit Service 360c39
#include <sys/mount.h>
Packit Service 360c39
#include <dirent.h>
Packit Service 360c39
#include <curses.h>
Packit Service 360c39
#include <term.h>
Packit Service 360c39
#include <sys/time.h>
Packit Service 360c39
#include <string.h>
Packit Service 360c39
#include <stdint.h>
Packit Service 360c39
#include <inttypes.h>
Packit Service 360c39
#include <ctype.h>
Packit Service 360c39
#include <errno.h>
Packit Service 360c39
#include <libgfs2.h>
Packit Service 360c39
Packit Service 360c39
#define MAX_GLOCKS 20
Packit Service 360c39
#define MAX_LINES 6000
Packit Service 360c39
#define MAX_MOUNT_POINTS 100
Packit Service 360c39
#define MAX_FILES 512
Packit Service 360c39
#define MAX_CALLTRACE_LINES 4
Packit Service 360c39
#define TITLE1 "glocktop - GFS2 glock monitor"
Packit Service 360c39
#define TITLE2 "Press <ctrl-c> or <escape> to exit"
Packit Service 360c39
Packit Service 360c39
#define COLOR_TITLE     1
Packit Service 360c39
#define COLOR_NORMAL    2
Packit Service 360c39
#define COLOR_INVERSE   3
Packit Service 360c39
#define COLOR_SPECIAL   4
Packit Service 360c39
#define COLOR_HIGHLIGHT 5
Packit Service 360c39
#define COLOR_OFFSETS   6
Packit Service 360c39
#define COLOR_CONTENTS  7
Packit Service 360c39
#define COLOR_HELD      8
Packit Service 360c39
Packit Service 360c39
/*	init_pair(COLOR_TITLE, COLOR_BLACK,  COLOR_CYAN);
Packit Service 360c39
	init_pair(COLOR_INVERSE, COLOR_BLACK,  COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_NORMAL, COLOR_WHITE,  COLOR_BLACK);
Packit Service 360c39
	init_pair(COLOR_SPECIAL, COLOR_MAGENTA, COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE);
Packit Service 360c39
	init_pair(COLOR_OFFSETS, COLOR_CYAN,   COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_CONTENTS, COLOR_BLUE, COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_HELD, COLOR_CYAN, COLOR_BLACK);
Packit Service 360c39
*/
Packit Service 360c39
Packit Service 360c39
#define STR_BLACK "[\033[0;30m]"
Packit Service 360c39
#define STR_RED "[\033[0;31m]"
Packit Service 360c39
#define STR_GREEN "[\033[0;32m]"
Packit Service 360c39
#define STR_YELLOW "[\033[0;33m]"
Packit Service 360c39
#define STR_BLUE "[\033[0;34m]"
Packit Service 360c39
#define STR_MAGENTA "[\033[0;35m]"
Packit Service 360c39
#define STR_CYAN "[\033[0;36m]"
Packit Service 360c39
#define STR_WHITE "[\033[0;37m]"
Packit Service 360c39
Packit Service 360c39
#define BOLD_WHITE "[\033[1;37m]"
Packit Service 360c39
Packit Service 360c39
#define BKG_CYAN "[\033[46m]"
Packit Service 360c39
#define BKG_WHITE "[\033[47m]"
Packit Service 360c39
#define BKG_BLUE "[\033[44m]"
Packit Service 360c39
Packit Service 360c39
#define REFRESH_TIME    30
Packit Service 360c39
#define COLORS_TITLE    \
Packit Service 360c39
	do {						   \
Packit Service 360c39
		if (termlines)				   \
Packit Service 360c39
			attrset(COLOR_PAIR(COLOR_TITLE));  \
Packit Service 360c39
		else 					   \
Packit Service 360c39
			printf(BKG_CYAN);		   \
Packit Service 360c39
	} while (0)
Packit Service 360c39
#define COLORS_NORMAL_BOLD    \
Packit Service 360c39
	do {						   \
Packit Service 360c39
		if (termlines) {			   \
Packit Service 360c39
			attrset(COLOR_PAIR(COLOR_NORMAL)); \
Packit Service 360c39
			attron(A_BOLD);			   \
Packit Service 360c39
		} else {				   \
Packit Service 360c39
			printf(BOLD_WHITE);		   \
Packit Service 360c39
		}					   \
Packit Service 360c39
	} while (0)
Packit Service 360c39
#define COLORS_NORMAL    \
Packit Service 360c39
	do {						   \
Packit Service 360c39
		if (termlines) {			   \
Packit Service 360c39
			attrset(COLOR_PAIR(COLOR_NORMAL)); \
Packit Service 360c39
		} else {				   \
Packit Service 360c39
			printf(STR_WHITE);		   \
Packit Service 360c39
		}					   \
Packit Service 360c39
	} while (0)
Packit Service 360c39
#define COLORS_INVERSE_BOLD   \
Packit Service 360c39
	do {						    \
Packit Service 360c39
		if (termlines) {			    \
Packit Service 360c39
			attrset(COLOR_PAIR(COLOR_INVERSE)); \
Packit Service 360c39
			attron(A_BOLD);			    \
Packit Service 360c39
		} else {				    \
Packit Service 360c39
			printf(BKG_WHITE);		    \
Packit Service 360c39
		}					    \
Packit Service 360c39
	} while (0)
Packit Service 360c39
#define COLORS_INVERSE   \
Packit Service 360c39
	do {						    \
Packit Service 360c39
		if (termlines) {			    \
Packit Service 360c39
			attrset(COLOR_PAIR(COLOR_INVERSE)); \
Packit Service 360c39
		} else {				    \
Packit Service 360c39
			printf(BKG_WHITE);		    \
Packit Service 360c39
		}					    \
Packit Service 360c39
	} while (0)
Packit Service 360c39
#define COLORS_HELD   \
Packit Service 360c39
	do {						    \
Packit Service 360c39
		if (termlines) {			    \
Packit Service 360c39
			attrset(COLOR_PAIR(COLOR_HELD));    \
Packit Service 360c39
		} else {				    \
Packit Service 360c39
			printf(STR_CYAN);		    \
Packit Service 360c39
		}					    \
Packit Service 360c39
	} while (0)
Packit Service 360c39
#define COLORS_HIGHLIGHT   \
Packit Service 360c39
	do {						    \
Packit Service 360c39
		if (termlines) {			    \
Packit Service 360c39
			attrset(COLOR_PAIR(COLOR_HIGHLIGHT));	\
Packit Service 360c39
		} else {				    \
Packit Service 360c39
			printf(BKG_BLUE);		    \
Packit Service 360c39
		}					    \
Packit Service 360c39
	} while (0)
Packit Service 360c39
#define DLM_DIRTBL "/sys/kernel/config/dlm/cluster/dirtbl_size"
Packit Service 360c39
#define DLM_RSBTBL "/sys/kernel/config/dlm/cluster/rsbtbl_size"
Packit Service 360c39
#define DLM_LKBTBL "/sys/kernel/config/dlm/cluster/lkbtbl_size"
Packit Service 360c39
Packit Service 360c39
#define GFS2_MAX_META_HEIGHT	10
Packit Service 360c39
Packit Service 360c39
#define DETAILS  0x00000001
Packit Service 360c39
#define FRIENDLY 0x00000002
Packit Service 360c39
Packit Service 360c39
enum summary_types {
Packit Service 360c39
	all = 0,
Packit Service 360c39
	locked = 1,
Packit Service 360c39
	held_ex = 2,
Packit Service 360c39
	held_sh = 3,
Packit Service 360c39
	held_df = 4,
Packit Service 360c39
	has_waiter = 5,
Packit Service 360c39
	tot_waiters = 6,
Packit Service 360c39
	stypes = 7,
Packit Service 360c39
};
Packit Service 360c39
Packit Service 360c39
char debugfs[PATH_MAX];
Packit Service 360c39
int termcols = 80, termlines = 30, done = 0;
Packit Service 360c39
unsigned glocks = 0;
Packit Service 360c39
const char *termtype;
Packit Service 360c39
WINDOW *wind;
Packit Service 360c39
int bufsize = 4 * 1024 * 1024;
Packit Service 360c39
char *glock[MAX_GLOCKS];
Packit Service 360c39
int iterations = 0, show_reservations = 0, iters_done = 0;
Packit Service 360c39
char devices[MAX_MOUNT_POINTS][80];
Packit Service 360c39
char mount_points[MAX_MOUNT_POINTS][80];
Packit Service 360c39
int fs_fd[MAX_MOUNT_POINTS];
Packit Service 360c39
int mounted = 0;
Packit Service 360c39
char dlmwlines[100][96]; /* waiters lines */
Packit Service 360c39
char dlmglines[MAX_LINES][97]; /* granted lines */
Packit Service 360c39
char contended_filenames[MAX_FILES][PATH_MAX];
Packit Service 360c39
unsigned long long contended_blocks[MAX_FILES];
Packit Service 360c39
int contended_count = 0;
Packit Service 360c39
int line = 0;
Packit Service 360c39
const char *prog_name;
Packit Service 360c39
char dlm_dirtbl_size[32], dlm_rsbtbl_size[32], dlm_lkbtbl_size[32];
Packit Service 360c39
int bsize = 0;
Packit Service 360c39
struct gfs2_sb sd_sb[MAX_MOUNT_POINTS];
Packit Service 360c39
int sd_diptrs = 0, sd_inptrs = 0;
Packit Service 360c39
uint64_t sd_heightsize[GFS2_MAX_META_HEIGHT];
Packit Service 360c39
uint64_t sd_jheightsize[GFS2_MAX_META_HEIGHT];
Packit Service 360c39
int sd_max_height, sd_max_jheight;
Packit Service 360c39
char print_dlm_grants = 1;
Packit Service 360c39
char *gbuf = NULL; /* glocks buffer */
Packit Service 360c39
char *gpos = NULL;
Packit Service 360c39
char *gnextpos = NULL;
Packit Service 360c39
int gmaxpos = 0;
Packit Service 360c39
Packit Service 360c39
char *dbuf = NULL; /* dlm locks buffer */
Packit Service 360c39
char *dpos = NULL;
Packit Service 360c39
char *dnextpos = NULL;
Packit Service 360c39
int dmaxpos = 0;
Packit Service 360c39
char hostname[256];
Packit Service 360c39
Packit Service 360c39
/*
Packit Service 360c39
 * init_colors
Packit Service 360c39
 */
Packit Service 360c39
static void init_colors(void)
Packit Service 360c39
{
Packit Service 360c39
	init_pair(COLOR_TITLE, COLOR_BLACK,  COLOR_CYAN);
Packit Service 360c39
	init_pair(COLOR_INVERSE, COLOR_BLACK,  COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_NORMAL, COLOR_WHITE,  COLOR_BLACK);
Packit Service 360c39
	init_pair(COLOR_SPECIAL, COLOR_MAGENTA, COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE);
Packit Service 360c39
	init_pair(COLOR_OFFSETS, COLOR_CYAN,   COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_CONTENTS, COLOR_BLUE, COLOR_WHITE);
Packit Service 360c39
	init_pair(COLOR_HELD, COLOR_CYAN, COLOR_BLACK);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
/*
Packit Service 360c39
 * UpdateSize - screen size changed, so update it
Packit Service 360c39
 */
Packit Service 360c39
static void UpdateSize(int sig)
Packit Service 360c39
{
Packit Service 360c39
	static char term_buffer[2048];
Packit Service 360c39
	int rc;
Packit Service 360c39
Packit Service 360c39
	if (termlines) {
Packit Service 360c39
		termlines = 30;
Packit Service 360c39
		termtype = getenv("TERM");
Packit Service 360c39
		if (termtype == NULL)
Packit Service 360c39
			return;
Packit Service 360c39
		rc=tgetent(term_buffer,termtype);
Packit Service 360c39
		if (rc >= 0) {
Packit Service 360c39
			termlines = tgetnum((char *)"li");
Packit Service 360c39
			if (termlines < 10)
Packit Service 360c39
				termlines = 30;
Packit Service 360c39
			termcols = tgetnum((char *)"co");
Packit Service 360c39
			if (termcols < 80)
Packit Service 360c39
				termcols = 80;
Packit Service 360c39
		} else
Packit Service 360c39
			perror("Error: tgetent failed.");
Packit Service 360c39
		termlines--; /* last line is number of lines -1 */
Packit Service 360c39
	}
Packit Service 360c39
	signal(SIGWINCH, UpdateSize);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void read_superblock(int fd, int mntpt)
Packit Service 360c39
{
Packit Service 360c39
	struct gfs2_sbd sbd = { .device_fd = fd, .bsize = GFS2_BASIC_BLOCK };
Packit Service 360c39
	struct gfs2_buffer_head *bh;
Packit Service 360c39
	int x;
Packit Service 360c39
	uint64_t space = 0;
Packit Service 360c39
Packit Service 360c39
	ioctl(fd, BLKFLSBUF, 0);
Packit Service 360c39
	bh = bread(&sbd, GFS2_SB_ADDR);
Packit Service 360c39
	gfs2_sb_in(&sd_sb[mntpt], bh->b_data);
Packit Service 360c39
	bsize = sd_sb[mntpt].sb_bsize;
Packit Service 360c39
	if (!bsize)
Packit Service 360c39
		bsize = 4096;
Packit Service 360c39
	sd_inptrs = (bsize - sizeof(struct gfs2_meta_header)) /
Packit Service 360c39
		sizeof(uint64_t);
Packit Service 360c39
	sd_diptrs = (bsize - sizeof(struct gfs2_dinode)) /
Packit Service 360c39
		sizeof(uint64_t);
Packit Service 360c39
	sd_heightsize[0] = bsize - sizeof(struct gfs2_dinode);
Packit Service 360c39
	sd_heightsize[1] = bsize * sd_diptrs;
Packit Service 360c39
	for (x = 2; ; x++) {
Packit Service 360c39
		space = sd_heightsize[x - 1] * sd_inptrs;
Packit Service 360c39
		if (space / sd_inptrs != sd_heightsize[x - 1] ||
Packit Service 360c39
		    space % sd_inptrs != 0)
Packit Service 360c39
			break;
Packit Service 360c39
		sd_heightsize[x] = space;
Packit Service 360c39
	}
Packit Service 360c39
	sd_jheightsize[0] = bsize - sizeof(struct gfs2_dinode);
Packit Service 360c39
	sd_jheightsize[1] = (bsize - sizeof(struct gfs2_meta_header)) *
Packit Service 360c39
		sd_diptrs;
Packit Service 360c39
	for (x = 2; ; x++){
Packit Service 360c39
		space = sd_jheightsize[x - 1] * sd_inptrs;
Packit Service 360c39
		if (space / sd_inptrs != sd_jheightsize[x - 1] ||
Packit Service 360c39
		    space % sd_inptrs != 0)
Packit Service 360c39
			break;
Packit Service 360c39
		sd_jheightsize[x] = space;
Packit Service 360c39
	}
Packit Service 360c39
	sd_max_jheight = x;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int parse_mounts(void)
Packit Service 360c39
{
Packit Service 360c39
	char str[PATH_MAX], dev[PATH_MAX], mnt[PATH_MAX], mtype[PATH_MAX];
Packit Service 360c39
	char opts[PATH_MAX];
Packit Service 360c39
	FILE *fp;
Packit Service 360c39
Packit Service 360c39
	memset(debugfs, 0, sizeof(debugfs));
Packit Service 360c39
	memset(mount_points, 0, sizeof(mount_points));
Packit Service 360c39
	memset(devices, 0, sizeof(devices));
Packit Service 360c39
Packit Service 360c39
	fp = fopen("/proc/mounts", "rt");
Packit Service 360c39
	if (fp == NULL) {
Packit Service 360c39
		perror("/proc/mounts");
Packit Service 360c39
		return 1;
Packit Service 360c39
	}
Packit Service 360c39
	while (fgets(str, sizeof(str) - 1, fp)) {
Packit Service 360c39
		sscanf(str, "%s %s %s %s", dev, mnt, mtype, opts);
Packit Service 360c39
		if (!strcmp(mtype, "debugfs")) {
Packit Service 360c39
			strcpy(debugfs, mnt);
Packit Service 360c39
			continue;
Packit Service 360c39
		}
Packit Service 360c39
		if (strcmp(mtype, "gfs2")) /* if not gfs2 */
Packit Service 360c39
			continue;
Packit Service 360c39
Packit Service 360c39
		strncpy(mount_points[mounted], mnt, 79);
Packit Service 360c39
		mount_points[mounted][79] = '\0';
Packit Service 360c39
		strncpy(devices[mounted], dev, 79);
Packit Service 360c39
		devices[mounted][79] = '\0';
Packit Service 360c39
Packit Service 360c39
		/* Now find out the mount point's file system name */
Packit Service 360c39
		fs_fd[mounted] = open(dev, O_RDONLY);
Packit Service 360c39
		if (fs_fd[mounted])
Packit Service 360c39
			read_superblock(fs_fd[mounted], mounted);
Packit Service 360c39
		mounted++;
Packit Service 360c39
	}
Packit Service 360c39
	if (debugfs[0] == '\0') {
Packit Service 360c39
		if (mount("debugfs", "/sys/kernel/debug", "debugfs", 0, NULL)){
Packit Service 360c39
			fprintf(stderr, "Unable to mount debugfs.\n");
Packit Service 360c39
			fprintf(stderr, "Please mount it manually.\n");
Packit Service 360c39
			exit(-1);
Packit Service 360c39
		}
Packit Service 360c39
		strcpy(debugfs, "/sys/kernel/debug");
Packit Service 360c39
	}
Packit Service 360c39
	fclose(fp);
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
/*
Packit Service 360c39
 * display_title_lines
Packit Service 360c39
 */
Packit Service 360c39
static void display_title_lines(void)
Packit Service 360c39
{
Packit Service 360c39
	if (termlines) {
Packit Service 360c39
		clear(); /* don't use Erase */
Packit Service 360c39
		COLORS_TITLE;
Packit Service 360c39
		attron(A_BOLD);
Packit Service 360c39
		move(0, 0);
Packit Service 360c39
		printw("%-80s", TITLE1);
Packit Service 360c39
		move(termlines, 0);
Packit Service 360c39
		printw("%-79s", TITLE2);
Packit Service 360c39
		COLORS_NORMAL_BOLD;
Packit Service 360c39
		move(1, 0);
Packit Service 360c39
	} else {
Packit Service 360c39
		printf("\n");
Packit Service 360c39
	}
Packit Service 360c39
	line = 1;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
/*
Packit Service 360c39
 * bobgets - get a string
Packit Service 360c39
 * returns: 1 if user exited by hitting enter
Packit Service 360c39
 *          0 if user exited by hitting escape
Packit Service 360c39
 */
Packit Service 360c39
static int bobgets(char string[], int x, int y, int sz, int *ch)
Packit Service 360c39
{
Packit Service 360c39
	int finished,runningy,rc;
Packit Service 360c39
Packit Service 360c39
	if (!termlines)
Packit Service 360c39
		return 0;
Packit Service 360c39
	move(x,y);
Packit Service 360c39
	finished=FALSE;
Packit Service 360c39
	COLORS_INVERSE_BOLD;
Packit Service 360c39
	move(x,y);
Packit Service 360c39
	addstr(string);
Packit Service 360c39
	move(x,y);
Packit Service 360c39
	curs_set(2);
Packit Service 360c39
	refresh();
Packit Service 360c39
	runningy=y;
Packit Service 360c39
	rc=0;
Packit Service 360c39
	while (!finished) {
Packit Service 360c39
		*ch = getch();
Packit Service 360c39
Packit Service 360c39
		if(*ch < 0x0100 && isprint(*ch)) {
Packit Service 360c39
			char *p=string+strlen(string); // end of the string
Packit Service 360c39
Packit Service 360c39
			*(p+1)='\0';
Packit Service 360c39
			string[runningy-y]=*ch;
Packit Service 360c39
			runningy++;
Packit Service 360c39
			move(x,y);
Packit Service 360c39
			addstr(string);
Packit Service 360c39
			if (runningy-y >= sz) {
Packit Service 360c39
				rc=1;
Packit Service 360c39
				*ch = KEY_RIGHT;
Packit Service 360c39
				finished = TRUE;
Packit Service 360c39
			}
Packit Service 360c39
		}
Packit Service 360c39
		else {
Packit Service 360c39
			// special character, is it one we recognize?
Packit Service 360c39
			switch(*ch)
Packit Service 360c39
			{
Packit Service 360c39
			case(KEY_ENTER):
Packit Service 360c39
			case('\n'):
Packit Service 360c39
			case('\r'):
Packit Service 360c39
				rc=1;
Packit Service 360c39
				finished=TRUE;
Packit Service 360c39
				string[runningy-y] = '\0';
Packit Service 360c39
				break;
Packit Service 360c39
			case(KEY_CANCEL):
Packit Service 360c39
			case(0x01B):
Packit Service 360c39
				rc=0;
Packit Service 360c39
				finished=TRUE;
Packit Service 360c39
				break;
Packit Service 360c39
			case(KEY_DC):
Packit Service 360c39
			case(0x07F):
Packit Service 360c39
				if (runningy>=y) {
Packit Service 360c39
					char *p;
Packit Service 360c39
					p = &string[runningy - y];
Packit Service 360c39
					while (*p) {
Packit Service 360c39
						*p = *(p + 1);
Packit Service 360c39
						p++;
Packit Service 360c39
					}
Packit Service 360c39
					*p = '\0';
Packit Service 360c39
					runningy--;
Packit Service 360c39
					// remove the character from the string
Packit Service 360c39
					move(x,y);
Packit Service 360c39
					addstr(string);
Packit Service 360c39
					COLORS_NORMAL_BOLD;
Packit Service 360c39
					addstr(" ");
Packit Service 360c39
					COLORS_INVERSE_BOLD;
Packit Service 360c39
					runningy++;
Packit Service 360c39
				}
Packit Service 360c39
				break;
Packit Service 360c39
			case(KEY_BACKSPACE):
Packit Service 360c39
				if (runningy>y) {
Packit Service 360c39
					char *p;
Packit Service 360c39
Packit Service 360c39
					p = &string[runningy - y - 1];
Packit Service 360c39
					while (*p) {
Packit Service 360c39
						*p = *(p + 1);
Packit Service 360c39
						p++;
Packit Service 360c39
					}
Packit Service 360c39
					*p='\0';
Packit Service 360c39
					runningy--;
Packit Service 360c39
					// remove the character from the string
Packit Service 360c39
					move(x,y);
Packit Service 360c39
					addstr(string);
Packit Service 360c39
					COLORS_NORMAL_BOLD;
Packit Service 360c39
					addstr(" ");
Packit Service 360c39
					COLORS_INVERSE_BOLD;
Packit Service 360c39
				}
Packit Service 360c39
				break;
Packit Service 360c39
			default:
Packit Service 360c39
				move(0,70);
Packit Service 360c39
				printw("%08x", *ch);
Packit Service 360c39
				// ignore all other characters
Packit Service 360c39
				break;
Packit Service 360c39
			} // end switch on non-printable character
Packit Service 360c39
		} // end non-printable character
Packit Service 360c39
		move(line, runningy);
Packit Service 360c39
		refresh();
Packit Service 360c39
	} // while !finished
Packit Service 360c39
	if (sz>0)
Packit Service 360c39
		string[sz]='\0';
Packit Service 360c39
	COLORS_NORMAL_BOLD;
Packit Service 360c39
	return rc;
Packit Service 360c39
}/* bobgets */
Packit Service 360c39
Packit Service 360c39
static char *bufgets(int fd, char *bigbuf, char **nextpos, char **pos,
Packit Service 360c39
		     int *maxpos)
Packit Service 360c39
{
Packit Service 360c39
	if (*nextpos == NULL) {
Packit Service 360c39
		*maxpos = read(fd, bigbuf, bufsize - 1);
Packit Service 360c39
		bigbuf[bufsize - 1] = '\0';
Packit Service 360c39
		if (*maxpos == 0)
Packit Service 360c39
			return NULL;
Packit Service 360c39
		*pos = bigbuf;
Packit Service 360c39
	} else
Packit Service 360c39
		*pos = *nextpos;
Packit Service 360c39
Packit Service 360c39
	*nextpos = memchr(*pos, '\n', (bigbuf + *maxpos) - *pos);
Packit Service 360c39
	while (*nextpos && (**nextpos == '\n' || **nextpos == '\r') &&
Packit Service 360c39
	       *nextpos < bigbuf + (bufsize - 1)) {
Packit Service 360c39
		**nextpos = '\0';
Packit Service 360c39
		(*nextpos)++;
Packit Service 360c39
	}
Packit Service 360c39
	if (*nextpos >= bigbuf + *maxpos)
Packit Service 360c39
		*nextpos = NULL;
Packit Service 360c39
	return *pos;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static char *glock_number(const char *str)
Packit Service 360c39
{
Packit Service 360c39
	const char *glockid;
Packit Service 360c39
	char *p;
Packit Service 360c39
	static char id[32];
Packit Service 360c39
Packit Service 360c39
	glockid = strchr(str, '/');
Packit Service 360c39
	if (glockid == NULL)
Packit Service 360c39
		return NULL;
Packit Service 360c39
	glockid++;
Packit Service 360c39
	strncpy(id, glockid, sizeof(id));
Packit Service 360c39
	id[31] = '\0';
Packit Service 360c39
	p = strchr(id, ' ');
Packit Service 360c39
	if (p)
Packit Service 360c39
		*p = '\0';
Packit Service 360c39
	return id;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int this_glock_requested(const char *str)
Packit Service 360c39
{
Packit Service 360c39
	const char *glockid;
Packit Service 360c39
	int i;
Packit Service 360c39
Packit Service 360c39
	if (!glocks)
Packit Service 360c39
		return 0;
Packit Service 360c39
Packit Service 360c39
	glockid = glock_number(str);
Packit Service 360c39
	if (glockid == NULL)
Packit Service 360c39
		return 0;
Packit Service 360c39
	for (i = 0; i < glocks; i++)
Packit Service 360c39
		if (!strcmp(glockid, glock[i]))
Packit Service 360c39
			return 1;
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int is_iopen(const char *str)
Packit Service 360c39
{
Packit Service 360c39
	char *p;
Packit Service 360c39
Packit Service 360c39
	p = strchr(str, '/');
Packit Service 360c39
	if (p == NULL)
Packit Service 360c39
		return 0;
Packit Service 360c39
	p--;
Packit Service 360c39
	if (*p == '5')
Packit Service 360c39
		return 1;
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int this_lkb_requested(const char *str)
Packit Service 360c39
{
Packit Service 360c39
	int i;
Packit Service 360c39
Packit Service 360c39
	if (!glocks)
Packit Service 360c39
		return 1;
Packit Service 360c39
Packit Service 360c39
	for (i = 0; i < glocks; i++) {
Packit Service 360c39
		if (strstr(str, glock[i]))
Packit Service 360c39
			return 1;
Packit Service 360c39
	}
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void eol(int col) /* end of line */
Packit Service 360c39
{
Packit Service 360c39
	if (termlines) {
Packit Service 360c39
		line++;
Packit Service 360c39
		move(line, col);
Packit Service 360c39
	} else {
Packit Service 360c39
		printf("\n");
Packit Service 360c39
		for (; col > 0; col--)
Packit Service 360c39
			printf(" ");
Packit Service 360c39
	}
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
void print_it(const char *label, const char *fmt, const char *fmt2, ...)
Packit Service 360c39
{
Packit Service 360c39
	va_list args;
Packit Service 360c39
	char tmp_string[128];
Packit Service 360c39
Packit Service 360c39
	if (!termlines || line < termlines) {
Packit Service 360c39
		va_start(args, fmt2);
Packit Service 360c39
		vsnprintf(tmp_string, 127, fmt, args);
Packit Service 360c39
		tmp_string[127] = '\0';
Packit Service 360c39
Packit Service 360c39
		if (termlines) {
Packit Service 360c39
			printw("%s", tmp_string);
Packit Service 360c39
			refresh();
Packit Service 360c39
		} else {
Packit Service 360c39
			printf("%s", tmp_string);
Packit Service 360c39
			fflush(stdout);
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
	va_end(args);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void display_filename(int fd, unsigned long long block,
Packit Service 360c39
			     unsigned long long dirarray[256], int subdepth)
Packit Service 360c39
{
Packit Service 360c39
	int i, subs;
Packit Service 360c39
	char *mntpt = NULL;
Packit Service 360c39
	char blk[32];
Packit Service 360c39
	DIR *dir = NULL;
Packit Service 360c39
	struct dirent *dent;
Packit Service 360c39
Packit Service 360c39
	for (i = 0; i < mounted; i++) {
Packit Service 360c39
		if (fd == fs_fd[i]) {
Packit Service 360c39
			mntpt = mount_points[i];
Packit Service 360c39
			break;
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
	if (i == mounted)
Packit Service 360c39
		return;
Packit Service 360c39
	for (i = 0; i < contended_count; i++) {
Packit Service 360c39
		if (contended_blocks[i] == block) {
Packit Service 360c39
			break;
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
	sprintf(blk, "%lld", block);
Packit Service 360c39
	if (i >= contended_count) {
Packit Service 360c39
		memset(contended_filenames[i], 0, PATH_MAX);
Packit Service 360c39
		strcat(contended_filenames[i], mntpt);
Packit Service 360c39
		for (subs = subdepth - 2; subs >= 0; subs--) {
Packit Service 360c39
			dir = opendir(contended_filenames[i]);
Packit Service 360c39
			while ((dent = readdir(dir))) {
Packit Service 360c39
				if (dent->d_ino == dirarray[subs]) {
Packit Service 360c39
					strcat(contended_filenames[i], "/");
Packit Service 360c39
					strcat(contended_filenames[i],
Packit Service 360c39
					       dent->d_name);
Packit Service 360c39
					break;
Packit Service 360c39
				}
Packit Service 360c39
			}
Packit Service 360c39
			closedir(dir);
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	print_it(NULL, "%s", NULL, contended_filenames[i]);
Packit Service 360c39
	eol(0);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *show_inode(const char *id, int fd, unsigned long long block)
Packit Service 360c39
{
Packit Service 360c39
	struct gfs2_inode *ip;
Packit Service 360c39
	const char *inode_type = NULL;
Packit Service 360c39
	struct gfs2_sbd sbd = { .device_fd = fd, .bsize = bsize };
Packit Service 360c39
Packit Service 360c39
	ip = lgfs2_inode_read(&sbd, block);
Packit Service 360c39
	if (S_ISDIR(ip->i_di.di_mode)) {
Packit Service 360c39
		struct gfs2_inode *parent;
Packit Service 360c39
		unsigned long long dirarray[256];
Packit Service 360c39
		int subdepth = 0, error;
Packit Service 360c39
Packit Service 360c39
		inode_type = "directory ";
Packit Service 360c39
		dirarray[0] = block;
Packit Service 360c39
		subdepth++;
Packit Service 360c39
		/* Backtrack the directory to its source */
Packit Service 360c39
		while (1) {
Packit Service 360c39
			error = gfs2_lookupi(ip, "..", 2, &parent);
Packit Service 360c39
			if (error)
Packit Service 360c39
				break;
Packit Service 360c39
			/* Stop at the root inode */
Packit Service 360c39
			if (ip->i_di.di_num.no_addr ==
Packit Service 360c39
			    parent->i_di.di_num.no_addr) {
Packit Service 360c39
				inode_put(&parent);
Packit Service 360c39
				break;
Packit Service 360c39
			}
Packit Service 360c39
			inode_put(&ip);
Packit Service 360c39
			ip = parent;
Packit Service 360c39
			dirarray[subdepth++] = parent->i_di.di_num.no_addr;
Packit Service 360c39
		}
Packit Service 360c39
		display_filename(fd, block, dirarray, subdepth);
Packit Service 360c39
	} else if (S_ISREG(ip->i_di.di_mode)) {
Packit Service 360c39
		inode_type = "file ";
Packit Service 360c39
	} else if (S_ISLNK(ip->i_di.di_mode)) {
Packit Service 360c39
		inode_type = "link ";
Packit Service 360c39
	} else if (S_ISCHR(ip->i_di.di_mode)) {
Packit Service 360c39
		inode_type = "char device ";
Packit Service 360c39
	} else if (S_ISBLK(ip->i_di.di_mode)) {
Packit Service 360c39
		inode_type = "block device ";
Packit Service 360c39
	} else if (S_ISFIFO(ip->i_di.di_mode)) {
Packit Service 360c39
		inode_type = "fifo ";
Packit Service 360c39
	} else if (S_ISSOCK(ip->i_di.di_mode)) {
Packit Service 360c39
		inode_type = "socket ";
Packit Service 360c39
	} else
Packit Service 360c39
		inode_type = "file? ";
Packit Service 360c39
	inode_put(&ip);
Packit Service 360c39
	return inode_type;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *show_details(const char *id, const char *fsname, int btype,
Packit Service 360c39
				int trace_dir_path)
Packit Service 360c39
{
Packit Service 360c39
	int mnt_num;
Packit Service 360c39
	unsigned long long block = 0;
Packit Service 360c39
	const char *blk_type = NULL;
Packit Service 360c39
	FILE *dlmf;
Packit Service 360c39
Packit Service 360c39
	/* Figure out which mount point corresponds to this debugfs id */
Packit Service 360c39
	for (mnt_num = 0; mnt_num < mounted; mnt_num++) {
Packit Service 360c39
		char *p;
Packit Service 360c39
Packit Service 360c39
		p = strchr(sd_sb[mnt_num].sb_locktable, ':');
Packit Service 360c39
		if (!p)
Packit Service 360c39
			continue;
Packit Service 360c39
		p++;
Packit Service 360c39
		if (!strcmp(p, fsname))
Packit Service 360c39
			break;
Packit Service 360c39
	}
Packit Service 360c39
	memset(dlm_dirtbl_size, 0, sizeof(dlm_dirtbl_size));
Packit Service 360c39
	memset(dlm_rsbtbl_size, 0, sizeof(dlm_rsbtbl_size));
Packit Service 360c39
	memset(dlm_lkbtbl_size, 0, sizeof(dlm_lkbtbl_size));
Packit Service 360c39
	if (!strcmp(sd_sb[mnt_num].sb_lockproto, "lock_dlm")) {
Packit Service 360c39
		char *sp;
Packit Service 360c39
		char *p;
Packit Service 360c39
Packit Service 360c39
		dlmf = fopen(DLM_DIRTBL, "rt");
Packit Service 360c39
		if (dlmf) {
Packit Service 360c39
			sp = fgets(dlm_dirtbl_size, sizeof(dlm_dirtbl_size), dlmf);
Packit Service 360c39
			if (sp == NULL)
Packit Service 360c39
				goto out_err;
Packit Service 360c39
			p = strchr(dlm_dirtbl_size, '\n');
Packit Service 360c39
			if (p)
Packit Service 360c39
				*p = '\0';
Packit Service 360c39
			fclose(dlmf);
Packit Service 360c39
		} else {
Packit Service 360c39
			strcpy(dlm_dirtbl_size, " ");
Packit Service 360c39
		}
Packit Service 360c39
		dlmf = fopen(DLM_RSBTBL, "rt");
Packit Service 360c39
		if (dlmf) {
Packit Service 360c39
			sp = fgets(dlm_rsbtbl_size, sizeof(dlm_rsbtbl_size), dlmf);
Packit Service 360c39
			if (sp == NULL)
Packit Service 360c39
				goto out_err;
Packit Service 360c39
			p = strchr(dlm_rsbtbl_size, '\n');
Packit Service 360c39
			if (p)
Packit Service 360c39
				*p = '\0';
Packit Service 360c39
			fclose(dlmf);
Packit Service 360c39
		} else {
Packit Service 360c39
			strcpy(dlm_rsbtbl_size, " ");
Packit Service 360c39
		}
Packit Service 360c39
		dlmf = fopen(DLM_LKBTBL, "rt");
Packit Service 360c39
		if (dlmf) {
Packit Service 360c39
			sp = fgets(dlm_lkbtbl_size, sizeof(dlm_lkbtbl_size), dlmf);
Packit Service 360c39
			if (sp == NULL)
Packit Service 360c39
				goto out_err;
Packit Service 360c39
			p = strchr(dlm_lkbtbl_size, '\n');
Packit Service 360c39
			if (p)
Packit Service 360c39
				*p = '\0';
Packit Service 360c39
			fclose(dlmf);
Packit Service 360c39
		} else {
Packit Service 360c39
			strcpy(dlm_lkbtbl_size, " ");
Packit Service 360c39
		}
Packit Service 360c39
	} else {
Packit Service 360c39
		strcpy(dlm_dirtbl_size, "nolock");
Packit Service 360c39
		strcpy(dlm_lkbtbl_size, "nolock");
Packit Service 360c39
		strcpy(dlm_lkbtbl_size, "nolock");
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	if (mnt_num >= mounted) /* can't find the right superblock */
Packit Service 360c39
		return "unknown";
Packit Service 360c39
Packit Service 360c39
	/* Read the inode in so we can see its type. */
Packit Service 360c39
	sscanf(id, "%llx", &block);
Packit Service 360c39
	if (block) {
Packit Service 360c39
		if (btype == 2)
Packit Service 360c39
			if (trace_dir_path)
Packit Service 360c39
				blk_type = show_inode(id, fs_fd[mnt_num],
Packit Service 360c39
						      block);
Packit Service 360c39
			else
Packit Service 360c39
				blk_type = "";
Packit Service 360c39
		else
Packit Service 360c39
			blk_type = "";
Packit Service 360c39
	}
Packit Service 360c39
	return blk_type;
Packit Service 360c39
out_err:
Packit Service 360c39
	fclose(dlmf);
Packit Service 360c39
	return "error";
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int is_dlm_waiting(int dlmwaiters, int locktype, char *id)
Packit Service 360c39
{
Packit Service 360c39
	int i;
Packit Service 360c39
	int dlmid, wait_type, nodeid, type;
Packit Service 360c39
	char locknum[32];
Packit Service 360c39
Packit Service 360c39
	for (i = 0; i < dlmwaiters && i < 100; i++) {
Packit Service 360c39
		sscanf(dlmwlines[i], "%x %d %d        %d         %s",
Packit Service 360c39
		       &dlmid, &wait_type, &nodeid, &type, locknum);
Packit Service 360c39
		if ((type == locktype) && (!strcmp(locknum, id)))
Packit Service 360c39
			return 1;
Packit Service 360c39
	}
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *friendly_state(const char *glock_line, const char *search)
Packit Service 360c39
{
Packit Service 360c39
	const char *p;
Packit Service 360c39
Packit Service 360c39
	p = strstr(glock_line, search);
Packit Service 360c39
Packit Service 360c39
	if (p == NULL)
Packit Service 360c39
		return "Dazed";
Packit Service 360c39
Packit Service 360c39
	p += 2;
Packit Service 360c39
	if (*p == 'E')
Packit Service 360c39
		return "Exclusive";
Packit Service 360c39
	else if (*p == 'S')
Packit Service 360c39
		return "Shared";
Packit Service 360c39
	else if (*p == 'U')
Packit Service 360c39
		return "Unlocked";
Packit Service 360c39
	else if (*p == 'D')
Packit Service 360c39
		return "Deferred";
Packit Service 360c39
	else
Packit Service 360c39
		return "Confused";
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *friendly_gflags(const char *glock_line)
Packit Service 360c39
{
Packit Service 360c39
	static char flagout[PATH_MAX];
Packit Service 360c39
	const char *p;
Packit Service 360c39
Packit Service 360c39
	memset(flagout, 0, sizeof(flagout));
Packit Service 360c39
Packit Service 360c39
	p = strstr(glock_line, "f:");
Packit Service 360c39
	if (!p)
Packit Service 360c39
		return " ";
Packit Service 360c39
	p += 2;
Packit Service 360c39
	strcpy(flagout, "[");
Packit Service 360c39
	while (*p != ' ') {
Packit Service 360c39
		switch (*p) {
Packit Service 360c39
		case 'l':
Packit Service 360c39
			/*strcat(flagout, "Locked");*/
Packit Service 360c39
			break;
Packit Service 360c39
		case 'D':
Packit Service 360c39
			strcat(flagout, "Demoting");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'd':
Packit Service 360c39
			strcat(flagout, "Demote pending");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'p':
Packit Service 360c39
			strcat(flagout, "Demote in progress");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'y':
Packit Service 360c39
			strcat(flagout, "Dirty");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'f':
Packit Service 360c39
			strcat(flagout, "Flush");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'i':
Packit Service 360c39
			strcat(flagout, "Invalidating");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'r':
Packit Service 360c39
			strcat(flagout, "Reply pending");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'I':
Packit Service 360c39
			/*strcat(flagout, "Initial");*/
Packit Service 360c39
			break;
Packit Service 360c39
		case 'F':
Packit Service 360c39
			strcat(flagout, "Frozen");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'q':
Packit Service 360c39
			strcat(flagout, "Queued");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'L':
Packit Service 360c39
			strcat(flagout, "LRU");
Packit Service 360c39
			break;
Packit Service 360c39
		case 'o':
Packit Service 360c39
			/*strcat(flagout, "Object present");*/
Packit Service 360c39
			break;
Packit Service 360c39
		case 'b':
Packit Service 360c39
			strcat(flagout, "Blocking");
Packit Service 360c39
			break;
Packit Service 360c39
		default:
Packit Service 360c39
			strcat(flagout, "Unknown");
Packit Service 360c39
			break;
Packit Service 360c39
		}
Packit Service 360c39
		if ((strlen(flagout)) > 1 && (!strchr(" lIo", *(p + 1))))
Packit Service 360c39
			strcat(flagout, ", ");
Packit Service 360c39
		p++;
Packit Service 360c39
	}
Packit Service 360c39
	strcat(flagout, "]");
Packit Service 360c39
	return flagout;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *friendly_glock(const char *glock_line, char prefix)
Packit Service 360c39
{
Packit Service 360c39
	static char gline[PATH_MAX];
Packit Service 360c39
Packit Service 360c39
	if (prefix == 'W')
Packit Service 360c39
		sprintf(gline, "Is:%s, Want:%s   %s",
Packit Service 360c39
			friendly_state(glock_line, "s:"),
Packit Service 360c39
			friendly_state(glock_line, "t:"),
Packit Service 360c39
			friendly_gflags(glock_line));
Packit Service 360c39
	else
Packit Service 360c39
		sprintf(gline, "Held:%s   %s",
Packit Service 360c39
			friendly_state(glock_line, "s:"),
Packit Service 360c39
			friendly_gflags(glock_line));
Packit Service 360c39
	return gline;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *dlm_grtype(int grmode)
Packit Service 360c39
{
Packit Service 360c39
	const char *dlm_types[8] = {"NL", "CR", "CW", "PR", "PW", "EX",
Packit Service 360c39
				    "NA", "NA"};
Packit Service 360c39
Packit Service 360c39
	if (grmode < 0)
Packit Service 360c39
		return "-1";
Packit Service 360c39
	return dlm_types[grmode & 0x07];
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *dlm_status(int status)
Packit Service 360c39
{
Packit Service 360c39
	const char *dlm_statuses[4] = {"Unknown", "Waiting", "Granted",
Packit Service 360c39
				       "Converting"};
Packit Service 360c39
	if (status < 0)
Packit Service 360c39
		return "unknown";
Packit Service 360c39
	return dlm_statuses[status & 0x03];
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *dlm_nodeid(int lkbnodeid)
Packit Service 360c39
{
Packit Service 360c39
	static char nodeid[16];
Packit Service 360c39
Packit Service 360c39
	if (lkbnodeid == 0)
Packit Service 360c39
		return "this node";
Packit Service 360c39
	sprintf(nodeid, "node %d", lkbnodeid);
Packit Service 360c39
	return nodeid;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *getprocname(int ownpid)
Packit Service 360c39
{
Packit Service 360c39
	char fn[1024];
Packit Service 360c39
	static char str[80];
Packit Service 360c39
	const char *procname;
Packit Service 360c39
	FILE *fp;
Packit Service 360c39
Packit Service 360c39
	sprintf(fn, "/proc/%d/status", ownpid);
Packit Service 360c39
	fp = fopen(fn, "r");
Packit Service 360c39
	if (fp == NULL)
Packit Service 360c39
		return "ended";
Packit Service 360c39
Packit Service 360c39
	if (fgets(str, 80, fp) != NULL) {
Packit Service 360c39
		char *p;
Packit Service 360c39
Packit Service 360c39
		procname = str + 6;
Packit Service 360c39
		p = strchr(procname, '\n');
Packit Service 360c39
		if (p)
Packit Service 360c39
			*p = '\0';
Packit Service 360c39
	} else
Packit Service 360c39
		procname = "unknown";
Packit Service 360c39
Packit Service 360c39
	fclose(fp);
Packit Service 360c39
	return procname;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void show_dlm_grants(int locktype, const char *g_line, int dlmgrants,
Packit Service 360c39
			    int summary)
Packit Service 360c39
{
Packit Service 360c39
	int i;
Packit Service 360c39
	char dlm_resid[75];
Packit Service 360c39
	unsigned int lkb_id, lkbnodeid, remid, ownpid, exflags, flags, status;
Packit Service 360c39
	unsigned int grmode, rqmode, nodeid, length;
Packit Service 360c39
	unsigned long long xid, us;
Packit Service 360c39
	char trgt_res_name[64], res_name[64], *p1, *p2;
Packit Service 360c39
	const char *procname;
Packit Service 360c39
Packit Service 360c39
	p1 = strchr(g_line, '/');
Packit Service 360c39
	if (!p1)
Packit Service 360c39
		return;
Packit Service 360c39
	p1++;
Packit Service 360c39
	p2 = strchr(p1, ' ');
Packit Service 360c39
	if (!p2)
Packit Service 360c39
		return;
Packit Service 360c39
	memset(trgt_res_name, 0, sizeof(trgt_res_name));
Packit Service 360c39
	memcpy(trgt_res_name, p1, p2 - p1);
Packit Service 360c39
	sprintf(dlm_resid, "%8d%16s", locktype, trgt_res_name);
Packit Service 360c39
	for (i = 0; i < dlmgrants; i++) {
Packit Service 360c39
/*
Packit Service 360c39
lkb_id  n   remid  pid x e f s g rq u n ln res_name 1234567890123456
Packit Service 360c39
1100003 1 2ae0006 8954 0 0 0 2 5 -1 0 1 24 "       2           102ab"
Packit Service 360c39
2a20001 1 30d0001 8934 0 0 0 2 3 -1 0 1 24 "       5           102ab"
Packit Service 360c39
  b0001 2  860001 8868 0 0 10000 2 3 -1 0 0 24 "       1               2"
Packit Service 360c39
2450001 2 1be0002 8962 0 0 10000 1 -1 5 12214 0 24 "       2           102ab"
Packit Service 360c39
*/
Packit Service 360c39
		p1 = strchr(dlmglines[i], '\"');
Packit Service 360c39
		if (!p1)
Packit Service 360c39
			continue;
Packit Service 360c39
		p1++;
Packit Service 360c39
		if (strncmp(dlm_resid, p1, 24))
Packit Service 360c39
			continue;
Packit Service 360c39
Packit Service 360c39
		sscanf(dlmglines[i], "%x %d %x %u %llu %x %x %d %d %d %llu "
Packit Service 360c39
		       "%u %d \"%24s\"\n",
Packit Service 360c39
		       &lkb_id, &lkbnodeid, &remid, &ownpid, &xid, &exflags,
Packit Service 360c39
		       &flags, &status, &grmode, &rqmode, &us, &nodeid,
Packit Service 360c39
		       &length, res_name);
Packit Service 360c39
		if (status == 1) { /* Waiting */
Packit Service 360c39
			if (!lkbnodeid)
Packit Service 360c39
				procname = getprocname(ownpid);
Packit Service 360c39
			else
Packit Service 360c39
				procname = "";
Packit Service 360c39
			if (summary)
Packit Service 360c39
				print_it(NULL, " (", NULL);
Packit Service 360c39
			else
Packit Service 360c39
				print_it(NULL, "  D: ", NULL);
Packit Service 360c39
			print_it(NULL, "%s for %s, pid %d %s", NULL,
Packit Service 360c39
				 dlm_status(status), dlm_nodeid(lkbnodeid),
Packit Service 360c39
				 ownpid, procname);
Packit Service 360c39
			if (summary)
Packit Service 360c39
				print_it(NULL, ")", NULL);
Packit Service 360c39
		} else if (grmode == 0) {
Packit Service 360c39
			continue; /* ignore "D: Granted NL on node X" */
Packit Service 360c39
		} else {
Packit Service 360c39
			procname = getprocname(ownpid);
Packit Service 360c39
			if (summary)
Packit Service 360c39
				print_it(NULL, " (", NULL);
Packit Service 360c39
			else
Packit Service 360c39
				print_it(NULL, "  D: ", NULL);
Packit Service 360c39
			print_it(NULL, "%s %s on %s to pid %d %s", NULL,
Packit Service 360c39
				 dlm_status(status), dlm_grtype(grmode),
Packit Service 360c39
				 dlm_nodeid(lkbnodeid), ownpid, procname);
Packit Service 360c39
			if (summary)
Packit Service 360c39
				print_it(NULL, ")", NULL);
Packit Service 360c39
		}
Packit Service 360c39
		if (!summary)
Packit Service 360c39
			eol(0);
Packit Service 360c39
	}
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void print_call_trace(const char *hline)
Packit Service 360c39
{
Packit Service 360c39
	char *p, *pid, tmp[32], stackfn[64], str[96];
Packit Service 360c39
	FILE *fp;
Packit Service 360c39
	int i;
Packit Service 360c39
Packit Service 360c39
	p = strchr(hline, 'p');
Packit Service 360c39
	if (!p)
Packit Service 360c39
		return;
Packit Service 360c39
	pid = p + 2;
Packit Service 360c39
	p = strchr(pid, ' ');
Packit Service 360c39
	if (!p)
Packit Service 360c39
		return;
Packit Service 360c39
	memset(tmp, 0, sizeof(tmp));
Packit Service 360c39
	memcpy(tmp, pid, p - pid);
Packit Service 360c39
	sprintf(stackfn, "/proc/%s/stack", tmp);
Packit Service 360c39
	fp = fopen(stackfn, "rt");
Packit Service 360c39
	if (fp == NULL)
Packit Service 360c39
		return;
Packit Service 360c39
	for (i = 0; i < MAX_CALLTRACE_LINES; i++) {
Packit Service 360c39
		if (fgets(str, sizeof(str) - 1, fp) == NULL)
Packit Service 360c39
			break;
Packit Service 360c39
		if (strstr(str, "gfs2_glock_")) { /* skip lines we don't
Packit Service 360c39
						      care about*/
Packit Service 360c39
			i--;
Packit Service 360c39
			continue;
Packit Service 360c39
		}
Packit Service 360c39
		p = strchr(str, '\n');
Packit Service 360c39
		if (p)
Packit Service 360c39
			*p = '\0';
Packit Service 360c39
		p = strchr(str, ']');
Packit Service 360c39
		if (p)
Packit Service 360c39
			p += 2;
Packit Service 360c39
		else
Packit Service 360c39
			p = str;
Packit Service 360c39
		print_it(NULL, "  C:              %s ", NULL, p);
Packit Service 360c39
		eol(0);
Packit Service 360c39
	}
Packit Service 360c39
	fclose(fp);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int is_ex(const char *hline)
Packit Service 360c39
{
Packit Service 360c39
	if (strncmp(hline, " H: s:EX ", 9) == 0)
Packit Service 360c39
		return 1;
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int has_holder_flag(const char *hline, char flag)
Packit Service 360c39
{
Packit Service 360c39
	const char *p;
Packit Service 360c39
Packit Service 360c39
	p = strchr(hline, 'f');
Packit Service 360c39
	if (p == NULL)
Packit Service 360c39
		return 0;
Packit Service 360c39
	p++;
Packit Service 360c39
	if (*p != ':')
Packit Service 360c39
		return 0;
Packit Service 360c39
	p++;
Packit Service 360c39
	while (*p != '\0') {
Packit Service 360c39
		if (*p == ' ')
Packit Service 360c39
			return 0;
Packit Service 360c39
		if (*p == flag)
Packit Service 360c39
			return 1;
Packit Service 360c39
		p++;
Packit Service 360c39
	}
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int is_holder(const char *hline)
Packit Service 360c39
{
Packit Service 360c39
	return has_holder_flag(hline, 'H');
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int is_waiter(const char *hline)
Packit Service 360c39
{
Packit Service 360c39
	return has_holder_flag(hline, 'W');
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int get_lock_type(const char *str)
Packit Service 360c39
{
Packit Service 360c39
	const char *p;
Packit Service 360c39
Packit Service 360c39
	p = strchr(str, '/');
Packit Service 360c39
	return (p ? (*(p - 1)) - '0' : 0);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static long long get_demote_time(const char *str)
Packit Service 360c39
{
Packit Service 360c39
	char *p;
Packit Service 360c39
	char tmp[80];
Packit Service 360c39
Packit Service 360c39
	p = strchr(str, '/');
Packit Service 360c39
	if (p == NULL)
Packit Service 360c39
		return 0;
Packit Service 360c39
	p++;
Packit Service 360c39
	p = strchr(p, '/');
Packit Service 360c39
	if (p == NULL)
Packit Service 360c39
		return 0;
Packit Service 360c39
	p++;
Packit Service 360c39
	strncpy(tmp, p, 79);
Packit Service 360c39
	tmp[79] = '\0';
Packit Service 360c39
	p = strchr(tmp, ' ');
Packit Service 360c39
	if (p == NULL)
Packit Service 360c39
		return 0;
Packit Service 360c39
	*p = '\0';
Packit Service 360c39
	return atoll(tmp);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *pid_string(const char *str)
Packit Service 360c39
{
Packit Service 360c39
	char *p;
Packit Service 360c39
	static char pidstr[80];
Packit Service 360c39
Packit Service 360c39
	memset(pidstr, 0, sizeof(pidstr));
Packit Service 360c39
	p = strchr(str, 'p');
Packit Service 360c39
	if (p) {
Packit Service 360c39
		strncpy(pidstr, p + 2, sizeof(pidstr));
Packit Service 360c39
		pidstr[79] = '\0';
Packit Service 360c39
		p = strchr(pidstr, ']');
Packit Service 360c39
		if (p) {
Packit Service 360c39
			p++;
Packit Service 360c39
			*p = '\0';
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
	return pidstr;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
/* If this glock is relevant, return 0, else the reason it's irrelevant */
Packit Service 360c39
static int irrelevant(const char *holder, const char *glockstr)
Packit Service 360c39
{
Packit Service 360c39
	int lock_type = get_lock_type(glockstr);
Packit Service 360c39
Packit Service 360c39
	/* Exclude shared and locks */
Packit Service 360c39
	if (!is_ex(holder))
Packit Service 360c39
		return 1;
Packit Service 360c39
	/* Exclude locks held at mount time: statfs*/
Packit Service 360c39
	if (strstr(holder, "init_per_node"))
Packit Service 360c39
		return 2;
Packit Service 360c39
	if (strstr(holder, "init_journal"))
Packit Service 360c39
		return 3;
Packit Service 360c39
	if (strstr(holder, "init_inodes"))
Packit Service 360c39
		return 4;
Packit Service 360c39
	if (strstr(holder, "fill_super"))
Packit Service 360c39
		return 5;
Packit Service 360c39
	if (lock_type == 9) /* Exclude journal locks */
Packit Service 360c39
		return 6;
Packit Service 360c39
	return 0;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static const char *reason(int why)
Packit Service 360c39
{
Packit Service 360c39
	const char *reasons[] = {"(N/A:------)",  /* 0 */
Packit Service 360c39
				 "(N/A:Not EX)",  /* 1 */
Packit Service 360c39
				 "(N/A:System)",  /* 2 */
Packit Service 360c39
				 "(N/A:journl)",  /* 3 */
Packit Service 360c39
				 "(N/A:System)",  /* 4 */
Packit Service 360c39
				 "(N/A:System)",  /* 5 */
Packit Service 360c39
				 "(N/A:Journl)"}; /* 6 */
Packit Service 360c39
Packit Service 360c39
	return reasons[why];
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void print_friendly_prefix(char one_glocks_lines[MAX_LINES][97])
Packit Service 360c39
{
Packit Service 360c39
	int why = irrelevant(one_glocks_lines[1], one_glocks_lines[0]);
Packit Service 360c39
Packit Service 360c39
	if (why)
Packit Service 360c39
		print_it(NULL, "  U: %s ", NULL, reason(why));
Packit Service 360c39
	else
Packit Service 360c39
		print_it(NULL, "  U: ", NULL);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void show_glock(char one_glocks_lines[MAX_LINES][97], int gline,
Packit Service 360c39
		       const char *fsname, int dlmwaiters, int dlmgrants,
Packit Service 360c39
		       int trace_dir_path, int prev_had_waiter, int flags,
Packit Service 360c39
		       int summary)
Packit Service 360c39
{
Packit Service 360c39
	int i, locktype = 0;
Packit Service 360c39
	char id[33], *p;
Packit Service 360c39
	char extras[80], prefix = '\0';
Packit Service 360c39
	long long demote_time = 0;
Packit Service 360c39
	const char *ltype[] = {"N/A", "non-disk", "inode", "rgrp", "meta",
Packit Service 360c39
			       "i_open", "flock", "posix lock", "quota",
Packit Service 360c39
			       "journal"};
Packit Service 360c39
Packit Service 360c39
	if (termlines) {
Packit Service 360c39
		if (irrelevant(one_glocks_lines[1], one_glocks_lines[0]))
Packit Service 360c39
			COLORS_HELD;
Packit Service 360c39
		else
Packit Service 360c39
			COLORS_NORMAL;
Packit Service 360c39
	}
Packit Service 360c39
	if (!gline)
Packit Service 360c39
		return;
Packit Service 360c39
Packit Service 360c39
	memset(extras, 0, sizeof(extras));
Packit Service 360c39
	p = strchr(one_glocks_lines[0], '/');
Packit Service 360c39
	memset(id, 0, sizeof(id));
Packit Service 360c39
Packit Service 360c39
	if (p) {
Packit Service 360c39
		locktype = get_lock_type(one_glocks_lines[0]);
Packit Service 360c39
		demote_time = get_demote_time(one_glocks_lines[0]);
Packit Service 360c39
		p++;
Packit Service 360c39
		strncpy(id, p, sizeof(id) - 1);
Packit Service 360c39
		id[sizeof(id) - 1] = '\0';
Packit Service 360c39
		p = strchr(id, ' ');
Packit Service 360c39
		if (p)
Packit Service 360c39
			*p = '\0';
Packit Service 360c39
Packit Service 360c39
		if (locktype != 2) {
Packit Service 360c39
			strncpy(extras, ltype[locktype], 79);
Packit Service 360c39
			extras[79] = '\0';
Packit Service 360c39
		} else {
Packit Service 360c39
			const char *i_type = show_details(id, fsname, 2,
Packit Service 360c39
							  trace_dir_path);
Packit Service 360c39
			sprintf(extras, "%sinode", i_type);
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
	if (flags & DETAILS) {
Packit Service 360c39
		print_it(NULL, " %s ", NULL, one_glocks_lines[0]);
Packit Service 360c39
		print_it(NULL, "(%s)", NULL, extras);
Packit Service 360c39
		if (demote_time)
Packit Service 360c39
			print_it(NULL, " ** demote time is greater than 0 **",
Packit Service 360c39
				 NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		if (dlmgrants)
Packit Service 360c39
			show_dlm_grants(locktype, one_glocks_lines[0],
Packit Service 360c39
					dlmgrants, 0);
Packit Service 360c39
	}
Packit Service 360c39
	if (flags & FRIENDLY) {
Packit Service 360c39
		print_friendly_prefix(one_glocks_lines);
Packit Service 360c39
		for (i = 1; i < gline; i++) {
Packit Service 360c39
			if (one_glocks_lines[i][0] == ' ' &&
Packit Service 360c39
			    one_glocks_lines[i][1] == 'H' &&
Packit Service 360c39
			    prefix != 'W')
Packit Service 360c39
				prefix = (is_holder(one_glocks_lines[i]) ?
Packit Service 360c39
					  'H' : 'W');
Packit Service 360c39
		}
Packit Service 360c39
		print_it(NULL, " %c %-10.10s %-9.9s %s", NULL, prefix,
Packit Service 360c39
			 extras, id, friendly_glock(one_glocks_lines[0],
Packit Service 360c39
						    prefix));
Packit Service 360c39
		eol(0);
Packit Service 360c39
	}
Packit Service 360c39
	for (i = 1; i < gline; i++) {
Packit Service 360c39
		if (!show_reservations &&
Packit Service 360c39
		    one_glocks_lines[i][0] == ' ' &&
Packit Service 360c39
		    one_glocks_lines[i][2] == 'B' &&
Packit Service 360c39
		    one_glocks_lines[i][3] == ':')
Packit Service 360c39
			continue;
Packit Service 360c39
Packit Service 360c39
		if (flags & DETAILS) {
Packit Service 360c39
			print_it(NULL, " %-80.80s", NULL, one_glocks_lines[i]);
Packit Service 360c39
			eol(0);
Packit Service 360c39
			continue;
Packit Service 360c39
		}
Packit Service 360c39
		if ((flags & FRIENDLY) &&
Packit Service 360c39
		    one_glocks_lines[i][1] == 'H')
Packit Service 360c39
			print_friendly_prefix(one_glocks_lines);
Packit Service 360c39
Packit Service 360c39
		if (one_glocks_lines[i][0] == ' ' &&
Packit Service 360c39
		    one_glocks_lines[i][1] == 'H') {
Packit Service 360c39
			print_it(NULL, " %c ---> %s pid %s ", NULL,
Packit Service 360c39
				 prefix, (is_holder(one_glocks_lines[i]) ?
Packit Service 360c39
					  "held by" : "waiting"),
Packit Service 360c39
				 pid_string(one_glocks_lines[i]));
Packit Service 360c39
			if (demote_time)
Packit Service 360c39
				print_it(NULL, "** demote time is non-"
Packit Service 360c39
					 "zero ** ", NULL);
Packit Service 360c39
			if (is_dlm_waiting(dlmwaiters, locktype, id)) {
Packit Service 360c39
				print_it(NULL, "***** DLM is in a "
Packit Service 360c39
					 "comm wait for this lock "
Packit Service 360c39
					 "***** ", NULL);
Packit Service 360c39
			}
Packit Service 360c39
			show_dlm_grants(locktype, one_glocks_lines[0],
Packit Service 360c39
					dlmgrants, 1);
Packit Service 360c39
			eol(0);
Packit Service 360c39
			print_call_trace(one_glocks_lines[i]);
Packit Service 360c39
		}
Packit Service 360c39
	}
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int parse_dlm_waiters(FILE *dlm, const char *fsname)
Packit Service 360c39
{
Packit Service 360c39
	int dlml = 0;
Packit Service 360c39
Packit Service 360c39
	memset(dlmwlines, 0, sizeof(dlmwlines));
Packit Service 360c39
	while (fgets(dlmwlines[dlml], 80, dlm))
Packit Service 360c39
		dlml++;
Packit Service 360c39
Packit Service 360c39
	return dlml;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static int parse_dlm_grants(int dlmfd, const char *fsname)
Packit Service 360c39
{
Packit Service 360c39
	int dlml = 0;
Packit Service 360c39
	char *dlmline;
Packit Service 360c39
Packit Service 360c39
	memset(dlmglines, 0, sizeof(dlmglines));
Packit Service 360c39
	dnextpos = NULL;
Packit Service 360c39
	while ((dlmline = bufgets(dlmfd, dbuf, &dnextpos, &dpos, &dmaxpos))) {
Packit Service 360c39
		if (!this_lkb_requested(dlmline))
Packit Service 360c39
			continue;
Packit Service 360c39
		strncpy(dlmglines[dlml], dlmline, 96);
Packit Service 360c39
		dlmglines[dlml][96] = '\0';
Packit Service 360c39
		dlml++;
Packit Service 360c39
		if (dlml >= MAX_LINES)
Packit Service 360c39
			break;
Packit Service 360c39
	}
Packit Service 360c39
	return dlml;
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void print_summary(int total_glocks[11][stypes], int dlmwaiters)
Packit Service 360c39
{
Packit Service 360c39
	int i;
Packit Service 360c39
	int total_unlocked = 0;
Packit Service 360c39
	const struct {
Packit Service 360c39
		const char *name;
Packit Service 360c39
		const int width;
Packit Service 360c39
	} column[] = {
Packit Service 360c39
		{ "unknown", 7 }, { "nondisk", 7}, { "inode", 8 }, { "rgrp", 7 },
Packit Service 360c39
		{ "meta", 4 }, { "iopen", 7 }, { "flock", 7 }, { "p", 1 },
Packit Service 360c39
		{ "quota", 5 }, { "jrnl", 4 }, { "Total", 8 }
Packit Service 360c39
	};
Packit Service 360c39
	const int ncols = sizeof(column) / sizeof(column[0]);
Packit Service 360c39
Packit Service 360c39
	/* Print column headers */
Packit Service 360c39
	print_it(NULL, "S     glocks ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++)
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*s ", NULL, column[i].width, column[i].name);
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S  --------- ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++)
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*s ", NULL, column[i].width, "--------");
Packit Service 360c39
	eol(0);
Packit Service 360c39
Packit Service 360c39
	/* Print rows */
Packit Service 360c39
	print_it(NULL, "S  Unlocked: ", NULL);
Packit Service 360c39
	for (i = 1; i < (ncols - 1); i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][all] - total_glocks[i][locked]);
Packit Service 360c39
		total_unlocked += total_glocks[i][all] -
Packit Service 360c39
			total_glocks[i][locked];
Packit Service 360c39
	}
Packit Service 360c39
	print_it(NULL, "%*d ", NULL, column[i].width, total_unlocked);
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S    Locked: ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][locked]);
Packit Service 360c39
		total_glocks[10][locked] += total_glocks[i][locked];
Packit Service 360c39
	}
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S     Total: ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][all]);
Packit Service 360c39
		total_glocks[10][all] += total_glocks[i][all];
Packit Service 360c39
	}
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S", NULL);
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S   Held EX: ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][held_ex]);
Packit Service 360c39
		total_glocks[10][held_ex] += total_glocks[i][held_ex];
Packit Service 360c39
	}
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S   Held SH: ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][held_sh]);
Packit Service 360c39
		total_glocks[10][held_sh] += total_glocks[i][held_sh];
Packit Service 360c39
	}
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S   Held DF: ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][held_df]);
Packit Service 360c39
		total_glocks[10][held_df] += total_glocks[i][held_df];
Packit Service 360c39
	}
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S G Waiting: ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][has_waiter]);
Packit Service 360c39
		total_glocks[10][has_waiter] += total_glocks[i][has_waiter];
Packit Service 360c39
	}
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S P Waiting: ", NULL);
Packit Service 360c39
	for (i = 1; i < ncols; i++) {
Packit Service 360c39
		if (i != 7 && i != 4) /* Ignore plock and meta */
Packit Service 360c39
			print_it(NULL, "%*d ", NULL, column[i].width,
Packit Service 360c39
				 total_glocks[i][tot_waiters]);
Packit Service 360c39
		total_glocks[10][tot_waiters] += total_glocks[i][tot_waiters];
Packit Service 360c39
	}
Packit Service 360c39
	eol(0);
Packit Service 360c39
	print_it(NULL, "S  DLM wait: %7d", NULL, dlmwaiters);
Packit Service 360c39
	eol(0);
Packit Service 360c39
	eol(0);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
/* flags = DETAILS || FRIENDLY or both */
Packit Service 360c39
static void glock_details(int fd, const char *fsname, int dlmwaiters,
Packit Service 360c39
			  int dlmgrants, int trace_dir_path, int show_held,
Packit Service 360c39
			  int summary)
Packit Service 360c39
{
Packit Service 360c39
	char *ln, *p;
Packit Service 360c39
	char one_glocks_lines[MAX_LINES][97];
Packit Service 360c39
	int gline = 0;
Packit Service 360c39
	int show_prev_glock = 0, prev_had_waiter = 0;
Packit Service 360c39
	int total_glocks[11][stypes], locktype = 0;
Packit Service 360c39
	int holders_this_glock_ex = 0;
Packit Service 360c39
	int holders_this_glock_sh = 0;
Packit Service 360c39
	int holders_this_glock_df = 0;
Packit Service 360c39
	int waiters_this_glock = 0;
Packit Service 360c39
Packit Service 360c39
	memset(total_glocks, 0, sizeof(total_glocks));
Packit Service 360c39
	gnextpos = NULL;
Packit Service 360c39
	while ((ln = bufgets(fd, gbuf, &gnextpos, &gpos, &gmaxpos))) {
Packit Service 360c39
		if (ln[0] == ' ' && ln[1] == ' ' && ln[2] == ' ')
Packit Service 360c39
			continue;
Packit Service 360c39
		if (ln[0] == 'G') {
Packit Service 360c39
			/* Summary stuff------------------------------------ */
Packit Service 360c39
			if (waiters_this_glock) {
Packit Service 360c39
				total_glocks[locktype][tot_waiters] +=
Packit Service 360c39
					waiters_this_glock;
Packit Service 360c39
				total_glocks[locktype][has_waiter]++;
Packit Service 360c39
			}
Packit Service 360c39
			if (holders_this_glock_ex)
Packit Service 360c39
				total_glocks[locktype][held_ex]++;
Packit Service 360c39
			if (holders_this_glock_sh)
Packit Service 360c39
				total_glocks[locktype][held_sh]++;
Packit Service 360c39
			if (holders_this_glock_df)
Packit Service 360c39
				total_glocks[locktype][held_df]++;
Packit Service 360c39
			locktype = get_lock_type(ln);
Packit Service 360c39
			p = ln + 6;
Packit Service 360c39
			if (*p != 'U' || *(p + 1) != 'N')
Packit Service 360c39
				total_glocks[locktype][locked]++;
Packit Service 360c39
			total_glocks[locktype][all]++;
Packit Service 360c39
			holders_this_glock_ex = 0;
Packit Service 360c39
			holders_this_glock_sh = 0;
Packit Service 360c39
			holders_this_glock_df = 0;
Packit Service 360c39
			waiters_this_glock = 0;
Packit Service 360c39
			/* Detail stuff------------------------------------- */
Packit Service 360c39
			if (show_prev_glock) {
Packit Service 360c39
				show_glock(one_glocks_lines, gline, fsname,
Packit Service 360c39
					   dlmwaiters, dlmgrants,
Packit Service 360c39
					   trace_dir_path, prev_had_waiter,
Packit Service 360c39
					   DETAILS, summary);
Packit Service 360c39
				show_glock(one_glocks_lines, gline, fsname,
Packit Service 360c39
					   dlmwaiters, dlmgrants,
Packit Service 360c39
					   trace_dir_path, prev_had_waiter,
Packit Service 360c39
					   FRIENDLY, summary);
Packit Service 360c39
				memset(one_glocks_lines, 0,
Packit Service 360c39
				       sizeof(one_glocks_lines));
Packit Service 360c39
				show_prev_glock = 0;
Packit Service 360c39
			}
Packit Service 360c39
			prev_had_waiter = 0;
Packit Service 360c39
			gline = 0;
Packit Service 360c39
			if (this_glock_requested(ln))
Packit Service 360c39
				show_prev_glock = 1;
Packit Service 360c39
		} else if (ln[0] == ' ' && ln[1] == 'H') {
Packit Service 360c39
			char *flag = strchr(ln, 'f');
Packit Service 360c39
			char *mode = strchr(ln, 's');
Packit Service 360c39
Packit Service 360c39
			/* Summary stuff------------------------------------ */
Packit Service 360c39
			while (flag) {
Packit Service 360c39
				flag++;
Packit Service 360c39
				switch (*flag) {
Packit Service 360c39
				case ':':
Packit Service 360c39
					break;
Packit Service 360c39
				case 'W':
Packit Service 360c39
					waiters_this_glock++;
Packit Service 360c39
					flag = NULL;
Packit Service 360c39
					break;
Packit Service 360c39
				case 'H':
Packit Service 360c39
					flag = NULL;
Packit Service 360c39
					if (mode == NULL)
Packit Service 360c39
						holders_this_glock_df++;
Packit Service 360c39
					else if (*(mode + 1) == ':' &&
Packit Service 360c39
						 *(mode + 2) == 'E' &&
Packit Service 360c39
						 *(mode + 3) == 'X')
Packit Service 360c39
						holders_this_glock_ex++;
Packit Service 360c39
					else if (*(mode + 1) == ':' &&
Packit Service 360c39
						 *(mode + 2) == 'S' &&
Packit Service 360c39
						 *(mode + 3) == 'H')
Packit Service 360c39
						holders_this_glock_sh++;
Packit Service 360c39
					else
Packit Service 360c39
						holders_this_glock_df++;
Packit Service 360c39
					break;
Packit Service 360c39
				case ' ':
Packit Service 360c39
					flag = NULL;
Packit Service 360c39
					break;
Packit Service 360c39
				default:
Packit Service 360c39
					break;
Packit Service 360c39
				};
Packit Service 360c39
			}
Packit Service 360c39
			/* Detail stuff------------------------------------- */
Packit Service 360c39
			if (!glocks) {
Packit Service 360c39
				int haswaiter = is_waiter(ln);
Packit Service 360c39
Packit Service 360c39
				if (haswaiter) {
Packit Service 360c39
					show_prev_glock = 1;
Packit Service 360c39
					prev_had_waiter = 1;
Packit Service 360c39
				} else if (show_held && is_holder(ln) &&
Packit Service 360c39
					   !is_iopen(one_glocks_lines[0])) {
Packit Service 360c39
					show_prev_glock = 1;
Packit Service 360c39
				} else if (!irrelevant(ln, one_glocks_lines[0])) {
Packit Service 360c39
					show_prev_glock = 1;
Packit Service 360c39
				}
Packit Service 360c39
			}
Packit Service 360c39
		}
Packit Service 360c39
		/* Detail stuff--------------------------------------------- */
Packit Service 360c39
		strncpy(one_glocks_lines[gline], ln, 96);
Packit Service 360c39
		one_glocks_lines[gline][96] = '\0';
Packit Service 360c39
		gline++;
Packit Service 360c39
		if (gline >= MAX_LINES)
Packit Service 360c39
			break;
Packit Service 360c39
		if (termlines && line >= termlines)
Packit Service 360c39
			break;
Packit Service 360c39
	}
Packit Service 360c39
	/* Detail stuff----------------------------------------------------- */
Packit Service 360c39
	if (show_prev_glock && gline < MAX_LINES &&
Packit Service 360c39
	    (!termlines || line < termlines)) {
Packit Service 360c39
		show_glock(one_glocks_lines, gline, fsname, dlmwaiters,
Packit Service 360c39
			   dlmgrants, trace_dir_path, prev_had_waiter,
Packit Service 360c39
			   DETAILS, summary);
Packit Service 360c39
		show_glock(one_glocks_lines, gline, fsname, dlmwaiters,
Packit Service 360c39
			   dlmgrants, trace_dir_path, prev_had_waiter,
Packit Service 360c39
			   FRIENDLY, summary);
Packit Service 360c39
	}
Packit Service 360c39
	if (!summary || ((iters_done % summary) != 0))
Packit Service 360c39
		return;
Packit Service 360c39
Packit Service 360c39
	print_summary(total_glocks, dlmwaiters);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void show_help(int help)
Packit Service 360c39
{
Packit Service 360c39
	if (help == 1) {
Packit Service 360c39
		COLORS_NORMAL;
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "  Glock flags:                 ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    l - Locked                 ", NULL);
Packit Service 360c39
		print_it(NULL, "    r - Reply pending          ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    d - Demote pending         ", NULL);
Packit Service 360c39
		print_it(NULL, "    I - Initial                ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    D - Demote requested       ", NULL);
Packit Service 360c39
		print_it(NULL, "    F - Frozen                 ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    p - Demote in progress     ", NULL);
Packit Service 360c39
		print_it(NULL, "    q - Queued holder          ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    y - Dirty data             ", NULL);
Packit Service 360c39
		print_it(NULL, "    L - LRU                    ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    f - Flush                  ", NULL);
Packit Service 360c39
		print_it(NULL, "    o - Object present         ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    i - Invalidating           ", NULL);
Packit Service 360c39
		print_it(NULL, "    b - Blocking request       ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
	} else if (help == 2) {
Packit Service 360c39
		COLORS_NORMAL;
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "  Holder flags:                ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    t - Try (non-blocking)     ", NULL);
Packit Service 360c39
		print_it(NULL, "    E - Exact lock             ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    T - Try with callback      ", NULL);
Packit Service 360c39
		print_it(NULL, "    c - No Cache lock          ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    e - No exp                 ", NULL);
Packit Service 360c39
		print_it(NULL, "    H - Held (locked)          ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    A - Any lock               ", NULL);
Packit Service 360c39
		print_it(NULL, "    W - Waiting for lock       ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    p - Priority lock          ", NULL);
Packit Service 360c39
		print_it(NULL, "    a - Asynchronous lock      ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
		print_it(NULL, "    F - First                  ", NULL);
Packit Service 360c39
		eol(0);
Packit Service 360c39
	}
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
/* flags = DETAILS || FRIENDLY or both */
Packit Service 360c39
static void parse_glocks_file(int fd, const char *fsname, int dlmwaiters,
Packit Service 360c39
			      int dlmgrants, int trace_dir_path,
Packit Service 360c39
			      int show_held, int help, int summary)
Packit Service 360c39
{
Packit Service 360c39
	char fstitle[96], fsdlm[105];
Packit Service 360c39
	char ctimestr[64];
Packit Service 360c39
	time_t t;
Packit Service 360c39
	int i;
Packit Service 360c39
Packit Service 360c39
	tzset();
Packit Service 360c39
	t = time(NULL);
Packit Service 360c39
	strftime(ctimestr, 64, "%a %b %d %T %Y", localtime(&t);;
Packit Service 360c39
	ctimestr[63] = '\0';
Packit Service 360c39
	memset(fstitle, 0, sizeof(fstitle));
Packit Service 360c39
	memset(fsdlm, 0, sizeof(fsdlm));
Packit Service 360c39
	sprintf(fstitle, "@ %s       %s ", fsname, ctimestr);
Packit Service 360c39
	if (dlmwaiters) {
Packit Service 360c39
		sprintf(fsdlm, "dlm: %s/%s/%s [", dlm_dirtbl_size,
Packit Service 360c39
			dlm_rsbtbl_size, dlm_lkbtbl_size);
Packit Service 360c39
		for (i = 0; i < dlmwaiters; i++)
Packit Service 360c39
			strcat(fsdlm, "*");
Packit Service 360c39
		for (; i < 10; i++)
Packit Service 360c39
			strcat(fsdlm, " ");
Packit Service 360c39
		strcat(fsdlm, "]");
Packit Service 360c39
	}
Packit Service 360c39
	attron(A_BOLD);
Packit Service 360c39
	print_it(NULL, "%s @%s %s", NULL, fstitle, hostname, fsdlm);
Packit Service 360c39
	eol(0);
Packit Service 360c39
	attroff(A_BOLD);
Packit Service 360c39
	glock_details(fd, fsname, dlmwaiters, dlmgrants, trace_dir_path,
Packit Service 360c39
		      show_held, summary);
Packit Service 360c39
Packit Service 360c39
	show_help(help);
Packit Service 360c39
	if (termlines)
Packit Service 360c39
		refresh();
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
static void usage(void)
Packit Service 360c39
{
Packit Service 360c39
	printf("Usage:\n");
Packit Service 360c39
	printf("glocktop [-i] [-d <delay sec>] [-n <iter>] [-sX] [-c] [-D] [-H] [-r] [-t]\n");
Packit Service 360c39
	printf("\n");
Packit Service 360c39
	printf("-i : Runs glocktop in interactive mode.\n");
Packit Service 360c39
	printf("-d : delay between refreshes, in seconds (default: %d).\n", REFRESH_TIME);
Packit Service 360c39
	printf("-n : stop after <iter> refreshes.\n");
Packit Service 360c39
	printf("-H : don't show Held glocks, even if not waited on, excluding "
Packit Service 360c39
	       "iopen\n");
Packit Service 360c39
	printf("-r : show reservations when rgrp glocks are displayed\n");
Packit Service 360c39
	printf("-s : show glock summary information every X iterations\n");
Packit Service 360c39
	printf("-t : trace directory glocks back\n");
Packit Service 360c39
	printf("-D : don't show DLM lock status\n");
Packit Service 360c39
	printf("\n");
Packit Service 360c39
	fflush(stdout);
Packit Service 360c39
	exit(0);
Packit Service 360c39
}
Packit Service 360c39
Packit Service 360c39
int main(int argc, char **argv)
Packit Service 360c39
{
Packit Service 360c39
	int fd;
Packit Service 360c39
	DIR *dir = NULL;
Packit Service 360c39
	char *fn;
Packit Service 360c39
	struct dirent *dent;
Packit Service 360c39
	int retval;
Packit Service 360c39
	int refresh_time = REFRESH_TIME;
Packit Service 360c39
	fd_set readfds;
Packit Service 360c39
	char string[96];
Packit Service 360c39
	int ch, i, dlmwaiters = 0, dlmgrants = 0;
Packit Service 360c39
	int cont = TRUE, optchar;
Packit Service 360c39
	int trace_dir_path = 0;
Packit Service 360c39
	int show_held = 1, help = 0;
Packit Service 360c39
	int interactive = 0;
Packit Service 360c39
	int summary = 10;
Packit Service 360c39
	int nfds = STDIN_FILENO + 1;
Packit Service 360c39
Packit Service 360c39
	prog_name = argv[0];
Packit Service 360c39
	memset(glock, 0, sizeof(glock));
Packit Service 360c39
	memset(contended_filenames, 0, sizeof(contended_filenames));
Packit Service 360c39
	memset(contended_blocks, 0, sizeof(contended_blocks));
Packit Service 360c39
	UpdateSize(0);
Packit Service 360c39
	/* decode command line arguments */
Packit Service 360c39
	while (cont) {
Packit Service 360c39
		optchar = getopt(argc, argv, "-d:Dn:rs:thHi");
Packit Service 360c39
Packit Service 360c39
		switch (optchar) {
Packit Service 360c39
		case 'd':
Packit Service 360c39
			refresh_time = atoi(optarg);
Packit Service 360c39
			if (refresh_time < 1) {
Packit Service 360c39
				fprintf(stderr, "Error: delay %d too small; "
Packit Service 360c39
					"must be at least 1\n", refresh_time);
Packit Service 360c39
				exit(-1);
Packit Service 360c39
			}
Packit Service 360c39
			break;
Packit Service 360c39
		case 'D':
Packit Service 360c39
			print_dlm_grants = 0;
Packit Service 360c39
			break;
Packit Service 360c39
		case 'n':
Packit Service 360c39
			iterations = atoi(optarg);
Packit Service 360c39
			break;
Packit Service 360c39
		case 'r':
Packit Service 360c39
			show_reservations = 1;
Packit Service 360c39
			break;
Packit Service 360c39
		case 's':
Packit Service 360c39
			summary = atoi(optarg);
Packit Service 360c39
			break;
Packit Service 360c39
		case 't':
Packit Service 360c39
			trace_dir_path = 1;
Packit Service 360c39
			break;
Packit Service 360c39
		case 'h':
Packit Service 360c39
			usage();
Packit Service 360c39
			break;
Packit Service 360c39
		case 'H':
Packit Service 360c39
			show_held = 0; /* held, but not iopen held */
Packit Service 360c39
			break;
Packit Service 360c39
		case 'i':
Packit Service 360c39
			interactive = 1;
Packit Service 360c39
			break;
Packit Service 360c39
		case EOF:
Packit Service 360c39
			cont = FALSE;
Packit Service 360c39
			break;
Packit Service 360c39
		case 1:
Packit Service 360c39
			if  (optarg && glocks < MAX_GLOCKS)
Packit Service 360c39
				glock[glocks++] = optarg;
Packit Service 360c39
			break;
Packit Service 360c39
Packit Service 360c39
		default:
Packit Service 360c39
			fprintf(stderr, "unknown option: %c\n", optchar);
Packit Service 360c39
			exit(-1);
Packit Service 360c39
		};
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	if (interactive) {
Packit Service 360c39
		printf("Initializing. Please wait...");
Packit Service 360c39
		fflush(stdout);
Packit Service 360c39
	}
Packit Service 360c39
	if (gethostname(hostname, sizeof(hostname))) {
Packit Service 360c39
		fprintf(stderr, "Error: unable to determine host name.\n");
Packit Service 360c39
		exit(-1);
Packit Service 360c39
	}
Packit Service 360c39
	if (parse_mounts())
Packit Service 360c39
		exit(-1);
Packit Service 360c39
Packit Service 360c39
	if (interactive && (wind = initscr()) == NULL) {
Packit Service 360c39
		fprintf(stderr, "Error: unable to initialize screen.\n");
Packit Service 360c39
		exit(-1);
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	if (interactive) {
Packit Service 360c39
		/* Do our initial screen stuff: */
Packit Service 360c39
		signal(SIGWINCH, UpdateSize); /* handle term resize signal */
Packit Service 360c39
		UpdateSize(0); /* update screen size based on term settings */
Packit Service 360c39
		clear(); /* don't use Erase */
Packit Service 360c39
		start_color();
Packit Service 360c39
		noecho();
Packit Service 360c39
		keypad(stdscr, TRUE);
Packit Service 360c39
		raw();
Packit Service 360c39
		curs_set(0);
Packit Service 360c39
		init_colors();
Packit Service 360c39
	} else {
Packit Service 360c39
		termlines = 0;
Packit Service 360c39
	}
Packit Service 360c39
	while (!gbuf) {
Packit Service 360c39
		gbuf = malloc(bufsize);
Packit Service 360c39
		if (gbuf) {
Packit Service 360c39
			/*printf("bufsize=%dK\n", bufsize / 1024);*/
Packit Service 360c39
			break;
Packit Service 360c39
		}
Packit Service 360c39
		bufsize /= 2;
Packit Service 360c39
	}
Packit Service 360c39
	while (!dbuf) {
Packit Service 360c39
		dbuf = malloc(bufsize);
Packit Service 360c39
		if (dbuf) {
Packit Service 360c39
			/*printf("bufsize=%dK\n", bufsize / 1024);*/
Packit Service 360c39
			break;
Packit Service 360c39
		}
Packit Service 360c39
		bufsize /= 2;
Packit Service 360c39
	}
Packit Service 360c39
Packit Service 360c39
	while (!done) {
Packit Service 360c39
		struct timeval tv;
Packit Service 360c39
Packit Service 360c39
		if (asprintf(&fn, "%s/gfs2/", debugfs) == -1) {
Packit Service 360c39
			perror(argv[0]);
Packit Service 360c39
			exit(-1);
Packit Service 360c39
		}
Packit Service 360c39
		dir = opendir(fn);
Packit Service 360c39
		free(fn);
Packit Service 360c39
Packit Service 360c39
		if (!dir) {
Packit Service 360c39
			if (interactive) {
Packit Service 360c39
				refresh();
Packit Service 360c39
				endwin();
Packit Service 360c39
			}
Packit Service 360c39
			fprintf(stderr, "Unable to open gfs2 debugfs directory.\n");
Packit Service 360c39
			fprintf(stderr, "Check if debugfs and gfs2 are mounted.\n");
Packit Service 360c39
			exit(-1);
Packit Service 360c39
		}
Packit Service 360c39
		display_title_lines();
Packit Service 360c39
		while ((dent = readdir(dir))) {
Packit Service 360c39
			const char *fsname;
Packit Service 360c39
			char dlm_fn[PATH_MAX+5+8]; /* "/dlm/" and "_waiters" */
Packit Service 360c39
			FILE *dlmf;
Packit Service 360c39
			int dlmfd;
Packit Service 360c39
Packit Service 360c39
			if (!strcmp(dent->d_name, "."))
Packit Service 360c39
				continue;
Packit Service 360c39
			if (!strcmp(dent->d_name, ".."))
Packit Service 360c39
				continue;
Packit Service 360c39
Packit Service 360c39
			fsname = strchr(dent->d_name, ':');
Packit Service 360c39
			if (fsname)
Packit Service 360c39
				fsname++;
Packit Service 360c39
			else
Packit Service 360c39
				fsname = dent->d_name;
Packit Service 360c39
Packit Service 360c39
			memset(dlm_fn, 0, sizeof(dlm_fn));
Packit Service 360c39
			sprintf(dlm_fn, "%s/dlm/%s_waiters", debugfs, fsname);
Packit Service 360c39
			dlmf = fopen(dlm_fn, "rt");
Packit Service 360c39
			if (dlmf) {
Packit Service 360c39
				dlmwaiters = parse_dlm_waiters(dlmf, fsname);
Packit Service 360c39
				fclose(dlmf);
Packit Service 360c39
			}
Packit Service 360c39
Packit Service 360c39
			if (print_dlm_grants) {
Packit Service 360c39
				memset(dlm_fn, 0, sizeof(dlm_fn));
Packit Service 360c39
				sprintf(dlm_fn, "%s/dlm/%s_locks", debugfs,
Packit Service 360c39
					fsname);
Packit Service 360c39
				dlmfd = open(dlm_fn, O_RDONLY);
Packit Service 360c39
				if (dlmfd > 0) {
Packit Service 360c39
					dlmgrants = parse_dlm_grants(dlmfd,
Packit Service 360c39
								     fsname);
Packit Service 360c39
					close(dlmfd);
Packit Service 360c39
				}
Packit Service 360c39
			}
Packit Service 360c39
Packit Service 360c39
			if (asprintf(&fn, "%s/gfs2/%s/glocks", debugfs, dent->d_name) == -1) {
Packit Service 360c39
				perror(argv[0]);
Packit Service 360c39
				exit(-1);
Packit Service 360c39
			}
Packit Service 360c39
			fd = open(fn, O_RDONLY);
Packit Service 360c39
			if (fd < 0) {
Packit Service 360c39
				if (interactive) {
Packit Service 360c39
					refresh();
Packit Service 360c39
					endwin();
Packit Service 360c39
				}
Packit Service 360c39
				perror(fn);
Packit Service 360c39
				free(fn);
Packit Service 360c39
				exit(-1);
Packit Service 360c39
			}
Packit Service 360c39
			free(fn);
Packit Service 360c39
			parse_glocks_file(fd, fsname, dlmwaiters, dlmgrants,
Packit Service 360c39
					  trace_dir_path, show_held, help,
Packit Service 360c39
					  summary);
Packit Service 360c39
			close(fd);
Packit Service 360c39
		}
Packit Service 360c39
		closedir(dir);
Packit Service 360c39
		tv.tv_sec = refresh_time;
Packit Service 360c39
		tv.tv_usec = 0;
Packit Service 360c39
		FD_ZERO(&readfds);
Packit Service 360c39
		if (nfds != 0)
Packit Service 360c39
			FD_SET(STDIN_FILENO, &readfds);
Packit Service 360c39
		retval = select(nfds, &readfds, NULL, NULL, &tv;;
Packit Service 360c39
		if (retval) {
Packit Service 360c39
			if (interactive)
Packit Service 360c39
				ch = getch();
Packit Service 360c39
			else
Packit Service 360c39
				ch = getchar();
Packit Service 360c39
			switch (ch) {
Packit Service 360c39
			case 0x1b: /* mount wheel? */
Packit Service 360c39
			case 0x03:
Packit Service 360c39
			case 'q':
Packit Service 360c39
				done = 1;
Packit Service 360c39
				break;
Packit Service 360c39
			case 'h':
Packit Service 360c39
				help = (help + 1) % 3;
Packit Service 360c39
				break;
Packit Service 360c39
			case 's':
Packit Service 360c39
				if (!interactive)
Packit Service 360c39
					break;
Packit Service 360c39
				move(1, 0);
Packit Service 360c39
				printw("Change delay from %d to: ",
Packit Service 360c39
				       refresh_time);
Packit Service 360c39
				if (bobgets(string, 1, 25, 5, &ch) == 1)
Packit Service 360c39
					refresh_time = atoi(string);
Packit Service 360c39
				if (refresh_time < 1)
Packit Service 360c39
					refresh_time = 1;
Packit Service 360c39
				break;
Packit Service 360c39
			/* When we get EOF on stdin, remove it from the fd_set
Packit Service 360c39
			   to avoid shorting out the select() */
Packit Service 360c39
			case EOF:
Packit Service 360c39
				nfds = 0;
Packit Service 360c39
				break;
Packit Service 360c39
			}
Packit Service 360c39
		}
Packit Service 360c39
		iters_done++;
Packit Service 360c39
		if (iterations && iters_done >= iterations)
Packit Service 360c39
			break;
Packit Service 360c39
	}
Packit Service 360c39
	for (i = 0; i < mounted; i++)
Packit Service 360c39
		close(fs_fd[i]);
Packit Service 360c39
	free(gbuf);
Packit Service 360c39
	free(dbuf);
Packit Service 360c39
	if (interactive) {
Packit Service 360c39
		refresh();
Packit Service 360c39
		endwin();
Packit Service 360c39
	}
Packit Service 360c39
	exit(0);
Packit Service 360c39
}