patch for 2.1.56 sys_mount

Bill Hawes (whawes@star.net)
Sun, 21 Sep 1997 10:13:16 -0400


This is a multi-part message in MIME format.
--------------958833E8593C071B3A84C854
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

While checking out a problem with the floppy_release code I found some
problems in the error cleanup in sys_mount. It appears that some error
exits might not close an opened device, or might incorrectly try putting
an unnamed device, or might fail to put an unnamed device.

The attached patch reworks the code so that all exits will release any
opened resources.

Regards,
Bill
--------------958833E8593C071B3A84C854
Content-Type: text/plain; charset=us-ascii; name="super_mnt56-patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="super_mnt56-patch"

--- fs/super.c.old Sat Sep 6 16:03:33 1997
+++ fs/super.c Sun Sep 21 09:18:47 1997
@@ -917,12 +918,11 @@
struct file_system_type * fstype;
struct dentry * dentry = NULL;
struct inode * inode = NULL;
- struct file_operations * fops;
kdev_t dev;
int retval = -EPERM;
- const char * t;
unsigned long flags = 0;
unsigned long page = 0;
+ struct file dummy; /* allows read-write or read-only flag */

lock_kernel();
if (!suser())
@@ -938,6 +938,7 @@
free_page(page);
goto out;
}
+
retval = copy_mount_options (type, &page);
if (retval < 0)
goto out;
@@ -946,8 +947,8 @@
retval = -ENODEV;
if (!fstype)
goto out;
- t = fstype->name;
- fops = NULL;
+
+ memset(&dummy, 0, sizeof(dummy));
if (fstype->fs_flags & FS_REQUIRES_DEV) {
dentry = namei(dev_name);
retval = PTR_ERR(dentry);
@@ -968,17 +969,15 @@
if (MAJOR(dev) >= MAX_BLKDEV)
goto dput_and_out;

- fops = get_blkfops(MAJOR(dev));
retval = -ENOTBLK;
- if (!fops)
+ dummy.f_op = get_blkfops(MAJOR(dev));
+ if (!dummy.f_op)
goto dput_and_out;

- if (fops->open) {
- struct file dummy; /* allows read-write or read-only flag */
- memset(&dummy, 0, sizeof(dummy));
+ if (dummy.f_op->open) {
dummy.f_dentry = dentry;
dummy.f_mode = (new_flags & MS_RDONLY) ? 1 : 3;
- retval = fops->open(inode, &dummy);
+ retval = dummy.f_op->open(inode, &dummy);
if (retval)
goto dput_and_out;
}
@@ -993,22 +992,28 @@
if ((new_flags & MS_MGC_MSK) == MS_MGC_VAL) {
flags = new_flags & ~MS_MGC_MSK;
retval = copy_mount_options(data, &page);
- if (retval < 0) {
- put_unnamed_dev(dev);
- goto dput_and_out;
- }
+ if (retval < 0)
+ goto clean_up;
}
- retval = do_mount(dev,dev_name,dir_name,t,flags,(void *) page);
+ retval = do_mount(dev, dev_name, dir_name, fstype->name, flags,
+ (void *) page);
free_page(page);
- if (retval && fops && fops->release) {
- fops->release(inode, NULL);
- put_unnamed_dev(dev);
- }
+ if (retval)
+ goto clean_up;
+
dput_and_out:
dput(dentry);
out:
unlock_kernel();
return retval;
+
+clean_up:
+ if (dummy.f_op) {
+ if (dummy.f_op->release)
+ dummy.f_op->release(inode, NULL);
+ } else
+ put_unnamed_dev(dev);
+ goto dput_and_out;
}

__initfunc(static void do_mount_root(void))

--------------958833E8593C071B3A84C854--