Project

General

Profile

Submit #1497

Updated by tuxillo about 10 years ago

HAMMER Util - add `mirror-dump header' to retrieve header information from the stream 

 

 This may be useful when you want to archive PFSes on a HAMMER filesystem 
 
 to a non-hammer storage, format the original or a new hard drive, then 
 
 restore the PFSes back on, realizing you forgot writing down the shared-uuid's 
 
 (OK you probably won't, but I did :)    The output is similar to that of 
 
 `hammer pfs-status' command applied to a live PFS, without `PFS #n' line 
 
 and the corresponding curly-brace. 

 

 --- 
  
  sbin/hammer/cmd_mirror.c     |     15 +++++++++++++-- 
  
  sbin/hammer/cmd_pseudofs.c |      2 -- 
  
  sbin/hammer/hammer.8         |      5 ++++- 
  
  sbin/hammer/hammer.c         |      4 ++-- 
  
  sbin/hammer/hammer.h         |      4 ++-- 
  
  5 files changed, 21 insertions(+), 9 deletions(-) 

 

 diff --git a/sbin/hammer/cmd_mirror.c b/sbin/hammer/cmd_mirror.c 
 
 index a17fced..d463858 100644 
 
 --- a/sbin/hammer/cmd_mirror.c 
 
 +++ b/sbin/hammer/cmd_mirror.c 
 
 @@ -717,7 +717,7 @@ again: 
  
  } 

  

  void 
 
 -hammer_cmd_mirror_dump(void) 
 
 +hammer_cmd_mirror_dump(char **av, int ac) 
  
  { 
 	 
 	 char *buf = malloc(SERIALBUF_SIZE); 
 	 
 	 struct hammer_ioc_mrecord_head pickup; 
 
 @@ -726,6 +726,12 @@ hammer_cmd_mirror_dump(void) 
 	 
 	 int size; 
 	 
 	 int offset; 
 	 
 	 int bytes; 
 
 + 	 int header_only = 0; 
 
 + 
 
 + 	 if (ac == 1 && strcmp(*av, "header") == 0) 
 
 + 		 header_only = 1; 
 
 + 	 else if (ac != 0) 
 
 + 		 mirror_usage(1); 

 	 

 	 /* 
 	  
 	  * Read and process the PFS header  
  
 @@ -735,6 +741,11 @@ hammer_cmd_mirror_dump(void) 

 	 

 	 mrec = read_mrecord(0, &error, &pickup); 

 

 + 	 if (header_only && mrec != NULL) { 
 
 + 		 dump_pfsd(&mrec->pfs.pfsd); 
 
 + 		 return; 
 
 + 	 } 
 
 + 
 	 
 	 /* 
 	  
 	  * Read and process bulk records 
 	  
 	  */ 
 
 @@ -1406,7 +1417,7 @@ mirror_usage(int code) 
 		 
 		 "hammer mirror-read <filesystem> [begin-tid]\n" 
 		 
 		 "hammer mirror-read-stream <filesystem> [begin-tid]\n" 
 		 
 		 "hammer mirror-write <filesystem>\n" 
 
 - 		 "hammer mirror-dump\n" 
 
 + 		 "hammer mirror-dump [header]\n" 
 		 
 		 "hammer mirror-copy [[user@]host:]<filesystem>" 
 				   
 				   " [[user@]host:]<filesystem>\n" 
 		 
 		 "hammer mirror-stream [[user@]host:]<filesystem>" 
 
 diff --git a/sbin/hammer/cmd_pseudofs.c b/sbin/hammer/cmd_pseudofs.c 
 
 index a987eff..db2beb7 100644 
 
 --- a/sbin/hammer/cmd_pseudofs.c 
 
 +++ b/sbin/hammer/cmd_pseudofs.c 
 
 @@ -38,7 +38,6 @@ 

  

  static void parse_pfsd_options(char **av, int ac, hammer_pseudofs_data_t pfsd); 
  
  static void init_pfsd(hammer_pseudofs_data_t pfsd, int is_slave); 
 
 -static void dump_pfsd(hammer_pseudofs_data_t pfsd); 
  
  static void pseudofs_usage(int code); 
  
  static int getyn(void); 
  
  static int timetosecs(char *str); 
 
 @@ -466,7 +465,6 @@ init_pfsd(hammer_pseudofs_data_t pfsd, int is_slave) 
 		 
 		 pfsd->mirror_flags |= HAMMER_PFSD_SLAVE; 
  
  } 

 

 -static 
  
  void 
  
  dump_pfsd(hammer_pseudofs_data_t pfsd) 
  
  { 
 
 diff --git a/sbin/hammer/hammer.8 b/sbin/hammer/hammer.8 
 
 index 44f6bae..feadd6a 100644 
 
 --- a/sbin/hammer/hammer.8 
 
 +++ b/sbin/hammer/hammer.8 
 
 @@ -762,12 +762,15 @@ configuration field for the two file systems do not match. 
  
  If the target PFS does not exist this command will ask you whether 
  
  you want to create a compatible PFS slave for the target or not. 
  
  .\" ==== mirror-dump ==== 
 
 -.It Ar mirror-dump 
 
 +.It Ar mirror-dump Ar [header] 
  
  A 
  
  .Ar mirror-read 
  
  can be piped into a 
  
  .Ar mirror-dump 
  
  to dump an ASCII representation of the mirroring stream. 
 
 +If the keyword 
 
 +.Ar header 
 
 +is specified, only the header information is shown. 
  
  .\" ==== mirror-copy ==== 
  
  .It Ar mirror-copy Ar [[user@]host:]filesystem Ar [[user@]host:]filesystem 
  
  This is a shortcut which pipes a 
 
 diff --git a/sbin/hammer/hammer.c b/sbin/hammer/hammer.c 
 
 index 000bb99..637b302 100644 
 
 --- a/sbin/hammer/hammer.c 
 
 +++ b/sbin/hammer/hammer.c 
 
 @@ -352,7 +352,7 @@ main(int ac, char **av) 
 		 
 		 else if (strcmp(av[0], "mirror-stream") == 0) 
 			 
 			 hammer_cmd_mirror_copy(av + 1, ac - 1, 1); 
 		 
 		 else if (strcmp(av[0], "mirror-dump") == 0) 
 
 - 			 hammer_cmd_mirror_dump(); 
 
 + 			 hammer_cmd_mirror_dump(av + 1, ac - 1); 
 		 
 		 else 
 			 
 			 usage(1); 
 		 
 		 exit(0); 
 
 @@ -482,7 +482,7 @@ usage(int exit_code) 
 		 
 		 "hammer mirror-read <filesystem> [begin-tid]\n" 
 		 
 		 "hammer mirror-read-stream <filesystem> [begin-tid]\n" 
 		 
 		 "hammer mirror-write <filesystem>\n" 
 
 - 		 "hammer mirror-dump\n" 
 
 + 		 "hammer mirror-dump [header]\n" 
 		 
 		 "hammer mirror-copy [[user@]host:]<filesystem>" 
 				   
 				   " [[user@]host:]<filesystem>\n" 
 		 
 		 "hammer mirror-stream [[user@]host:]<filesystem>" 
 
 diff --git a/sbin/hammer/hammer.h b/sbin/hammer/hammer.h 
 
 index b0c6bdd..59a9167 100644 
 
 --- a/sbin/hammer/hammer.h 
 
 +++ b/sbin/hammer/hammer.h 
 
 @@ -86,7 +86,7 @@ void hammer_cmd_synctid(char **av, int ac); 
  
  void hammer_cmd_mirror_read(char **av, int ac, int streaming); 
  
  void hammer_cmd_mirror_write(char **av, int ac); 
  
  void hammer_cmd_mirror_copy(char **av, int ac, int streaming); 
 
 -void hammer_cmd_mirror_dump(void); 
 
 +void hammer_cmd_mirror_dump(char **av, int ac); 
  
  void hammer_cmd_history(const char *offset_str, char **av, int ac); 
  
  void hammer_cmd_blockmap(void); 
  
  void hammer_cmd_reblock(char **av, int ac, int flags); 
 
 @@ -111,4 +111,4 @@ void hammer_reset_cycle(void); 

  

  int getpfs(struct hammer_ioc_pseudofs_rw *pfs, const char *path); 
  
  void relpfs(int fd, struct hammer_ioc_pseudofs_rw *pfs); 
 
 - 
 
 +void dump_pfsd(hammer_pseudofs_data_t pfsd); 
 
 --  
  
 1.6.4

Back