Signed-off-by: Tao Ma <[EMAIL PROTECTED]>

Mark Fasheh wrote:
> This way we can review locking state even if all a customer provides us is
> the contents of /sys/kernel/debug/o2dlm/locking_state.
> 
> Signed-off-by: Mark Fasheh <[EMAIL PROTECTED]>
> ---
>  debugfs.ocfs2/commands.c               |   36 ++++++++++++++++++++++-------
>  debugfs.ocfs2/dump_dlm_locks.c         |   38 ++++++++++++++++++++-----------
>  debugfs.ocfs2/include/dump_dlm_locks.h |    2 +-
>  3 files changed, 52 insertions(+), 24 deletions(-)
> 
> diff --git a/debugfs.ocfs2/commands.c b/debugfs.ocfs2/commands.c
> index 0e46151..06b6c98 100644
> --- a/debugfs.ocfs2/commands.c
> +++ b/debugfs.ocfs2/commands.c
> @@ -831,7 +831,7 @@ static void do_help (char **args)
>       printf ("controld dump\t\t\tObtain information from ocfs2_controld\n");
>       printf ("curdev\t\t\t\t\tShow current device\n");
>       printf ("decode <lockname#> ...\t\t\tDecode block#(s) from the 
> lockname(s)\n");
> -     printf ("dlm_locks [-l] lockname\t\t\tShow live dlm locking state\n");
> +     printf ("dlm_locks [-f <file>] [-l] lockname\t\t\tShow live dlm locking 
> state\n");
>       printf ("dump [-p] <filespec> <outfile>\t\tDumps file to outfile on a 
> mounted fs\n");
>       printf ("encode <filespec>\t\t\tShow lock name\n");
>       printf ("extent <block#>\t\t\t\tShow extent block\n");
> @@ -1485,26 +1485,44 @@ static void do_dlm_locks(char **args)
>       int dump_lvbs = 0;
>       int i;
>       struct list_head locklist;
> -
> -     if (check_device_open())
> -             return;
> +     char *path = NULL, *uuid_str = NULL;
> +     int c, argc;
>  
>       init_stringlist(&locklist);
>  
> -     i = 1;
> -     if (args[i] && strlen(args[i])) {
> -             if (!strcmp("-l", args[i])) {
> +     for (argc = 0; (args[argc]); ++argc);
> +     optind = 0;
> +
> +     while ((c = getopt(argc, args, "lf:")) != -1) {
> +             switch (c) {
> +             case 'l':
>                       dump_lvbs = 1;
> -                     i++;
> +                     break;
> +             case 'f':
> +                     path = optarg;
> +                     break;
> +             default:
> +                     break;
>               }
> +     }
> +     if ((path == NULL)) {
> +             /* Only error for a missing device if we're asked to
> +              * read from a live file system. */
> +             if (check_device_open())
> +                     return;
> +
> +             uuid_str = gbls.fs->uuid_str;
> +     }
>  
> +     i = optind;
> +     if (args[i] && strlen(args[i])) {
>               for ( ; args[i] && strlen(args[i]); ++i)
>                       if (add_to_stringlist(args[i], &locklist))
>                               break;
>       }
>  
>       out = open_pager(gbls.interactive);
> -     dump_dlm_locks(gbls.fs->uuid_str, out, dump_lvbs, &locklist);
> +     dump_dlm_locks(uuid_str, out, path, dump_lvbs, &locklist);
>       close_pager(out);
>  
>       free_stringlist(&locklist);
> diff --git a/debugfs.ocfs2/dump_dlm_locks.c b/debugfs.ocfs2/dump_dlm_locks.c
> index b946821..6344ff1 100644
> --- a/debugfs.ocfs2/dump_dlm_locks.c
> +++ b/debugfs.ocfs2/dump_dlm_locks.c
> @@ -411,7 +411,7 @@ static int get_next_dlm_lockname(FILE *file, char *name, 
> int len)
>       return 0;
>  }
>  
> -void dump_dlm_locks(char *uuid, FILE *out, int dump_lvbs,
> +void dump_dlm_locks(char *uuid, FILE *out, char *path, int dump_lvbs,
>                   struct list_head *locklist)
>  {
>       errcode_t ret;
> @@ -421,20 +421,30 @@ void dump_dlm_locks(char *uuid, FILE *out, int 
> dump_lvbs,
>       struct lockres res;
>       int show_all_locks = 0;
>  
> -     ret = get_debugfs_path(debugfs_path, sizeof(debugfs_path));
> -     if (ret) {
> -             fprintf(stderr, "Could not locate debugfs file system. "
> -                     "Perhaps it is not mounted?\n");
> -             return;
> -     }
> +     if (path == NULL) {
> +             ret = get_debugfs_path(debugfs_path, sizeof(debugfs_path));
> +             if (ret) {
> +                     fprintf(stderr, "Could not locate debugfs file system. "
> +                             "Perhaps it is not mounted?\n");
> +                     return;
> +             }
>  
> -     ret = open_debugfs_file(debugfs_path, "o2dlm", uuid, "locking_state",
> -                             &file);
> -     if (ret) {
> -             fprintf(stderr, "Could not open debug state for \"%s\".\n"
> -                     "Perhaps that OCFS2 file system is not mounted?\n",
> -                     uuid);
> -             return;
> +             ret = open_debugfs_file(debugfs_path, "o2dlm", uuid,
> +                                     "locking_state", &file);
> +             if (ret) {
> +                     fprintf(stderr,
> +                             "Could not open debug state for \"%s\".\n"
> +                             "Perhaps that OCFS2 file system is not 
> mounted?\n",
> +                             uuid);
> +                     return;
> +             }
> +     } else {
> +             file = fopen(path, "r");
> +             if (!file) {
> +                     fprintf(stderr, "Could not open file at \"%s\"\n",
> +                             path);
> +                     return;
> +             }
>       }
>  
>       show_all_locks = list_empty(locklist);
> diff --git a/debugfs.ocfs2/include/dump_dlm_locks.h 
> b/debugfs.ocfs2/include/dump_dlm_locks.h
> index 2cbb72a..7bc35ba 100644
> --- a/debugfs.ocfs2/include/dump_dlm_locks.h
> +++ b/debugfs.ocfs2/include/dump_dlm_locks.h
> @@ -74,7 +74,7 @@ struct lock {
>       struct list_head list;
>  };
>  
> -void dump_dlm_locks(char *uuid, FILE *out, int dump_lvbs,
> +void dump_dlm_locks(char *uuid, FILE *out, char *path, int dump_lvbs,
>                   struct list_head *locklist);
>  
>  #endif               /* _DUMP_DLM_LOCKS_H_ */

_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to