History

mtd: slram: simplify register_device() cleanup

Use local variables for the list entry, mtd_info, and private data while initializing a new device. This keeps the initialization path easier to read and publishes the new list entry only after mtd_device_register() has succeeded.

Ruoyu Wang committed 5 months ago

Commit 4fe97a51 parent 36f16481 file · +42 −44Browse files

Unified · Split

drivers/mtd/devices/slram.c+42−44
@@ -129,6 +129,9 @@ static int slram_write(struct mtd_info *mtd, loff_t to, size_t len, · 128 unmodified lines
129129 static int register_device(char *name, unsigned long start, unsigned long length)
130130 {
131131 slram_mtd_list_t **curmtd;
132+ slram_mtd_list_t *new_mtd;
133+ struct mtd_info *mtdinfo;
134+ slram_priv_t *priv;
132135 int ret = -ENOMEM;
133136
134137 curmtd = &slram_mtdlist;
@@ -136,73 +139,68 @@ static int register_device(char *name, unsigned long start, unsigned long length · 1 unmodified line
136139 curmtd = &(*curmtd)->next;
137140 }
138141
139− *curmtd = kmalloc_obj(slram_mtd_list_t);
140− if (!(*curmtd)) {
142+ new_mtd = kmalloc_obj(slram_mtd_list_t);
143+ if (!new_mtd) {
141144 E("slram: Cannot allocate new MTD device.\n");
142145 return(-ENOMEM);
143146 }
144− (*curmtd)->mtdinfo = kzalloc_obj(struct mtd_info);
145− (*curmtd)->next = NULL;
146−
147− if ((*curmtd)->mtdinfo) {
148− (*curmtd)->mtdinfo->priv =
149− kzalloc_obj(slram_priv_t);
147+ new_mtd->next = NULL;
150148
151− if (!(*curmtd)->mtdinfo->priv) {
152− kfree((*curmtd)->mtdinfo);
153− (*curmtd)->mtdinfo = NULL;
154− }
149+ mtdinfo = kzalloc_obj(struct mtd_info);
150+ if (!mtdinfo) {
151+ E("slram: Cannot allocate new MTD device.\n");
152+ goto err_free_list;
155153 }
154+ new_mtd->mtdinfo = mtdinfo;
156155
157− if (!(*curmtd)->mtdinfo) {
156+ priv = kzalloc_obj(slram_priv_t);
157+ if (!priv) {
158158 E("slram: Cannot allocate new MTD device.\n");
159− goto err_free_list;
159+ goto err_free_mtdinfo;
160160 }
161+ mtdinfo->priv = priv;
161162
162− if (!(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start =
163− memremap(start, length,
164− MEMREMAP_WB | MEMREMAP_WT | MEMREMAP_WC))) {
163+ priv->start = memremap(start, length,
164+ MEMREMAP_WB | MEMREMAP_WT | MEMREMAP_WC);
165+ if (!priv->start) {
165166 E("slram: memremap failed\n");
166167 ret = -EIO;
167168 goto err_free_priv;
168169 }
169− ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->end =
170− ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start + length;
171−
172−
173− (*curmtd)->mtdinfo->name = name;
174− (*curmtd)->mtdinfo->size = length;
175− (*curmtd)->mtdinfo->flags = MTD_CAP_RAM;
176− (*curmtd)->mtdinfo->_erase = slram_erase;
177− (*curmtd)->mtdinfo->_point = slram_point;
178− (*curmtd)->mtdinfo->_unpoint = slram_unpoint;
179− (*curmtd)->mtdinfo->_read = slram_read;
180− (*curmtd)->mtdinfo->_write = slram_write;
181− (*curmtd)->mtdinfo->owner = THIS_MODULE;
182− (*curmtd)->mtdinfo->type = MTD_RAM;
183− (*curmtd)->mtdinfo->erasesize = SLRAM_BLK_SZ;
184− (*curmtd)->mtdinfo->writesize = 1;
185−
186− if (mtd_device_register((*curmtd)->mtdinfo, NULL, 0)) {
170+ priv->end = priv->start + length;
171+
172+ mtdinfo->name = name;
173+ mtdinfo->size = length;
174+ mtdinfo->flags = MTD_CAP_RAM;
175+ mtdinfo->_erase = slram_erase;
176+ mtdinfo->_point = slram_point;
177+ mtdinfo->_unpoint = slram_unpoint;
178+ mtdinfo->_read = slram_read;
179+ mtdinfo->_write = slram_write;
180+ mtdinfo->owner = THIS_MODULE;
181+ mtdinfo->type = MTD_RAM;
182+ mtdinfo->erasesize = SLRAM_BLK_SZ;
183+ mtdinfo->writesize = 1;
184+
185+ if (mtd_device_register(mtdinfo, NULL, 0)) {
187186 E("slram: Failed to register new device\n");
188187 ret = -EAGAIN;
189188 goto err_unmap;
190189 }
190+ *curmtd = new_mtd;
191191 T("slram: Registered device %s from %luKiB to %luKiB\n", name,
192192 (start / 1024), ((start + length) / 1024));
193− T("slram: Mapped from 0x%p to 0x%p\n",
194− ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start,
195− ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->end);
196− return(0);
193+ T("slram: Mapped from 0x%p to 0x%p\n", priv->start, priv->end);
194+ return 0;
197195
198196 err_unmap:
199− memunmap(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start);
197+ memunmap(priv->start);
200198 err_free_priv:
201− kfree((*curmtd)->mtdinfo->priv);
199+ kfree(priv);
200+err_free_mtdinfo:
201+ kfree(mtdinfo);
202202 err_free_list:
203− kfree((*curmtd)->mtdinfo);
204− kfree(*curmtd);
205− *curmtd = NULL;
203+ kfree(new_mtd);
206204 return ret;
207205 }
208206

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t