MT#55283 store ref to stream object in priv data

Change-Id: I0c8dcd333770ab3da1fe7fea28deadaca43d4147
(cherry picked from commit ff0cdf8393)
mr13.5
Richard Fuchs 5 months ago
parent 887ea4ac4b
commit ead44fd46f

@ -3480,8 +3480,7 @@ out:
static ssize_t proc_stream_read(struct file *f, char __user *b, size_t l, loff_t *o) { static ssize_t proc_stream_read(struct file *f, char __user *b, size_t l, loff_t *o) {
unsigned int stream_idx = (unsigned int) (unsigned long) PDE_DATA(f->f_path.dentry->d_inode); struct re_stream *stream = f->private_data;
struct re_stream *stream;
unsigned long flags; unsigned long flags;
struct re_stream_packet *packet; struct re_stream_packet *packet;
ssize_t ret; ssize_t ret;
@ -3493,10 +3492,6 @@ static ssize_t proc_stream_read(struct file *f, char __user *b, size_t l, loff_t
DBG("entering proc_stream_read()\n"); DBG("entering proc_stream_read()\n");
stream = get_stream_lock(NULL, stream_idx);
if (!stream)
return -EINVAL;
DBG("locking stream's packet list lock\n"); DBG("locking stream's packet list lock\n");
spin_lock_irqsave(&stream->packet_list_lock, flags); spin_lock_irqsave(&stream->packet_list_lock, flags);
@ -3583,21 +3578,15 @@ err:
free_packet(packet); free_packet(packet);
out: out:
stream_put(stream);
return ret; return ret;
} }
static unsigned int proc_stream_poll(struct file *f, struct poll_table_struct *p) { static unsigned int proc_stream_poll(struct file *f, struct poll_table_struct *p) {
unsigned int stream_idx = (unsigned int) (unsigned long) PDE_DATA(f->f_path.dentry->d_inode); struct re_stream *stream = f->private_data;
struct re_stream *stream;
unsigned long flags; unsigned long flags;
unsigned int ret = 0; unsigned int ret = 0;
DBG("entering proc_stream_poll()\n"); DBG("entering proc_stream_poll()\n");
stream = get_stream_lock(NULL, stream_idx);
if (!stream)
return POLLERR;
poll_wait(f, &stream->read_wq, p); poll_wait(f, &stream->read_wq, p);
DBG("locking stream's packet list lock\n"); DBG("locking stream's packet list lock\n");
@ -3612,8 +3601,6 @@ static unsigned int proc_stream_poll(struct file *f, struct poll_table_struct *p
spin_unlock_irqrestore(&stream->packet_list_lock, flags); spin_unlock_irqrestore(&stream->packet_list_lock, flags);
stream_put(stream);
return ret; return ret;
} }
@ -3636,22 +3623,18 @@ static int proc_stream_open(struct inode *i, struct file *f) {
return -ETXTBSY; return -ETXTBSY;
} }
f->private_data = stream;
return 0; return 0;
} }
static int proc_stream_close(struct inode *i, struct file *f) { static int proc_stream_close(struct inode *i, struct file *f) {
unsigned int stream_idx = (unsigned int) (unsigned long) PDE_DATA(f->f_path.dentry->d_inode); struct re_stream *stream = f->private_data;
struct re_stream *stream;
DBG("entering proc_stream_close()\n"); DBG("entering proc_stream_close()\n");
stream = get_stream_lock(NULL, stream_idx);
if (!stream)
return -EIO;
/* release our own ref and the ref from _open */
stream_put(stream); stream_put(stream);
stream_put(stream); f->private_data = NULL;
proc_generic_close_modref(i, f); proc_generic_close_modref(i, f);
return 0; return 0;

Loading…
Cancel
Save