diff options
author | Tom Gundersen <teg@jklm.no> | 2014-07-14 10:37:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-15 19:12:01 -0400 |
commit | 238fa3623a5709d29673ed78ff8e714d040fbb89 (patch) | |
tree | febee5d08cba4e04e37cdc9cb1cbf57abbbfdc84 /net | |
parent | 685343fc3ba61a1f6eef361b786601123db16c28 (diff) |
net: set name assign type for renamed devices
Based on a patch from David Herrmann.
This is the only place devices can be renamed.
v9: restore revers-christmas-tree order of local variables
Signed-off-by: Tom Gundersen <teg@jklm.no>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/dev.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 6e2a2cd82321..38793fb84a35 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1082,6 +1082,7 @@ static int dev_get_valid_name(struct net *net, | |||
1082 | */ | 1082 | */ |
1083 | int dev_change_name(struct net_device *dev, const char *newname) | 1083 | int dev_change_name(struct net_device *dev, const char *newname) |
1084 | { | 1084 | { |
1085 | unsigned char old_assign_type; | ||
1085 | char oldname[IFNAMSIZ]; | 1086 | char oldname[IFNAMSIZ]; |
1086 | int err = 0; | 1087 | int err = 0; |
1087 | int ret; | 1088 | int ret; |
@@ -1109,10 +1110,14 @@ int dev_change_name(struct net_device *dev, const char *newname) | |||
1109 | return err; | 1110 | return err; |
1110 | } | 1111 | } |
1111 | 1112 | ||
1113 | old_assign_type = dev->name_assign_type; | ||
1114 | dev->name_assign_type = NET_NAME_RENAMED; | ||
1115 | |||
1112 | rollback: | 1116 | rollback: |
1113 | ret = device_rename(&dev->dev, dev->name); | 1117 | ret = device_rename(&dev->dev, dev->name); |
1114 | if (ret) { | 1118 | if (ret) { |
1115 | memcpy(dev->name, oldname, IFNAMSIZ); | 1119 | memcpy(dev->name, oldname, IFNAMSIZ); |
1120 | dev->name_assign_type = old_assign_type; | ||
1116 | write_seqcount_end(&devnet_rename_seq); | 1121 | write_seqcount_end(&devnet_rename_seq); |
1117 | return ret; | 1122 | return ret; |
1118 | } | 1123 | } |
@@ -1141,6 +1146,8 @@ rollback: | |||
1141 | write_seqcount_begin(&devnet_rename_seq); | 1146 | write_seqcount_begin(&devnet_rename_seq); |
1142 | memcpy(dev->name, oldname, IFNAMSIZ); | 1147 | memcpy(dev->name, oldname, IFNAMSIZ); |
1143 | memcpy(oldname, newname, IFNAMSIZ); | 1148 | memcpy(oldname, newname, IFNAMSIZ); |
1149 | dev->name_assign_type = old_assign_type; | ||
1150 | old_assign_type = NET_NAME_RENAMED; | ||
1144 | goto rollback; | 1151 | goto rollback; |
1145 | } else { | 1152 | } else { |
1146 | pr_err("%s: name change rollback failed: %d\n", | 1153 | pr_err("%s: name change rollback failed: %d\n", |