aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@ozlabs.org>2015-09-25 20:19:15 -0400
committerJames Bottomley <JBottomley@Odin.com>2015-10-01 13:46:28 -0400
commit1378889c563a2938d231203ed36c041af183b798 (patch)
tree3c3e4e5c8c9c5803a56629ab78cad9dcf6fcd12c /tools
parent52f5664a87474894e7da44f3b778dbe4e4c740b7 (diff)
scsi_dh: Use the correct module name when loading device handler
This fixes a bug in recent kernels which results in failure to boot on systems that have multipath SCSI disks. I observed this failure on a POWER8 server where all the disks are multipath SCSI disks. The symptoms are several messages like this on the console: [ 3.018700] device-mapper: table: 253:0: multipath: error attaching hardware handler [ 3.018828] device-mapper: ioctl: error adding target to table and the system does not find its disks, and therefore fails to boot. Bisection revealed that the bug was introduced in commit 566079c849cf, "dm-mpath, scsi_dh: request scsi_dh modules in scsi_dh, not dm-mpath". The specific reason for the failure is that where we previously loaded the "scsi_dh_alua" module, we are now trying to load the "alua" module, which doesn't exist. To fix this, we change the request_module call in scsi_dh_lookup() to prepend "scsi_dh_" to the name, just like the old code in drivers/md/dm-mpath.c:parse_hw_handler() used to do. [jejb: also fixes issue spotted by Sasha Levin that formatting characters could be passed in via sysfs and cause issues with request_module()] Fixes: 566079c849cf Signed-off-by: Paul Mackerras <paulus@ozlabs.org> Cc: Sasha Levin <sasha.levin@oracle.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'tools')
0 files changed, 0 insertions, 0 deletions
href='/cgit/cgit.cgi/litmus-rt.git/diff/drivers/net/bonding/bond_sysfs.c?id=d6cd4715e21508bebbb1928c91d628bd65f5de5f'>diffstats
path: root/drivers/net/bonding/bond_sysfs.c
blob: 5acd557cea9ba7ab4c4cbcb36323dccee02bff20 (plain) (tree)



















                                                                              
   


                                           

                         
                         
                        







                             


                            
                              
                              

                              
 
                    
 
                                                              
                                                                         
 



                                                  
                                                               
 

                                                            


                             
                    
 
                                                             



                                                                         
                                                               

                              
                                                                  
         

                                                               

                      


                   
                                                                               
 
                                                            

                             
                                                             





                                                                    







                                                                 

                                                                    
 
                                                   

                                           
                            
 






                                                      
                                                            
                                              
                         
                                                           
                                 
                 

                                            
 
                            
                                                         
                               
                                                                    

                                                       
                                                                             




                                      
 



                                                                           

           
                                                                                 
                      
 
 



                                                                            

                                                         




                                                                    
                                                                        



                                                              
                                                   
                                                                        




                                          

                                                           


                                  
                                                        
                                                   
                                                         





                                       

                                                                            


                            
                                          
 
                               




                                                                         
                                                               



                                                                   
                                 

                                                               







                                                                    


                                                                     



                                            
                         
                            
                                      
                                          


                                                             

                                                                               



                                                                            

                                         
 









                                                                             
 
                                                                    
                           

                                                                     
                                      
                                 
                 

                                          
                                                                                             



                                                           



                                                   
                                                                                 






                                                                
                                                                           
 


                                                                      
                                                            

                                                                  

                                                           
                                        



                                                       
                 
 
                                                   


                                                                              
                        
                                  
 




                                
                                 


                                                                                
                                                                   


                                      
                                                          
                                                            
                                                                   




                                                              
                                                       
                        

                                                                                       





                                      

                                                                                        


                     
                      


                   

                                                                  




                                                                     

                                                                          
 
                                          


                                                                  
                                           

 


                                                                

                                   
                                          

                                        

                                                                                



                             
                                                        
                             

                                                                   


                              





                                                          

                                                           

                                                                           
                                  



                   

                                                          

  

                                                                  
   


                                                                    
 
                                          
 


                                                                            

 


                                                                     

                                   
                                          

                                        
                                                                              




                                        
                                                            
                             
                                                                             






                                                           
                                                                     

                                                                          



                   

                                                                    

  

                             


                                                                       
 
                                          


                                                                            
                                                  

 


                                                                        

                      
                                          
 
                                                           
                            
                                                                      



                                                                         
                                                                                  


                                        


                                                                      
 
                                                    
                                        
                                                         
                                          





                                              

                                                                              

  


                                                                 


                                                                        


                                          


                                                                              

 


                                                                         

                      


                                          
                                                                              
                                        
                              

         

                                                            
                                                                        

                                             

         
                                               


                                                                       

                     

 

                                                                            

  




                                                                     


                                                                       
 
                                          
 
                                                               

 


                                                                        

                                   
                                          

                                                 
                                                                




                                        
                                                                                          




                                                            

                                                               
                                              

                                                           
                                  

                                                                                                                
                                        


                                                             


                                           

                                                                                                        






                                                                  








                                                                             





                   

                                                                          



                                


                                                                      

                       
                                          


                                                    

                                                                     
         

                                                               


                   


                                                                       
 
                         
                                         
                                          
                        




                                           
                                                                                 
                                                                                      
                                                            



                                                                                      
                                                                       
                                                                      
                                                                                  
                                                                    


                                              
                                              

                                                                        




                                                       
                                                                 




                                                
                                         
                                                                                 
                                                                                     
                                                            



                                      
                                                                       
                                                      
                                      

                                                                          



                                                                                                



                                         

                                                                                      


                                      
                

                                                                                                        






                             
                                                                                                           





                                                                       


                                                                    
 
                                          
 
                                                                                  

 


                                                                     

                                   
                                          

                                     
                                                                                      





                                                 
                                                                                



                              
                                                                                         




                                                               
                                                                                                                             



                                                                      

                                                                         


                                                                      





                   

                                                                    
 


                                                                  
 
                                          
 
                                                                                


 


                                                                   

                                   
                                          

                                     
                                                                                    





                                                 
                                                            




                                        
                                                                                         




                                                               
                                                                                                                             



                                                                      

                                                                       


                                                                    




                   

                                                                




                                                                        


                                                               
 
                                          


                                                               
                                        

 


                                                                

                                   
                                          

                                        
                                                                                   





                                                    
                                                                                               




                                        
                                                        


                                                   
                                                              

                                                                           
                
                                                                      
                                                                   




                              

                                                          
 



















                                                                     

                                                                                   







                                                        


                                                                           
                
                                                                      





                                                                   

                                                                    
 
  


















                                                                      
                                                                




                                               
                                                                                           








                                                      

                                                                      

  
                                                                              

















                                                                      
                                                                



                                        
 
                                               
                                                                                           


                                                   
              
                                                      


                   

                                                                      
 
  




                                                                     


                                                                 
 
                                          
 
                                                         

 


                                                                  

                                   
                                          

                                                 
                                                          




                                        
                                                                                     



                                                               

                                                                       
                                                
                                         


                                                                                                                   
                                           


                                                                                                                     
                                                

                                                                                                                       
                                                      
                                                                    




                                                               


                                                                     








                                                                          




                                                                       





                         

                                                              







                                                                      


                                                                  

                      
                                          

                                
                                                                             



                     


                                                                   


                            
                                          
 

                                         


                                              
                                               

                                                                              




                                                              

                                                                             
                                                            
                                                                               







                                                                                

                                                                       
                                                   

                                                               

                                                                                                  


                 

                                                

                      

                     

                                                                

  
























                                                                                
                                                                             






                                                   
                                                             
















                                                                      

                                     


                                                                  
 
                                          
 
                                                              

 


                                                                   

                                   
                                          


                                                 
                                                               





                                                     

                                                           
                

                                                                       



                     

                                                                




                                       


                                                                       

                           
                                          
                      
 




                                                    
                                                              


                     


                                                                        


                            

                                        
                                          
 

                                         

                                              
 
                                             
                                                                                

                                                                             





                                                                     
                                                               
                                                        


                                                                                                






                                                                                 


                                                                                            
                                                                                                   

                                              


                                                                                                                                         
                                                                          








                                                                                
                                                                      
                                                 
                                                   
                                                       
                        
                                                                                                 
                                                                            

                 
     

                                                

                      


                     

                                                                          




                                          


                                                                     

                           
                                          




                                            
                                                          
 
                                                                       




                                      


                                                                        

                      
                                          


                                                    


                                                                              
         


                     
                                                                             




                                       


                                                                       

                      
                                          


                                                    


                                                                              
         


                     
                                                                           




                                  


                                                                       

                      
                                          


                                                    


                                                                              
         


                     
                                                                           




                                    


                                                                         

                      
                                          


                                                    


                                                                              
         


                     
                                                                               




                                    


                                                                         

                      
                                          


                                                    
                                                                  
                                                                              
         


                     
                                                                               



                                             

                              
                                     





                                     
                                 
                                        
                                    
                                    

                               
                                        







                                      













                                                              
                
 
                                                                    











                                                                      


                                                                                
                                                                                 
                                                                     
                        
         









                                         
                                                              





                                                                         
                                                   
 
                                                    

 
/*
 * Copyright(c) 2004-2005 Intel Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 */

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/sched.h>
#include <linux/sysdev.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
#include <linux/in.h>
#include <linux/sysfs.h>
#include <linux/ctype.h>
#include <linux/inet.h>
#include <linux/rtnetlink.h>
#include <linux/etherdevice.h>
#include <net/net_namespace.h>
#include <net/netns/generic.h>
#include <linux/nsproxy.h>

#include "bonding.h"

#define to_dev(obj)	container_of(obj, struct device, kobj)
#define to_bond(cd)	((struct bonding *)(netdev_priv(to_net_dev(cd))))

/*
 * "show" function for the bond_masters attribute.
 * The class parameter is ignored.
 */
static ssize_t bonding_show_bonds(struct class *cls, char *buf)
{
	struct net *net = current->nsproxy->net_ns;
	struct bond_net *bn = net_generic(net, bond_net_id);
	int res = 0;
	struct bonding *bond;

	rtnl_lock();

	list_for_each_entry(bond, &bn->dev_list, bond_list) {
		if (res > (PAGE_SIZE - IFNAMSIZ)) {
			/* not enough space for another interface name */
			if ((PAGE_SIZE - res) > 10)
				res = PAGE_SIZE - 10;
			res += sprintf(buf + res, "++more++ ");
			break;
		}
		res += sprintf(buf + res, "%s ", bond->dev->name);
	}
	if (res)
		buf[res-1] = '\n'; /* eat the leftover space */

	rtnl_unlock();
	return res;
}

static struct net_device *bond_get_by_name(struct net *net, const char *ifname)
{
	struct bond_net *bn = net_generic(net, bond_net_id);
	struct bonding *bond;

	list_for_each_entry(bond, &bn->dev_list, bond_list) {
		if (strncmp(bond->dev->name, ifname, IFNAMSIZ) == 0)
			return bond->dev;
	}
	return NULL;
}

/*
 * "store" function for the bond_masters attribute.  This is what
 * creates and deletes entire bonds.
 *
 * The class parameter is ignored.
 *
 */

static ssize_t bonding_store_bonds(struct class *cls,
				   const char *buffer, size_t count)
{
	struct net *net = current->nsproxy->net_ns;
	char command[IFNAMSIZ + 1] = {0, };
	char *ifname;
	int rv, res = count;

	sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
	ifname = command + 1;
	if ((strlen(command) <= 1) ||
	    !dev_valid_name(ifname))
		goto err_no_cmd;

	if (command[0] == '+') {
		pr_info("%s is being created...\n", ifname);
		rv = bond_create(net, ifname);
		if (rv) {
			pr_info("Bond creation failed.\n");
			res = rv;
		}
	} else if (command[0] == '-') {
		struct net_device *bond_dev;

		rtnl_lock();
		bond_dev = bond_get_by_name(net, ifname);
		if (bond_dev) {
			pr_info("%s is being deleted...\n", ifname);
			unregister_netdevice(bond_dev);
		} else {
			pr_err("unable to delete non-existent %s\n", ifname);
			res = -ENODEV;
		}
		rtnl_unlock();
	} else
		goto err_no_cmd;

	/* Always return either count or an error.  If you return 0, you'll
	 * get called forever, which is bad.
	 */
	return res;

err_no_cmd:
	pr_err("no command found in bonding_masters. Use +ifname or -ifname.\n");
	return -EPERM;
}

/* class attribute for bond_masters file.  This ends up in /sys/class/net */
static CLASS_ATTR(bonding_masters,  S_IWUSR | S_IRUGO,
		  bonding_show_bonds, bonding_store_bonds);

int bond_create_slave_symlinks(struct net_device *master,
			       struct net_device *slave)
{
	char linkname[IFNAMSIZ+7];
	int ret = 0;

	/* first, create a link from the slave back to the master */
	ret = sysfs_create_link(&(slave->dev.kobj), &(master->dev.kobj),
				"master");
	if (ret)
		return ret;
	/* next, create a link from the master to the slave */
	sprintf(linkname, "slave_%s", slave->name);
	ret = sysfs_create_link(&(master->dev.kobj), &(slave->dev.kobj),
				linkname);
	return ret;

}

void bond_destroy_slave_symlinks(struct net_device *master,
				 struct net_device *slave)
{
	char linkname[IFNAMSIZ+7];

	sysfs_remove_link(&(slave->dev.kobj), "master");
	sprintf(linkname, "slave_%s", slave->name);
	sysfs_remove_link(&(master->dev.kobj), linkname);
}


/*
 * Show the slaves in the current bond.
 */
static ssize_t bonding_show_slaves(struct device *d,
				   struct device_attribute *attr, char *buf)
{
	struct slave *slave;
	int i, res = 0;
	struct bonding *bond = to_bond(d);

	read_lock(&bond->lock);
	bond_for_each_slave(bond, slave, i) {
		if (res > (PAGE_SIZE - IFNAMSIZ)) {
			/* not enough space for another interface name */
			if ((PAGE_SIZE - res) > 10)
				res = PAGE_SIZE - 10;
			res += sprintf(buf + res, "++more++ ");
			break;
		}
		res += sprintf(buf + res, "%s ", slave->dev->name);
	}
	read_unlock(&bond->lock);
	if (res)
		buf[res-1] = '\n'; /* eat the leftover space */
	return res;
}

/*
 * Set the slaves in the current bond.  The bond interface must be
 * up for this to succeed.
 * This function is largely the same flow as bonding_update_bonds().
 */
static ssize_t bonding_store_slaves(struct device *d,
				    struct device_attribute *attr,
				    const char *buffer, size_t count)
{
	char command[IFNAMSIZ + 1] = { 0, };
	char *ifname;
	int i, res, found, ret = count;
	u32 original_mtu;
	struct slave *slave;
	struct net_device *dev = NULL;
	struct bonding *bond = to_bond(d);

	/* Quick sanity check -- is the bond interface up? */
	if (!(bond->dev->flags & IFF_UP)) {
		pr_warning("%s: doing slave updates when interface is down.\n",
			   bond->dev->name);
	}

	/* Note:  We can't hold bond->lock here, as bond_create grabs it. */

	if (!rtnl_trylock())
		return restart_syscall();

	sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
	ifname = command + 1;
	if ((strlen(command) <= 1) ||
	    !dev_valid_name(ifname))
		goto err_no_cmd;

	if (command[0] == '+') {

		/* Got a slave name in ifname.  Is it already in the list? */
		found = 0;

		dev = __dev_get_by_name(dev_net(bond->dev), ifname);
		if (!dev) {
			pr_info("%s: Interface %s does not exist!\n",
				bond->dev->name, ifname);
			ret = -ENODEV;
			goto out;
		}

		if (dev->flags & IFF_UP) {
			pr_err("%s: Error: Unable to enslave %s because it is already up.\n",
			       bond->dev->name, dev->name);
			ret = -EPERM;
			goto out;
		}

		read_lock(&bond->lock);
		bond_for_each_slave(bond, slave, i)
			if (slave->dev == dev) {
				pr_err("%s: Interface %s is already enslaved!\n",
				       bond->dev->name, ifname);
				ret = -EPERM;
				read_unlock(&bond->lock);
				goto out;
			}
		read_unlock(&bond->lock);

		pr_info("%s: Adding slave %s.\n", bond->dev->name, ifname);

		/* If this is the first slave, then we need to set
		   the master's hardware address to be the same as the
		   slave's. */
		if (is_zero_ether_addr(bond->dev->dev_addr))
			memcpy(bond->dev->dev_addr, dev->dev_addr,
			       dev->addr_len);

		/* Set the slave's MTU to match the bond */
		original_mtu = dev->mtu;
		res = dev_set_mtu(dev, bond->dev->mtu);
		if (res) {
			ret = res;
			goto out;
		}

		res = bond_enslave(bond->dev, dev);
		bond_for_each_slave(bond, slave, i)
			if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0)
				slave->original_mtu = original_mtu;
		if (res)
			ret = res;

		goto out;
	}

	if (command[0] == '-') {
		dev = NULL;
		original_mtu = 0;
		bond_for_each_slave(bond, slave, i)
			if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
				dev = slave->dev;
				original_mtu = slave->original_mtu;
				break;
			}
		if (dev) {
			pr_info("%s: Removing slave %s\n",
				bond->dev->name, dev->name);
				res = bond_release(bond->dev, dev);
			if (res) {
				ret = res;
				goto out;
			}
			/* set the slave MTU to the default */
			dev_set_mtu(dev, original_mtu);
		} else {
			pr_err("unable to remove non-existent slave %s for bond %s.\n",
			       ifname, bond->dev->name);
			ret = -ENODEV;
		}
		goto out;
	}

err_no_cmd:
	pr_err("no command found in slaves file for bond %s. Use +ifname or -ifname.\n",
	       bond->dev->name);
	ret = -EPERM;

out:
	rtnl_unlock();
	return ret;
}

static DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves,
		   bonding_store_slaves);

/*
 * Show and set the bonding mode.  The bond interface must be down to
 * change the mode.
 */
static ssize_t bonding_show_mode(struct device *d,
				 struct device_attribute *attr, char *buf)
{
	struct bonding *bond = to_bond(d);

	return sprintf(buf, "%s %d\n",
			bond_mode_tbl[bond->params.mode].modename,
			bond->params.mode);
}

static ssize_t bonding_store_mode(struct device *d,
				  struct device_attribute *attr,
				  const char *buf, size_t count)
{
	int new_value, ret = count;
	struct bonding *bond = to_bond(d);

	if (bond->dev->flags & IFF_UP) {
		pr_err("unable to update mode of %s because interface is up.\n",
		       bond->dev->name);
		ret = -EPERM;
		goto out;
	}

	new_value = bond_parse_parm(buf, bond_mode_tbl);
	if (new_value < 0)  {
		pr_err("%s: Ignoring invalid mode value %.*s.\n",
		       bond->dev->name, (int)strlen(buf) - 1, buf);
		ret = -EINVAL;
		goto out;
	} else {
		if (bond->params.mode == BOND_MODE_8023AD)
			bond_unset_master_3ad_flags(bond);

		if (bond->params.mode == BOND_MODE_ALB)
			bond_unset_master_alb_flags(bond);

		bond->params.mode = new_value;
		bond_set_mode_ops(bond, bond->params.mode);
		pr_info("%s: setting mode to %s (%d).\n",
			bond->dev->name, bond_mode_tbl[new_value].modename,
		       new_value);
	}
out:
	return ret;
}
static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
		   bonding_show_mode, bonding_store_mode);

/*
 * Show and set the bonding transmit hash method.
 * The bond interface must be down to change the xmit hash policy.
 */
static ssize_t bonding_show_xmit_hash(struct device *d,
				      struct device_attribute *attr,
				      char *buf)