@@ -90,7 +90,7 @@ enum ffs_state {
90
90
91
91
/*
92
92
* We've got descriptors and strings. We are or have called
93
- * functionfs_ready_callback (). functionfs_bind() may have
93
+ * ffs_ready (). functionfs_bind() may have
94
94
* been called but we don't know.
95
95
*
96
96
* This is the only state in which operations on epfiles may
@@ -103,7 +103,7 @@ enum ffs_state {
103
103
* we encounter an unrecoverable error. The only
104
104
* unrecoverable error is situation when after reading strings
105
105
* from user space we fail to initialise epfiles or
106
- * functionfs_ready_callback () returns with error (<0).
106
+ * ffs_ready () returns with error (<0).
107
107
*
108
108
* In this state no open(2), read(2) or write(2) (both on ep0
109
109
* as well as epfile) may succeed (at this point epfiles are
@@ -361,6 +361,15 @@ ffs_sb_create_file(struct super_block *sb, const char *name, void *data,
361
361
const struct file_operations * fops ,
362
362
struct dentry * * dentry_p );
363
363
364
+ /* Devices management *******************************************************/
365
+
366
+ DEFINE_MUTEX (ffs_lock );
367
+
368
+ static struct ffs_dev * ffs_find_dev (const char * name );
369
+ static void * ffs_acquire_dev (const char * dev_name );
370
+ static void ffs_release_dev (struct ffs_data * ffs_data );
371
+ static int ffs_ready (struct ffs_data * ffs );
372
+ static void ffs_closed (struct ffs_data * ffs );
364
373
365
374
/* Misc helper functions ****************************************************/
366
375
@@ -486,7 +495,7 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf,
486
495
ffs -> state = FFS_ACTIVE ;
487
496
mutex_unlock (& ffs -> mutex );
488
497
489
- ret = functionfs_ready_callback (ffs );
498
+ ret = ffs_ready (ffs );
490
499
if (unlikely (ret < 0 )) {
491
500
ffs -> state = FFS_CLOSING ;
492
501
return ret ;
@@ -1218,7 +1227,7 @@ ffs_fs_mount(struct file_system_type *t, int flags,
1218
1227
return ERR_PTR (- ENOMEM );
1219
1228
}
1220
1229
1221
- ffs_dev = functionfs_acquire_dev_callback (dev_name );
1230
+ ffs_dev = ffs_acquire_dev (dev_name );
1222
1231
if (IS_ERR (ffs_dev )) {
1223
1232
ffs_data_put (ffs );
1224
1233
return ERR_CAST (ffs_dev );
@@ -1228,7 +1237,7 @@ ffs_fs_mount(struct file_system_type *t, int flags,
1228
1237
1229
1238
rv = mount_nodev (t , flags , & data , ffs_sb_fill );
1230
1239
if (IS_ERR (rv ) && data .ffs_data ) {
1231
- functionfs_release_dev_callback (data .ffs_data );
1240
+ ffs_release_dev (data .ffs_data );
1232
1241
ffs_data_put (data .ffs_data );
1233
1242
}
1234
1243
return rv ;
@@ -1241,7 +1250,7 @@ ffs_fs_kill_sb(struct super_block *sb)
1241
1250
1242
1251
kill_litter_super (sb );
1243
1252
if (sb -> s_fs_info ) {
1244
- functionfs_release_dev_callback (sb -> s_fs_info );
1253
+ ffs_release_dev (sb -> s_fs_info );
1245
1254
ffs_data_put (sb -> s_fs_info );
1246
1255
}
1247
1256
}
@@ -1354,7 +1363,7 @@ static void ffs_data_clear(struct ffs_data *ffs)
1354
1363
ENTER ();
1355
1364
1356
1365
if (test_and_clear_bit (FFS_FL_CALL_CLOSED_CALLBACK , & ffs -> flags ))
1357
- functionfs_closed_callback (ffs );
1366
+ ffs_closed (ffs );
1358
1367
1359
1368
BUG_ON (ffs -> gadget );
1360
1369
@@ -2466,6 +2475,221 @@ static int ffs_func_revmap_intf(struct ffs_function *func, u8 intf)
2466
2475
}
2467
2476
2468
2477
2478
+ /* Devices management *******************************************************/
2479
+
2480
+ static LIST_HEAD (ffs_devices );
2481
+
2482
+ static struct ffs_dev * _ffs_find_dev (const char * name )
2483
+ {
2484
+ struct ffs_dev * dev ;
2485
+
2486
+ list_for_each_entry (dev , & ffs_devices , entry ) {
2487
+ if (!dev -> name || !name )
2488
+ continue ;
2489
+ if (strcmp (dev -> name , name ) == 0 )
2490
+ return dev ;
2491
+ }
2492
+
2493
+ return NULL ;
2494
+ }
2495
+
2496
+ /*
2497
+ * ffs_lock must be taken by the caller of this function
2498
+ */
2499
+ static struct ffs_dev * ffs_get_single_dev (void )
2500
+ {
2501
+ struct ffs_dev * dev ;
2502
+
2503
+ if (list_is_singular (& ffs_devices )) {
2504
+ dev = list_first_entry (& ffs_devices , struct ffs_dev , entry );
2505
+ if (dev -> single )
2506
+ return dev ;
2507
+ }
2508
+
2509
+ return NULL ;
2510
+ }
2511
+
2512
+ /*
2513
+ * ffs_lock must be taken by the caller of this function
2514
+ */
2515
+ static struct ffs_dev * ffs_find_dev (const char * name )
2516
+ {
2517
+ struct ffs_dev * dev ;
2518
+
2519
+ dev = ffs_get_single_dev ();
2520
+ if (dev )
2521
+ return dev ;
2522
+
2523
+ return _ffs_find_dev (name );
2524
+ }
2525
+
2526
+ /*
2527
+ * ffs_lock must be taken by the caller of this function
2528
+ */
2529
+ struct ffs_dev * ffs_alloc_dev (void )
2530
+ {
2531
+ struct ffs_dev * dev ;
2532
+ int ret ;
2533
+
2534
+ if (ffs_get_single_dev ())
2535
+ return ERR_PTR (- EBUSY );
2536
+
2537
+ dev = kzalloc (sizeof (* dev ), GFP_KERNEL );
2538
+ if (!dev )
2539
+ return ERR_PTR (- ENOMEM );
2540
+
2541
+ if (list_empty (& ffs_devices )) {
2542
+ ret = functionfs_init ();
2543
+ if (ret ) {
2544
+ kfree (dev );
2545
+ return ERR_PTR (ret );
2546
+ }
2547
+ }
2548
+
2549
+ list_add (& dev -> entry , & ffs_devices );
2550
+
2551
+ return dev ;
2552
+ }
2553
+
2554
+ /*
2555
+ * ffs_lock must be taken by the caller of this function
2556
+ * The caller is responsible for "name" being available whenever f_fs needs it
2557
+ */
2558
+ static int _ffs_name_dev (struct ffs_dev * dev , const char * name )
2559
+ {
2560
+ struct ffs_dev * existing ;
2561
+
2562
+ existing = _ffs_find_dev (name );
2563
+ if (existing )
2564
+ return - EBUSY ;
2565
+
2566
+ dev -> name = name ;
2567
+
2568
+ return 0 ;
2569
+ }
2570
+
2571
+ /*
2572
+ * The caller is responsible for "name" being available whenever f_fs needs it
2573
+ */
2574
+ int ffs_name_dev (struct ffs_dev * dev , const char * name )
2575
+ {
2576
+ int ret ;
2577
+
2578
+ ffs_dev_lock ();
2579
+ ret = _ffs_name_dev (dev , name );
2580
+ ffs_dev_unlock ();
2581
+
2582
+ return ret ;
2583
+ }
2584
+
2585
+ int ffs_single_dev (struct ffs_dev * dev )
2586
+ {
2587
+ int ret ;
2588
+
2589
+ ret = 0 ;
2590
+ ffs_dev_lock ();
2591
+
2592
+ if (!list_is_singular (& ffs_devices ))
2593
+ ret = - EBUSY ;
2594
+ else
2595
+ dev -> single = true;
2596
+
2597
+ ffs_dev_unlock ();
2598
+ return ret ;
2599
+ }
2600
+
2601
+ /*
2602
+ * ffs_lock must be taken by the caller of this function
2603
+ */
2604
+ void ffs_free_dev (struct ffs_dev * dev )
2605
+ {
2606
+ list_del (& dev -> entry );
2607
+ kfree (dev );
2608
+ if (list_empty (& ffs_devices ))
2609
+ functionfs_cleanup ();
2610
+ }
2611
+
2612
+ static void * ffs_acquire_dev (const char * dev_name )
2613
+ {
2614
+ struct ffs_dev * ffs_dev ;
2615
+
2616
+ ENTER ();
2617
+ ffs_dev_lock ();
2618
+
2619
+ ffs_dev = ffs_find_dev (dev_name );
2620
+ if (!ffs_dev )
2621
+ ffs_dev = ERR_PTR (- ENODEV );
2622
+ else if (ffs_dev -> mounted )
2623
+ ffs_dev = ERR_PTR (- EBUSY );
2624
+ else
2625
+ ffs_dev -> mounted = true;
2626
+
2627
+ ffs_dev_unlock ();
2628
+ return ffs_dev ;
2629
+ }
2630
+
2631
+ static void ffs_release_dev (struct ffs_data * ffs_data )
2632
+ {
2633
+ struct ffs_dev * ffs_dev ;
2634
+
2635
+ ENTER ();
2636
+ ffs_dev_lock ();
2637
+
2638
+ ffs_dev = ffs_data -> private_data ;
2639
+ if (ffs_dev )
2640
+ ffs_dev -> mounted = false;
2641
+
2642
+ ffs_dev_unlock ();
2643
+ }
2644
+
2645
+ static int ffs_ready (struct ffs_data * ffs )
2646
+ {
2647
+ struct ffs_dev * ffs_obj ;
2648
+ int ret = 0 ;
2649
+
2650
+ ENTER ();
2651
+ ffs_dev_lock ();
2652
+
2653
+ ffs_obj = ffs -> private_data ;
2654
+ if (!ffs_obj ) {
2655
+ ret = - EINVAL ;
2656
+ goto done ;
2657
+ }
2658
+ if (WARN_ON (ffs_obj -> desc_ready )) {
2659
+ ret = - EBUSY ;
2660
+ goto done ;
2661
+ }
2662
+
2663
+ ffs_obj -> desc_ready = true;
2664
+ ffs_obj -> ffs_data = ffs ;
2665
+
2666
+ if (ffs_obj -> ffs_ready_callback )
2667
+ ret = ffs_obj -> ffs_ready_callback (ffs );
2668
+
2669
+ done :
2670
+ ffs_dev_unlock ();
2671
+ return ret ;
2672
+ }
2673
+
2674
+ static void ffs_closed (struct ffs_data * ffs )
2675
+ {
2676
+ struct ffs_dev * ffs_obj ;
2677
+
2678
+ ENTER ();
2679
+ ffs_dev_lock ();
2680
+
2681
+ ffs_obj = ffs -> private_data ;
2682
+ if (!ffs_obj )
2683
+ goto done ;
2684
+
2685
+ ffs_obj -> desc_ready = false;
2686
+
2687
+ if (ffs_obj -> ffs_closed_callback )
2688
+ ffs_obj -> ffs_closed_callback (ffs );
2689
+ done :
2690
+ ffs_dev_unlock ();
2691
+ }
2692
+
2469
2693
/* Misc helper functions ****************************************************/
2470
2694
2471
2695
static int ffs_mutex_lock (struct mutex * mutex , unsigned nonblock )
0 commit comments