|
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 |
}
|