The loopback cdev created with cdev_create_loop() is used, but never
opened. Open it before usage.

Not having it opened has the effect that during unmount of a loopback
mounted file the devfs_remove() call for the loopback cdev fails,
because the usage counter drops below zero.

Signed-off-by: Sascha Hauer <[email protected]>
---
 fs/fs.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/fs/fs.c b/fs/fs.c
index 5e7e05f499..f24962d2a6 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -933,6 +933,13 @@ int fsdev_open_cdev(struct fs_device *fsdev)
                        return ret;
 
                fsdev->cdev = cdev_create_loop(fsdev->backingstore, O_RDWR, 
offset);
+               if (fsdev->cdev) {
+                       ret = cdev_open(fsdev->cdev, O_RDWR);
+                       if (ret) {
+                               cdev_remove_loop(fsdev->cdev);
+                               fsdev->cdev = NULL;
+                       }
+               }
        } else {
                fsdev->cdev = cdev_open_by_name(fsdev->backingstore, O_RDWR);
        }

-- 
2.39.5


Reply via email to