struct net_bridge *br = p->br;
        struct net_device *dev = p->dev;
 
-       sysfs_remove_link(br->ifobj, dev->name);
+       sysfs_remove_link(br->ifobj, p->sysfs_name);
 
        dev_set_promiscuity(dev, -1);
 
 
        struct net_device *dev = ptr;
        struct net_bridge_port *p = dev->br_port;
        struct net_bridge *br;
+       int err;
 
        /* not a port of a bridge */
        if (p == NULL)
                br_del_if(br, dev);
                break;
 
+       case NETDEV_CHANGENAME:
+               err = br_sysfs_renameif(p);
+               if (err)
+                       return notifier_from_errno(err);
+               break;
+
        case NETDEV_PRE_TYPE_CHANGE:
                /* Forbid underlaying device to change its type. */
                return NOTIFY_BAD;
 
        struct hlist_head               mglist;
        struct hlist_node               rlist;
 #endif
+
+#ifdef CONFIG_SYSFS
+       char                            sysfs_name[IFNAMSIZ];
+#endif
 };
 
 struct br_cpu_netstats {
 /* br_sysfs_if.c */
 extern const struct sysfs_ops brport_sysfs_ops;
 extern int br_sysfs_addif(struct net_bridge_port *p);
+extern int br_sysfs_renameif(struct net_bridge_port *p);
 
 /* br_sysfs_br.c */
 extern int br_sysfs_addbr(struct net_device *dev);
 #else
 
 #define br_sysfs_addif(p)      (0)
+#define br_sysfs_renameif(p)   (0)
 #define br_sysfs_addbr(dev)    (0)
 #define br_sysfs_delbr(dev)    do { } while(0)
 #endif /* CONFIG_SYSFS */
 
 /*
  * Add sysfs entries to ethernet device added to a bridge.
  * Creates a brport subdirectory with bridge attributes.
- * Puts symlink in bridge's brport subdirectory
+ * Puts symlink in bridge's brif subdirectory
  */
 int br_sysfs_addif(struct net_bridge_port *p)
 {
        err = sysfs_create_link(&p->kobj, &br->dev->dev.kobj,
                                SYSFS_BRIDGE_PORT_LINK);
        if (err)
-               goto out2;
+               return err;
 
        for (a = brport_attrs; *a; ++a) {
                err = sysfs_create_file(&p->kobj, &((*a)->attr));
                if (err)
-                       goto out2;
+                       return err;
        }
 
-       err = sysfs_create_link(br->ifobj, &p->kobj, p->dev->name);
-out2:
+       strlcpy(p->sysfs_name, p->dev->name, IFNAMSIZ);
+       return sysfs_create_link(br->ifobj, &p->kobj, p->sysfs_name);
+}
+
+/* Rename bridge's brif symlink */
+int br_sysfs_renameif(struct net_bridge_port *p)
+{
+       struct net_bridge *br = p->br;
+       int err;
+
+       /* If a rename fails, the rollback will cause another
+        * rename call with the existing name.
+        */
+       if (!strncmp(p->sysfs_name, p->dev->name, IFNAMSIZ))
+               return 0;
+
+       err = sysfs_rename_link(br->ifobj, &p->kobj,
+                               p->sysfs_name, p->dev->name);
+       if (err)
+               netdev_notice(br->dev, "unable to rename link %s to %s",
+                             p->sysfs_name, p->dev->name);
+       else
+               strlcpy(p->sysfs_name, p->dev->name, IFNAMSIZ);
+
        return err;
 }