mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 01:04:08 +08:00
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: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
03b642a701
commit
4d8e8d21de
@ -229,23 +229,12 @@ static int
|
|||||||
hysdn_conf_open(struct inode *ino, struct file *filep)
|
hysdn_conf_open(struct inode *ino, struct file *filep)
|
||||||
{
|
{
|
||||||
hysdn_card *card;
|
hysdn_card *card;
|
||||||
struct proc_dir_entry *pd;
|
|
||||||
struct conf_writedata *cnf;
|
struct conf_writedata *cnf;
|
||||||
char *cp, *tmp;
|
char *cp, *tmp;
|
||||||
|
|
||||||
/* now search the addressed card */
|
/* now search the addressed card */
|
||||||
mutex_lock(&hysdn_conf_mutex);
|
mutex_lock(&hysdn_conf_mutex);
|
||||||
card = card_root;
|
card = PDE(ino)->data;
|
||||||
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 */
|
|
||||||
}
|
|
||||||
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
||||||
hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x",
|
hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x",
|
||||||
filep->f_cred->fsuid, filep->f_cred->fsgid,
|
filep->f_cred->fsuid, filep->f_cred->fsgid,
|
||||||
@ -317,21 +306,9 @@ hysdn_conf_close(struct inode *ino, struct file *filep)
|
|||||||
hysdn_card *card;
|
hysdn_card *card;
|
||||||
struct conf_writedata *cnf;
|
struct conf_writedata *cnf;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
struct proc_dir_entry *pd;
|
|
||||||
|
|
||||||
mutex_lock(&hysdn_conf_mutex);
|
mutex_lock(&hysdn_conf_mutex);
|
||||||
/* search the addressed card */
|
card = PDE(ino)->data;
|
||||||
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 */
|
|
||||||
}
|
|
||||||
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
||||||
hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x",
|
hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x",
|
||||||
filep->f_cred->fsuid, filep->f_cred->fsgid,
|
filep->f_cred->fsuid, filep->f_cred->fsgid,
|
||||||
@ -394,10 +371,11 @@ hysdn_procconf_init(void)
|
|||||||
while (card) {
|
while (card) {
|
||||||
|
|
||||||
sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid);
|
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,
|
S_IFREG | S_IRUGO | S_IWUSR,
|
||||||
hysdn_proc_entry,
|
hysdn_proc_entry,
|
||||||
&conf_fops)) != NULL) {
|
&conf_fops,
|
||||||
|
card)) != NULL) {
|
||||||
hysdn_proclog_init(card); /* init the log file entry */
|
hysdn_proclog_init(card); /* init the log file entry */
|
||||||
}
|
}
|
||||||
card = card->next; /* next entry */
|
card = card->next; /* next entry */
|
||||||
|
@ -173,27 +173,14 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
|
|||||||
{
|
{
|
||||||
struct log_data *inf;
|
struct log_data *inf;
|
||||||
int len;
|
int len;
|
||||||
struct proc_dir_entry *pde = PDE(file_inode(file));
|
hysdn_card *card = PDE(file_inode(file))->data;
|
||||||
struct procdata *pd = NULL;
|
|
||||||
hysdn_card *card;
|
|
||||||
|
|
||||||
if (!*((struct log_data **) file->private_data)) {
|
if (!*((struct log_data **) file->private_data)) {
|
||||||
|
struct procdata *pd = card->proclog;
|
||||||
if (file->f_flags & O_NONBLOCK)
|
if (file->f_flags & O_NONBLOCK)
|
||||||
return (-EAGAIN);
|
return (-EAGAIN);
|
||||||
|
|
||||||
/* sorry, but we need to search the card */
|
interruptible_sleep_on(&(pd->rd_queue));
|
||||||
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)))
|
if (!(inf = *((struct log_data **) file->private_data)))
|
||||||
return (0);
|
return (0);
|
||||||
@ -215,27 +202,15 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
|
|||||||
static int
|
static int
|
||||||
hysdn_log_open(struct inode *ino, struct file *filep)
|
hysdn_log_open(struct inode *ino, struct file *filep)
|
||||||
{
|
{
|
||||||
hysdn_card *card;
|
hysdn_card *card = PDE(ino)->data;
|
||||||
struct procdata *pd = NULL;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
mutex_lock(&hysdn_log_mutex);
|
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) {
|
if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
|
||||||
/* write only access -> write log level only */
|
/* 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) {
|
} else if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
|
||||||
|
struct procdata *pd = card->proclog;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
/* read access -> log/debug read */
|
/* read access -> log/debug read */
|
||||||
spin_lock_irqsave(&card->hysdn_lock, flags);
|
spin_lock_irqsave(&card->hysdn_lock, flags);
|
||||||
@ -275,21 +250,13 @@ hysdn_log_close(struct inode *ino, struct file *filep)
|
|||||||
} else {
|
} else {
|
||||||
/* read access -> log/debug read, mark one further file as closed */
|
/* read access -> log/debug read, mark one further file as closed */
|
||||||
|
|
||||||
pd = NULL;
|
|
||||||
inf = *((struct log_data **) filep->private_data); /* get first log entry */
|
inf = *((struct log_data **) filep->private_data); /* get first log entry */
|
||||||
if (inf)
|
if (inf)
|
||||||
pd = (struct procdata *) inf->proc_ctrl; /* still entries there */
|
pd = (struct procdata *) inf->proc_ctrl; /* still entries there */
|
||||||
else {
|
else {
|
||||||
/* no info available -> search card */
|
/* no info available -> search card */
|
||||||
card = card_root;
|
card = PDE(file_inode(filep))->data;
|
||||||
while (card) {
|
pd = card->proclog; /* pointer to procfs log */
|
||||||
pd = card->proclog;
|
|
||||||
if (pd->log == PDE(ino))
|
|
||||||
break;
|
|
||||||
card = card->next; /* search next entry */
|
|
||||||
}
|
|
||||||
if (card)
|
|
||||||
pd = card->proclog; /* pointer to procfs log */
|
|
||||||
}
|
}
|
||||||
if (pd)
|
if (pd)
|
||||||
pd->if_used--; /* decrement interface usage count by one */
|
pd->if_used--; /* decrement interface usage count by one */
|
||||||
@ -319,24 +286,12 @@ static unsigned int
|
|||||||
hysdn_log_poll(struct file *file, poll_table *wait)
|
hysdn_log_poll(struct file *file, poll_table *wait)
|
||||||
{
|
{
|
||||||
unsigned int mask = 0;
|
unsigned int mask = 0;
|
||||||
struct proc_dir_entry *pde = PDE(file_inode(file));
|
hysdn_card *card = PDE(file_inode(file))->data;
|
||||||
hysdn_card *card;
|
struct procdata *pd = card->proclog;
|
||||||
struct procdata *pd = NULL;
|
|
||||||
|
|
||||||
if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE)
|
if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE)
|
||||||
return (mask); /* no polling for write supported */
|
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);
|
poll_wait(file, &(pd->rd_queue), wait);
|
||||||
|
|
||||||
if (*((struct log_data **) file->private_data))
|
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) {
|
if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) {
|
||||||
sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid);
|
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,
|
S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry,
|
||||||
&log_fops);
|
&log_fops, card);
|
||||||
|
|
||||||
init_waitqueue_head(&(pd->rd_queue));
|
init_waitqueue_head(&(pd->rd_queue));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user