Subject: iprutils: Eliminate libsysfs dependency

libsysfs is unmaintained and just adds an oerhead for very little
gain. So implement the core functions ourselves and drop libsysfs.

Signed-off-by:  Hannes Reinecke <hare@suse.de>
This commit is contained in:
root 2014-02-07 15:21:16 -06:00 committed by Kleber Sacilotto de Souza
commit 96923605ff
5 changed files with 426 additions and 605 deletions

View file

@ -16,22 +16,22 @@ TAR = cd .. && tar -zcpf iprutils-$(UTILS_VER)-src.tgz --exclude CVS --exclude a
all: iprconfig iprupdate iprdump iprinit iprdbg docs
iprconfig: iprconfig.c iprlib.o iprconfig.h
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprconfig iprconfig.c iprlib.o -lform -lpanel -lncurses -lmenu -lsysfs
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprconfig iprconfig.c iprlib.o -lform -lpanel -lncurses -lmenu
iprupdate: iprupdate.c iprlib.o
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprupdate iprlib.o iprupdate.c -lsysfs
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprupdate iprlib.o iprupdate.c
iprdump:iprdump.c iprlib.o
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprdump iprlib.o iprdump.c -lsysfs
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprdump iprlib.o iprdump.c
iprinit:iprinit.c iprlib.o
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprinit iprlib.o iprinit.c -lsysfs
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprinit iprlib.o iprinit.c
iprdbg:iprdbg.c iprlib.o
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprdbg iprlib.o iprdbg.c -lsysfs
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprdbg iprlib.o iprdbg.c
iprucode:iprucode.c iprlib.o
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprucode iprlib.o iprucode.c -lsysfs
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprucode iprlib.o iprucode.c
iprlib.o: iprlib.c iprlib.h
$(CC) $(CFLAGS) $(INCLUDEDIR) -o iprlib.o -c iprlib.c

View file

@ -7097,9 +7097,6 @@ static void wait_for_new_dev_64bit(struct ipr_ioa *ioa, struct ipr_res_path *res
struct ipr_dev *dev;
struct ipr_res_path_aliases aliases;
struct ipr_res_path *rp;
struct sysfs_class_device *class_device;
struct sysfs_attribute *attr;
char *buf = "0 - -";
ipr_query_res_path_aliases(ioa, res_path, &aliases);
if (aliases.length < (4 + 2 * sizeof(struct ipr_res_path))) {
@ -7107,10 +7104,7 @@ static void wait_for_new_dev_64bit(struct ipr_ioa *ioa, struct ipr_res_path *res
memcpy(&aliases.res_path[0], res_path, 2 * sizeof(struct ipr_res_path));
}
class_device = sysfs_open_class_device("scsi_host", ioa->host_name);
attr = sysfs_get_classdev_attr(class_device, "scan");
sysfs_write_attribute(attr, buf, strlen(buf));
sysfs_close_class_device(class_device);
ipr_scan(ioa, 0, -1, -1);
while (time--) {
check_current_config(false);
@ -7155,7 +7149,8 @@ int remove_or_add_back_device_64bit(struct ipr_dev *dev)
res_path_len = strlen(dev->res_path_name);
dev_slot = strtoul(dev->res_path_name + (res_path_len - 2), NULL, 16);
if (!ipr_read_dev_attr(dev, "resource_path", new_sysfs_res_path))
if (!ipr_read_dev_attr(dev, "resource_path",
new_sysfs_res_path, IPR_MAX_RES_PATH_LEN))
if (strncmp(dev->res_path_name, new_sysfs_res_path, sizeof(dev->res_path_name)))
for_each_dev(dev->ioa, tmp_dev)
if (!strncmp(tmp_dev->res_path_name, new_sysfs_res_path, sizeof(tmp_dev->res_path_name))) {
@ -8494,7 +8489,8 @@ static int dev_init_complete(u8 num_devs)
if (!dev->do_init || dev->done)
continue;
if (ipr_read_dev_attr(dev->dev, "type", dev_type)) {
if (ipr_read_dev_attr(dev->dev, "type",
dev_type, 100)) {
dev->done = 1;
continue;
}
@ -10421,23 +10417,13 @@ int driver_config(i_container *i_con)
**/
int get_log_level(struct ipr_ioa *ioa)
{
struct sysfs_class_device *class_device;
struct sysfs_attribute *attr;
char value_str[100];
int value;
class_device = sysfs_open_class_device("scsi_host",
ioa->host_name);
if (!class_device)
if (ipr_read_host_attr(ioa, "log_level", value_str, 100) < 0)
return 0;
attr = sysfs_get_classdev_attr(class_device,
"log_level");
if (!attr)
return 0;
sscanf(attr->value, "%d", &value);
sysfs_close_class_device(class_device);
sscanf(value_str, "%d", &value);
return value;
}
@ -10451,21 +10437,8 @@ int get_log_level(struct ipr_ioa *ioa)
**/
void set_log_level(struct ipr_ioa *ioa, char *log_level)
{
struct sysfs_class_device *class_device;
struct sysfs_attribute *attr;
class_device = sysfs_open_class_device("scsi_host",
ioa->host_name);
if (!class_device)
return;
attr = sysfs_get_classdev_attr(class_device,
"log_level");
if (!attr)
return;
sysfs_write_attribute(attr, log_level, 2);
sysfs_close_class_device(class_device);
ipr_write_host_attr(ioa, "log_level", log_level,
strlen(log_level));
}
/**
@ -14238,9 +14211,11 @@ static struct ipr_dev *find_slot(struct ipr_dev **devs, int num_devs, char *slot
{
int i;
for (i = 0; i < num_devs; i++)
for (i = 0; i < num_devs; i++) {
syslog_dbg("Looking for slot %s at pos %d\n", slot, i);
if (!strncmp(devs[i]->physical_location, slot, strlen(slot)))
return devs[i];
}
return NULL;
}
@ -16440,6 +16415,8 @@ static int show_ioas(char **args, int num_args)
if (num_ioas)
printf("%s\n%s\n", status_hdr[2], status_sep[2]);
else
printf("No IOAs found\n");
for_each_ioa(ioa)
printf_device(&ioa->ioa, 2);
@ -17652,18 +17629,19 @@ static int non_interactive_cmd(char *cmd, char **args, int num_args)
int check_sg_module()
{
struct sysfs_attribute *sysfs_attr;
char path[SYSFS_PATH_MAX];
DIR *sg_dirfd;
char devpath[PATH_MAX];
sprintf(path, "%s", "/sys/module/sg");
sprintf(devpath, "%s", "/sys/module/sg");
sysfs_attr = sysfs_open_attribute(path);
if (!sysfs_attr) {
syslog_dbg("Failed to open sg parameter.\n");
sg_dirfd = opendir(devpath);
if (!sg_dirfd) {
exit_on_error("Failed to open sg parameter.\n");
return -1;
}
sysfs_close_attribute(sysfs_attr);
closedir(sg_dirfd);
return 0;
}

View file

@ -61,41 +61,13 @@ static char *disable = "0\n";
**/
static void enable_dump(struct ipr_ioa *ioa)
{
struct sysfs_class_device *class_device;
struct sysfs_attribute *attr;
int rc, fd;
int rc;
class_device = sysfs_open_class_device("scsi_host", ioa->host_name);
if (!class_device) {
ioa_err(ioa, "Failed to open class device. %m\n");
return;
}
attr = sysfs_get_classdev_attr(class_device, "dump");
if (!attr) {
ioa_dbg(ioa, "Failed to get class attribute. %m\n");
sysfs_close_class_device(class_device);
return;
}
fd = open(attr->path, O_RDWR);
if (fd < 0) {
if (errno != ENOENT)
ioa_err(ioa, "Failed to open dump attribute. %m\n");
sysfs_close_class_device(class_device);
return;
}
rc = write(fd, enable, strlen(enable));
rc = ipr_write_host_attr(ioa, "dump", enable, strlen(enable));
if (rc != strlen(enable)) {
ioa_err(ioa, "Failed to enable dump. rc=%d. %m\n", rc);
close(fd);
sysfs_close_class_device(class_device);
return;
}
close(fd);
sysfs_close_class_device(class_device);
}
/**
@ -107,38 +79,13 @@ static void enable_dump(struct ipr_ioa *ioa)
**/
static void disable_dump(struct ipr_ioa *ioa)
{
struct sysfs_class_device *class_device;
struct sysfs_attribute *attr;
int rc, fd;
int rc;
class_device = sysfs_open_class_device("scsi_host", ioa->host_name);
if (!class_device) {
ioa_err(ioa, "Failed to open class device. %m\n");
return;
}
attr = sysfs_get_classdev_attr(class_device, "dump");
if (!attr) {
ioa_dbg(ioa, "Failed to get class attribute. %m\n");
sysfs_close_class_device(class_device);
return;
}
fd = open(attr->path, O_RDWR);
if (fd < 0) {
ioa_err(ioa, "Failed to open dump attribute. %m\n");
sysfs_close_class_device(class_device);
return;
}
rc = write(fd, disable, strlen(disable));
rc = ipr_write_host_attr(ioa, "dump", disable, strlen(disable));
if (rc != strlen(disable)) {
ioa_err(ioa, "Failed to disable dump. rc=%d. %m\n", rc);
sysfs_close_class_device(class_device);
return;
}
sysfs_close_class_device(class_device);
}
/**
@ -150,36 +97,10 @@ static void disable_dump(struct ipr_ioa *ioa)
**/
static int read_dump(struct ipr_ioa *ioa)
{
struct sysfs_class_device *class_device;
struct sysfs_attribute *attr;
int count = 0;
FILE *file;
class_device = sysfs_open_class_device("scsi_host", ioa->host_name);
if (!class_device) {
ioa_err(ioa, "Failed to open class device. %m\n");
return -EIO;
}
attr = sysfs_get_classdev_attr(class_device, "dump");
if (!attr) {
ioa_dbg(ioa, "Failed to open dump attribute. %m\n");
sysfs_close_class_device(class_device);
return -EIO;
}
file = fopen(attr->path, "r");
if (!file) {
ioa_err(ioa, "Failed to open sysfs dump file. %m\n");
sysfs_close_class_device(class_device);
return -EIO;
}
count = fread(&dump, 1, sizeof(dump), file);
fclose(file);
sysfs_close_class_device(class_device);
return count;
count = ipr_read_host_attr(ioa, "dump", &dump, sizeof(dump));
return (count < 0) ? 0: count;
}
/**

840
iprlib.c

File diff suppressed because it is too large Load diff

View file

@ -16,6 +16,7 @@
*/
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
@ -42,7 +43,6 @@
#include <pci/pci.h>
#include <stdbool.h>
#include <netinet/in.h>
#include <sysfs/libsysfs.h>
#include <asm/byteorder.h>
#include <sys/mman.h>
#include <paths.h>
@ -265,7 +265,7 @@ extern struct sysfs_dev *head_zdev;
extern struct sysfs_dev *tail_zdev;
struct sysfs_dev {
char sysfs_device_name[SYSFS_NAME_LEN];
char sysfs_device_name[PATH_MAX];
struct sysfs_dev *next, *prev;
};
@ -1212,7 +1212,7 @@ struct scsi_dev_data {
u32 handle;
char vendor_id[IPR_VENDOR_ID_LEN + 1];
char product_id[IPR_PROD_ID_LEN + 1];
char sysfs_device_name[SYSFS_NAME_LEN];
char sysfs_device_name[PATH_MAX];
char dev_name[64];
char gen_name[64];
#define IPR_MAX_RES_PATH_LEN 24
@ -2523,7 +2523,9 @@ void ipr_convert_res_path_to_bytes(struct ipr_dev *);
void ipr_format_res_path(u8 *, char *, int);
void ipr_reset_adapter(struct ipr_ioa *);
void ipr_scan(struct ipr_ioa *, int, int, int);
int ipr_read_dev_attr(struct ipr_dev *, char *, char *);
int ipr_read_host_attr(struct ipr_ioa *, char *, void *, size_t);
int ipr_write_host_attr(struct ipr_ioa *, char *, void *, size_t);
int ipr_read_dev_attr(struct ipr_dev *, char *, char *, size_t);
int ipr_write_dev_attr(struct ipr_dev *, char *, char *);
int ipr_suspend_device_bus(struct ipr_dev *, struct ipr_res_addr *, u8);
int ipr_resume_device_bus(struct ipr_dev *, struct ipr_res_addr *);