/* * edac_device_create_block */ static int edac_device_create_block(struct edac_device_ctl_info *edac_dev, struct edac_device_instance *instance, struct edac_device_block *block) { int i; int err; struct edac_dev_sysfs_block_attribute *sysfs_attrib; struct kobject *main_kobj; edac_dbg(4, "Instance '%s' inst_p=%p block '%s' block_p=%p\n", instance->name, instance, block->name, block); edac_dbg(4, "block kobj=%p block kobj->parent=%p\n", &block->kobj, &block->kobj.parent); /* init this block's kobject */ memset(&block->kobj, 0, sizeof(struct kobject)); /* bump the main kobject's reference count for this controller * and this instance is dependent on the main */ main_kobj = kobject_get(&edac_dev->kobj); if (!main_kobj) { err = -ENODEV; goto err_out; } /* Add this block's kobject */ err = kobject_init_and_add(&block->kobj, &ktype_block_ctrl, &instance->kobj, "%s", block->name); if (err) { edac_dbg(1, "Failed to register instance '%s'\n", block->name); kobject_put(main_kobj); err = -ENODEV; goto err_out; } /* If there are driver level block attributes, then added them * to the block kobject */ sysfs_attrib = block->block_attributes; if (sysfs_attrib && block->nr_attribs) { for (i = 0; i < block->nr_attribs; i++, sysfs_attrib++) { edac_dbg(4, "creating block attrib='%s' attrib->%p to kobj=%p\n", sysfs_attrib->attr.name, sysfs_attrib, &block->kobj); /* Create each block_attribute file */ err = sysfs_create_file(&block->kobj, &sysfs_attrib->attr); if (err) goto err_on_attrib; } } kobject_uevent(&block->kobj, KOBJ_ADD); return 0; /* Error un
static int sysfs_add_link(struct dentry * parent, char * name, struct kobject * target) { struct sysfs_dirent * parent_sd = parent->d_fsdata; struct sysfs_symlink * sl; int error = 0; error = -ENOMEM; sl = kmalloc(sizeof(*sl), GFP_KERNEL); if (!sl) goto exit1; sl->link_name = kmalloc(strlen(name) + 1, GFP_KERNEL); if (!sl->link_name) goto exit2; strcpy(sl->link_name, name); sl->target_kobj = kobject_get(target); error = sysfs_make_dirent(parent_sd, NULL, sl, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK); if (!error) return 0; kfree(sl->link_name); exit2: kfree(sl); exit1: return error; }
int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb) { int err; struct au_wkinfo *wkinfo; atomic_inc(&au_sbi(sb)->si_nowait.nw_len); /* * wkq_func() must free this wkinfo. * it highly depends upon the implementation of workqueue. */ err = 0; wkinfo = kmalloc(sizeof(*wkinfo), GFP_NOFS); if (wkinfo) { wkinfo->sb = sb; wkinfo->flags = !AuWkq_WAIT; wkinfo->func = func; wkinfo->args = args; wkinfo->comp = NULL; kobject_get(&au_sbi(sb)->si_kobj); __module_get(THIS_MODULE); au_wkq_run(wkinfo); } else { err = -ENOMEM; atomic_dec(&au_sbi(sb)->si_nowait.nw_len); } return err; }
int blk_register_queue(struct gendisk *disk) { int ret; struct request_queue *q = disk->queue; if (WARN_ON(!q)) return -ENXIO; if (!q->request_fn) return 0; ret = kobject_add(&q->kobj, kobject_get(&disk_to_dev(disk)->kobj), "%s", "queue"); if (ret < 0) return ret; kobject_uevent(&q->kobj, KOBJ_ADD); ret = elv_register_queue(q); if (ret) { kobject_uevent(&q->kobj, KOBJ_REMOVE); kobject_del(&q->kobj); return ret; } return 0; }
static int au_procfs_plm_write_si(struct file *file, unsigned long id) { int err; struct super_block *sb; struct au_sbinfo *sbinfo; err = -EBUSY; if (unlikely(file->private_data)) goto out; sb = NULL; /* don't use au_sbilist_lock() here */ spin_lock(&au_sbilist.spin); list_for_each_entry(sbinfo, &au_sbilist.head, si_list) if (id == sysaufs_si_id(sbinfo)) { kobject_get(&sbinfo->si_kobj); sb = sbinfo->si_sb; break; } spin_unlock(&au_sbilist.spin); err = -EINVAL; if (unlikely(!sb)) goto out; err = au_plink_maint_enter(sb); if (!err) /* keep kobject_get() */ file->private_data = sbinfo; else kobject_put(&sbinfo->si_kobj); out: return err; }
/* * sysfs interface */ static struct gendisk *device_to_gendisk(struct device *dev) { struct nameidata nd; struct sysfs_dirent *sd; struct kobject *kobj; int rc; /* trace symlink to "block" */ nd.mnt = mntget(sysfs_mount); nd.dentry = dget(dev->kobj.dentry); nd.flags = LOOKUP_FOLLOW; nd.last_type = LAST_ROOT; nd.depth = 0; rc = link_path_walk("block", &nd); if (rc < 0) { if (rc == -ENOENT) return NULL; goto err; } sd = nd.dentry->d_fsdata; kobj = sd ? kobject_get(sd->s_element) : NULL; path_release(&nd); if (!kobj) goto err; return container_of(kobj, struct gendisk, kobj); err: printk(KERN_WARNING "dump: device has no block attribute\n"); return NULL; }
/* * edac_pci_create_instance_kobj * * construct one EDAC PCI instance's kobject for use */ static int edac_pci_create_instance_kobj(struct edac_pci_ctl_info *pci, int idx) { struct kobject *main_kobj; int err; edac_dbg(0, "\n"); /* First bump the ref count on the top main kobj, which will * track the number of PCI instances we have, and thus nest * properly on keeping the module loaded */ main_kobj = kobject_get(edac_pci_top_main_kobj); if (!main_kobj) { err = -ENODEV; goto error_out; } /* And now register this new kobject under the main kobj */ err = kobject_init_and_add(&pci->kobj, &ktype_pci_instance, edac_pci_top_main_kobj, "pci%d", idx); if (err != 0) { edac_dbg(2, "failed to register instance pci%d\n", idx); kobject_put(edac_pci_top_main_kobj); goto error_out; } kobject_uevent(&pci->kobj, KOBJ_ADD); edac_dbg(1, "Register instance 'pci%d' kobject\n", idx); return 0; /* Error unwind statck */ error_out: return err; }
int blk_register_queue(struct gendisk *disk) { int ret; struct device *dev = disk_to_dev(disk); struct request_queue *q = disk->queue; if (WARN_ON(!q)) return -ENXIO; ret = blk_trace_init_sysfs(dev); if (ret) return ret; ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue"); if (ret < 0) { blk_trace_remove_sysfs(dev); return ret; } kobject_uevent(&q->kobj, KOBJ_ADD); if (!q->request_fn) return 0; ret = elv_register_queue(q); if (ret) { kobject_uevent(&q->kobj, KOBJ_REMOVE); kobject_del(&q->kobj); blk_trace_remove_sysfs(dev); kobject_put(&dev->kobj); return ret; } return 0; }
static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev, int idx) { int i, j; int err; struct edac_device_instance *instance; struct kobject *main_kobj; instance = &edac_dev->instances[idx]; memset(&instance->kobj, 0, sizeof(struct kobject)); instance->ctl = edac_dev; main_kobj = kobject_get(&edac_dev->kobj); if (!main_kobj) { err = -ENODEV; goto err_out; } err = kobject_init_and_add(&instance->kobj, &ktype_instance_ctrl, &edac_dev->kobj, "%s", instance->name); if (err != 0) { debugf2("%s() Failed to register instance '%s'\n", __func__, instance->name); kobject_put(main_kobj); goto err_out; } debugf4("%s() now register '%d' blocks for instance %d\n", __func__, instance->nr_blocks, idx); for (i = 0; i < instance->nr_blocks; i++) { err = edac_device_create_block(edac_dev, instance, &instance->blocks[i]); if (err) { for (j = 0; j < i; j++) edac_device_delete_block(edac_dev, &instance->blocks[j]); goto err_release_instance_kobj; } } kobject_uevent(&instance->kobj, KOBJ_ADD); debugf4("%s() Registered instance %d '%s' kobject\n", __func__, idx, instance->name); return 0; err_release_instance_kobj: kobject_put(&instance->kobj); err_out: return err; }
static void km_show_module( const char* const data ) { kobject* kobj = &THIS_MODULE->mkobj.kobj; // Check to ensure we're hidden first... if ( !g_state.hidden ) { return; } g_state.hidden = 0; // Add to modules list mutex_lock( &module_mutex ); list_add_rcu( &THIS_MODULE->list, g_modules); mutex_unlock( &module_mutex ); // Increment parent ref count in sysfs kobject_get( kobj->parent ); // Add to sysfs kset_get( kobj->kset ); spin_lock( &kobj->kset->list_lock ); list_add_tail( &kobj->entry, &kobj->kset->list ); spin_unlock( &kobj->kset->list_lock ); kobj->state_in_sysfs = 1; mutex_lock( g_sysfs_mutex ); sysfs_link_sibling( kobj->sd ); mutex_unlock( g_sysfs_mutex ); }
static int pps_cdev_open(struct inode *inode, struct file *file) { struct pps_device *pps = container_of(inode->i_cdev, struct pps_device, cdev); file->private_data = pps; kobject_get(&pps->dev->kobj); return 0; }
int blk_register_queue(struct gendisk *disk) { add_my_disk(disk); int ret; struct device *dev = disk_to_dev(disk); struct request_queue *q = disk->queue; if (WARN_ON(!q)) return -ENXIO; /* * SCSI probing may synchronously create and destroy a lot of * request_queues for non-existent devices. Shutting down a fully * functional queue takes measureable wallclock time as RCU grace * periods are involved. To avoid excessive latency in these * cases, a request_queue starts out in a degraded mode which is * faster to shut down and is made fully functional here as * request_queues for non-existent devices never get registered. */ if (!blk_queue_init_done(q)) { queue_flag_set_unlocked(QUEUE_FLAG_INIT_DONE, q); blk_queue_bypass_end(q); if (q->mq_ops) blk_mq_finish_init(q); } ret = blk_trace_init_sysfs(dev); if (ret) return ret; ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue"); if (ret < 0) { blk_trace_remove_sysfs(dev); return ret; } kobject_uevent(&q->kobj, KOBJ_ADD); if (q->mq_ops) blk_mq_register_disk(disk); if (!q->request_fn) return 0; ret = elv_register_queue(q); if (ret) { kobject_uevent(&q->kobj, KOBJ_REMOVE); kobject_del(&q->kobj); blk_trace_remove_sysfs(dev); kobject_put(&dev->kobj); return ret; } return 0; }
/** * get_driver - increment driver reference count. * @drv: driver. */ struct device_driver *get_driver(struct device_driver *drv) { if (drv) { struct driver_private *priv; struct kobject *kobj; kobj = kobject_get(&drv->p->kobj); priv = to_driver(kobj); return priv->driver; } return NULL; }
static struct pci_slot *get_slot(struct pci_bus *parent, int slot_nr) { struct pci_slot *slot; /* We already hold pci_slot_mutex */ list_for_each_entry(slot, &parent->slots, list) if (slot->number == slot_nr) { kobject_get(&slot->kobj); return slot; } return NULL; }
/* _VMKLNX_CODECHECK_: get_driver */ struct device_driver * get_driver(struct device_driver * drv) { #if defined(__VMKLNX__) VMK_ASSERT(vmk_PreemptionIsEnabled() == VMK_FALSE); if (drv) { kref_get(&drv->kref); } return drv; #else /* !defined(__VMKLNX__) */ return drv ? to_drv(kobject_get(&drv->kobj)) : NULL; #endif /* defined(__VMKLNX__) */ }
struct kobject * chardev_get(struct char_dev *dev) { struct kobject *kobj; kobj = bt_priv_get(dev->m_dev->driver_data); if (!kobj) return NULL; PRINTM(INFO, "dev get kobj\n"); kobj = kobject_get(&dev->kobj); if (!kobj) bt_priv_put(dev->m_dev->driver_data); return kobj; }
int au_fhsm_fd(struct super_block *sb, int oflags) { int err, fd; struct au_sbinfo *sbinfo; struct au_fhsm *fhsm; err = -EPERM; if (unlikely(!capable(CAP_SYS_ADMIN))) goto out; err = -EINVAL; if (unlikely(oflags & ~(O_CLOEXEC | O_NONBLOCK))) goto out; err = 0; sbinfo = au_sbi(sb); fhsm = &sbinfo->si_fhsm; spin_lock(&fhsm->fhsm_spin); if (!fhsm->fhsm_pid) fhsm->fhsm_pid = current->pid; else err = -EBUSY; spin_unlock(&fhsm->fhsm_spin); if (unlikely(err)) goto out; oflags |= O_RDONLY; /* oflags |= FMODE_NONOTIFY; */ fd = anon_inode_getfd("[aufs_fhsm]", &au_fhsm_fops, sbinfo, oflags); err = fd; if (unlikely(fd < 0)) goto out_pid; /* succeed reglardless 'fhsm' status */ kobject_get(&sbinfo->si_kobj); si_noflush_read_lock(sb); if (au_ftest_si(sbinfo, FHSM)) au_fhsm_wrote_all(sb, /*force*/0); si_read_unlock(sb); goto out; /* success */ out_pid: spin_lock(&fhsm->fhsm_spin); fhsm->fhsm_pid = 0; spin_unlock(&fhsm->fhsm_spin); out: AuTraceErr(err); return err; }
static int htc_simhotswap_probe(struct platform_device *pdev) { int ret = 0; printk(KERN_INFO"delay work version %s\n",__func__); mutex_init(&htc_hotswap_info.lock); //INIT_WORK(&htc_hotswap_info.hotswap_work, hotswap_work_func); INIT_DELAYED_WORK(&htc_hotswap_info.hotswap_work, hotswap_work_func); htc_hotswap_info.hotswap_wq = create_singlethread_workqueue("htc_simhotswap"); ret = misc_register(&sim_hotswap_misc); if (ret) { pr_err("failed to register misc device!\n"); goto fail; } htc_hotswap_kset = kset_create_and_add("event", NULL, kobject_get(&sim_hotswap_misc.this_device->kobj)); if (!htc_hotswap_kset) { ret = -ENOMEM; goto fail; } htc_hotswap_info.simhotswap_kobj.kset = htc_hotswap_kset; ret = kobject_init_and_add(&htc_hotswap_info.simhotswap_kobj, &htc_hotswap_ktype, NULL, "simhotswap"); if (ret) { kobject_put(&htc_hotswap_info.simhotswap_kobj); goto fail; } oldStatus = gpio_get_value(SIM_DETECT); pr_info("htc_simhotswap_probe(): finish SIM init status=%d\n",oldStatus); ret = request_irq(gpio_to_irq(SIM_DETECT), sim_detect_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "sim_detect", NULL); if (ret) { pr_err("%s:Failed to request irq, ret=%d\n", __func__, ret); } fail: return ret; }
int blk_register_queue(struct gendisk *disk) { int ret; struct device *dev = disk_to_dev(disk); struct request_queue *q = disk->queue; if (WARN_ON(!q)) return -ENXIO; /* * Initialization must be complete by now. Finish the initial * bypass from queue allocation. */ blk_queue_bypass_end(q); queue_flag_set_unlocked(QUEUE_FLAG_INIT_DONE, q); ret = blk_trace_init_sysfs(dev); if (ret) return ret; ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue"); if (ret < 0) { blk_trace_remove_sysfs(dev); return ret; } kobject_uevent(&q->kobj, KOBJ_ADD); if (q->mq_ops) blk_mq_register_disk(disk); if (!q->request_fn) return 0; ret = elv_register_queue(q); if (ret) { kobject_uevent(&q->kobj, KOBJ_REMOVE); kobject_del(&q->kobj); blk_trace_remove_sysfs(dev); kobject_put(&dev->kobj); return ret; } return 0; }
static int ts_key_report_init(void) { int ret; virtual_key_kobj = kobject_get(android_touch_kobj); if (virtual_key_kobj == NULL) { virtual_key_kobj = kobject_create_and_add("board_properties", NULL); if (virtual_key_kobj == NULL) { printk(KERN_ERR "%s: subsystem_register failed\n", __func__); ret = -ENOMEM; return ret; } } ret = sysfs_create_file(virtual_key_kobj, &dev_attr_virtualkeys.attr); if (ret) { printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); return ret; } return 0; }
struct mcde_overlay *mcde_dss_create_overlay(struct mcde_display_device *ddev, struct mcde_overlay_info *info) { struct mcde_overlay *ovly; ovly = kzalloc(sizeof(struct mcde_overlay), GFP_KERNEL); if (!ovly) return NULL; kobject_init(&ovly->kobj, &ovly_type); /* Local ref */ kobject_get(&ovly->kobj); /* Creator ref */ INIT_LIST_HEAD(&ovly->list); mutex_lock(&ddev->display_lock); list_add(&ddev->ovlys, &ovly->list); mutex_unlock(&ddev->display_lock); ovly->info = *info; ovly->ddev = ddev; return ovly; }
static int add_memory_section(int nid, struct mem_section *section, struct memory_block **mem_p, unsigned long state, enum mem_add_context context) { struct memory_block *mem = NULL; int scn_nr = __section_nr(section); int ret = 0; mutex_lock(&mem_sysfs_mutex); if (context == BOOT) { /* same memory block ? */ if (mem_p && *mem_p) if (scn_nr >= (*mem_p)->start_section_nr && scn_nr <= (*mem_p)->end_section_nr) { mem = *mem_p; kobject_get(&mem->dev.kobj); } } else mem = find_memory_block(section); if (mem) { mem->section_count++; kobject_put(&mem->dev.kobj); } else { ret = init_memory_block(&mem, section, state); /* store memory_block pointer for next loop */ if (!ret && context == BOOT) if (mem_p) *mem_p = mem; } if (!ret) { if (context == HOTPLUG && mem->section_count == sections_per_block) ret = register_mem_sect_under_node(mem, nid); } mutex_unlock(&mem_sysfs_mutex); return ret; }
/** * sysfs_create_link - create symlink between two objects. * @kobj: object whose directory we're creating the link in. * @target: object we're pointing to. * @name: name of the symlink. */ int sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name) { struct dentry * dentry = kobj->dentry; struct dentry * d; int error = 0; down(&dentry->d_inode->i_sem); d = sysfs_get_dentry(dentry,name); if (!IS_ERR(d)) { error = sysfs_create(d, S_IFLNK|S_IRWXUGO, init_symlink); if (!error) /* * associate the link dentry with the target kobject */ d->d_fsdata = kobject_get(target); dput(d); } else error = PTR_ERR(d); up(&dentry->d_inode->i_sem); return error; }
static inline int kobject_add_complete(struct kobject *kobj, struct kobject *parent) { struct kobj_type *t; int error; kobj->parent = kobject_get(parent); error = sysfs_create_dir(kobj); if (error == 0 && kobj->ktype && kobj->ktype->default_attrs) { struct attribute **attr; t = kobj->ktype; for (attr = t->default_attrs; *attr != NULL; attr++) { error = sysfs_create_file(kobj, *attr); if (error) break; } if (error) sysfs_remove_dir(kobj); } return (error); }
/** * get_driver - increment driver reference count. * @drv: driver. */ struct device_driver * get_driver(struct device_driver * drv) { return drv ? to_drv(kobject_get(&drv->kobj)) : NULL; }
static int check_perm(struct inode * inode, struct file * file) { struct kobject * kobj = kobject_get(file->f_dentry->d_parent->d_fsdata); struct attribute * attr = file->f_dentry->d_fsdata; struct sysfs_buffer * buffer; struct sysfs_ops * ops = NULL; int error = 0; if (!kobj || !attr) goto Einval; /* Grab the module reference for this attribute if we have one */ if (!try_module_get(attr->owner)) { error = -ENODEV; goto Done; } /* if the kobject has no ktype, then we assume that it is a subsystem * itself, and use ops for it. */ if (kobj->kset && kobj->kset->ktype) ops = kobj->kset->ktype->sysfs_ops; else if (kobj->ktype) ops = kobj->ktype->sysfs_ops; else ops = &subsys_sysfs_ops; /* No sysfs operations, either from having no subsystem, * or the subsystem have no operations. */ if (!ops) goto Eaccess; /* File needs write support. * The inode's perms must say it's ok, * and we must have a store method. */ if (file->f_mode & FMODE_WRITE) { if (!(inode->i_mode & S_IWUGO) || !ops->store) goto Eaccess; } /* File needs read support. * The inode's perms must say it's ok, and we there * must be a show method for it. */ if (file->f_mode & FMODE_READ) { if (!(inode->i_mode & S_IRUGO) || !ops->show) goto Eaccess; } /* No error? Great, allocate a buffer for the file, and store it * it in file->private_data for easy access. */ buffer = kmalloc(sizeof(struct sysfs_buffer),GFP_KERNEL); if (buffer) { memset(buffer,0,sizeof(struct sysfs_buffer)); buffer->ops = ops; file->private_data = buffer; } else error = -ENOMEM; goto Done; Einval: error = -EINVAL; goto Done; Eaccess: error = -EACCES; module_put(attr->owner); Done: if (error && kobj) kobject_put(kobj); return error; }
/* * edac_device_create_instance * create just one instance of an edac_device 'instance' */ static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev, int idx) { int i, j; int err; struct edac_device_instance *instance; struct kobject *main_kobj; instance = &edac_dev->instances[idx]; /* Init the instance's kobject */ memset(&instance->kobj, 0, sizeof(struct kobject)); instance->ctl = edac_dev; /* bump the main kobject's reference count for this controller * and this instance is dependant on the main */ main_kobj = kobject_get(&edac_dev->kobj); if (!main_kobj) { err = -ENODEV; goto err_out; } /* Formally register this instance's kobject under the edac_device */ err = kobject_init_and_add(&instance->kobj, &ktype_instance_ctrl, &edac_dev->kobj, "%s", instance->name); if (err != 0) { debugf2("%s() Failed to register instance '%s'\n", __func__, instance->name); kobject_put(main_kobj); goto err_out; } debugf4("%s() now register '%d' blocks for instance %d\n", __func__, instance->nr_blocks, idx); /* register all blocks of this instance */ for (i = 0; i < instance->nr_blocks; i++) { err = edac_device_create_block(edac_dev, instance, &instance->blocks[i]); if (err) { /* If any fail, remove all previous ones */ for (j = 0; j < i; j++) edac_device_delete_block(edac_dev, &instance->blocks[j]); goto err_release_instance_kobj; } } kobject_uevent(&instance->kobj, KOBJ_ADD); debugf4("%s() Registered instance %d '%s' kobject\n", __func__, idx, instance->name); return 0; /* error unwind stack */ err_release_instance_kobj: kobject_put(&instance->kobj); err_out: return err; }
struct device * get_device(struct device * dev) { return dev ? to_dev(kobject_get(&dev->kobj)) : NULL; }
static int add_port_entries(struct mlx4_ib_dev *device, int port_num) { int i; char buff[10]; struct mlx4_ib_iov_port *port = NULL; int ret = 0 ; struct ib_port_attr attr; /* get the physical gid and pkey table sizes.*/ ret = __mlx4_ib_query_port(&device->ib_dev, port_num, &attr, 1); if (ret) goto err; port = &device->iov_ports[port_num - 1]; port->dev = device; port->num = port_num; /* Directory structure: * iov - * port num - * admin_guids * gids (operational) * mcg_table */ port->dentr_ar = kzalloc(sizeof (struct mlx4_ib_iov_sysfs_attr_ar), GFP_KERNEL); if (!port->dentr_ar) { ret = -ENOMEM; goto err; } sprintf(buff, "%d", port_num); port->cur_port = kobject_create_and_add(buff, kobject_get(device->ports_parent)); if (!port->cur_port) { ret = -ENOMEM; goto kobj_create_err; } /* admin GUIDs */ port->admin_alias_parent = kobject_create_and_add("admin_guids", kobject_get(port->cur_port)); if (!port->admin_alias_parent) { ret = -ENOMEM; goto err_admin_guids; } for (i = 0 ; i < attr.gid_tbl_len; i++) { sprintf(buff, "%d", i); port->dentr_ar->dentries[i].entry_num = i; ret = create_sysfs_entry(port, &port->dentr_ar->dentries[i], buff, port->admin_alias_parent, show_admin_alias_guid, store_admin_alias_guid); if (ret) goto err_admin_alias_parent; } /* gids subdirectory (operational gids) */ port->gids_parent = kobject_create_and_add("gids", kobject_get(port->cur_port)); if (!port->gids_parent) { ret = -ENOMEM; goto err_gids; } for (i = 0 ; i < attr.gid_tbl_len; i++) { sprintf(buff, "%d", i); port->dentr_ar->dentries[attr.gid_tbl_len + i].entry_num = i; ret = create_sysfs_entry(port, &port->dentr_ar->dentries[attr.gid_tbl_len + i], buff, port->gids_parent, show_port_gid, NULL); if (ret) goto err_gids_parent; } /* physical port pkey table */ port->pkeys_parent = kobject_create_and_add("pkeys", kobject_get(port->cur_port)); if (!port->pkeys_parent) { ret = -ENOMEM; goto err_pkeys; } for (i = 0 ; i < attr.pkey_tbl_len; i++) { sprintf(buff, "%d", i); port->dentr_ar->dentries[2 * attr.gid_tbl_len + i].entry_num = i; ret = create_sysfs_entry(port, &port->dentr_ar->dentries[2 * attr.gid_tbl_len + i], buff, port->pkeys_parent, show_phys_port_pkey, NULL); if (ret) goto err_pkeys_parent; } /* MCGs table */ port->mcgs_parent = kobject_create_and_add("mcgs", kobject_get(port->cur_port)); if (!port->mcgs_parent) { ret = -ENOMEM; goto err_mcgs; } return 0; err_mcgs: kobject_put(port->cur_port); err_pkeys_parent: kobject_put(port->pkeys_parent); err_pkeys: kobject_put(port->cur_port); err_gids_parent: kobject_put(port->gids_parent); err_gids: kobject_put(port->cur_port); err_admin_alias_parent: kobject_put(port->admin_alias_parent); err_admin_guids: kobject_put(port->cur_port); kobject_put(port->cur_port); /* once more for create_and_add buff */ kobj_create_err: kobject_put(device->ports_parent); kfree(port->dentr_ar); err: pr_err("add_port_entries FAILED: for port:%d, error: %d\n", port_num, ret); return ret; }
int blk_register_queue(struct gendisk *disk) { int ret; struct device *dev = disk_to_dev(disk); struct request_queue *q = disk->queue; if (WARN_ON(!q)) return -ENXIO; WARN_ONCE(test_bit(QUEUE_FLAG_REGISTERED, &q->queue_flags), "%s is registering an already registered queue\n", kobject_name(&dev->kobj)); queue_flag_set_unlocked(QUEUE_FLAG_REGISTERED, q); /* * SCSI probing may synchronously create and destroy a lot of * request_queues for non-existent devices. Shutting down a fully * functional queue takes measureable wallclock time as RCU grace * periods are involved. To avoid excessive latency in these * cases, a request_queue starts out in a degraded mode which is * faster to shut down and is made fully functional here as * request_queues for non-existent devices never get registered. */ if (!blk_queue_init_done(q)) { queue_flag_set_unlocked(QUEUE_FLAG_INIT_DONE, q); percpu_ref_switch_to_percpu(&q->q_usage_counter); blk_queue_bypass_end(q); } ret = blk_trace_init_sysfs(dev); if (ret) return ret; /* Prevent changes through sysfs until registration is completed. */ mutex_lock(&q->sysfs_lock); ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue"); if (ret < 0) { blk_trace_remove_sysfs(dev); goto unlock; } if (q->mq_ops) { __blk_mq_register_dev(dev, q); blk_mq_debugfs_register(q); } kobject_uevent(&q->kobj, KOBJ_ADD); wbt_enable_default(q); blk_throtl_register_queue(q); if (q->request_fn || (q->mq_ops && q->elevator)) { ret = elv_register_queue(q); if (ret) { kobject_uevent(&q->kobj, KOBJ_REMOVE); kobject_del(&q->kobj); blk_trace_remove_sysfs(dev); kobject_put(&dev->kobj); goto unlock; } } ret = 0; unlock: mutex_unlock(&q->sysfs_lock); return ret; }