Messages in this thread | | | From | Andrea Righi <> | Subject | Re: [PATCH 2/3] relay: Fix race condition which occurs when reading across CPUs. | Date | Fri, 13 Jun 2008 00:58:01 +0200 (MEST) |
| |
Eduard - Gabriel Munteanu wrote: > @@ -1028,15 +1032,19 @@ static ssize_t relay_file_read_subbufs(struct file *filp, loff_t *ppos, > break; > > avail = min(desc->count, avail); > + /* subbuf_actor may sleep, so release the spinlock for now */ > + spin_unlock_irqrestore(&buf->rw_lock, flags); > ret = subbuf_actor(read_start, buf, avail, desc, actor); > if (desc->error < 0) > break;
If you just break here buf->rw_lock will be unlocked twice. Maybe a better way is: if (desc->error < 0) goto out; ... } while (desc->count && ret); spin_unlock_irqrestore(&buf->rw_lock, flags); out: mutex_unlock(&filp->f_path.dentry->d_inode->i_mutex);
return desc->written;
> + spin_lock_irqsave(&buf->rw_lock, flags); > > if (ret) { > relay_file_read_consume(buf, read_start, ret); > *ppos = relay_file_read_end_pos(buf, read_start, ret); > } > } while (desc->count && ret); > + spin_unlock_irqrestore(&buf->rw_lock, flags); > mutex_unlock(&filp->f_path.dentry->d_inode->i_mutex); > > return desc->written;
-Andrea
| |