static int ffs_ep0_open(struct inode *inode, struct file *file)
{
- struct ffs_data *ffs = inode->i_sb->s_fs_info;
- int ret;
+ struct ffs_data *ffs = inode->i_private;
- /* Acquire mutex */
- ret = ffs_mutex_lock(&ffs->mutex, file->f_flags & O_NONBLOCK);
- if (ret < 0)
- return ret;
-
- ffs_data_opened(ffs);
- if (ffs->state == FFS_CLOSING) {
- ffs_data_closed(ffs);
- mutex_unlock(&ffs->mutex);
+ if (ffs->state == FFS_CLOSING)
return -EBUSY;
- }
- mutex_unlock(&ffs->mutex);
+
file->private_data = ffs;
+ ffs_data_opened(ffs);
return stream_open(inode, file);
}
static int
ffs_epfile_open(struct inode *inode, struct file *file)
{
- struct ffs_data *ffs = inode->i_sb->s_fs_info;
- struct ffs_epfile *epfile;
- int ret;
+ struct ffs_epfile *epfile = inode->i_private;
- /* Acquire mutex */
- ret = ffs_mutex_lock(&ffs->mutex, file->f_flags & O_NONBLOCK);
- if (ret < 0)
- return ret;
-
- if (!atomic_inc_not_zero(&ffs->opened)) {
- mutex_unlock(&ffs->mutex);
- return -ENODEV;
- }
- /*
- * we want the state to be FFS_ACTIVE; FFS_ACTIVE alone is
- * not enough, though - we might have been through FFS_CLOSING
- * and back to FFS_ACTIVE, with our file already removed.
- */
- epfile = smp_load_acquire(&inode->i_private);
- if (unlikely(ffs->state != FFS_ACTIVE || !epfile)) {
- mutex_unlock(&ffs->mutex);
- ffs_data_closed(ffs);
+ if (WARN_ON(epfile->ffs->state != FFS_ACTIVE))
return -ENODEV;
- }
- mutex_unlock(&ffs->mutex);
file->private_data = epfile;
+ ffs_data_opened(epfile->ffs);
+
return stream_open(inode, file);
}
static int
ffs_epfile_release(struct inode *inode, struct file *file)
{
- struct ffs_epfile *epfile = file->private_data;
+ struct ffs_epfile *epfile = inode->i_private;
struct ffs_dmabuf_priv *priv, *tmp;
struct ffs_data *ffs = epfile->ffs;
return 0;
}
-static void clear_one(struct dentry *dentry)
-{
- smp_store_release(&dentry->d_inode->i_private, NULL);
-}
-
static void ffs_epfiles_destroy(struct ffs_epfile *epfiles, unsigned count)
{
struct ffs_epfile *epfile = epfiles;
for (; count; --count, ++epfile) {
BUG_ON(mutex_is_locked(&epfile->mutex));
if (epfile->dentry) {
- simple_recursive_removal(epfile->dentry, clear_one);
+ simple_recursive_removal(epfile->dentry, NULL);
epfile->dentry = NULL;
}
}