linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] loop file resizable
@ 2008-11-17  7:44 Tomas M
  2008-11-19  0:42 ` Andrew Morton
  0 siblings, 1 reply; 13+ messages in thread
From: Tomas M @ 2008-11-17  7:44 UTC (permalink / raw)
  To: linux-kernel

The following patch against loop.c adds ability to 'resize' the loop device on the fly.
This may be practically very useful.

One practical application is a loop file with XFS filesystem, already mounted:
You can easily enlarge the file (append some bytes) and then call
ioctl(fd, LOOP_SET_CAPACITY, new);
The loop driver will learn about the new size and you can use xfs_growfs
later on, which will allow you to use full capacity of the loop
file without the need to unmount.

Please include it in mainline kernel.

Hope you like it.

Signed-off-by: Junjiro Okajima <hooanon05@yahoo.co.jp>
Signed-off-by: Tomas Matejicek <tomas@slax.org>

Tomas M
slax.org


Index: linux-2.6.27/drivers/block/loop.c
===================================================================
retrieving revision 1.1
diff -u -p -r1.1 loop.c
--- linux-2.6.27/drivers/block/loop.c	7 Nov 2008 13:07:06 -0000	1.1
+++ linux-2.6.27/drivers/block/loop.c	8 Nov 2008 03:29:47 -0000
@@ -1142,6 +1142,8 @@ static int lo_ioctl(struct inode * inode
 {
 	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
 	int err;
+	sector_t sec;
+	loff_t sz;
 
 	mutex_lock(&lo->lo_ctl_mutex);
 	switch (cmd) {
@@ -1166,6 +1168,16 @@ static int lo_ioctl(struct inode * inode
 	case LOOP_GET_STATUS64:
 		err = loop_get_status64(lo, (struct loop_info64 __user *) arg);
 		break;
+	case LOOP_SET_CAPACITY:
+		err = figure_loop_size(lo);
+		if (!err) {
+			sec = get_capacity(lo->lo_disk);
+			sz = sec << 9;
+			mutex_lock(&inode->i_bdev->bd_mutex);
+			bd_set_size(inode->i_bdev, sz);
+			mutex_unlock(&inode->i_bdev->bd_mutex);
+		}
+		break;
 	default:
 		err = lo->ioctl ? lo->ioctl(lo, cmd, arg) : -EINVAL;
 	}
@@ -1311,6 +1323,7 @@ static long lo_compat_ioctl(struct file 
 			lo, (struct compat_loop_info __user *) arg);
 		mutex_unlock(&lo->lo_ctl_mutex);
 		break;
+	case LOOP_SET_CAPACITY:
 	case LOOP_CLR_FD:
 	case LOOP_GET_STATUS64:
 	case LOOP_SET_STATUS64:
Index: linux-2.6.27/include/linux/loop.h
===================================================================
retrieving revision 1.1
diff -u -p -r1.1 loop.h
--- linux-2.6.27/include/linux/loop.h	7 Nov 2008 13:05:58 -0000	1.1
+++ linux-2.6.27/include/linux/loop.h	8 Nov 2008 03:22:36 -0000
@@ -160,5 +160,6 @@ int loop_unregister_transfer(int number)
 #define LOOP_SET_STATUS64	0x4C04
 #define LOOP_GET_STATUS64	0x4C05
 #define LOOP_CHANGE_FD		0x4C06
+#define LOOP_SET_CAPACITY	0x4C07
 
 #endif

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

end of thread, other threads:[~2008-11-24  2:08 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-17  7:44 [PATCH] loop file resizable Tomas M
2008-11-19  0:42 ` Andrew Morton
2008-11-19  2:07   ` Akinobu Mita
2008-11-19  3:51   ` hooanon05
2008-11-19 18:34     ` Tomas M
2008-11-20 21:26     ` Andrew Morton
2008-11-21  2:37       ` hooanon05
2008-11-21  3:19         ` hooanon05
2008-11-21  4:31       ` [PATCH v2] " hooanon05
2008-11-21 10:12       ` [PATCH] " Karel Zak
2008-11-21 12:23         ` hooanon05
2008-11-21 12:44           ` Karel Zak
2008-11-24  2:08             ` hooanon05

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).