3263 if (vport->flags & FC_VPORT_CREATING) {
3264 spin_unlock_irqrestore(shost->host_lock, flags);
3265 return -EBUSY;
3266 }
3267 if (vport->flags & (FC_VPORT_DEL)) {
3268 spin_unlock_irqrestore(shost->host_lock, flags);
3269 return -EALREADY;
3270 }
3271 vport->flags |= FC_VPORT_DELETING;
3272 spin_unlock_irqrestore(shost->host_lock, flags);
3273
3274 if (i->f->vport_delete)
3275 stat = i->f->vport_delete(vport);
3276 else
3277 stat = -ENOENT;
3278
3279 spin_lock_irqsave(shost->host_lock, flags);
3280 vport->flags &= ~FC_VPORT_DELETING;
3281 if (!stat) {
3282 vport->flags |= FC_VPORT_DELETED;
3283 list_del(&vport->peers);
3284 fc_host->npiv_vports_inuse--;
3285 put_device(&shost->shost_gendev);
3286 }
3287 spin_unlock_irqrestore(shost->host_lock, flags);
3288
3289 if (stat)
3290 return stat;
3291
3292 if (dev->parent != &shost->shost_gendev)
3293 sysfs_remove_link(&shost->shost_gendev.kobj, dev->bus_id);
3294 transport_remove_device(dev);
3295 device_del(dev);
3296 transport_destroy_device(dev);
3297
3298
3299
3300
3301
3302
3303 put_device(dev);