Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48dee093 authored by Mike Frysinger's avatar Mike Frysinger
Browse files

Blackfin: cplbinfo: drop d_path() hacks



The cplbinfo was using d_path() to figure out which cpu/cplb was being
parsed.  As Al pointed out, this isn't exactly reliable as it assumes the
static VFS path to be unchanged, and it's just poor form.  So use the
proc_create_data() to properly (and internally) pass the exact cpu/cplb
requested to the parser function.

Reported-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
parent d586e833
Loading
Loading
Loading
Loading
+12 −13
Original line number Diff line number Diff line
@@ -112,24 +112,21 @@ static const struct seq_operations cplbinfo_sops = {
	.show  = cplbinfo_show,
};

#define CPLBINFO_DCPLB_FLAG 0x80000000

static int cplbinfo_open(struct inode *inode, struct file *file)
{
	char buf[256], *path, *p;
	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
	char cplb_type;
	unsigned int cpu;
	char *s_cpu, *s_cplb;
	int ret;
	struct seq_file *m;
	struct cplbinfo_data *cdata;

	path = d_path(&file->f_path, buf, sizeof(buf));
	if (IS_ERR(path))
		return PTR_ERR(path);
	s_cpu = strstr(path, "/cpu");
	s_cplb = strrchr(path, '/');
	if (!s_cpu || !s_cplb)
		return -EINVAL;
	cpu = (unsigned int)pde->data;
	cplb_type = cpu & CPLBINFO_DCPLB_FLAG ? 'D' : 'I';
	cpu &= ~CPLBINFO_DCPLB_FLAG;

	cpu = simple_strtoul(s_cpu + 4, &p, 10);
	if (!cpu_online(cpu))
		return -ENODEV;

@@ -140,7 +137,7 @@ static int cplbinfo_open(struct inode *inode, struct file *file)
	cdata = m->private;

	cdata->pos = 0;
	cdata->cplb_type = toupper(s_cplb[1]);
	cdata->cplb_type = cplb_type;
	cplbinfo_seq_init(cdata, cpu);

	return 0;
@@ -169,8 +166,10 @@ static int __init cplbinfo_init(void)
		if (!cpu_dir)
			return -ENOMEM;

		proc_create("icplb", S_IRUGO, cpu_dir, &cplbinfo_fops);
		proc_create("dcplb", S_IRUGO, cpu_dir, &cplbinfo_fops);
		proc_create_data("icplb", S_IRUGO, cpu_dir, &cplbinfo_fops,
			(void *)cpu);
		proc_create_data("dcplb", S_IRUGO, cpu_dir, &cplbinfo_fops,
			(void *)(cpu | CPLBINFO_DCPLB_FLAG));
	}

	return 0;