git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix the deadlock in qib_fs
[pandora-kernel.git]
/
drivers
/
infiniband
/
hw
/
qib
/
qib_fs.c
diff --git
a/drivers/infiniband/hw/qib/qib_fs.c
b/drivers/infiniband/hw/qib/qib_fs.c
index
7554704
..
844954b
100644
(file)
--- a/
drivers/infiniband/hw/qib/qib_fs.c
+++ b/
drivers/infiniband/hw/qib/qib_fs.c
@@
-144,10
+144,11
@@
static ssize_t dev_counters_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{
u64 *counters;
size_t count, loff_t *ppos)
{
u64 *counters;
+ size_t avail;
struct qib_devdata *dd = private2dd(file);
struct qib_devdata *dd = private2dd(file);
- return simple_read_from_buffer(buf, count, ppos, counters,
-
dd->f_read_cntrs(dd, *ppos, NULL, &counters)
);
+ avail = dd->f_read_cntrs(dd, *ppos, NULL, &counters);
+
return simple_read_from_buffer(buf, count, ppos, counters, avail
);
}
/* read the per-device counters */
}
/* read the per-device counters */
@@
-155,10
+156,11
@@
static ssize_t dev_names_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{
char *names;
size_t count, loff_t *ppos)
{
char *names;
+ size_t avail;
struct qib_devdata *dd = private2dd(file);
struct qib_devdata *dd = private2dd(file);
- return simple_read_from_buffer(buf, count, ppos, names,
-
dd->f_read_cntrs(dd, *ppos, &names, NULL)
);
+ avail = dd->f_read_cntrs(dd, *ppos, &names, NULL);
+
return simple_read_from_buffer(buf, count, ppos, names, avail
);
}
static const struct file_operations cntr_ops[] = {
}
static const struct file_operations cntr_ops[] = {
@@
-176,10
+178,11
@@
static ssize_t portnames_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{
char *names;
size_t count, loff_t *ppos)
{
char *names;
+ size_t avail;
struct qib_devdata *dd = private2dd(file);
struct qib_devdata *dd = private2dd(file);
- return simple_read_from_buffer(buf, count, ppos, names,
-
dd->f_read_portcntrs(dd, *ppos, 0, &names, NULL)
);
+ avail = dd->f_read_portcntrs(dd, *ppos, 0, &names, NULL);
+
return simple_read_from_buffer(buf, count, ppos, names, avail
);
}
/* read the per-port counters for port 1 (pidx 0) */
}
/* read the per-port counters for port 1 (pidx 0) */
@@
-187,10
+190,11
@@
static ssize_t portcntrs_1_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{
u64 *counters;
size_t count, loff_t *ppos)
{
u64 *counters;
+ size_t avail;
struct qib_devdata *dd = private2dd(file);
struct qib_devdata *dd = private2dd(file);
- return simple_read_from_buffer(buf, count, ppos, counters,
-
dd->f_read_portcntrs(dd, *ppos, 0, NULL, &counters)
);
+ avail = dd->f_read_portcntrs(dd, *ppos, 0, NULL, &counters);
+
return simple_read_from_buffer(buf, count, ppos, counters, avail
);
}
/* read the per-port counters for port 2 (pidx 1) */
}
/* read the per-port counters for port 2 (pidx 1) */
@@
-198,10
+202,11
@@
static ssize_t portcntrs_2_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{
u64 *counters;
size_t count, loff_t *ppos)
{
u64 *counters;
+ size_t avail;
struct qib_devdata *dd = private2dd(file);
struct qib_devdata *dd = private2dd(file);
- return simple_read_from_buffer(buf, count, ppos, counters,
-
dd->f_read_portcntrs(dd, *ppos, 1, NULL, &counters)
);
+ avail = dd->f_read_portcntrs(dd, *ppos, 1, NULL, &counters);
+
return simple_read_from_buffer(buf, count, ppos, counters, avail
);
}
static const struct file_operations portcntr_ops[] = {
}
static const struct file_operations portcntr_ops[] = {
@@
-537,10
+542,8
@@
static int qibfs_fill_super(struct super_block *sb, void *data, int silent)
list_for_each_entry_safe(dd, tmp, &qib_dev_list, list) {
spin_unlock_irqrestore(&qib_devs_lock, flags);
ret = add_cntr_files(sb, dd);
list_for_each_entry_safe(dd, tmp, &qib_dev_list, list) {
spin_unlock_irqrestore(&qib_devs_lock, flags);
ret = add_cntr_files(sb, dd);
- if (ret) {
- deactivate_super(sb);
+ if (ret)
goto bail;
goto bail;
- }
spin_lock_irqsave(&qib_devs_lock, flags);
}
spin_lock_irqsave(&qib_devs_lock, flags);
}