aboutsummaryrefslogblamecommitdiff
path: root/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
blob: d3f179c5cb167fbd426d954d02a0ec970b9e4445 (plain) (tree)





















                                                                      
                                                                               
                                                            
                                                               
                                                                           
                                                                  
                                                        
                                       
                                

   





                    
                   









                     

                 
                     
                     
                       




                       
                        
                            
 

                       




                                          
                                             
 

                                             






                                          
                                         
 

                                         


                                          
                                        
 
                                             











                                          

                                       



                                                                               

            










                                                             
      





                    
                        





                     
                        




                     
                        



                     
                 
                   
                  

                    
























                                                                                

                                                                          

                                                                          






                                                                          
                                                                          



                                                                          
                                                                          
                 
                                                                          




                                                                          
                                                                          



                                                                          
                                                                          



                                                                            
                                        
                                            
                                      

                                     
                   

                           




                                                                    
                                       
                        
                                                                    
                         

                                                       


                                                                    

                                                                          






                                                               
                                                                   

                                                          
                                                                      

                                                                        
                                                                      
                                                                        
                                                
                                                                               
                         
                                                                              
                                   

                                                               
                       
                                                                    
                                                                 


                                                                         
                                                                        

                                                                 
                                       
                         
                                                                          
                         
                                                      

                                                                               
                        
                                                                   
                         

                                                                               
                          
                                                  
                                                                 
                      

                                                                         

                                                                     



                                                                          

                                                      

                                                        





                        



                                                              

                                 


                      
                                                                  
 


                                              
                                              
 




                                                                    
                            









                                                                                


















                                                                               



                                                           

                                                            



                                                                            
                                                            
                                                  

                                                 

                                                                     




                                                                               
                                                                                












                                                           
    

                                                                                












                                                                 






                                                                          
                                                                       

                                                                 



                            











                                                                   
  





















                                                                    

                                                                           

                                                                           



                                                                          




                                                                          
                                                                                









                                                                        



                                                          
                



                                                                          
                 


















                                                                   














                                                                            

















                                                                            

                                     















































                                                                                




                                                  
                                                      
                                                                       
                                                                    
                                              













                                                                           










                                                                            



                                                    








                            
                                  
  
                                        




                                      
                       
                            



                                     
 




















                                                                                





                                                                                





                                                        










                                                                                
                                






























                                                                            





                     



                                                                           






                                                                           




                              





















                                                                                




                                                                        


                               









                                                                       
              



                                                                  


                                     







                                                                                
                                            


                                                                          

         
                                                 
                                      



                                                                     
 



                                                                     


                           












                                                                 
 

                                 
                              




















                                                                          


           

                                    
                                      
                                                                     


         

                         




                     
                                                   
                                                   
                                                                        
  
                                      


                                                                              

                                                                             
                         
                                                                  
                                   

                                                                      
                                                                   





                                                                                

                                           




                                      
                                                

                                                           
              
                                
                       
                           
                    

                                


                                 

                           
                                                                   






                                        


                                                       
                         
              







                                                                 





                                                                      

                                         


                                                                         
                                                                     

                                                                           

                              
                                                                

                                            










                                                                           

                          













                                                                                












                                                                               

                                                                             









                                                                         









                                                                           
                                            
                         
                              




















                                                                               


                                                                              
                                      


                                                                                
                                      








                                                                                
                              


                                                                                
                              












                                                                              
                            

         

































                                                                                
                                                           
                                                                     
                                                      
                           
                            

                                                                             
                                            


                                                                        
                            

         


                                                                              
                            




                                                                              
                                                         
           
                                            
                                                              
                                                             
                                     
                          




                                                                            
                                    

















                                                                           


                                                                           

                                                                        















                                                                            


                 











                                                                           








                                                                              


                                                                         


                        


                                      
                                           
                                        













                                                                              


                                                                         


                                                    

                        

                                                   

                                                                           
                                           
                                                                  
                                                                 

                                                





                                                                            
       
                            

                             
                     




                             




                       
                                               
























































                                                                                



                                                              


















                                                                               
                                      





                            
                                                      



                                       


                                           




























                                                                                


                                                                      
                                
                                                                      
                                        
                                                                        
                                
                 













                                                                                
                                                             
















                                                                      







                                                                      











                                                                      




















































                                                                        
                                
                                    
                        
                                       

                            
                        
                          
                          
                   
 



                                                                 
                                                                      
                                          
 




                                                                        






















                                                                               

                                                   
                           

                                                                            



















                                                                        



                                                                         



                                                                                





























                                                                             







                                                                        



                                                                       



                                                                 





                                                                                




                                                                      
                                                          



                                                          

         




































                                                                              


                                        
                                                           
 
                                                    
                                                                          



                                                                           
                                 
                                                                      





                                                         





                                                                              
                                                                             






                                                                        

                                                   

                       
                                                                      


                                                                       
                                                                             

                              
                                    

















                                                                        



                                                                         



                                                                  



                                                                       



                                                                 







                                                                 



                                                                          
                           

                                 
                                                                       
                                                                           


                            



                                                                
                                                                                



                                                         
 



                                                               
                                                                                


                                                         



         


























                                                                               
                                                                     







                                                                           
 
  














                                         
                      









                                                                    
                                                                          
                                          
                                                               


                                                     


                                                                      







                                                       

                                                                         



                                           
                                                                              



                                          

                                                                       


                                      
                                                                     



                                        
                                                                      



                                        

                                                                               


                                        
                                                                                


                                                




                                                                             

                                                                            
                                                                   










                                                                                
                                          
                                                                               

                                          


                                         
                                                                         



                                   
                                                                                


                                
                                      
                                                                                


                                      





                                                                         










                                                                          

                                                           
                                                                         


                                                                             
                                                                    
                                                                         

                                                                   
                        
                                                                         

                                                                 
                 
                                                         
                                                                          




                                                                                
                                                                            



                                                                             













                                                                                


                                                 
                                                                            



                                                                              
                                                                            



                                                                           



                                                                              











                                                                             
                                                                           



                                                 
                                                                             

                           
                                               



                                                  
 


                                                             









                                                                            

                                                                              


                                                                     
                               












                                                                   
                                                 
                                                                          
                                                                              
                           

                                                  






























                                                                               

         
                                                                          




                                       

                                                            
 
                                                         
                                         
                                                          




                                 
                   


  


                                    

                                                          



































































                                                                                
                             


                                                               

                                                           
  
                                                                           
                        
  
                                                                             

                                                                           

                                                                         
  
                                                                             


                                                                               


                                                                           

                                                                            
  
                                                                         
  
                                            
  
                                                                    
  
                                                         
  

                                                                        
  

                                                                        
  
                                       
  
                                                                                
  

                                                                  
  








                                                                               
                    
                               

                                         
                             

                         


                                
                               
                                
                               
                        





                                                 
                               

                                   
 





                                                                            
                           
                                                                       
                                         



                                        


                                           
















                                                                          
                                                     
                              
                         









                                                        
                              
                         








                                                                      

                              


                                                                         






                                                                           

                                                                           
                              

                                  
                                                           












                                                                               


                                                       














                                                                                




                                                                                













                                                                              


                                                                          

                           

                                                          
                                       























                                                                                
                                            



                                   
          
















                                                                               
                                                    
                                             

                                       
                                    
 
                  
                                                                      
                   








                                      
                              







                                                                     


                                                                             








                                                                            



                                                                             



                        
                                 
                                    








                                                                            













                                                                            
                                                                   

                                  





                                                    
                                     
                                                                       

                                                  
                                                    
                         












































                                                                                
                                                            










                                                                          

                           
                           
                            




                             






































                                                                                
                              
                             
                         

                              
















                                                                       
                                                                         






                                      
           
























                                                                               


                                                  
                            

                                                                            



                                
                                                                         
















































                                                                             
                                                           
 






                                                                              


                                                                          



                                                                        

          
























                                                                                













                                                                             

                                                                        




                                                                                


































































                                                                                

                                                                    














                                                                              
                                                                                
   


                                                              
 
                                              
                                 















                                                                          















                                                                               
                           























                                                                          



























































                                                                                













































                                                                            


                                                       






































                                                                                

                                     
                                    
                                     
                                   




                                                                               
           
                               
 
                                           
                                         


                                 
                         
 
                                              








                                                                             
                           
                                            
                    

                                        











                                                                            
 


                                                          
                                                            
                    

                                                             




                            




                                                                                
                                                  
 
                                           



                                        
                     

                                              









                                                                             
                             
                                            


                                                    

                                        

                 

                                                 
                                                                      
                                                                          
                                              
                            
                                                   
 
                                                                            




                                                                           


                                      
 
 




                                                                              
                                                                               





                                                              
 

                            
 
           

                                                                       




                                                                

                                 
                                   













                                                                            
                                                                            

                      
                                                              



                                                               















                                                                     


                                                                             




                                                                      


                                                         


                                                          







                                                                                











                                                                               

                                                                 







                                                                               













                                                                  





                                                                 




                                                                       












                                                                               
                                                                








                                                                               
 



                                                                       
                                                
                                                                               






                                                                              






                                              

                         
 
                                             
 






                                                                   




                   
                                                                            
  


                                                                              

                                                                             
                                                         
                                                             









                                                                              
                                     

                                                                           
                                    
                                              

                                 

                           
                                                            




                                                
                                       
                              


                                               


                                                   


                                               














                                                                                

                                                           

                                                                              
 
                  


                                                                      





                                                                         
 

                                                       
 


                                                                  
                 
                                                                       






                                               
                                     
                                       

         





                                                                         
                                        


                     







                                                                

                                     
                













                                                                                









































                                                                                
                                                  





                                                                             





                                                                       
                                                                        
                                              






                                                                            
























































































                                                                                





                         






































                                                                             
                                                   











                                                                      
                                                           







































































                                                                                
                                                                           











                                                                       

                                   






                                      
                              
                      

                           
                                                      
                            


                                                   

























                                                                                
                                    
                                                                             













                                                                               
                                
                 
         
 
























































                                                                                

                                                                 
                                
         
 












                                                                  
              
                    




                                                 


                            






















                                                                                



                                                                       
                       



                                                                        













                                                                               

                                                               
                           
         


                                            
 

                                                              
                           
         
 
                                                  

                        

                         

                            


                     













































                                                                                



                                                                        



                                      
              



                            









                                                                                


               








                                                                        









                                                            



                             
                                      

                 

























                                                                               














                                                                            
                                                             
 






                                                                           



                          
                                   

                                                   
                                               






                                     
                                     
                                            

                           
                                                      

                            
                                                    
                              


                                                           






                                                                                






                                                                             












                                                                                
















































































































                                                                                





                                    
                                       




                                   
           
                                       
 
                                 



                                                                      
                             

                                                                           
 
                                           
 


                                                                    



                                                           

                                   
                                         
 
                                                                              
 

                                                 
 







                                                              
                                                      





                                                                              
                                                                






                                                                             
                 
 








                                                                         


                       

                                              
                                                             
                                              



                                                                            


                                                                       

                                           



                                                                       
 



                                          
                                   
 



                                                                             
                                                  
                                                   














                                                                
                                                          

                                                               
 
                                                                    
                         


                                                                              
                

                                                                             


                                                 
                                                                      

                                                        
                                                                    

                                                        













                                                                              

 
  

































                                                                                







































































































                                                                                
           
































                                                                     

                                    
                                   











































                                                                      
                                                                       
                                                         
                                          
















                                                                       
                                                                        
                                                          




                                           









                                                                    
                                                                         


                                                                          
                                        


                            





                                                           











                                                                             
  




                                                                 
                                                  



























                                                                             


                                                   
                                                       
                                                    













                                                                        
                                                                       
                                                                          
                                        
                                                               


































                                                                               

                                                            






















                                                                              









                                                                             



















                                                                               

                                                            


                                        


                                                                              

                                                                               

                                                                               










                                                                                






                                                                                
                                                                           

                      
























                                                                                






































                                                                               








                                                                              







                                                                         
                                                                             




                              

                                             
                                                   
                                            
                                                
 
                                                         

                                                                          
                                                                   

                                                                       


                                                       
                                               
                                             
 







                                                                               
                                           
 
                                         
                                                                   


                                                                            













                                                                           
                                                                         























                                                                              


                                                  








                                                                            
                                                            


                                                          

                                                             







                                                           
                                              


                                   
                                                         






                                               





                                                   









                                                                                
                                                           



                                        
                             
 


                                                       
 




















                                                                          


                               

                                   
                                                              


                                   

                   
                  
          






                                          
                      




                                                                     
                                   

                                                         
                                   


                                                            



                                                                                
           

                                                                      





                                                                    
          




































































                                                                               




                                          

                                    
 

                                                                              

                                                                        



                                                  



                                                                 
                                                  
 




                                                            
                  

                                                              
                         

                                 
              







                                                                     
      








                                                      
                                                
                                         



                                                                      







                                                                             
                 
         
 







                                             



















                                                                             





                                                     








                                                                          






                                                                 

                                                                        




                                                                             








                                                                      









                                                        
                                                         




                                                                          


                           




















                                                                                
                                                                    



















                                                                            





                                            
                                    
                                     

                             
 






                                                                              


                                                                        
                                         

                           
 


                                                                        
                                                              


                                                      

                                                                               
                                                                       

                                                                    


                           


                                                            

                                     
                  

                                                              
                         
         
 







                                                      
                  

                                                                      
                         

                                                                          
                                                               

                                                 

         

                                             

         
                   




                   
                                             











                                                                         
                                       

                  

                           
                                                         

                            
                                            



                                              

                                                                  

                                                                       




                                                                               




                                                                              











                                                                                

                                            
                                              




                                                              
                           
                                              



                                                                      
                                
                                

                                                                              



                                       

                                                                      
                           








                                                                              

                                                                            







                                                                               











                                                                              








                                                                             

                                                                             


















                                                                                

                                             
                                                         

                                                           



                                                                                
                                                                              

                                                                                



                                                                                

                         

                                     







                                                                   

                                                                    
 
                                  


                                                                                









                                                                           


                                                                               

                                                     

                 
                                                             


                                      









                                                                                      


                     

                            

                           

                








                                                     
                   
                                                  
 
                            








                                                                           

                                           
 








                                                                          
 



















                                                                             
                                         













                                                                             
                                         











                                                                          




                                                                   

                                          
                                         

                                                                         
                 



                                            
                 
                                    





                                                                               
                 


                                                                         
                 


                                                                         
                 

                                    














                                                        
                                     
                
              
 




                                                      
                                                

                              
                                                 






                                                                                



                                                                        
                     
 
                                                  









                                                               
                                                             
                               

                               



                                                                   

                                                                         
                   
                                                     


                                           



                                                                
 







                                                                             
                                                                            





                                                                            



                   






                                                                               
                                                         



                                                                 


                                   

                                       
                

                    

                             



                                              
                                      



                                            
                                   
 






















































                                                                                
                                                                  




















                                                                                
                                

                               


               
                                     
                                                    




                                                             
                                                                


                                         
                                                   
            
                                                

































































                                                                         






















                                                                  
                    

                      





























                                                                           
                                                                          
 





                                                                








                                                                        


                                                                         
                




                                                              


                                                             












                                                                              
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
 * Copyright (c) 2012 by Frederik Wessels. All rights reserved.
 * Copyright (c) 2012 Martin Matuska <mm@FreeBSD.org>. All rights reserved.
 * Copyright (c) 2013 by Prasad Joshi (sTec). All rights reserved.
 * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>.
 * Copyright 2016 Nexenta Systems, Inc.
 * Copyright (c) 2017 Datto Inc.
 */

#include <solaris.h>
#include <assert.h>
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <libgen.h>
#include <libintl.h>
#include <libuutil.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <priv.h>
#include <pwd.h>
#include <zone.h>
#include <sys/time.h>
#include <zfs_prop.h>
#include <sys/fs/zfs.h>
#include <sys/stat.h>

#include <libzfs.h>

#include "zpool_util.h"
#include "zfs_comutil.h"
#include "zfeature_common.h"

#include "statcommon.h"

static int zpool_do_create(int, char **);
static int zpool_do_destroy(int, char **);

static int zpool_do_add(int, char **);
static int zpool_do_remove(int, char **);
static int zpool_do_labelclear(int, char **);

static int zpool_do_checkpoint(int, char **);

static int zpool_do_list(int, char **);
static int zpool_do_iostat(int, char **);
static int zpool_do_status(int, char **);

static int zpool_do_online(int, char **);
static int zpool_do_offline(int, char **);
static int zpool_do_clear(int, char **);
static int zpool_do_reopen(int, char **);

static int zpool_do_reguid(int, char **);

static int zpool_do_attach(int, char **);
static int zpool_do_detach(int, char **);
static int zpool_do_replace(int, char **);
static int zpool_do_split(int, char **);

static int zpool_do_initialize(int, char **);
static int zpool_do_scrub(int, char **);

static int zpool_do_import(int, char **);
static int zpool_do_export(int, char **);

static int zpool_do_upgrade(int, char **);

static int zpool_do_history(int, char **);

static int zpool_do_get(int, char **);
static int zpool_do_set(int, char **);

static int zpool_do_sync(int, char **);

/*
 * These libumem hooks provide a reasonable set of defaults for the allocator's
 * debugging facilities.
 */

#ifdef DEBUG
const char *
_umem_debug_init(void)
{
	return ("default,verbose"); /* $UMEM_DEBUG setting */
}

const char *
_umem_logging_init(void)
{
	return ("fail,contents"); /* $UMEM_LOGGING setting */
}
#endif

typedef enum {
	HELP_ADD,
	HELP_ATTACH,
	HELP_CLEAR,
	HELP_CREATE,
	HELP_CHECKPOINT,
	HELP_DESTROY,
	HELP_DETACH,
	HELP_EXPORT,
	HELP_HISTORY,
	HELP_IMPORT,
	HELP_IOSTAT,
	HELP_LABELCLEAR,
	HELP_LIST,
	HELP_OFFLINE,
	HELP_ONLINE,
	HELP_REPLACE,
	HELP_REMOVE,
	HELP_INITIALIZE,
	HELP_SCRUB,
	HELP_STATUS,
	HELP_UPGRADE,
	HELP_GET,
	HELP_SET,
	HELP_SPLIT,
	HELP_SYNC,
	HELP_REGUID,
	HELP_REOPEN
} zpool_help_t;


typedef struct zpool_command {
	const char	*name;
	int		(*func)(int, char **);
	zpool_help_t	usage;
} zpool_command_t;

/*
 * Master command table.  Each ZFS command has a name, associated function, and
 * usage message.  The usage messages need to be internationalized, so we have
 * to have a function to return the usage message based on a command index.
 *
 * These commands are organized according to how they are displayed in the usage
 * message.  An empty command (one with a NULL name) indicates an empty line in
 * the generic usage message.
 */
static zpool_command_t command_table[] = {
	{ "create",	zpool_do_create,	HELP_CREATE		},
	{ "destroy",	zpool_do_destroy,	HELP_DESTROY		},
	{ NULL },
	{ "add",	zpool_do_add,		HELP_ADD		},
	{ "remove",	zpool_do_remove,	HELP_REMOVE		},
	{ NULL },
	{ "labelclear",	zpool_do_labelclear,	HELP_LABELCLEAR		},
	{ NULL },
	{ "checkpoint",	zpool_do_checkpoint,	HELP_CHECKPOINT		},
	{ NULL },
	{ "list",	zpool_do_list,		HELP_LIST		},
	{ "iostat",	zpool_do_iostat,	HELP_IOSTAT		},
	{ "status",	zpool_do_status,	HELP_STATUS		},
	{ NULL },
	{ "online",	zpool_do_online,	HELP_ONLINE		},
	{ "offline",	zpool_do_offline,	HELP_OFFLINE		},
	{ "clear",	zpool_do_clear,		HELP_CLEAR		},
	{ "reopen",	zpool_do_reopen,	HELP_REOPEN		},
	{ NULL },
	{ "attach",	zpool_do_attach,	HELP_ATTACH		},
	{ "detach",	zpool_do_detach,	HELP_DETACH		},
	{ "replace",	zpool_do_replace,	HELP_REPLACE		},
	{ "split",	zpool_do_split,		HELP_SPLIT		},
	{ NULL },
	{ "initialize",	zpool_do_initialize,	HELP_INITIALIZE		},
	{ "scrub",	zpool_do_scrub,		HELP_SCRUB		},
	{ NULL },
	{ "import",	zpool_do_import,	HELP_IMPORT		},
	{ "export",	zpool_do_export,	HELP_EXPORT		},
	{ "upgrade",	zpool_do_upgrade,	HELP_UPGRADE		},
	{ "reguid",	zpool_do_reguid,	HELP_REGUID		},
	{ NULL },
	{ "history",	zpool_do_history,	HELP_HISTORY		},
	{ "get",	zpool_do_get,		HELP_GET		},
	{ "set",	zpool_do_set,		HELP_SET		},
	{ "sync",	zpool_do_sync,		HELP_SYNC		},
};

#define	NCOMMAND	(sizeof (command_table) / sizeof (command_table[0]))

static zpool_command_t *current_command;
static char history_str[HIS_MAX_RECORD_LEN];
static boolean_t log_history = B_TRUE;
static uint_t timestamp_fmt = NODATE;

static const char *
get_usage(zpool_help_t idx)
{
	switch (idx) {
	case HELP_ADD:
		return (gettext("\tadd [-fn] <pool> <vdev> ...\n"));
	case HELP_ATTACH:
		return (gettext("\tattach [-f] <pool> <device> "
		    "<new-device>\n"));
	case HELP_CLEAR:
		return (gettext("\tclear [-nF] <pool> [device]\n"));
	case HELP_CREATE:
		return (gettext("\tcreate [-fnd] [-B] "
		    "[-o property=value] ... \n"
		    "\t    [-O file-system-property=value] ...\n"
		    "\t    [-m mountpoint] [-R root] [-t tempname] "
		    "<pool> <vdev> ...\n"));
	case HELP_CHECKPOINT:
		return (gettext("\tcheckpoint [--discard] <pool> ...\n"));
	case HELP_DESTROY:
		return (gettext("\tdestroy [-f] <pool>\n"));
	case HELP_DETACH:
		return (gettext("\tdetach <pool> <device>\n"));
	case HELP_EXPORT:
		return (gettext("\texport [-f] <pool> ...\n"));
	case HELP_HISTORY:
		return (gettext("\thistory [-il] [<pool>] ...\n"));
	case HELP_IMPORT:
		return (gettext("\timport [-d dir] [-D]\n"
		    "\timport [-o mntopts] [-o property=value] ... \n"
		    "\t    [-d dir | -c cachefile] [-D] [-f] [-m] [-N] "
		    "[-R root] [-F [-n]] -a\n"
		    "\timport [-o mntopts] [-o property=value] ... \n"
		    "\t    [-d dir | -c cachefile] [-D] [-f] [-m] [-N] "
		    "[-R root] [-F [-n]] [-t]\n"
		    "\t    [--rewind-to-checkpoint] <pool | id> [newpool]\n"));
	case HELP_IOSTAT:
		return (gettext("\tiostat [-v] [-T d|u] [pool] ... [interval "
		    "[count]]\n"));
	case HELP_LABELCLEAR:
		return (gettext("\tlabelclear [-f] <vdev>\n"));
	case HELP_LIST:
		return (gettext("\tlist [-Hpv] [-o property[,...]] "
		    "[-T d|u] [pool] ... [interval [count]]\n"));
	case HELP_OFFLINE:
		return (gettext("\toffline [-t] <pool> <device> ...\n"));
	case HELP_ONLINE:
		return (gettext("\tonline [-e] <pool> <device> ...\n"));
	case HELP_REPLACE:
		return (gettext("\treplace [-f] <pool> <device> "
		    "[new-device]\n"));
	case HELP_REMOVE:
		return (gettext("\tremove [-nps] <pool> <device> ...\n"));
	case HELP_REOPEN:
		return (gettext("\treopen <pool>\n"));
	case HELP_INITIALIZE:
		return (gettext("\tinitialize [-cs] <pool> [<device> ...]\n"));
	case HELP_SCRUB:
		return (gettext("\tscrub [-s | -p] <pool> ...\n"));
	case HELP_STATUS:
		return (gettext("\tstatus [-vx] [-T d|u] [pool] ... [interval "
		    "[count]]\n"));
	case HELP_UPGRADE:
		return (gettext("\tupgrade [-v]\n"
		    "\tupgrade [-V version] <-a | pool ...>\n"));
	case HELP_GET:
		return (gettext("\tget [-Hp] [-o \"all\" | field[,...]] "
		    "<\"all\" | property[,...]> <pool> ...\n"));
	case HELP_SET:
		return (gettext("\tset <property=value> <pool> \n"));
	case HELP_SPLIT:
		return (gettext("\tsplit [-n] [-R altroot] [-o mntopts]\n"
		    "\t    [-o property=value] <pool> <newpool> "
		    "[<device> ...]\n"));
	case HELP_REGUID:
		return (gettext("\treguid <pool>\n"));
	case HELP_SYNC:
		return (gettext("\tsync [pool] ...\n"));
	}

	abort();
	/* NOTREACHED */
}


/*
 * Callback routine that will print out a pool property value.
 */
static int
print_prop_cb(int prop, void *cb)
{
	FILE *fp = cb;

	(void) fprintf(fp, "\t%-15s  ", zpool_prop_to_name(prop));

	if (zpool_prop_readonly(prop))
		(void) fprintf(fp, "  NO   ");
	else
		(void) fprintf(fp, " YES   ");

	if (zpool_prop_values(prop) == NULL)
		(void) fprintf(fp, "-\n");
	else
		(void) fprintf(fp, "%s\n", zpool_prop_values(prop));

	return (ZPROP_CONT);
}

/*
 * Display usage message.  If we're inside a command, display only the usage for
 * that command.  Otherwise, iterate over the entire command table and display
 * a complete usage message.
 */
void
usage(boolean_t requested)
{
	FILE *fp = requested ? stdout : stderr;

	if (current_command == NULL) {
		int i;

		(void) fprintf(fp, gettext("usage: zpool command args ...\n"));
		(void) fprintf(fp,
		    gettext("where 'command' is one of the following:\n\n"));

		for (i = 0; i < NCOMMAND; i++) {
			if (command_table[i].name == NULL)
				(void) fprintf(fp, "\n");
			else
				(void) fprintf(fp, "%s",
				    get_usage(command_table[i].usage));
		}
	} else {
		(void) fprintf(fp, gettext("usage:\n"));
		(void) fprintf(fp, "%s", get_usage(current_command->usage));
	}

	if (current_command != NULL &&
	    ((strcmp(current_command->name, "set") == 0) ||
	    (strcmp(current_command->name, "get") == 0) ||
	    (strcmp(current_command->name, "list") == 0))) {

		(void) fprintf(fp,
		    gettext("\nthe following properties are supported:\n"));

		(void) fprintf(fp, "\n\t%-15s  %s   %s\n\n",
		    "PROPERTY", "EDIT", "VALUES");

		/* Iterate over all properties */
		(void) zprop_iter(print_prop_cb, fp, B_FALSE, B_TRUE,
		    ZFS_TYPE_POOL);

		(void) fprintf(fp, "\t%-15s   ", "feature@...");
		(void) fprintf(fp, "YES   disabled | enabled | active\n");

		(void) fprintf(fp, gettext("\nThe feature@ properties must be "
		    "appended with a feature name.\nSee zpool-features(7).\n"));
	}

	/*
	 * See comments at end of main().
	 */
	if (getenv("ZFS_ABORT") != NULL) {
		(void) printf("dumping core by request\n");
		abort();
	}

	exit(requested ? 0 : 2);
}

void
print_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
    boolean_t print_logs)
{
	nvlist_t **child;
	uint_t c, children;
	char *vname;

	if (name != NULL)
		(void) printf("\t%*s%s\n", indent, "", name);

	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
	    &child, &children) != 0)
		return;

	for (c = 0; c < children; c++) {
		uint64_t is_log = B_FALSE;

		(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
		    &is_log);
		if ((is_log && !print_logs) || (!is_log && print_logs))
			continue;

		vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE);
		print_vdev_tree(zhp, vname, child[c], indent + 2,
		    B_FALSE);
		free(vname);
	}
}

static boolean_t
prop_list_contains_feature(nvlist_t *proplist)
{
	nvpair_t *nvp;
	for (nvp = nvlist_next_nvpair(proplist, NULL); NULL != nvp;
	    nvp = nvlist_next_nvpair(proplist, nvp)) {
		if (zpool_prop_feature(nvpair_name(nvp)))
			return (B_TRUE);
	}
	return (B_FALSE);
}

/*
 * Add a property pair (name, string-value) into a property nvlist.
 */
static int
add_prop_list(const char *propname, char *propval, nvlist_t **props,
    boolean_t poolprop)
{
	zpool_prop_t prop = ZPROP_INVAL;
	zfs_prop_t fprop;
	nvlist_t *proplist;
	const char *normnm;
	char *strval;

	if (*props == NULL &&
	    nvlist_alloc(props, NV_UNIQUE_NAME, 0) != 0) {
		(void) fprintf(stderr,
		    gettext("internal error: out of memory\n"));
		return (1);
	}

	proplist = *props;

	if (poolprop) {
		const char *vname = zpool_prop_to_name(ZPOOL_PROP_VERSION);

		if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL &&
		    !zpool_prop_feature(propname)) {
			(void) fprintf(stderr, gettext("property '%s' is "
			    "not a valid pool property\n"), propname);
			return (2);
		}

		/*
		 * feature@ properties and version should not be specified
		 * at the same time.
		 */
		if ((prop == ZPOOL_PROP_INVAL && zpool_prop_feature(propname) &&
		    nvlist_exists(proplist, vname)) ||
		    (prop == ZPOOL_PROP_VERSION &&
		    prop_list_contains_feature(proplist))) {
			(void) fprintf(stderr, gettext("'feature@' and "
			    "'version' properties cannot be specified "
			    "together\n"));
			return (2);
		}


		if (zpool_prop_feature(propname))
			normnm = propname;
		else
			normnm = zpool_prop_to_name(prop);
	} else {
		if ((fprop = zfs_name_to_prop(propname)) != ZPROP_INVAL) {
			normnm = zfs_prop_to_name(fprop);
		} else {
			normnm = propname;
		}
	}

	if (nvlist_lookup_string(proplist, normnm, &strval) == 0 &&
	    prop != ZPOOL_PROP_CACHEFILE) {
		(void) fprintf(stderr, gettext("property '%s' "
		    "specified multiple times\n"), propname);
		return (2);
	}

	if (nvlist_add_string(proplist, normnm, propval) != 0) {
		(void) fprintf(stderr, gettext("internal "
		    "error: out of memory\n"));
		return (1);
	}

	return (0);
}

/*
 * Set a default property pair (name, string-value) in a property nvlist
 */
static int
add_prop_list_default(const char *propname, char *propval, nvlist_t **props,
    boolean_t poolprop)
{
	char *pval;

	if (nvlist_lookup_string(*props, propname, &pval) == 0)
		return (0);

	return (add_prop_list(propname, propval, props, poolprop));
}

/*
 * zpool add [-fn] <pool> <vdev> ...
 *
 *	-f	Force addition of devices, even if they appear in use
 *	-n	Do not add the devices, but display the resulting layout if
 *		they were to be added.
 *
 * Adds the given vdevs to 'pool'.  As with create, the bulk of this work is
 * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
 * libzfs.
 */
int
zpool_do_add(int argc, char **argv)
{
	boolean_t force = B_FALSE;
	boolean_t dryrun = B_FALSE;
	int c;
	nvlist_t *nvroot;
	char *poolname;
	zpool_boot_label_t boot_type;
	uint64_t boot_size;
	int ret;
	zpool_handle_t *zhp;
	nvlist_t *config;

	/* check options */
	while ((c = getopt(argc, argv, "fn")) != -1) {
		switch (c) {
		case 'f':
			force = B_TRUE;
			break;
		case 'n':
			dryrun = B_TRUE;