aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio/css.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/cio/css.c')
-rw-r--r--drivers/s390/cio/css.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
index 054fb428531f..1ebe5d3ddebb 100644
--- a/drivers/s390/cio/css.c
+++ b/drivers/s390/cio/css.c
@@ -137,6 +137,18 @@ out:
137 137
138static void css_sch_todo(struct work_struct *work); 138static void css_sch_todo(struct work_struct *work);
139 139
140static int css_sch_create_locks(struct subchannel *sch)
141{
142 sch->lock = kmalloc(sizeof(*sch->lock), GFP_KERNEL);
143 if (!sch->lock)
144 return -ENOMEM;
145
146 spin_lock_init(sch->lock);
147 mutex_init(&sch->reg_mutex);
148
149 return 0;
150}
151
140static void css_subchannel_release(struct device *dev) 152static void css_subchannel_release(struct device *dev)
141{ 153{
142 struct subchannel *sch = to_subchannel(dev); 154 struct subchannel *sch = to_subchannel(dev);
@@ -152,18 +164,26 @@ struct subchannel *css_alloc_subchannel(struct subchannel_id schid)
152 struct subchannel *sch; 164 struct subchannel *sch;
153 int ret; 165 int ret;
154 166
155 sch = kmalloc (sizeof (*sch), GFP_KERNEL | GFP_DMA); 167 sch = kzalloc(sizeof(*sch), GFP_KERNEL | GFP_DMA);
156 if (sch == NULL) 168 if (!sch)
157 return ERR_PTR(-ENOMEM); 169 return ERR_PTR(-ENOMEM);
158 ret = cio_validate_subchannel (sch, schid); 170
159 if (ret < 0) { 171 ret = cio_validate_subchannel(sch, schid);
160 kfree(sch); 172 if (ret < 0)
161 return ERR_PTR(ret); 173 goto err;
162 } 174
175 ret = css_sch_create_locks(sch);
176 if (ret)
177 goto err;
178
163 INIT_WORK(&sch->todo_work, css_sch_todo); 179 INIT_WORK(&sch->todo_work, css_sch_todo);
164 sch->dev.release = &css_subchannel_release; 180 sch->dev.release = &css_subchannel_release;
165 device_initialize(&sch->dev); 181 device_initialize(&sch->dev);
166 return sch; 182 return sch;
183
184err:
185 kfree(sch);
186 return ERR_PTR(ret);
167} 187}
168 188
169static int css_sch_device_register(struct subchannel *sch) 189static int css_sch_device_register(struct subchannel *sch)
@@ -756,7 +776,7 @@ static int __init setup_css(int nr)
756 css->pseudo_subchannel->dev.release = css_subchannel_release; 776 css->pseudo_subchannel->dev.release = css_subchannel_release;
757 dev_set_name(&css->pseudo_subchannel->dev, "defunct"); 777 dev_set_name(&css->pseudo_subchannel->dev, "defunct");
758 mutex_init(&css->pseudo_subchannel->reg_mutex); 778 mutex_init(&css->pseudo_subchannel->reg_mutex);
759 ret = cio_create_sch_lock(css->pseudo_subchannel); 779 ret = css_sch_create_locks(css->pseudo_subchannel);
760 if (ret) { 780 if (ret) {
761 kfree(css->pseudo_subchannel); 781 kfree(css->pseudo_subchannel);
762 return ret; 782 return ret;