Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: dgnc: use tty_alloc_driver instead of kcalloc

The tty_alloc_driver() can allocate memory for ttys and termios.
And also allocated memory will be released easily with
put_tty_driver() call.

Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Daeseok Youn and committed by
Greg Kroah-Hartman
60b3109e e47e7379

+61 -85
+2 -2
drivers/staging/dgnc/dgnc_driver.h
··· 202 202 * to our channels. 203 203 */ 204 204 205 - struct tty_driver serial_driver; 205 + struct tty_driver *serial_driver; 206 206 char serial_name[200]; 207 - struct tty_driver print_driver; 207 + struct tty_driver *print_driver; 208 208 char print_name[200]; 209 209 210 210 bool dgnc_major_serial_registered;
+59 -83
drivers/staging/dgnc/dgnc_tty.c
··· 176 176 */ 177 177 int dgnc_tty_register(struct dgnc_board *brd) 178 178 { 179 - int rc = 0; 179 + int rc; 180 180 181 - brd->serial_driver.magic = TTY_DRIVER_MAGIC; 181 + brd->serial_driver = tty_alloc_driver(brd->maxports, 182 + TTY_DRIVER_REAL_RAW | 183 + TTY_DRIVER_DYNAMIC_DEV | 184 + TTY_DRIVER_HARDWARE_BREAK); 185 + 186 + if (IS_ERR(brd->serial_driver)) 187 + return PTR_ERR(brd->serial_driver); 182 188 183 189 snprintf(brd->serial_name, MAXTTYNAMELEN, "tty_dgnc_%d_", brd->boardnum); 184 190 185 - brd->serial_driver.name = brd->serial_name; 186 - brd->serial_driver.name_base = 0; 187 - brd->serial_driver.major = 0; 188 - brd->serial_driver.minor_start = 0; 189 - brd->serial_driver.num = brd->maxports; 190 - brd->serial_driver.type = TTY_DRIVER_TYPE_SERIAL; 191 - brd->serial_driver.subtype = SERIAL_TYPE_NORMAL; 192 - brd->serial_driver.init_termios = DgncDefaultTermios; 193 - brd->serial_driver.driver_name = DRVSTR; 194 - brd->serial_driver.flags = (TTY_DRIVER_REAL_RAW | 195 - TTY_DRIVER_DYNAMIC_DEV | 196 - TTY_DRIVER_HARDWARE_BREAK); 197 - 198 - /* 199 - * The kernel wants space to store pointers to 200 - * tty_struct's and termios's. 201 - */ 202 - brd->serial_driver.ttys = kcalloc(brd->maxports, 203 - sizeof(*brd->serial_driver.ttys), 204 - GFP_KERNEL); 205 - if (!brd->serial_driver.ttys) 206 - return -ENOMEM; 207 - 208 - kref_init(&brd->serial_driver.kref); 209 - brd->serial_driver.termios = kcalloc(brd->maxports, 210 - sizeof(*brd->serial_driver.termios), 211 - GFP_KERNEL); 212 - if (!brd->serial_driver.termios) 213 - return -ENOMEM; 191 + brd->serial_driver->name = brd->serial_name; 192 + brd->serial_driver->name_base = 0; 193 + brd->serial_driver->major = 0; 194 + brd->serial_driver->minor_start = 0; 195 + brd->serial_driver->type = TTY_DRIVER_TYPE_SERIAL; 196 + brd->serial_driver->subtype = SERIAL_TYPE_NORMAL; 197 + brd->serial_driver->init_termios = DgncDefaultTermios; 198 + brd->serial_driver->driver_name = DRVSTR; 214 199 215 200 /* 216 201 * Entry points for driver. Called by the kernel from 217 202 * tty_io.c and n_tty.c. 218 203 */ 219 - tty_set_operations(&brd->serial_driver, &dgnc_tty_ops); 204 + tty_set_operations(brd->serial_driver, &dgnc_tty_ops); 220 205 221 206 if (!brd->dgnc_major_serial_registered) { 222 207 /* Register tty devices */ 223 - rc = tty_register_driver(&brd->serial_driver); 208 + rc = tty_register_driver(brd->serial_driver); 224 209 if (rc < 0) { 225 210 dev_dbg(&brd->pdev->dev, 226 211 "Can't register tty device (%d)\n", rc); 227 - return rc; 212 + goto free_serial_driver; 228 213 } 229 214 brd->dgnc_major_serial_registered = true; 230 215 } ··· 219 234 * again, separately so we don't get the LD confused about what major 220 235 * we are when we get into the dgnc_tty_open() routine. 221 236 */ 222 - brd->print_driver.magic = TTY_DRIVER_MAGIC; 237 + brd->print_driver = tty_alloc_driver(brd->maxports, 238 + TTY_DRIVER_REAL_RAW | 239 + TTY_DRIVER_DYNAMIC_DEV | 240 + TTY_DRIVER_HARDWARE_BREAK); 241 + 223 242 snprintf(brd->print_name, MAXTTYNAMELEN, "pr_dgnc_%d_", brd->boardnum); 224 243 225 - brd->print_driver.name = brd->print_name; 226 - brd->print_driver.name_base = 0; 227 - brd->print_driver.major = brd->serial_driver.major; 228 - brd->print_driver.minor_start = 0x80; 229 - brd->print_driver.num = brd->maxports; 230 - brd->print_driver.type = TTY_DRIVER_TYPE_SERIAL; 231 - brd->print_driver.subtype = SERIAL_TYPE_NORMAL; 232 - brd->print_driver.init_termios = DgncDefaultTermios; 233 - brd->print_driver.driver_name = DRVSTR; 234 - brd->print_driver.flags = (TTY_DRIVER_REAL_RAW | 235 - TTY_DRIVER_DYNAMIC_DEV | 236 - TTY_DRIVER_HARDWARE_BREAK); 244 + brd->print_driver->name = brd->print_name; 245 + brd->print_driver->name_base = 0; 246 + brd->print_driver->major = brd->serial_driver->major; 247 + brd->print_driver->minor_start = 0x80; 248 + brd->print_driver->type = TTY_DRIVER_TYPE_SERIAL; 249 + brd->print_driver->subtype = SERIAL_TYPE_NORMAL; 250 + brd->print_driver->init_termios = DgncDefaultTermios; 251 + brd->print_driver->driver_name = DRVSTR; 237 252 238 - /* 239 - * The kernel wants space to store pointers to 240 - * tty_struct's and termios's. Must be separated from 241 - * the Serial Driver so we don't get confused 242 - */ 243 - brd->print_driver.ttys = kcalloc(brd->maxports, 244 - sizeof(*brd->print_driver.ttys), 245 - GFP_KERNEL); 246 - if (!brd->print_driver.ttys) 247 - return -ENOMEM; 248 - kref_init(&brd->print_driver.kref); 249 - brd->print_driver.termios = kcalloc(brd->maxports, 250 - sizeof(*brd->print_driver.termios), 251 - GFP_KERNEL); 252 - if (!brd->print_driver.termios) 253 - return -ENOMEM; 253 + if (IS_ERR(brd->print_driver)) { 254 + rc = PTR_ERR(brd->print_driver); 255 + goto unregister_serial_driver; 256 + } 254 257 255 258 /* 256 259 * Entry points for driver. Called by the kernel from 257 260 * tty_io.c and n_tty.c. 258 261 */ 259 - tty_set_operations(&brd->print_driver, &dgnc_tty_ops); 262 + tty_set_operations(brd->print_driver, &dgnc_tty_ops); 260 263 261 264 if (!brd->dgnc_major_transparent_print_registered) { 262 265 /* Register Transparent Print devices */ 263 - rc = tty_register_driver(&brd->print_driver); 266 + rc = tty_register_driver(brd->print_driver); 264 267 if (rc < 0) { 265 268 dev_dbg(&brd->pdev->dev, 266 269 "Can't register Transparent Print device(%d)\n", 267 270 rc); 268 - return rc; 271 + goto free_print_driver; 269 272 } 270 273 brd->dgnc_major_transparent_print_registered = true; 271 274 } 272 275 273 - dgnc_BoardsByMajor[brd->serial_driver.major] = brd; 276 + dgnc_BoardsByMajor[brd->serial_driver->major] = brd; 277 + 278 + return 0; 279 + 280 + free_print_driver: 281 + put_tty_driver(brd->print_driver); 282 + unregister_serial_driver: 283 + tty_unregister_driver(brd->serial_driver); 284 + free_serial_driver: 285 + put_tty_driver(brd->serial_driver); 274 286 275 287 return rc; 276 288 } ··· 344 362 { 345 363 struct device *classp; 346 364 347 - classp = tty_register_device(&brd->serial_driver, i, 365 + classp = tty_register_device(brd->serial_driver, i, 348 366 &ch->ch_bd->pdev->dev); 349 367 ch->ch_tun.un_sysfs = classp; 350 368 dgnc_create_tty_sysfs(&ch->ch_tun, classp); 351 369 352 - classp = tty_register_device(&brd->print_driver, i, 370 + classp = tty_register_device(brd->print_driver, i, 353 371 &ch->ch_bd->pdev->dev); 354 372 ch->ch_pun.un_sysfs = classp; 355 373 dgnc_create_tty_sysfs(&ch->ch_pun, classp); ··· 388 406 int i = 0; 389 407 390 408 if (brd->dgnc_major_serial_registered) { 391 - dgnc_BoardsByMajor[brd->serial_driver.major] = NULL; 409 + dgnc_BoardsByMajor[brd->serial_driver->major] = NULL; 392 410 for (i = 0; i < brd->nasync; i++) { 393 411 if (brd->channels[i]) 394 412 dgnc_remove_tty_sysfs(brd->channels[i]-> 395 413 ch_tun.un_sysfs); 396 - tty_unregister_device(&brd->serial_driver, i); 414 + tty_unregister_device(brd->serial_driver, i); 397 415 } 398 - tty_unregister_driver(&brd->serial_driver); 416 + tty_unregister_driver(brd->serial_driver); 399 417 brd->dgnc_major_serial_registered = false; 400 418 } 401 419 402 420 if (brd->dgnc_major_transparent_print_registered) { 403 - dgnc_BoardsByMajor[brd->print_driver.major] = NULL; 421 + dgnc_BoardsByMajor[brd->print_driver->major] = NULL; 404 422 for (i = 0; i < brd->nasync; i++) { 405 423 if (brd->channels[i]) 406 424 dgnc_remove_tty_sysfs(brd->channels[i]-> 407 425 ch_pun.un_sysfs); 408 - tty_unregister_device(&brd->print_driver, i); 426 + tty_unregister_device(brd->print_driver, i); 409 427 } 410 - tty_unregister_driver(&brd->print_driver); 428 + tty_unregister_driver(brd->print_driver); 411 429 brd->dgnc_major_transparent_print_registered = false; 412 430 } 413 431 414 - kfree(brd->serial_driver.ttys); 415 - brd->serial_driver.ttys = NULL; 416 - kfree(brd->serial_driver.termios); 417 - brd->serial_driver.termios = NULL; 418 - kfree(brd->print_driver.ttys); 419 - brd->print_driver.ttys = NULL; 420 - kfree(brd->print_driver.termios); 421 - brd->print_driver.termios = NULL; 432 + put_tty_driver(brd->serial_driver); 433 + put_tty_driver(brd->print_driver); 422 434 } 423 435 424 436 /*