|
@@ -246,7 +246,6 @@ EXPORT_SYMBOL_GPL(ffs_lock);
|
|
|
|
|
|
static struct ffs_dev *_ffs_find_dev(const char *name);
|
|
|
static struct ffs_dev *_ffs_alloc_dev(void);
|
|
|
-static int _ffs_name_dev(struct ffs_dev *dev, const char *name);
|
|
|
static void _ffs_free_dev(struct ffs_dev *dev);
|
|
|
static void *ffs_acquire_dev(const char *dev_name);
|
|
|
static void ffs_release_dev(struct ffs_data *ffs_data);
|
|
@@ -3302,9 +3301,10 @@ static struct ffs_dev *_ffs_do_find_dev(const char *name)
|
|
|
{
|
|
|
struct ffs_dev *dev;
|
|
|
|
|
|
+ if (!name)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
list_for_each_entry(dev, &ffs_devices, entry) {
|
|
|
- if (!dev->name || !name)
|
|
|
- continue;
|
|
|
if (strcmp(dev->name, name) == 0)
|
|
|
return dev;
|
|
|
}
|
|
@@ -3380,42 +3380,11 @@ static void ffs_free_inst(struct usb_function_instance *f)
|
|
|
kfree(opts);
|
|
|
}
|
|
|
|
|
|
-#define MAX_INST_NAME_LEN 40
|
|
|
-
|
|
|
static int ffs_set_inst_name(struct usb_function_instance *fi, const char *name)
|
|
|
{
|
|
|
- struct f_fs_opts *opts;
|
|
|
- char *ptr;
|
|
|
- const char *tmp;
|
|
|
- int name_len, ret;
|
|
|
-
|
|
|
- name_len = strlen(name) + 1;
|
|
|
- if (name_len > MAX_INST_NAME_LEN)
|
|
|
+ if (strlen(name) >= FIELD_SIZEOF(struct ffs_dev, name))
|
|
|
return -ENAMETOOLONG;
|
|
|
-
|
|
|
- ptr = kstrndup(name, name_len, GFP_KERNEL);
|
|
|
- if (!ptr)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- opts = to_f_fs_opts(fi);
|
|
|
- tmp = NULL;
|
|
|
-
|
|
|
- ffs_dev_lock();
|
|
|
-
|
|
|
- tmp = opts->dev->name_allocated ? opts->dev->name : NULL;
|
|
|
- ret = _ffs_name_dev(opts->dev, ptr);
|
|
|
- if (ret) {
|
|
|
- kfree(ptr);
|
|
|
- ffs_dev_unlock();
|
|
|
- return ret;
|
|
|
- }
|
|
|
- opts->dev->name_allocated = true;
|
|
|
-
|
|
|
- ffs_dev_unlock();
|
|
|
-
|
|
|
- kfree(tmp);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return ffs_name_dev(to_f_fs_opts(fi)->dev, name);
|
|
|
}
|
|
|
|
|
|
static struct usb_function_instance *ffs_alloc_inst(void)
|
|
@@ -3545,32 +3514,19 @@ static struct ffs_dev *_ffs_alloc_dev(void)
|
|
|
return dev;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * ffs_lock must be taken by the caller of this function
|
|
|
- * The caller is responsible for "name" being available whenever f_fs needs it
|
|
|
- */
|
|
|
-static int _ffs_name_dev(struct ffs_dev *dev, const char *name)
|
|
|
+int ffs_name_dev(struct ffs_dev *dev, const char *name)
|
|
|
{
|
|
|
struct ffs_dev *existing;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- existing = _ffs_do_find_dev(name);
|
|
|
- if (existing)
|
|
|
- return -EBUSY;
|
|
|
-
|
|
|
- dev->name = name;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
+ ffs_dev_lock();
|
|
|
|
|
|
-/*
|
|
|
- * The caller is responsible for "name" being available whenever f_fs needs it
|
|
|
- */
|
|
|
-int ffs_name_dev(struct ffs_dev *dev, const char *name)
|
|
|
-{
|
|
|
- int ret;
|
|
|
+ existing = _ffs_do_find_dev(name);
|
|
|
+ if (!existing)
|
|
|
+ strlcpy(dev->name, name, ARRAY_SIZE(dev->name));
|
|
|
+ else if (existing != dev)
|
|
|
+ ret = -EBUSY;
|
|
|
|
|
|
- ffs_dev_lock();
|
|
|
- ret = _ffs_name_dev(dev, name);
|
|
|
ffs_dev_unlock();
|
|
|
|
|
|
return ret;
|
|
@@ -3600,8 +3556,6 @@ EXPORT_SYMBOL_GPL(ffs_single_dev);
|
|
|
static void _ffs_free_dev(struct ffs_dev *dev)
|
|
|
{
|
|
|
list_del(&dev->entry);
|
|
|
- if (dev->name_allocated)
|
|
|
- kfree(dev->name);
|
|
|
|
|
|
/* Clear the private_data pointer to stop incorrect dev access */
|
|
|
if (dev->ffs_data)
|