All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Ext3 online resizing locking issue
@ 2005-08-24 21:03 Glauber de Oliveira Costa
  2005-08-25 19:02   ` Stephen C. Tweedie
  0 siblings, 1 reply; 10+ messages in thread
From: Glauber de Oliveira Costa @ 2005-08-24 21:03 UTC (permalink / raw)
  To: ext2-devel, ext2resize-devel, linux-kernel, linux-fsdevel,
	adilger, sct, akpm

This simple patch provides a fix for a locking issue found in the online
resizing code. The problem actually happened while trying to resize the
filesystem trough the resize=xxx option in a remount. 

Signed-off-by: Glauber de Oliveira Costa <gocosta@br.ibm.com>


diff -up linux-2.6.13-rc6-orig/fs/ext3/ioctl.c linux/fs/ext3/ioctl.c
--- linux-2.6.13-rc6-orig/fs/ext3/ioctl.c	2005-08-24 17:48:22.000000000 -0300
+++ linux/fs/ext3/ioctl.c	2005-08-24 15:12:48.000000000 -0300
@@ -206,7 +206,9 @@ flags_err:
 		if (get_user(n_blocks_count, (__u32 __user *)arg))
 			return -EFAULT;
 
+		lock_super(sb);
 		err = ext3_group_extend(sb, EXT3_SB(sb)->s_es, n_blocks_count);
+		unlock_super(sb);
 		journal_lock_updates(EXT3_SB(sb)->s_journal);
 		journal_flush(EXT3_SB(sb)->s_journal);
 		journal_unlock_updates(EXT3_SB(sb)->s_journal);
Only in linux/fs/ext3: patch-mnt_resize
diff -up linux-2.6.13-rc6-orig/fs/ext3/resize.c linux/fs/ext3/resize.c
--- linux-2.6.13-rc6-orig/fs/ext3/resize.c	2005-08-24 17:48:22.000000000 -0300
+++ linux/fs/ext3/resize.c	2005-08-24 15:15:28.000000000 -0300
@@ -884,7 +884,9 @@ exit_put:
 /* Extend the filesystem to the new number of blocks specified.  This entry
  * point is only used to extend the current filesystem to the end of the last
  * existing group.  It can be accessed via ioctl, or by "remount,resize=<size>"
- * for emergencies (because it has no dependencies on reserved blocks).
+ * for emergencies (because it has no dependencies on reserved blocks). 
+ * 
+ * It should be called with sb->s_lock held
  *
  * If we _really_ wanted, we could use default values to call ext3_group_add()
  * allow the "remount" trick to work for arbitrary resizing, assuming enough
@@ -959,7 +961,6 @@ int ext3_group_extend(struct super_block
 		goto exit_put;
 	}
 
-	lock_super(sb);
 	if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) {
 		ext3_warning(sb, __FUNCTION__,
 			     "multiple resizers run on filesystem!\n");
@@ -978,7 +979,6 @@ int ext3_group_extend(struct super_block
 	es->s_blocks_count = cpu_to_le32(o_blocks_count + add);
 	ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh);
 	sb->s_dirt = 1;
-	unlock_super(sb);
 	ext3_debug("freeing blocks %ld through %ld\n", o_blocks_count,
 		   o_blocks_count + add);
 	ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks);
diff -up linux-2.6.13-rc6-orig/fs/ext3/super.c linux/fs/ext3/super.c
--- linux-2.6.13-rc6-orig/fs/ext3/super.c	2005-08-24 17:48:22.000000000 -0300
+++ linux/fs/ext3/super.c	2005-08-24 15:13:16.000000000 -0300
@@ -639,8 +639,8 @@ static match_table_t tokens = {
 	{Opt_quota, "quota"},
 	{Opt_quota, "usrquota"},
 	{Opt_barrier, "barrier=%u"},
+	{Opt_resize, "resize=%u"},
 	{Opt_err, NULL},
-	{Opt_resize, "resize"},
 };
 
 static unsigned long get_sb_block(void **data)

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2005-09-01 23:02 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-24 21:03 [PATCH] Ext3 online resizing locking issue Glauber de Oliveira Costa
2005-08-25 19:02 ` Stephen C. Tweedie
2005-08-25 19:02   ` Stephen C. Tweedie
2005-08-25 20:43   ` Glauber de Oliveira Costa
2005-08-30 14:06     ` Stephen C. Tweedie
2005-08-30 14:06       ` Stephen C. Tweedie
2005-08-31 11:35       ` Glauber de Oliveira Costa
2005-08-31 11:35         ` Glauber de Oliveira Costa
2005-08-31 13:30         ` Stephen C. Tweedie
2005-09-01 23:04           ` [PATCH][RFC] Ext3 online resizing locking issue (Again) Glauber de Oliveira Costa

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.