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

Commit 4d8e8d21 authored by Al Viro's avatar Al Viro
Browse files

hysdn: stash pointer to card into proc_dir_entry->data



no need to search later - we know the card when we are
creating procfs entries

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 03b642a7
Loading
Loading
Loading
Loading
+5 −27
Original line number Diff line number Diff line
@@ -229,23 +229,12 @@ static int
hysdn_conf_open(struct inode *ino, struct file *filep)
{
	hysdn_card *card;
	struct proc_dir_entry *pd;
	struct conf_writedata *cnf;
	char *cp, *tmp;

	/* now search the addressed card */
	mutex_lock(&hysdn_conf_mutex);
	card = card_root;
	while (card) {
		pd = card->procconf;
		if (pd == PDE(ino))
			break;
		card = card->next;	/* search next entry */
	}
	if (!card) {
		mutex_unlock(&hysdn_conf_mutex);
		return (-ENODEV);	/* device is unknown/invalid */
	}
	card = PDE(ino)->data;
	if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
		hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x",
			     filep->f_cred->fsuid, filep->f_cred->fsgid,
@@ -317,21 +306,9 @@ hysdn_conf_close(struct inode *ino, struct file *filep)
	hysdn_card *card;
	struct conf_writedata *cnf;
	int retval = 0;
	struct proc_dir_entry *pd;

	mutex_lock(&hysdn_conf_mutex);
	/* search the addressed card */
	card = card_root;
	while (card) {
		pd = card->procconf;
		if (pd == PDE(ino))
			break;
		card = card->next;	/* search next entry */
	}
	if (!card) {
		mutex_unlock(&hysdn_conf_mutex);
		return (-ENODEV);	/* device is unknown/invalid */
	}
	card = PDE(ino)->data;
	if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
		hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x",
			     filep->f_cred->fsuid, filep->f_cred->fsgid,
@@ -394,10 +371,11 @@ hysdn_procconf_init(void)
	while (card) {

		sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid);
		if ((card->procconf = (void *) proc_create(conf_name,
		if ((card->procconf = (void *) proc_create_data(conf_name,
							   S_IFREG | S_IRUGO | S_IWUSR,
							   hysdn_proc_entry,
							   &conf_fops)) != NULL) {
							   &conf_fops,
							   card)) != NULL) {
			hysdn_proclog_init(card);	/* init the log file entry */
		}
		card = card->next;	/* next entry */
+13 −58
Original line number Diff line number Diff line
@@ -173,27 +173,14 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
{
	struct log_data *inf;
	int len;
	struct proc_dir_entry *pde = PDE(file_inode(file));
	struct procdata *pd = NULL;
	hysdn_card *card;
	hysdn_card *card = PDE(file_inode(file))->data;

	if (!*((struct log_data **) file->private_data)) {
		struct procdata *pd = card->proclog;
		if (file->f_flags & O_NONBLOCK)
			return (-EAGAIN);

		/* sorry, but we need to search the card */
		card = card_root;
		while (card) {
			pd = card->proclog;
			if (pd->log == pde)
				break;
			card = card->next;	/* search next entry */
		}
		if (card)
		interruptible_sleep_on(&(pd->rd_queue));
		else
			return (-EAGAIN);

	}
	if (!(inf = *((struct log_data **) file->private_data)))
		return (0);
@@ -215,27 +202,15 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
static int
hysdn_log_open(struct inode *ino, struct file *filep)
{
	hysdn_card *card;
	struct procdata *pd = NULL;
	unsigned long flags;
	hysdn_card *card = PDE(ino)->data;

	mutex_lock(&hysdn_log_mutex);
	card = card_root;
	while (card) {
		pd = card->proclog;
		if (pd->log == PDE(ino))
			break;
		card = card->next;	/* search next entry */
	}
	if (!card) {
		mutex_unlock(&hysdn_log_mutex);
		return (-ENODEV);	/* device is unknown/invalid */
	}
	filep->private_data = card;	/* remember our own card */

	if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
		/* write only access -> write log level only */
		filep->private_data = card;	/* remember our own card */
	} else if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
		struct procdata *pd = card->proclog;
		unsigned long flags;

		/* read access -> log/debug read */
		spin_lock_irqsave(&card->hysdn_lock, flags);
@@ -275,20 +250,12 @@ hysdn_log_close(struct inode *ino, struct file *filep)
	} else {
		/* read access -> log/debug read, mark one further file as closed */

		pd = NULL;
		inf = *((struct log_data **) filep->private_data);	/* get first log entry */
		if (inf)
			pd = (struct procdata *) inf->proc_ctrl;	/* still entries there */
		else {
			/* no info available -> search card */
			card = card_root;
			while (card) {
				pd = card->proclog;
				if (pd->log == PDE(ino))
					break;
				card = card->next;	/* search next entry */
			}
			if (card)
			card = PDE(file_inode(filep))->data;
			pd = card->proclog;	/* pointer to procfs log */
		}
		if (pd)
@@ -319,24 +286,12 @@ static unsigned int
hysdn_log_poll(struct file *file, poll_table *wait)
{
	unsigned int mask = 0;
	struct proc_dir_entry *pde = PDE(file_inode(file));
	hysdn_card *card;
	struct procdata *pd = NULL;
	hysdn_card *card = PDE(file_inode(file))->data;
	struct procdata *pd = card->proclog;

	if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE)
		return (mask);	/* no polling for write supported */

	/* we need to search the card */
	card = card_root;
	while (card) {
		pd = card->proclog;
		if (pd->log == pde)
			break;
		card = card->next;	/* search next entry */
	}
	if (!card)
		return (mask);	/* card not found */

	poll_wait(file, &(pd->rd_queue), wait);

	if (*((struct log_data **) file->private_data))
@@ -373,9 +328,9 @@ hysdn_proclog_init(hysdn_card *card)

	if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) {
		sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid);
		pd->log = proc_create(pd->log_name,
		pd->log = proc_create_data(pd->log_name,
				      S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry,
				      &log_fops);
				      &log_fops, card);

		init_waitqueue_head(&(pd->rd_queue));