/*
- * Copyright (C) 2009-2012 Cray, Inc.
+ * Copyright (C) 2009-2012, 2016 Cray, Inc.
*
- * Copyright (c) 2013, Intel Corporation.
+ * Copyright (c) 2013, 2015, Intel Corporation.
*
* Author: Nic Henke <nic@cray.com>
+ * Author: James Shimek <jshimek@cray.com>
*
* This file is part of Lustre, http://www.lustre.org.
*
static int
_kgnilnd_proc_run_cksum_test(int caseno, int nloops, int nob)
{
- lnet_kiov_t *src, *dest;
+ struct bio_vec *src, *dest;
struct timespec begin, end, diff;
int niov;
int rc = 0;
__u16 cksum, cksum2;
__u64 mbytes;
- LIBCFS_ALLOC(src, LNET_MAX_IOV * sizeof(lnet_kiov_t));
- LIBCFS_ALLOC(dest, LNET_MAX_IOV * sizeof(lnet_kiov_t));
+ CFS_ALLOC_PTR_ARRAY(src, LNET_MAX_IOV);
+ CFS_ALLOC_PTR_ARRAY(dest, LNET_MAX_IOV);
if (src == NULL || dest == NULL) {
CERROR("couldn't allocate iovs\n");
}
for (i = 0; i < LNET_MAX_IOV; i++) {
- src[i].kiov_offset = 0;
- src[i].kiov_len = PAGE_SIZE;
- src[i].kiov_page = alloc_page(__GFP_WAIT | __GFP_IO |
- __GFP_FS | __GFP_ZERO);
+ src[i].bv_offset = 0;
+ src[i].bv_len = PAGE_SIZE;
+ src[i].bv_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
- if (src[i].kiov_page == NULL) {
+ if (src[i].bv_page == NULL) {
CERROR("couldn't allocate page %d\n", i);
GOTO(unwind, rc = -ENOMEM);
}
- dest[i].kiov_offset = 0;
- dest[i].kiov_len = PAGE_SIZE;
- dest[i].kiov_page = alloc_page(__GFP_WAIT | __GFP_IO |
- __GFP_FS | __GFP_ZERO);
+ dest[i].bv_offset = 0;
+ dest[i].bv_len = PAGE_SIZE;
+ dest[i].bv_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
- if (dest[i].kiov_page == NULL) {
+ if (dest[i].bv_page == NULL) {
CERROR("couldn't allocate page %d\n", i);
GOTO(unwind, rc = -ENOMEM);
}
}
/* setup real data */
- src[0].kiov_offset = 317;
- dest[0].kiov_offset = 592;
+ src[0].bv_offset = 317;
+ dest[0].bv_offset = 592;
switch (caseno) {
default:
/* odd -> even */
break;
case 1:
/* odd -> odd */
- dest[0].kiov_offset -= 1;
+ dest[0].bv_offset -= 1;
break;
case 2:
/* even -> even */
- src[0].kiov_offset += 1;
+ src[0].bv_offset += 1;
break;
case 3:
/* even -> odd */
- src[0].kiov_offset += 1;
- dest[0].kiov_offset -= 1;
+ src[0].bv_offset += 1;
+ dest[0].bv_offset -= 1;
}
- src[0].kiov_len = PAGE_SIZE - src[0].kiov_offset;
- dest[0].kiov_len = PAGE_SIZE - dest[0].kiov_offset;
+ src[0].bv_len = PAGE_SIZE - src[0].bv_offset;
+ dest[0].bv_len = PAGE_SIZE - dest[0].bv_offset;
for (i = 0; i < niov; i++) {
- memset(page_address(src[i].kiov_page) + src[i].kiov_offset,
- 0xf0 + i, src[i].kiov_len);
+ memset(page_address(src[i].bv_page) + src[i].bv_offset,
+ 0xf0 + i, src[i].bv_len);
}
lnet_copy_kiov2kiov(niov, dest, 0, niov, src, 0, nob);
getnstimeofday(&begin);
for (n = 0; n < nloops; n++) {
- CDEBUG(D_BUFFS, "case %d loop %d src %d dest %d nob %d niov %d\n",
- caseno, n, src[0].kiov_offset, dest[0].kiov_offset, nob, niov);
+ CDEBUG(D_BUFFS,
+ "case %d loop %d src %d dest %d nob %d niov %d\n",
+ caseno, n, src[0].bv_offset, dest[0].bv_offset, nob,
+ niov);
cksum = kgnilnd_cksum_kiov(niov, src, 0, nob - (n % nob), 1);
cksum2 = kgnilnd_cksum_kiov(niov, dest, 0, nob - (n % nob), 1);
diff = kgnilnd_ts_sub(end, begin);
- LCONSOLE_INFO("running "LPD64"MB took %ld.%ld seconds\n",
+ LCONSOLE_INFO("running %lldMB took %ld.%ld seconds\n",
mbytes, diff.tv_sec, diff.tv_nsec);
unwind:
CDEBUG(D_NET, "freeing %d pages\n", i);
for (i -= 1; i >= 0; i--) {
- if (src[i].kiov_page != NULL) {
- __free_page(src[i].kiov_page);
- }
- if (dest[i].kiov_page != NULL) {
- __free_page(dest[i].kiov_page);
- }
+ if (src[i].bv_page)
+ __free_page(src[i].bv_page);
+
+ if (dest[i].bv_page)
+ __free_page(dest[i].bv_page);
}
if (src != NULL)
- LIBCFS_FREE(src, LNET_MAX_IOV * sizeof(lnet_kiov_t));
+ CFS_FREE_PTR_ARRAY(src, LNET_MAX_IOV);
if (dest != NULL)
- LIBCFS_FREE(dest, LNET_MAX_IOV * sizeof(lnet_kiov_t));
+ CFS_FREE_PTR_ARRAY(dest, LNET_MAX_IOV);
return rc;
}
static const struct file_operations kgn_cksum_test_fops = {
.owner = THIS_MODULE,
.open = kgnilnd_cksum_test_seq_open,
- .read = seq_read,
.write = kgnilnd_proc_cksum_test_write,
.llseek = seq_lseek,
.release = seq_release,
kgnilnd_stats_seq_show(struct seq_file *sf, void *v)
{
kgn_device_t *dev;
- struct timeval now;
- int rc;
+ struct timespec64 now;
if (kgnilnd_data.kgn_init < GNILND_INIT_ALL) {
- rc = seq_printf(sf, "kgnilnd is not initialized yet\n");
- return rc;
+ seq_printf(sf, "kgnilnd is not initialized yet\n");
+ return 0;
}
/* only do the first device */
/* sampling is racy, but so is reading this file! */
smp_rmb();
- do_gettimeofday(&now);
-
- rc = seq_printf(sf, "time: %lu.%lu\n"
- "ntx: %d\n"
- "npeers: %d\n"
- "nconns: %d\n"
- "nEPs: %d\n"
- "ndgrams: %d\n"
- "nfmablk: %d\n"
- "n_mdd: %d\n"
- "n_mdd_held: %d\n"
- "n_eager_allocs: %d\n"
- "GART map bytes: %ld\n"
- "TX queued maps: %d\n"
- "TX phys nmaps: %d\n"
- "TX phys bytes: %lu\n"
- "TX virt nmaps: %d\n"
- "TX virt bytes: "LPU64"\n"
- "RDMAQ bytes_auth: %ld\n"
- "RDMAQ bytes_left: %ld\n"
- "RDMAQ nstalls: %d\n"
- "dev mutex delay: %ld\n"
- "dev n_yield: %d\n"
- "dev n_schedule: %d\n"
- "SMSG fast_try: %d\n"
- "SMSG fast_ok: %d\n"
- "SMSG fast_block: %d\n"
- "SMSG ntx: %u\n"
- "SMSG tx_bytes: %lu\n"
- "SMSG nrx: %u\n"
- "SMSG rx_bytes: %lu\n"
- "RDMA ntx: %u\n"
- "RDMA tx_bytes: %lu\n"
- "RDMA nrx: %u\n"
- "RDMA rx_bytes: %lu\n"
- "VMAP short: %d\n"
- "VMAP cksum: %d\n"
- "KMAP short: %d\n"
- "RDMA REV length: %d\n"
- "RDMA REV offset: %d\n"
- "RDMA REV copy: %d\n",
- now.tv_sec, now.tv_usec,
- atomic_read(&kgnilnd_data.kgn_ntx),
- atomic_read(&kgnilnd_data.kgn_npeers),
- atomic_read(&kgnilnd_data.kgn_nconns),
- atomic_read(&dev->gnd_neps),
- atomic_read(&dev->gnd_ndgrams),
- atomic_read(&dev->gnd_nfmablk),
- atomic_read(&dev->gnd_n_mdd), atomic_read(&dev->gnd_n_mdd_held),
- atomic_read(&kgnilnd_data.kgn_neager_allocs),
- atomic64_read(&dev->gnd_nbytes_map),
- atomic_read(&dev->gnd_nq_map),
- dev->gnd_map_nphys, dev->gnd_map_physnop * PAGE_SIZE,
- dev->gnd_map_nvirt, dev->gnd_map_virtnob,
- atomic64_read(&dev->gnd_rdmaq_bytes_out),
- atomic64_read(&dev->gnd_rdmaq_bytes_ok),
- atomic_read(&dev->gnd_rdmaq_nstalls),
- dev->gnd_mutex_delay,
- atomic_read(&dev->gnd_n_yield), atomic_read(&dev->gnd_n_schedule),
- atomic_read(&dev->gnd_fast_try), atomic_read(&dev->gnd_fast_ok),
- atomic_read(&dev->gnd_fast_block),
- atomic_read(&dev->gnd_short_ntx), atomic64_read(&dev->gnd_short_txbytes),
- atomic_read(&dev->gnd_short_nrx), atomic64_read(&dev->gnd_short_rxbytes),
- atomic_read(&dev->gnd_rdma_ntx), atomic64_read(&dev->gnd_rdma_txbytes),
- atomic_read(&dev->gnd_rdma_nrx), atomic64_read(&dev->gnd_rdma_rxbytes),
- atomic_read(&kgnilnd_data.kgn_nvmap_short),
- atomic_read(&kgnilnd_data.kgn_nvmap_cksum),
- atomic_read(&kgnilnd_data.kgn_nkmap_short),
- atomic_read(&kgnilnd_data.kgn_rev_length),
- atomic_read(&kgnilnd_data.kgn_rev_offset),
- atomic_read(&kgnilnd_data.kgn_rev_copy_buff));
+ ktime_get_ts64(&now);
+
+ seq_printf(sf, "time: %llu.%lu\n"
+ "ntx: %d\n"
+ "npeers: %d\n"
+ "nconns: %d\n"
+ "nEPs: %d\n"
+ "ndgrams: %d\n"
+ "nfmablk: %d\n"
+ "n_mdd: %d\n"
+ "n_mdd_held: %d\n"
+ "n_eager_allocs: %d\n"
+ "GART map bytes: %lld\n"
+ "TX queued maps: %d\n"
+ "TX phys nmaps: %d\n"
+ "TX phys bytes: %lu\n"
+ "RDMAQ bytes_auth: %lld\n"
+ "RDMAQ bytes_left: %lld\n"
+ "RDMAQ nstalls: %d\n"
+ "dev mutex delay: %ld\n"
+ "dev n_yield: %d\n"
+ "dev n_schedule: %d\n"
+ "SMSG fast_try: %d\n"
+ "SMSG fast_ok: %d\n"
+ "SMSG fast_block: %d\n"
+ "SMSG ntx: %u\n"
+ "SMSG tx_bytes: %llu\n"
+ "SMSG nrx: %u\n"
+ "SMSG rx_bytes: %llu\n"
+ "RDMA ntx: %u\n"
+ "RDMA tx_bytes: %llu\n"
+ "RDMA nrx: %u\n"
+ "RDMA rx_bytes: %llu\n"
+ "VMAP short: %d\n"
+ "VMAP cksum: %d\n"
+ "KMAP short: %d\n"
+ "RDMA REV length: %d\n"
+ "RDMA REV offset: %d\n"
+ "RDMA REV copy: %d\n",
+ (s64)now.tv_sec, now.tv_nsec,
+ atomic_read(&kgnilnd_data.kgn_ntx),
+ atomic_read(&kgnilnd_data.kgn_npeers),
+ atomic_read(&kgnilnd_data.kgn_nconns),
+ atomic_read(&dev->gnd_neps),
+ atomic_read(&dev->gnd_ndgrams),
+ atomic_read(&dev->gnd_nfmablk),
+ atomic_read(&dev->gnd_n_mdd), atomic_read(&dev->gnd_n_mdd_held),
+ atomic_read(&kgnilnd_data.kgn_neager_allocs),
+ (s64)atomic64_read(&dev->gnd_nbytes_map),
+ atomic_read(&dev->gnd_nq_map),
+ dev->gnd_map_nphys, dev->gnd_map_physnop * PAGE_SIZE,
+ (s64)atomic64_read(&dev->gnd_rdmaq_bytes_out),
+ (s64)atomic64_read(&dev->gnd_rdmaq_bytes_ok),
+ atomic_read(&dev->gnd_rdmaq_nstalls),
+ dev->gnd_mutex_delay,
+ atomic_read(&dev->gnd_n_yield),
+ atomic_read(&dev->gnd_n_schedule),
+ atomic_read(&dev->gnd_fast_try),
+ atomic_read(&dev->gnd_fast_ok),
+ atomic_read(&dev->gnd_fast_block),
+ atomic_read(&dev->gnd_short_ntx),
+ (s64)atomic64_read(&dev->gnd_short_txbytes),
+ atomic_read(&dev->gnd_short_nrx),
+ (s64)atomic64_read(&dev->gnd_short_rxbytes),
+ atomic_read(&dev->gnd_rdma_ntx),
+ (s64)atomic64_read(&dev->gnd_rdma_txbytes),
+ atomic_read(&dev->gnd_rdma_nrx),
+ (s64)atomic64_read(&dev->gnd_rdma_rxbytes),
+ atomic_read(&kgnilnd_data.kgn_nvmap_short),
+ atomic_read(&kgnilnd_data.kgn_nvmap_cksum),
+ atomic_read(&kgnilnd_data.kgn_nkmap_short),
+ atomic_read(&kgnilnd_data.kgn_rev_length),
+ atomic_read(&kgnilnd_data.kgn_rev_offset),
+ atomic_read(&kgnilnd_data.kgn_rev_copy_buff));
- return rc;
+ return 0;
}
static ssize_t
loff_t next = *pos + 1;
rc = kgnilnd_mdd_seq_seek(gseq, next);
+ *pos = next;
if (rc != 0) {
return NULL;
}
- *pos = next;
return gseq;
}
hndl.qword1 = tx->tx_map_key.qword1;
hndl.qword2 = tx->tx_map_key.qword2;
- seq_printf(s, "%p %x %16"LPF64"u %8d %#8x "LPX64"."LPX64"x\n",
+ seq_printf(s, "%p %x %16llu %8d %#8x %#llx.%#llxx\n",
tx, id, nob, physnop, buftype,
hndl.qword1, hndl.qword2);
return 0;
}
-static struct seq_operations kgn_mdd_sops = {
+static const struct seq_operations kgn_mdd_sops = {
.start = kgnilnd_mdd_seq_start,
.stop = kgnilnd_mdd_seq_stop,
.next = kgnilnd_mdd_seq_next,
return rc;
}
-static struct file_operations kgn_mdd_fops = {
- .owner = THIS_MODULE,
- .open = kgnilnd_mdd_seq_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
+static const struct file_operations kgn_mdd_fops = {
+ .owner = THIS_MODULE,
+ .open = kgnilnd_mdd_seq_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
};
typedef struct {
loff_t next = *pos + 1;
rc = kgnilnd_smsg_seq_seek(gseq, next);
+ *pos = next;
if (rc != 0) {
LIBCFS_FREE(gseq, sizeof(*gseq));
return NULL;
}
- *pos = next;
return gseq;
}
spin_unlock(&dev->gnd_fmablk_lock);
if (live) {
- seq_printf(s, "%5d %4s %6d/%5d/%5d %9d %18p "LPX64"."LPX64"\n",
+ seq_printf(s, "%5d %4s %6d/%5d/%5d %9d %18p %#llx.%#llx\n",
(int) gseq->gsmsg_off, kgnilnd_fmablk_state2str(state),
avail_mboxs, held_mboxs, num_mboxs, blk_size,
fmablk, hndl.qword1, hndl.qword2);
return 0;
}
-static struct seq_operations kgn_smsg_sops = {
+static const struct seq_operations kgn_smsg_sops = {
.start = kgnilnd_smsg_seq_start,
.stop = kgnilnd_smsg_seq_stop,
.next = kgnilnd_smsg_seq_next,
return rc;
}
-static struct file_operations kgn_smsg_fops = {
- .owner = THIS_MODULE,
- .open = kgnilnd_smsg_seq_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
+static const struct file_operations kgn_smsg_fops = {
+ .owner = THIS_MODULE,
+ .open = kgnilnd_smsg_seq_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
};
typedef struct {
loff_t next = *pos + 1;
rc = kgnilnd_conn_seq_seek(gseq, next);
+ *pos = next;
if (rc != 0) {
LIBCFS_FREE(gseq, sizeof(*gseq));
return NULL;
}
- *pos = next;
return gseq;
}
"rx sq %u %dms/%dms "
"noop r/s %d/%d w/s/cq %lds/%lds/%lds "
"sched a/d %lds/%lds "
- "tx_re "LPD64" TO %ds %s\n",
+ "tx_re %lld TO %ds %s\n",
conn, peer ? libcfs_nid2str(peer->gnp_nid) : "<?>",
atomic_read(&conn->gnc_refcount),
kgnilnd_count_list(&conn->gnc_fmaq),
return 0;
}
-static struct seq_operations kgn_conn_sops = {
+static const struct seq_operations kgn_conn_sops = {
.start = kgnilnd_conn_seq_start,
.stop = kgnilnd_conn_seq_stop,
.next = kgnilnd_conn_seq_next,
struct tm ctm;
struct timespec now;
unsigned long jifs;
- int rc = 0;
if (kgnilnd_debug_peer_nid == KGN_DEBUG_PEER_NID_DEFAULT) {
- rc = seq_printf(sf, "peer_conns not initialized\n");
- return rc;
+ seq_printf(sf, "peer_conns not initialized\n");
+ return 0;
}
/* sample date/time stamp - print time in UTC
* 2012-12-11T16:06:16.966751 123@gni ...
*/
getnstimeofday(&now);
- time_to_tm(now.tv_sec, 0, &ctm);
+ time64_to_tm(now.tv_sec, 0, &ctm);
jifs = jiffies;
write_lock(&kgnilnd_data.kgn_peer_conn_lock);
peer = kgnilnd_find_peer_locked(kgnilnd_debug_peer_nid);
if (peer == NULL) {
- rc = seq_printf(sf, "peer not found for this nid %d\n",
+ seq_printf(sf, "peer not found for this nid %d\n",
kgnilnd_debug_peer_nid);
write_unlock(&kgnilnd_data.kgn_peer_conn_lock);
- return rc;
+ return 0;
}
list_for_each_entry(conn, &peer->gnp_conns, gnc_list) {
- rc = seq_printf(sf,
- "%04ld-%02d-%02dT%02d:%02d:%02d.%06ld %s "
- "mbox adr %p "
- "dg type %s "
- "%s "
- "purg %d "
- "close s/r %d/%d "
- "err %d peer err %d "
- "tx sq %u %dms/%dms "
- "rx sq %u %dms/%dms/%dms "
- "tx retran %lld\n",
- ctm.tm_year+1900, ctm.tm_mon+1, ctm.tm_mday,
- ctm.tm_hour, ctm.tm_min, ctm.tm_sec, now.tv_nsec,
- libcfs_nid2str(peer->gnp_nid),
- conn->remote_mbox_addr,
- kgnilnd_conn_dgram_type2str(conn->gnc_dgram_type),
- kgnilnd_conn_state2str(conn),
- conn->gnc_in_purgatory,
- conn->gnc_close_sent,
- conn->gnc_close_recvd,
- conn->gnc_error,
- conn->gnc_peer_error,
- atomic_read(&conn->gnc_tx_seq),
- jiffies_to_msecs(jifs - conn->gnc_last_tx),
- jiffies_to_msecs(jifs - conn->gnc_last_tx_cq),
- atomic_read(&conn->gnc_rx_seq),
- jiffies_to_msecs(jifs - conn->gnc_first_rx),
- jiffies_to_msecs(jifs - conn->gnc_last_rx),
- jiffies_to_msecs(jifs - conn->gnc_last_rx_cq),
- conn->gnc_tx_retrans);
+ seq_printf(sf,
+ "%04ld-%02d-%02dT%02d:%02d:%02d.%06ld %s "
+ "mbox adr %p "
+ "dg type %s "
+ "%s "
+ "purg %d "
+ "close s/r %d/%d "
+ "err %d peer err %d "
+ "tx sq %u %dms/%dms "
+ "rx sq %u %dms/%dms/%dms "
+ "tx retran %lld\n",
+ ctm.tm_year+1900, ctm.tm_mon+1, ctm.tm_mday,
+ ctm.tm_hour, ctm.tm_min, ctm.tm_sec, now.tv_nsec,
+ libcfs_nid2str(peer->gnp_nid),
+ conn->remote_mbox_addr,
+ kgnilnd_conn_dgram_type2str(conn->gnc_dgram_type),
+ kgnilnd_conn_state2str(conn),
+ conn->gnc_in_purgatory,
+ conn->gnc_close_sent,
+ conn->gnc_close_recvd,
+ conn->gnc_error,
+ conn->gnc_peer_error,
+ atomic_read(&conn->gnc_tx_seq),
+ jiffies_to_msecs(jifs - conn->gnc_last_tx),
+ jiffies_to_msecs(jifs - conn->gnc_last_tx_cq),
+ atomic_read(&conn->gnc_rx_seq),
+ jiffies_to_msecs(jifs - conn->gnc_first_rx),
+ jiffies_to_msecs(jifs - conn->gnc_last_rx),
+ jiffies_to_msecs(jifs - conn->gnc_last_rx_cq),
+ conn->gnc_tx_retrans);
}
write_unlock(&kgnilnd_data.kgn_peer_conn_lock);
- return rc;
+ return 0;
}
static int
return rc;
}
-static struct file_operations kgn_conn_fops = {
- .owner = THIS_MODULE,
- .open = kgnilnd_conn_seq_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
+static const struct file_operations kgn_conn_fops = {
+ .owner = THIS_MODULE,
+ .open = kgnilnd_conn_seq_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
};
typedef struct {
loff_t next = *pos + 1;
rc = kgnilnd_peer_seq_seek(gseq, next);
+ *pos = next;
if (rc != 0) {
LIBCFS_FREE(gseq, sizeof(*gseq));
return NULL;
}
- *pos = next;
return gseq;
}
read_unlock(&kgnilnd_data.kgn_peer_conn_lock);
- seq_printf(s, "%p->%s [%d] %s NIC 0x%x q %d conn %c purg %d "
- "last %d@%dms dgram %d@%dms "
- "reconn %dms to %lus \n",
+ seq_printf(s, "%p->%s [%d] %s NIC 0x%x q %d conn %c purg %d last %d@%lldms dgram %d@%dms reconn %dms to %lus \n",
peer, libcfs_nid2str(peer->gnp_nid),
atomic_read(&peer->gnp_refcount),
- (peer->gnp_down == GNILND_RCA_NODE_DOWN) ? "down" : "up",
+ (peer->gnp_state == GNILND_PEER_DOWN) ? "down" :
+ peer->gnp_state == GNILND_PEER_TIMED_OUT ? "timedout" : "up",
peer->gnp_host_id,
kgnilnd_count_list(&peer->gnp_tx_queue),
conn_str,
purg_count,
peer->gnp_last_errno,
- jiffies_to_msecs(jiffies - peer->gnp_last_alive),
+ (ktime_get_seconds() - peer->gnp_last_alive) * MSEC_PER_SEC,
peer->gnp_last_dgram_errno,
jiffies_to_msecs(jiffies - peer->gnp_last_dgram_time),
peer->gnp_reconnect_interval != 0
return 0;
}
-static struct seq_operations kgn_peer_sops = {
+static const struct seq_operations kgn_peer_sops = {
.start = kgnilnd_peer_seq_start,
.stop = kgnilnd_peer_seq_stop,
.next = kgnilnd_peer_seq_next,
return rc;
}
-static struct file_operations kgn_peer_fops = {
- .owner = THIS_MODULE,
- .open = kgnilnd_peer_seq_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
+static const struct file_operations kgn_peer_fops = {
+ .owner = THIS_MODULE,
+ .open = kgnilnd_peer_seq_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
};
static struct proc_dir_entry *kgn_proc_root;