[PATCH] IB/iser: use sector_div instead of do_div

2015-11-20 Thread Arnd Bergmann
do_div is the wrong way to divide a sector_t, as it is less
efficient when sector_t is 32-bit wide. With the upcoming
do_div optimizations, the kernel starts warning about this:

drivers/infiniband/ulp/iser/iser_verbs.c:1296:4: note: in expansion of macro 
'do_div'
include/asm-generic/div64.h:224:22: warning: passing argument 1 of '__div64_32' 
from incompatible pointer type

This changes the code to use sector_div instead, which always
produces optimal code.

Signed-off-by: Arnd Bergmann 

diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c 
b/drivers/infiniband/ulp/iser/iser_verbs.c
index a93070210109..42f4da620f2e 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -1293,7 +1293,7 @@ u8 iser_check_task_pi_status(struct iscsi_iser_task 
*iser_task,
if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {
sector_t sector_off = mr_status.sig_err.sig_err_offset;
 
-   do_div(sector_off, sector_size + 8);
+   sector_div(sector_off, sector_size + 8);
*sector = scsi_get_lba(iser_task->sc) + sector_off;
 
pr_err("PI error found type %d at sector %llx "

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 02/25] IB/mthca, net/mlx4: remove counting semaphores

2015-10-27 Thread Arnd Bergmann
The mthca and mlx4 device drivers use the same method
to switch between polling and event-driven command mode,
abusing two semaphores to create a mutual exclusion between
one polled command or multiple concurrent event driven
commands.

Since we want to make counting semaphores go away, this
patch replaces the semaphore counting the event-driven
commands with an open-coded wait-queue, which should
be an equivalent transformation of the code, although
it does not make it any nicer.

As far as I can tell, there is a preexisting race condition
regarding the cmd->use_events flag, which is not protected
by any lock. When this flag is toggled while another command
is being started, that command gets stuck until the mode is
toggled back.

A better solution that would solve the race condition and
at the same time improve the code readability would create
a new locking primitive that replaces both semaphores, like

static int mlx4_use_events(struct mlx4_cmd *cmd)
{
int ret = -EAGAIN;
spin_lock(&cmd->lock);
if (cmd->use_events && cmd->commands < cmd->max_commands) {
cmd->commands++;
ret = 1;
} else if (!cmd->use_events && cmd->commands == 0) {
cmd->commands = 1;
ret = 0;
}
spin_unlock(&cmd->lock);
return ret;
}

static bool mlx4_use_events(struct mlx4_cmd *cmd)
{
int ret;
wait_event(cmd->events_wq, ret = __mlx4_use_events(cmd) >= 0);
return ret;
}

Cc: Roland Dreier 
Cc: Eli Cohen 
Cc: Yevgeny Petrilin 
Cc: net...@vger.kernel.org
Cc: linux-rdma@vger.kernel.org
Signed-off-by: Arnd Bergmann 

Conflicts:

drivers/net/mlx4/cmd.c
drivers/net/mlx4/mlx4.h
---
 drivers/infiniband/hw/mthca/mthca_cmd.c   | 12 
 drivers/infiniband/hw/mthca/mthca_dev.h   |  3 ++-
 drivers/net/ethernet/mellanox/mlx4/cmd.c  | 12 
 drivers/net/ethernet/mellanox/mlx4/mlx4.h |  3 ++-
 4 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c 
b/drivers/infiniband/hw/mthca/mthca_cmd.c
index 9d3e5c1ac60e..aad1852e8e10 100644
--- a/drivers/infiniband/hw/mthca/mthca_cmd.c
+++ b/drivers/infiniband/hw/mthca/mthca_cmd.c
@@ -417,7 +417,8 @@ static int mthca_cmd_wait(struct mthca_dev *dev,
int err = 0;
struct mthca_cmd_context *context;
 
-   down(&dev->cmd.event_sem);
+   wait_event(dev->cmd.event_wait,
+  atomic_add_unless(&dev->cmd.commands, -1, 0));
 
spin_lock(&dev->cmd.context_lock);
BUG_ON(dev->cmd.free_head < 0);
@@ -459,7 +460,8 @@ out:
dev->cmd.free_head = context - dev->cmd.context;
spin_unlock(&dev->cmd.context_lock);
 
-   up(&dev->cmd.event_sem);
+   atomic_inc(&dev->cmd.commands);
+   wake_up(&dev->cmd.event_wait);
return err;
 }
 
@@ -571,7 +573,8 @@ int mthca_cmd_use_events(struct mthca_dev *dev)
dev->cmd.context[dev->cmd.max_cmds - 1].next = -1;
dev->cmd.free_head = 0;
 
-   sema_init(&dev->cmd.event_sem, dev->cmd.max_cmds);
+   init_waitqueue_head(&dev->cmd.event_wait);
+   atomic_set(&dev->cmd.commands, dev->cmd.max_cmds);
spin_lock_init(&dev->cmd.context_lock);
 
for (dev->cmd.token_mask = 1;
@@ -597,7 +600,8 @@ void mthca_cmd_use_polling(struct mthca_dev *dev)
dev->cmd.flags &= ~MTHCA_CMD_USE_EVENTS;
 
for (i = 0; i < dev->cmd.max_cmds; ++i)
-   down(&dev->cmd.event_sem);
+   wait_event(dev->cmd.event_wait,
+  atomic_add_unless(&dev->cmd.commands, -1, 0));
 
kfree(dev->cmd.context);
 
diff --git a/drivers/infiniband/hw/mthca/mthca_dev.h 
b/drivers/infiniband/hw/mthca/mthca_dev.h
index 7e6a6d64ad4e..3055f5c12ac8 100644
--- a/drivers/infiniband/hw/mthca/mthca_dev.h
+++ b/drivers/infiniband/hw/mthca/mthca_dev.h
@@ -121,7 +121,8 @@ struct mthca_cmd {
struct pci_pool  *pool;
struct mutex  hcr_mutex;
struct semaphore  poll_sem;
-   struct semaphore  event_sem;
+   wait_queue_head_t event_wait;
+   atomic_t  commands;
int   max_cmds;
spinlock_tcontext_lock;
int   free_head;
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c 
b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index 78f5a1a0b8c8..60134a4245ef 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -273,7 +273,8 @@ static int mlx4_cmd_wait(struct mlx4_dev *dev, u64 
in_param, u64 *out_param,
struct mlx4_cmd_context *context;
int err = 0;
 
-   down(&cmd->event_sem);
+   wait_event(cmd->event_w

Re: [PATCH] IB/core: avoid 32-bit warning

2015-10-07 Thread Arnd Bergmann
On Wednesday 07 October 2015 16:19:27 Sagi Grimberg wrote:
> On 10/7/2015 3:29 PM, Arnd Bergmann wrote:
> > The INIT_UDATA() macro requires a pointer or unsigned long argument for
> > both input and output buffer, and all callers had a cast from when
> > the code was merged until a recent restructuring, so now we get
> >
> > core/uverbs_cmd.c: In function 'ib_uverbs_create_cq':
> > core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of 
> > different size [-Wint-to-pointer-cast]
> >
> > This makes the code behave as before by adding back the cast to
> > unsigned long.
> >
> > Signed-off-by: Arnd Bergmann 
> > Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq")
> >
> > diff --git a/drivers/infiniband/core/uverbs_cmd.c 
> > b/drivers/infiniband/core/uverbs_cmd.c
> > index be4cb9f04be3..88b3b78340f2 100644
> > --- a/drivers/infiniband/core/uverbs_cmd.c
> > +++ b/drivers/infiniband/core/uverbs_cmd.c
> > @@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file 
> > *file,
> >   if (copy_from_user(&cmd, buf, sizeof(cmd)))
> >   return -EFAULT;
> >
> > - INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), sizeof(resp));
> > + INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, sizeof(cmd), 
> > sizeof(resp));
> 
> Would it make sense to cast inside INIT_UDATA() and not have callers
> worry about it?

If we want to do this properly, INIT_UDATA should be converted into a function
call that has the right types.

My patch doesn't try to do that here, it just restores the code to how it
was for the past 10 years.

Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] IB/core: avoid 32-bit warning

2015-10-07 Thread Arnd Bergmann
The INIT_UDATA() macro requires a pointer or unsigned long argument for
both input and output buffer, and all callers had a cast from when
the code was merged until a recent restructuring, so now we get

core/uverbs_cmd.c: In function 'ib_uverbs_create_cq':
core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of different 
size [-Wint-to-pointer-cast]

This makes the code behave as before by adding back the cast to
unsigned long.

Signed-off-by: Arnd Bergmann 
Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq")

diff --git a/drivers/infiniband/core/uverbs_cmd.c 
b/drivers/infiniband/core/uverbs_cmd.c
index be4cb9f04be3..88b3b78340f2 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file,
if (copy_from_user(&cmd, buf, sizeof(cmd)))
return -EFAULT;
 
-   INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), sizeof(resp));
+   INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, sizeof(cmd), 
sizeof(resp));
 
INIT_UDATA(&uhw, buf + sizeof(cmd),
   (unsigned long)cmd.response + sizeof(resp),

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] RDMA/cxgb4: re-fix 32-bit build warning

2015-10-07 Thread Arnd Bergmann
Casting a pointer to __be64 produces a warning on 32-bit architectures:

drivers/infiniband/hw/cxgb4/mem.c:147:20: warning: cast from pointer to integer 
of different size [-Wpointer-to-int-cast]
req->wr.wr_lo = (__force __be64)&wr_wait;

This was fixed at least twice for this driver in different places,
and accidentally reverted once more. This puts the correct version
back in place.

Signed-off-by: Arnd Bergmann 
Fixes: 6198dd8d7a6a7 ("iw_cxgb4: 32b platform fixes")

diff --git a/drivers/infiniband/hw/cxgb4/mem.c 
b/drivers/infiniband/hw/cxgb4/mem.c
index 026b91ebd5e2..140415d31bcc 100644
--- a/drivers/infiniband/hw/cxgb4/mem.c
+++ b/drivers/infiniband/hw/cxgb4/mem.c
@@ -144,7 +144,7 @@ static int _c4iw_write_mem_inline(struct c4iw_rdev *rdev, 
u32 addr, u32 len,
if (i == (num_wqe-1)) {
req->wr.wr_hi = cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR) |
FW_WR_COMPL_F);
-   req->wr.wr_lo = (__force __be64)&wr_wait;
+   req->wr.wr_lo = (__force __be64)(unsigned long)&wr_wait;
} else
req->wr.wr_hi = cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR));
req->wr.wr_mid = cpu_to_be32(

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] RDMA/nes: Remove unused field sent_ts

2015-02-03 Thread Arnd Bergmann
On Tuesday 03 February 2015 17:17:47 Tina Ruchandani wrote:
> This patch removes the unused field sent_ts from struct nes_cm_tcp_context.
> This patch is part of an effort to clean up instances of timekeeping 
> data-types
> like 'struct timeval' which will overflow on 32-bit systems in year 2038 and
> beyond.
> 
> Signed-off-by: Tina Ruchandani 
> 

Acked-by: Arnd Bergmann 
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] mlx5: avoid build warnings on 32-bit

2015-01-13 Thread Arnd Bergmann
On Tuesday 13 January 2015 18:28:03 Eli Cohen wrote:
> On Tue, Jan 13, 2015 at 05:08:06PM +0100, Arnd Bergmann wrote:
> 
> Hi Arnd,
> wouldn't it work by casting to uintptr_t instead of unsigned long?
> 

These are the same on all architectures that Linux can run on,
but if you have a strong preference, I can send an updated
patch, the effect is exactly the same.

Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] infiniband: mlx5: avoid a compile-time warning

2015-01-13 Thread Arnd Bergmann
The return type of find_first_bit() is architecture specific,
on ARM it is 'unsigned int', while the asm-generic code used
on x86 and a lot of other architectures returns 'unsigned long'.

When building the mlx5 driver on ARM, we get a warning about
this:

infiniband/hw/mlx5/mem.c: In function 'mlx5_ib_cont_pages':
infiniband/hw/mlx5/mem.c:84:143: warning: comparison of distinct pointer types 
lacks a cast
 m = min(m, find_first_bit(&tmp, sizeof(tmp)));

This patch changes the driver to use min_t to make it behave
the same way on all architectures.

Signed-off-by: Arnd Bergmann 

diff --git a/drivers/infiniband/hw/mlx5/mem.c b/drivers/infiniband/hw/mlx5/mem.c
index b56e4c5593ee..611a9fdf2f38 100644
--- a/drivers/infiniband/hw/mlx5/mem.c
+++ b/drivers/infiniband/hw/mlx5/mem.c
@@ -81,7 +81,7 @@ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr, int 
*count, int *shift,
for (k = 0; k < len; k++) {
if (!(i & mask)) {
tmp = (unsigned long)pfn;
-   m = min(m, find_first_bit(&tmp, sizeof(tmp)));
+   m = min_t(unsigned long, m, 
find_first_bit(&tmp, sizeof(tmp)));
skip = 1 << m;
mask = skip - 1;
base = pfn;

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] mlx5: avoid build warnings on 32-bit

2015-01-13 Thread Arnd Bergmann
The mlx5 driver passes a string pointer in through a 'u64' variable,
which on 32-bit machines causes a build warning:

drivers/net/ethernet/mellanox/mlx5/core/debugfs.c: In function 'qp_read_field':
drivers/net/ethernet/mellanox/mlx5/core/debugfs.c:303:11: warning: cast from 
pointer to integer of different size [-Wpointer-to-int-cast]

The code is in fact safe, so we can shut up the warning by adding
extra type casts.

Signed-off-by: Arnd Bergmann 

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c 
b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
index 10e1f1a18255..4878025e231c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
@@ -300,11 +300,11 @@ static u64 qp_read_field(struct mlx5_core_dev *dev, 
struct mlx5_core_qp *qp,
param = qp->pid;
break;
case QP_STATE:
-   param = (u64)mlx5_qp_state_str(be32_to_cpu(ctx->flags) >> 28);
+   param = (unsigned 
long)mlx5_qp_state_str(be32_to_cpu(ctx->flags) >> 28);
*is_str = 1;
break;
case QP_XPORT:
-   param = (u64)mlx5_qp_type_str((be32_to_cpu(ctx->flags) >> 16) & 
0xff);
+   param = (unsigned 
long)mlx5_qp_type_str((be32_to_cpu(ctx->flags) >> 16) & 0xff);
*is_str = 1;
break;
case QP_MTU:
@@ -464,7 +464,7 @@ static ssize_t dbg_read(struct file *filp, char __user 
*buf, size_t count,
 
 
if (is_str)
-   ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char *)field);
+   ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char 
*)(unsigned long)field);
else
ret = snprintf(tbuf, sizeof(tbuf), "0x%llx\n", field);
 

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 0/5] of_platform_driver and OF_DEVICE removal

2013-04-22 Thread Arnd Bergmann
On Monday 22 April 2013, Rob Herring wrote:
> From: Rob Herring 
> 
> This series is a relatively straight-forward removal of the last remaining
> user of of_platform_driver (ibmebus) and removal of CONFIG_OF_DEVICE which
> is always enabled when CONFIG_OF is enabled.
> 
> Compile tested on powerpc and sparc.
> 

Acked-by: Arnd Bergmann 
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] RDMA/cxgb4: Add default_llseek to debugfs files.

2010-09-29 Thread Arnd Bergmann
On Wednesday 29 September 2010 21:21:14 Roland Dreier wrote:
> 
>  > The main difference between default_llseek and generic_file_llseek
>  > is that default_llseek doesn't care about the maximum file size
>  > of the underlying file system, which is ULONG_MAX on debugfs,
>  > so they are equivalent.
> 
> I thought default_llseek also takes the BKL still?

Not any more in linux-next.

>  > In general, the preferred one is no_llseek for those files where
>  > you know you do not need to seek. If you do, I'd use default_llseek
>  > for character devices and generic_file_llseek for file systems
>  > that set the s_maxbytes.
> 
> The case in question is for debugfs files, so we should use
> generic_file_llseek, right?

Yes, but it's a very weak "should". My automatic conversion script
uses default_llseek.

Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] RDMA/cxgb4: Add default_llseek to debugfs files.

2010-09-29 Thread Arnd Bergmann
On Wednesday 29 September 2010 19:19:32 Roland Dreier wrote:
>  > @@ -182,6 +182,7 @@ static const struct file_operations qp_debugfs_fops = {
>  >  .open= qp_open,
>  >  .release = qp_release,
>  >  .read= debugfs_read,
>  > +.llseek  = default_llseek,
>  >  };
> 
> I think this could actually be generic_file_llseek (right, Arnd?).

The main difference between default_llseek and generic_file_llseek
is that default_llseek doesn't care about the maximum file size
of the underlying file system, which is ULONG_MAX on debugfs,
so they are equivalent.

In general, the preferred one is no_llseek for those files where
you know you do not need to seek. If you do, I'd use default_llseek
for character devices and generic_file_llseek for file systems
that set the s_maxbytes.

Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: linux-next: manual merge of the bkl-llseek tree with the infiniband tree

2010-09-29 Thread Arnd Bergmann
On Wednesday 29 September 2010, Stephen Rothwell wrote:
> Today's linux-next merge of the bkl-llseek tree got a conflict in
> drivers/infiniband/hw/cxgb4/device.c between commit
> 9e8d1fa3420f489da8a5da47c026511aa71fa50b ("RDMA/cxgb4: debugfs files for
> dumping active stags") from the infiniband tree and commit
> 9711569d06e7df5f02a943fc4138fb152526e719 ("llseek: automatically
> add .llseek fop") from the bkl-llseek tree.
> 
> The former added a whole new file_operations (and changed some
> context) ... I fixed it up (see below) and can carry the fix as necessary.

Looks fine, thanks!

Steve, Roland:

Would you mind adding an appropriate .llseek method to your file operations
so I can drop the change from my tree?

The default_llseek function is used because the read function can currently
be seeked, but I do not know whether that is intentional. If you don't want
to seek, just make open() call nonseekable_open() and set .llseek to no_llseek.

Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 04/18] ib/qib: use generic_file_llseek

2010-07-07 Thread Arnd Bergmann
When the default llseek action gets changed to
no_llseek, all file systems relying on the
current behaviour need to set explicit .llseek
operations.

In case of qib_fs, we want the files to be
seekable, so generic_file_llseek fits best.

Signed-off-by: Arnd Bergmann 
Cc: Roland Dreier 
Cc: Sean Hefty 
Cc: Hal Rosenstock 
Cc: linux-rdma@vger.kernel.org
---
 drivers/infiniband/hw/qib/qib_fs.c |   18 +-
 1 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/infiniband/hw/qib/qib_fs.c 
b/drivers/infiniband/hw/qib/qib_fs.c
index 844954b..9f989c0 100644
--- a/drivers/infiniband/hw/qib/qib_fs.c
+++ b/drivers/infiniband/hw/qib/qib_fs.c
@@ -135,8 +135,8 @@ static ssize_t driver_names_read(struct file *file, char 
__user *buf,
 }
 
 static const struct file_operations driver_ops[] = {
-   { .read = driver_stats_read, },
-   { .read = driver_names_read, },
+   { .read = driver_stats_read, .llseek = generic_file_llseek, },
+   { .read = driver_names_read, .llseek = generic_file_llseek, },
 };
 
 /* read the per-device counters */
@@ -164,8 +164,8 @@ static ssize_t dev_names_read(struct file *file, char 
__user *buf,
 }
 
 static const struct file_operations cntr_ops[] = {
-   { .read = dev_counters_read, },
-   { .read = dev_names_read, },
+   { .read = dev_counters_read, .llseek = generic_file_llseek, },
+   { .read = dev_names_read, .llseek = generic_file_llseek, },
 };
 
 /*
@@ -210,9 +210,9 @@ static ssize_t portcntrs_2_read(struct file *file, char 
__user *buf,
 }
 
 static const struct file_operations portcntr_ops[] = {
-   { .read = portnames_read, },
-   { .read = portcntrs_1_read, },
-   { .read = portcntrs_2_read, },
+   { .read = portnames_read, .llseek = generic_file_llseek, },
+   { .read = portcntrs_1_read, .llseek = generic_file_llseek, },
+   { .read = portcntrs_2_read, .llseek = generic_file_llseek, },
 };
 
 /*
@@ -261,8 +261,8 @@ static ssize_t qsfp_2_read(struct file *file, char __user 
*buf,
 }
 
 static const struct file_operations qsfp_ops[] = {
-   { .read = qsfp_1_read, },
-   { .read = qsfp_2_read, },
+   { .read = qsfp_1_read, .llseek = generic_file_llseek, },
+   { .read = qsfp_2_read, .llseek = generic_file_llseek, },
 };
 
 static ssize_t flash_read(struct file *file, char __user *buf,
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html