Skip to contentSkip to conversation

fsync on unmounting root

PATCH In review Chris Mason 2 participants 3 messages Jan 4, 2001 VFS

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fsync on unmounting root

Hi guys,

Looks like the prerelease, and at least test13 don't fsync the device when someone does an unmount on /

mount -o remount works, just unmounting the root misses the fsync.

This patch works for me:

-chris

fs/super.c renamed from fs/super.c.1 +5 -1
@@ -1031,8 +1031,12 @@
 		 * we just try to remount it readonly.
 		 */
 		mntput(mnt);
-		if (!(sb->s_flags & MS_RDONLY)) 
+		if (!(sb->s_flags & MS_RDONLY)) {
+			shrink_dcache_sb(sb);
+			fsync_dev(sb->s_dev);
+			acct_auto_close(sb->s_dev);
 			retval = do_remount_sb(sb, MS_RDONLY, 0);
+		}
 		return retval;
 	}
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#1 lore raw
Quoted 14 lines · Chris Mason

Hi guys,

Looks like the prerelease, and at least test13 don't fsync the device when someone does an unmount on /

mount -o remount works, just unmounting the root misses the fsync.

This patch works for me:

(quoted diff) +0 -1
-chris

fs/super.c line 1039

Quoted 10 lines
fs/super.c renamed from fs/super.c.1 +5 -1
@@ -1031,8 +1031,12 @@
 		 * we just try to remount it readonly.
 		 */
 		mntput(mnt);
-		if (!(sb->s_flags & MS_RDONLY)) 
+		if (!(sb->s_flags & MS_RDONLY)) {
+			shrink_dcache_sb(sb);
+			fsync_dev(sb->s_dev);
+			acct_auto_close(sb->s_dev);
 			retval = do_remount_sb(sb, MS_RDONLY, 0);
+		}

I have a better suggestion:

        if (mnt == current->fs->rootmnt && !umount_root) {
                mntput(mnt);
		return do_remount("/", 0, NULL);
	}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#2 lore raw
Quoted 8 lines · On Thursday, January 04, 2001 01:58:47 PM -0500 Alexander Viro…
Quoted 5 lines · Chris Mason

Looks like the prerelease, and at least test13 don't fsync the device when someone does an unmount on /

mount -o remount works, just unmounting the root misses the fsync. [snip]

Quoted 7 lines

I have a better suggestion:

        if (mnt == current->fs->rootmnt && !umount_root) {
                mntput(mnt);
		 return do_remount("/", 0, NULL);
	 }

Ok, but I thought we would need an MS_RDONLY in there somewhere...How about this:

-chris

fs/super.c renamed from fs/super.c.1 +2 -4
@@ -54,6 +54,7 @@
 extern int root_mountflags;
 
 static int do_remount_sb(struct super_block *sb, int flags, char * data);
+static int do_remount(const char *dir, int flags, char * data);
 
 /* this is initialized in init/main.c */
 kdev_t ROOT_DEV;
@@ -1025,15 +1026,12 @@
 	 * call reboot(9). Then init(8) could umount root and exec /reboot.
 	 */
 	if (mnt == current->fs->rootmnt && !umount_root) {
-		int retval = 0;
 		/*
 		 * Special case for "unmounting" root ...
 		 * we just try to remount it readonly.
 		 */
 		mntput(mnt);
-		if (!(sb->s_flags & MS_RDONLY)) 
-			retval = do_remount_sb(sb, MS_RDONLY, 0);
-		return retval;
+		return do_remount("/", MS_RDONLY, NULL);
 	}
 
 	spin_lock(&dcache_lock);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/