]> Pileus Git - ~andy/linux/blobdiff - sound/sound_core.c
diag: warn about missing first netlink attribute
[~andy/linux] / sound / sound_core.c
index 45759f4cca754488d38f15bcae85b161a85fb4a9..11e953a1fa45a06ab9243eca4d99d5b3f16ea9ef 100644 (file)
@@ -626,31 +626,20 @@ static int soundcore_open(struct inode *inode, struct file *file)
                if (s)
                        new_fops = fops_get(s->unit_fops);
        }
+       spin_unlock(&sound_loader_lock);
        if (new_fops) {
                /*
                 * We rely upon the fact that we can't be unloaded while the
-                * subdriver is there, so if ->open() is successful we can
-                * safely drop the reference counter and if it is not we can
-                * revert to old ->f_op. Ugly, indeed, but that's the cost of
-                * switching ->f_op in the first place.
+                * subdriver is there.
                 */
                int err = 0;
-               const struct file_operations *old_fops = file->f_op;
-               file->f_op = new_fops;
-               spin_unlock(&sound_loader_lock);
+               replace_fops(file, new_fops);
 
                if (file->f_op->open)
                        err = file->f_op->open(inode,file);
 
-               if (err) {
-                       fops_put(file->f_op);
-                       file->f_op = fops_get(old_fops);
-               }
-
-               fops_put(old_fops);
                return err;
        }
-       spin_unlock(&sound_loader_lock);
        return -ENODEV;
 }