| --- a/vmnet-only/bridge.c |
| +++ b/vmnet-only/bridge.c |
| @@ -105,8 +105,6 @@ static Bool VNetBridgeCycleDetect(VNetJack *this, int generation); |
| static Bool VNetBridgeIsDeviceWireless(struct net_device *dev); |
| static void VNetBridgePortsChanged(VNetJack *this); |
| static int VNetBridgeIsBridged(VNetJack *this); |
| -static int VNetBridgeProcRead(char *page, char **start, off_t off, |
| - int count, int *eof, void *data); |
| static void VNetBridgeComputeHeaderPosIPv6(struct sk_buff *skb); |
| static PacketStatus VNetCallSMACFunc(struct SMACState *state, |
| struct sk_buff **skb, void *startOfData, |
| @@ -225,6 +223,53 @@ VNetBridgeDevCompatible(VNetBridge *bridge, // IN: Bridge |
| /* |
| *---------------------------------------------------------------------- |
| * |
| + * VNetBridgeProcShow -- |
| + * |
| + * Callback for read operation on this bridge entry in vnets proc fs. |
| + * |
| + * Results: |
| + * Length of read operation. |
| + * |
| + * Side effects: |
| + * None. |
| + * |
| + *---------------------------------------------------------------------- |
| + */ |
| + |
| +int |
| +VNetBridgeProcShow(struct seq_file *seqf, // IN/OUT: buffer to write into |
| + void *data) // IN: client data - pointer to bridge |
| +{ |
| + VNetBridge *bridge = (VNetBridge*)data; |
| + |
| + if (!bridge) { |
| + return 0; |
| + } |
| + |
| + VNetPrintPort(&bridge->port, seqf); |
| + |
| + seq_printf(seqf, "dev %s ", bridge->name); |
| + |
| + seq_printf(seqf, "\n"); |
| + |
| + return 0; |
| +} |
| + |
| +static int proc_bridge_open(struct inode *inode, struct file *file) |
| +{ |
| + return single_open(file, VNetBridgeProcShow, PDE_DATA(inode)); |
| +} |
| + |
| +static const struct file_operations proc_bridge_fops = { |
| + .open = proc_bridge_open, |
| + .read = seq_read, |
| + .llseek = seq_lseek, |
| + .release = seq_release, |
| +}; |
| + |
| +/* |
| + *---------------------------------------------------------------------- |
| + * |
| * VNetBridge_Create -- |
| * |
| * Creates a bridge. Allocates struct, allocates internal device, |
| @@ -319,17 +364,14 @@ VNetBridge_Create(const char *devName, // IN: name of device (e.g., "eth0") |
| * Make proc entry for this jack. |
| */ |
| |
| - retval = VNetProc_MakeEntry(bridge->port.jack.name, S_IFREG, |
| - &bridge->port.jack.procEntry); |
| + retval = VNetProc_MakeEntryOps(bridge->port.jack.name, S_IFREG, |
| + &bridge->port.jack.procEntry, &proc_bridge_fops, bridge); |
| if (retval) { |
| if (retval == -ENXIO) { |
| bridge->port.jack.procEntry = NULL; |
| } else { |
| goto out; |
| } |
| - } else { |
| - bridge->port.jack.procEntry->read_proc = VNetBridgeProcRead; |
| - bridge->port.jack.procEntry->data = bridge; |
| } |
| |
| /* |
| @@ -1719,45 +1761,3 @@ VNetBridgeReceiveFromDev(struct sk_buff *skb, // IN: packet to receive |
| return 0; |
| } |
| |
| - |
| -/* |
| - *---------------------------------------------------------------------- |
| - * |
| - * VNetBridgeProcRead -- |
| - * |
| - * Callback for read operation on this bridge entry in vnets proc fs. |
| - * |
| - * Results: |
| - * Length of read operation. |
| - * |
| - * Side effects: |
| - * None. |
| - * |
| - *---------------------------------------------------------------------- |
| - */ |
| - |
| -int |
| -VNetBridgeProcRead(char *page, // IN/OUT: buffer to write into |
| - char **start, // OUT: 0 if file < 4k, else offset into page |
| - off_t off, // IN: (unused) offset of read into the file |
| - int count, // IN: (unused) maximum number of bytes to read |
| - int *eof, // OUT: TRUE if there is nothing more to read |
| - void *data) // IN: client data - pointer to bridge |
| -{ |
| - VNetBridge *bridge = (VNetBridge*)data; |
| - int len = 0; |
| - |
| - if (!bridge) { |
| - return len; |
| - } |
| - |
| - len += VNetPrintPort(&bridge->port, page+len); |
| - |
| - len += sprintf(page+len, "dev %s ", bridge->name); |
| - |
| - len += sprintf(page+len, "\n"); |
| - |
| - *start = 0; |
| - *eof = 1; |
| - return len; |
| -} |
| --- a/vmnet-only/driver.c |
| +++ b/vmnet-only/driver.c |
| @@ -1785,21 +1785,17 @@ VNetSetMACUnique(VNetPort *port, // IN: |
| *---------------------------------------------------------------------- |
| */ |
| |
| -int |
| +void |
| VNetPrintJack(const VNetJack *jack, // IN: jack |
| - char *buf) // OUT: info about jack |
| + struct seq_file *seqf) // OUT: info about jack |
| { |
| - int len = 0; |
| - |
| read_lock(&vnetPeerLock); |
| if (!jack->peer) { |
| - len += sprintf(buf+len, "connected not "); |
| + seq_printf(seqf, "connected not "); |
| } else { |
| - len += sprintf(buf+len, "connected %s ", jack->peer->name); |
| + seq_printf(seqf, "connected %s ", jack->peer->name); |
| } |
| read_unlock(&vnetPeerLock); |
| - |
| - return len; |
| } |
| |
| |
| @@ -1819,52 +1815,48 @@ VNetPrintJack(const VNetJack *jack, // IN: jack |
| *---------------------------------------------------------------------- |
| */ |
| |
| -int |
| +void |
| VNetPrintPort(const VNetPort *port, // IN: port |
| - char *buf) // OUT: info about port |
| + struct seq_file *seqf) // OUT: info about port |
| { |
| - int len = 0; |
| + VNetPrintJack(&port->jack, seqf); |
| |
| - len += VNetPrintJack(&port->jack, buf+len); |
| - |
| - len += sprintf(buf+len, "mac %02x:%02x:%02x:%02x:%02x:%02x ", |
| + seq_printf(seqf, "mac %02x:%02x:%02x:%02x:%02x:%02x ", |
| port->paddr[0], port->paddr[1], port->paddr[2], |
| port->paddr[3], port->paddr[4], port->paddr[5]); |
| |
| - len += sprintf(buf+len, "ladrf %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x ", |
| + seq_printf(seqf, "ladrf %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x ", |
| port->ladrf[0], port->ladrf[1], port->ladrf[2], |
| port->ladrf[3], port->ladrf[4], port->ladrf[5], |
| port->ladrf[6], port->ladrf[7]); |
| |
| - len += sprintf(buf+len, "flags IFF_RUNNING"); |
| + seq_printf(seqf, "flags IFF_RUNNING"); |
| |
| if (port->flags & IFF_UP) { |
| - len += sprintf(buf+len, ",IFF_UP"); |
| + seq_printf(seqf, ",IFF_UP"); |
| } |
| |
| if (port->flags & IFF_BROADCAST) { |
| - len += sprintf(buf+len, ",IFF_BROADCAST"); |
| + seq_printf(seqf, ",IFF_BROADCAST"); |
| } |
| |
| if (port->flags & IFF_DEBUG) { |
| - len += sprintf(buf+len, ",IFF_DEBUG"); |
| + seq_printf(seqf, ",IFF_DEBUG"); |
| } |
| |
| if (port->flags & IFF_PROMISC) { |
| - len += sprintf(buf+len, ",IFF_PROMISC"); |
| + seq_printf(seqf, ",IFF_PROMISC"); |
| } |
| |
| if (port->flags & IFF_MULTICAST) { |
| - len += sprintf(buf+len, ",IFF_MULTICAST"); |
| + seq_printf(seqf, ",IFF_MULTICAST"); |
| } |
| |
| if (port->flags & IFF_ALLMULTI) { |
| - len += sprintf(buf+len, ",IFF_ALLMULTI"); |
| + seq_printf(seqf, ",IFF_ALLMULTI"); |
| } |
| |
| - len += sprintf(buf+len, " "); |
| - |
| - return len; |
| + seq_printf(seqf, " "); |
| } |
| |
| |
| --- a/vmnet-only/hub.c |
| +++ b/vmnet-only/hub.c |
| @@ -25,6 +25,7 @@ |
| #include <linux/sched.h> |
| #include <linux/slab.h> |
| #include <linux/poll.h> |
| +#include <linux/seq_file.h> |
| |
| #include <linux/netdevice.h> |
| #include <linux/etherdevice.h> |
| @@ -71,8 +72,6 @@ static void VNetHubReceive(VNetJack *this, struct sk_buff *skb); |
| static Bool VNetHubCycleDetect(VNetJack *this, int generation); |
| static void VNetHubPortsChanged(VNetJack *this); |
| static int VNetHubIsBridged(VNetJack *this); |
| -static int VNetHubProcRead(char *page, char **start, off_t off, |
| - int count, int *eof, void *data); |
| |
| static VNetHub *vnetHub; |
| static DEFINE_SPINLOCK(vnetHubLock); |
| @@ -241,6 +240,53 @@ VNetHub_AllocPvn(uint8 id[]) // IN: the PVN ID to alloc on |
| /* |
| *---------------------------------------------------------------------- |
| * |
| + * VNetHubProcShow -- |
| + * |
| + * Callback for read operation on hub entry in vnets proc fs. |
| + * |
| + * Results: |
| + * Length of read operation. |
| + * |
| + * Side effects: |
| + * None. |
| + * |
| + *---------------------------------------------------------------------- |
| + */ |
| + |
| +int |
| +VNetHubProcShow(struct seq_file *seqf, // IN/OUT: buffer to write into |
| + void *data) // IN: client data - not used |
| +{ |
| + VNetJack *jack = (VNetJack*)data; |
| + VNetHub *hub; |
| + |
| + if (!jack || !jack->private) { |
| + return 0; |
| + } |
| + hub = (VNetHub*)jack->private; |
| + |
| + VNetPrintJack(jack, seqf); |
| + |
| + seq_printf(seqf, "tx %u ", hub->stats[jack->index].tx); |
| + seq_printf(seqf, "\n"); |
| + return 0; |
| +} |
| + |
| +static int proc_hub_open(struct inode *inode, struct file *file) |
| +{ |
| + return single_open(file, VNetHubProcShow, PDE_DATA(inode)); |
| +} |
| + |
| +static const struct file_operations proc_hub_fops = { |
| + .open = proc_hub_open, |
| + .read = seq_read, |
| + .llseek = seq_lseek, |
| + .release = seq_release, |
| +}; |
| + |
| +/* |
| + *---------------------------------------------------------------------- |
| + * |
| * VNetHubAlloc -- |
| * |
| * Allocate a jack on this hub. |
| @@ -354,7 +400,7 @@ VNetHubAlloc(Bool allocPvn, // IN: TRUE for PVN, FALSE for vnet |
| * Make proc entry for this jack. |
| */ |
| |
| - retval = VNetProc_MakeEntry(jack->name, S_IFREG, &jack->procEntry); |
| + retval = VNetProc_MakeEntryOps(jack->name, S_IFREG, &jack->procEntry, &proc_hub_fops, jack); |
| if (retval) { |
| if (retval == -ENXIO) { |
| jack->procEntry = NULL; |
| @@ -362,9 +408,6 @@ VNetHubAlloc(Bool allocPvn, // IN: TRUE for PVN, FALSE for vnet |
| hub->used[i] = FALSE; |
| return NULL; |
| } |
| - } else { |
| - jack->procEntry->read_proc = VNetHubProcRead; |
| - jack->procEntry->data = jack; |
| } |
| |
| /* |
| @@ -686,46 +729,3 @@ VNetHubIsBridged(VNetJack *this) |
| } |
| |
| |
| -/* |
| - *---------------------------------------------------------------------- |
| - * |
| - * VNetHubProcRead -- |
| - * |
| - * Callback for read operation on hub entry in vnets proc fs. |
| - * |
| - * Results: |
| - * Length of read operation. |
| - * |
| - * Side effects: |
| - * None. |
| - * |
| - *---------------------------------------------------------------------- |
| - */ |
| - |
| -int |
| -VNetHubProcRead(char *page, // IN/OUT: buffer to write into |
| - char **start, // OUT: 0 if file < 4k, else offset into page |
| - off_t off, // IN: offset of read into the file |
| - int count, // IN: maximum number of bytes to read |
| - int *eof, // OUT: TRUE if there is nothing more to read |
| - void *data) // IN: client data - not used |
| -{ |
| - VNetJack *jack = (VNetJack*)data; |
| - VNetHub *hub; |
| - int len = 0; |
| - |
| - if (!jack || !jack->private) { |
| - return len; |
| - } |
| - hub = (VNetHub*)jack->private; |
| - |
| - len += VNetPrintJack(jack, page+len); |
| - |
| - len += sprintf(page+len, "tx %u ", hub->stats[jack->index].tx); |
| - |
| - len += sprintf(page+len, "\n"); |
| - |
| - *start = 0; |
| - *eof = 1; |
| - return len; |
| -} |
| --- a/vmnet-only/netif.c |
| +++ b/vmnet-only/netif.c |
| @@ -62,8 +62,6 @@ static int VNetNetifStartXmit(struct sk_buff *skb, struct net_device *dev); |
| static struct net_device_stats *VNetNetifGetStats(struct net_device *dev); |
| static int VNetNetifSetMAC(struct net_device *dev, void *addr); |
| static void VNetNetifSetMulticast(struct net_device *dev); |
| -static int VNetNetIfProcRead(char *page, char **start, off_t off, |
| - int count, int *eof, void *data); |
| |
| /* |
| *---------------------------------------------------------------------- |
| @@ -116,6 +114,53 @@ VNetNetIfSetup(struct net_device *dev) // IN: |
| |
| } |
| |
| +/* |
| + *---------------------------------------------------------------------- |
| + * |
| + * VNetNetIfProcShow -- |
| + * |
| + * Callback for read operation on this netif entry in vnets proc fs. |
| + * |
| + * Results: |
| + * Length of read operation. |
| + * |
| + * Side effects: |
| + * None. |
| + * |
| + *---------------------------------------------------------------------- |
| + */ |
| + |
| +int |
| +VNetNetIfProcShow(struct seq_file *seqf, // IN/OUT: buffer to write into |
| + void *data) // IN: client data |
| +{ |
| + VNetNetIF *netIf = data; |
| + |
| + if (!netIf) { |
| + return 0; |
| + } |
| + |
| + VNetPrintPort(&netIf->port, seqf); |
| + |
| + seq_printf(seqf, "dev %s ", netIf->dev->name); |
| + |
| + seq_printf(seqf, "\n"); |
| + |
| + return 0; |
| +} |
| + |
| +static int proc_netif_open(struct inode *inode, struct file *file) |
| +{ |
| + return single_open(file, VNetNetIfProcShow, PDE_DATA(inode)); |
| +} |
| + |
| +static const struct file_operations proc_netif_fops = { |
| + .open = proc_netif_open, |
| + .read = seq_read, |
| + .llseek = seq_lseek, |
| + .release = seq_release, |
| +}; |
| + |
| |
| /* |
| *---------------------------------------------------------------------- |
| @@ -180,16 +225,13 @@ VNetNetIf_Create(char *devName, // IN: |
| * Make proc entry for this jack. |
| */ |
| |
| - retval = VNetProc_MakeEntry(netIf->port.jack.name, S_IFREG, |
| - &netIf->port.jack.procEntry); |
| + retval = VNetProc_MakeEntryOps(netIf->port.jack.name, S_IFREG, |
| + &netIf->port.jack.procEntry, &proc_netif_fops, netIf); |
| if (retval) { |
| netIf->port.jack.procEntry = NULL; |
| if (retval != -ENXIO) { |
| goto outFreeDev; |
| } |
| - } else { |
| - netIf->port.jack.procEntry->read_proc = VNetNetIfProcRead; |
| - netIf->port.jack.procEntry->data = netIf; |
| } |
| |
| /* |
| @@ -553,45 +595,3 @@ VNetNetifGetStats(struct net_device *dev) // IN: |
| return &netIf->stats; |
| } |
| |
| - |
| -/* |
| - *---------------------------------------------------------------------- |
| - * |
| - * VNetNetIfProcRead -- |
| - * |
| - * Callback for read operation on this netif entry in vnets proc fs. |
| - * |
| - * Results: |
| - * Length of read operation. |
| - * |
| - * Side effects: |
| - * None. |
| - * |
| - *---------------------------------------------------------------------- |
| - */ |
| - |
| -int |
| -VNetNetIfProcRead(char *page, // IN/OUT: buffer to write into |
| - char **start, // OUT: 0 if file < 4k, else offset into page |
| - off_t off, // IN: (unused) offset of read into the file |
| - int count, // IN: (unused) maximum number of bytes to read |
| - int *eof, // OUT: TRUE if there is nothing more to read |
| - void *data) // IN: client data |
| -{ |
| - VNetNetIF *netIf = data; |
| - int len = 0; |
| - |
| - if (!netIf) { |
| - return len; |
| - } |
| - |
| - len += VNetPrintPort(&netIf->port, page+len); |
| - |
| - len += sprintf(page+len, "dev %s ", netIf->dev->name); |
| - |
| - len += sprintf(page+len, "\n"); |
| - |
| - *start = 0; |
| - *eof = 1; |
| - return len; |
| -} |
| --- a/vmnet-only/procfs.c |
| +++ b/vmnet-only/procfs.c |
| @@ -45,10 +45,6 @@ |
| |
| #if defined(CONFIG_PROC_FS) |
| |
| -static int VNetProcMakeEntryInt(VNetProcEntry *parent, char *name, int mode, |
| - VNetProcEntry **ret); |
| -static void VNetProcRemoveEntryInt(VNetProcEntry *node, VNetProcEntry *parent); |
| - |
| static VNetProcEntry *base = NULL; |
| |
| |
| @@ -71,7 +67,12 @@ static VNetProcEntry *base = NULL; |
| int |
| VNetProc_Init(void) |
| { |
| - return VNetProcMakeEntryInt(NULL, "vmnet", S_IFDIR, &base); |
| + base = proc_mkdir("vmnet", NULL); |
| + if(IS_ERR(base)) { |
| + base = NULL; |
| + return PTR_ERR(base); |
| + } |
| + return 0; |
| } |
| |
| |
| @@ -94,14 +95,14 @@ VNetProc_Init(void) |
| void |
| VNetProc_Cleanup(void) |
| { |
| - VNetProcRemoveEntryInt(base, NULL); |
| + proc_remove(base); |
| base = NULL; |
| } |
| |
| /* |
| *---------------------------------------------------------------------- |
| * |
| - * VNetProcMakeEntryInt -- |
| + * VNetProc_MakeEntryOps -- |
| * |
| * Make an entry in the vnets proc file system. |
| * |
| @@ -116,72 +117,21 @@ VNetProc_Cleanup(void) |
| */ |
| |
| int |
| -VNetProcMakeEntryInt(VNetProcEntry *parent, // IN: |
| - char *name, // IN: |
| +VNetProc_MakeEntryOps(char *name, // IN: |
| int mode, // IN: |
| - VNetProcEntry **ret) // OUT: |
| + VNetProcEntry **ret, |
| + const struct file_operations *fops, |
| + void *data |
| + ) // OUT: |
| { |
| VNetProcEntry *ent; |
| - ent = create_proc_entry(name, mode, parent); |
| + ent = proc_create_data(name, mode, base, fops, data); |
| *ret = ent; |
| if (!ent) |
| return -ENOMEM; |
| return 0; |
| } |
| |
| - |
| -/* |
| - *---------------------------------------------------------------------- |
| - * |
| - * VNetProcRemoveEntryInt -- |
| - * |
| - * Remove a previously installed proc entry. |
| - * |
| - * Results: |
| - * None. |
| - * |
| - * Side effects: |
| - * None. |
| - * |
| - *---------------------------------------------------------------------- |
| - */ |
| - |
| -void |
| -VNetProcRemoveEntryInt(VNetProcEntry *node, |
| - VNetProcEntry *parent) |
| -{ |
| - if (node) { |
| - remove_proc_entry(node->name, parent); |
| - } |
| -} |
| - |
| - |
| -/* |
| - *---------------------------------------------------------------------- |
| - * |
| - * VNetProc_MakeEntry -- |
| - * |
| - * Make an entry in the vnets proc file system. |
| - * |
| - * Results: |
| - * errno. If errno is 0 and ret is non NULL then ret is filled |
| - * in with the resulting proc entry. |
| - * |
| - * Side effects: |
| - * None. |
| - * |
| - *---------------------------------------------------------------------- |
| - */ |
| - |
| -int |
| -VNetProc_MakeEntry(char *name, // IN: |
| - int mode, // IN: |
| - VNetProcEntry **ret) // OUT: |
| -{ |
| - return VNetProcMakeEntryInt(base, name, mode, ret); |
| -} |
| - |
| - |
| /* |
| *---------------------------------------------------------------------- |
| * |
| @@ -201,7 +151,8 @@ VNetProc_MakeEntry(char *name, // IN: |
| void |
| VNetProc_RemoveEntry(VNetProcEntry *node) |
| { |
| - VNetProcRemoveEntryInt(node, base); |
| + if(node) |
| + proc_remove(node); |
| } |
| |
| |
| @@ -253,31 +204,6 @@ VNetProc_Cleanup(void) |
| } |
| |
| |
| -/* |
| - *---------------------------------------------------------------------- |
| - * |
| - * VNetProc_MakeEntry -- |
| - * |
| - * Make an entry in the vnets proc file system. |
| - * |
| - * Results: |
| - * errno. If errno is 0 and ret is non NULL then ret is filled |
| - * in with the resulting proc entry. |
| - * |
| - * Side effects: |
| - * None. |
| - * |
| - *---------------------------------------------------------------------- |
| - */ |
| - |
| -int |
| -VNetProc_MakeEntry(char *name, |
| - int mode, |
| - VNetProcEntry **ret) |
| -{ |
| - return -ENXIO; |
| -} |
| - |
| |
| /* |
| *---------------------------------------------------------------------- |
| --- a/vmnet-only/userif.c |
| +++ b/vmnet-only/userif.c |
| @@ -389,7 +389,7 @@ VNetUserIfReceive(VNetJack *this, // IN |
| /* |
| *---------------------------------------------------------------------- |
| * |
| - * VNetUserIfProcRead -- |
| + * VNetUserIfProcShow -- |
| * |
| * Callback for read operation on this userif entry in vnets proc fs. |
| * |
| @@ -403,30 +403,23 @@ VNetUserIfReceive(VNetJack *this, // IN |
| */ |
| |
| static int |
| -VNetUserIfProcRead(char *page, // IN/OUT: buffer to write into |
| - char **start, // OUT: 0 if file < 4k, else offset into |
| - // page |
| - off_t off, // IN: offset of read into the file |
| - int count, // IN: maximum number of bytes to read |
| - int *eof, // OUT: TRUE if there is nothing more to |
| - // read |
| +VNetUserIfProcShow(struct seq_file *seqf, // IN/OUT: buffer to write into |
| void *data) // IN: client data - not used |
| { |
| VNetUserIF *userIf = (VNetUserIF*)data; |
| - int len = 0; |
| |
| if (!userIf) { |
| - return len; |
| + return 0; |
| } |
| |
| - len += VNetPrintPort(&userIf->port, page+len); |
| + VNetPrintPort(&userIf->port, seqf); |
| |
| - len += sprintf(page+len, "read %u written %u queued %u ", |
| + seq_printf(seqf, "read %u written %u queued %u ", |
| userIf->stats.read, |
| userIf->stats.written, |
| userIf->stats.queued); |
| |
| - len += sprintf(page+len, |
| + seq_printf(seqf, |
| "dropped.down %u dropped.mismatch %u " |
| "dropped.overflow %u dropped.largePacket %u", |
| userIf->stats.droppedDown, |
| @@ -434,13 +427,23 @@ VNetUserIfProcRead(char *page, // IN/OUT: buffer to write into |
| userIf->stats.droppedOverflow, |
| userIf->stats.droppedLargePacket); |
| |
| - len += sprintf(page+len, "\n"); |
| + seq_printf(seqf, "\n"); |
| |
| - *start = 0; |
| - *eof = 1; |
| - return len; |
| + return 0; |
| +} |
| + |
| +static int proc_userif_open(struct inode *inode, struct file *file) |
| +{ |
| + return single_open(file, VNetUserIfProcShow, PDE_DATA(inode)); |
| } |
| |
| +static const struct file_operations proc_userif_fops = { |
| + .open = proc_userif_open, |
| + .read = seq_read, |
| + .llseek = seq_lseek, |
| + .release = seq_release, |
| +}; |
| + |
| |
| /* |
| *---------------------------------------------------------------------- |
| @@ -1036,8 +1039,8 @@ VNetUserIf_Create(VNetPort **ret) // OUT |
| * Make proc entry for this jack. |
| */ |
| |
| - retval = VNetProc_MakeEntry(userIf->port.jack.name, S_IFREG, |
| - &userIf->port.jack.procEntry); |
| + retval = VNetProc_MakeEntryOps(userIf->port.jack.name, S_IFREG, |
| + &userIf->port.jack.procEntry, &proc_userif_fops, userIf); |
| if (retval) { |
| if (retval == -ENXIO) { |
| userIf->port.jack.procEntry = NULL; |
| @@ -1045,9 +1048,6 @@ VNetUserIf_Create(VNetPort **ret) // OUT |
| kfree(userIf); |
| return retval; |
| } |
| - } else { |
| - userIf->port.jack.procEntry->read_proc = VNetUserIfProcRead; |
| - userIf->port.jack.procEntry->data = userIf; |
| } |
| |
| /* |
| --- a/vmnet-only/vnetInt.h |
| +++ b/vmnet-only/vnetInt.h |
| @@ -171,12 +171,14 @@ VNetJack *VNetDisconnect(VNetJack *jack); |
| |
| void VNetSend(const VNetJack *jack, struct sk_buff *skb); |
| |
| -int VNetProc_MakeEntry(char *name, int mode, |
| - VNetProcEntry **ret); |
| +int VNetProc_MakeEntryOps(char *name, int mode, |
| + VNetProcEntry **ret, |
| + const struct file_operations *fops, |
| + void *data); |
| |
| void VNetProc_RemoveEntry(VNetProcEntry *node); |
| |
| -int VNetPrintJack(const VNetJack *jack, char *buf); |
| +void VNetPrintJack(const VNetJack *jack, struct seq_file *seqf); |
| |
| int VNet_MakeMACAddress(VNetPort *port); |
| |
| @@ -196,7 +198,7 @@ Bool VNetPacketMatch(const uint8 *destAddr, const uint8 *ifAddr, |
| |
| Bool VNetCycleDetectIf(const char *name, int generation); |
| |
| -int VNetPrintPort(const VNetPort *port, char *buf); |
| +void VNetPrintPort(const VNetPort *port, struct seq_file *seqf); |
| |
| int VNetSnprintf(char *str, size_t size, const char *format, ...); |
| |
| -- |
| --- a/vmblock-only/linux/control.c 2013-05-21 19:21:19.165750556 +0200 |
| +++ b/vmblock-only/linux/control.c 2013-05-21 19:22:18.363747723 +0200 |
| @@ -208,9 +208,10 @@ |
| VMBlockSetProcEntryOwner(controlProcMountpoint); |
| |
| /* Create /proc/fs/vmblock/dev */ |
| - controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME, |
| - VMBLOCK_CONTROL_MODE, |
| - controlProcDirEntry); |
| + controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME, |
| + VMBLOCK_CONTROL_MODE, |
| + controlProcDirEntry, |
| + &ControlFileOps); |
| if (!controlProcEntry) { |
| Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n"); |
| remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry); |
| @@ -218,7 +219,6 @@ |
| return -EINVAL; |
| } |
| |
| - controlProcEntry->proc_fops = &ControlFileOps; |
| return 0; |
| } |
| |