diff --git a/vmblock-only/linux/control.c b/vmblock-only/linux/control.c index 2dd83fe..d945749 100644 --- a/vmblock-only/linux/control.c +++ b/vmblock-only/linux/control.c @@ -208,9 +208,10 @@ SetupProcDevice(void) 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 @@ SetupProcDevice(void) return -EINVAL; } - controlProcEntry->proc_fops = &ControlFileOps; return 0; } diff --git a/vmnet-only/bridge.c b/vmnet-only/bridge.c index 10eaa41..6fdc19e 100644 --- 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; -} diff --git a/vmnet-only/driver.c b/vmnet-only/driver.c index b12b982..395f5ce 100644 --- a/vmnet-only/driver.c +++ b/vmnet-only/driver.c @@ -1775,21 +1775,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; } @@ -1809,52 +1805,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, " "); } diff --git a/vmnet-only/hub.c b/vmnet-only/hub.c index 47f04ac..8aafb95 100644 --- a/vmnet-only/hub.c +++ b/vmnet-only/hub.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -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; -} diff --git a/vmnet-only/netif.c b/vmnet-only/netif.c index 65f3cb9..b20f56a 100644 --- a/vmnet-only/netif.c +++ b/vmnet-only/netif.c @@ -63,8 +63,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); /* *---------------------------------------------------------------------- @@ -117,6 +115,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, +}; + /* *---------------------------------------------------------------------- @@ -201,9 +246,9 @@ 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) { if (retval == -ENXIO) { netIf->port.jack.procEntry = NULL; @@ -211,9 +256,6 @@ VNetNetIf_Create(char *devName, // IN: netIf->port.jack.procEntry = NULL; goto out; } - } else { - netIf->port.jack.procEntry->read_proc = VNetNetIfProcRead; - netIf->port.jack.procEntry->data = netIf; } /* @@ -591,45 +633,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 = (VNetNetIF*)data; - int len = 0; - - if (!netIf) { - return len; - } - - len += VNetPrintPort(&netIf->port, page+len); - - len += sprintf(page+len, "dev %s ", netIf->devName); - - len += sprintf(page+len, "\n"); - - *start = 0; - *eof = 1; - return len; -} diff --git a/vmnet-only/procfs.c b/vmnet-only/procfs.c index ca42ee2..fd7921e 100644 --- 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; -} - /* *---------------------------------------------------------------------- diff --git a/vmnet-only/userif.c b/vmnet-only/userif.c index 17b49e0..b01004a 100644 --- a/vmnet-only/userif.c +++ b/vmnet-only/userif.c @@ -387,7 +387,7 @@ VNetUserIfReceive(VNetJack *this, // IN /* *---------------------------------------------------------------------- * - * VNetUserIfProcRead -- + * VNetUserIfProcShow -- * * Callback for read operation on this userif entry in vnets proc fs. * @@ -401,30 +401,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, @@ -432,13 +425,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, +}; + /* *---------------------------------------------------------------------- @@ -1034,8 +1037,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; @@ -1043,9 +1046,6 @@ VNetUserIf_Create(VNetPort **ret) // OUT kfree(userIf); return retval; } - } else { - userIf->port.jack.procEntry->read_proc = VNetUserIfProcRead; - userIf->port.jack.procEntry->data = userIf; } /* diff --git a/vmnet-only/vnetInt.h b/vmnet-only/vnetInt.h index c615395..d90a1ef 100644 --- 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, ...);