All of lore.kernel.org
 help / color / mirror / Atom feed
From: Akinobu Mita <mita@miraclelinux.com>
To: linux-kernel@vger.kernel.org
Cc: akpm@osdl.org, Jens Axboe <axboe@suse.de>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Akinobu Mita <mita@miraclelinux.com>
Subject: [PATCH] loop: online resize support
Date: Tue, 23 May 2006 15:31:29 +0800	[thread overview]
Message-ID: <20060523073129.GA6507@miraclelinux.com> (raw)

This patch introduces new ioctl command LOOP_UPDATE_SIZE
which enables to resize online mounted loop device.

EXAMPLE
=======
# Make 10MB disk image
# dd if=/dev/zero of=image bs=1k count=10k
# mkfs.ext3 -j -F image

# Mount
# mkdir loop
# mount -o loop=/dev/loop/0,debug -t ext3 image loop

# Check disk size
# df -h loop
Filesystem            Size  Used Avail Use% Mounted on
/home/mita/looback-test/image
                      9.7M  1.1M  8.2M  12% /home/mita/looback-test/loop

# Extend disk image to 20MB
# dd if=/dev/zero of=appendix bs=1k count=10k
# cat appendix >> image

# Resize
# gcc -o loop-update loop-update.c
# ./loop-update /dev/loop/0
# ext2online -d -v image

# Check disk size again
# df -h loop
Filesystem            Size  Used Avail Use% Mounted on
/home/mita/looback-test/image
                       20M  1.1M   18M   6% /home/mita/looback-test/loop

loop-update.c
=============
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define LOOP_UPDATE_SIZE	0x4C07

int main(int argc, char **argv)
{
	int fd;
	int err;

	if (argc < 2) {
		fprintf(stderr, "usage: loop-update loop_device\n");
		exit(1);
	}

	fd = open(argv[1], O_RDWR);
	if (fd < 0) {
		perror(argv[1]);
		exit(1);
	}

	err = ioctl(fd, LOOP_UPDATE_SIZE, NULL);
	if (err) {
		perror(argv[1]);
		exit(1);
	}
}


CC: Jens Axboe <axboe@suse.de>
CC: "Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: Akinobu Mita <mita@miraclelinux.com>

--- 2.6-mm/include/linux/loop.h.orig	2006-05-23 12:52:54.000000000 +0800
+++ 2.6-mm/include/linux/loop.h	2006-05-23 12:59:14.000000000 +0800
@@ -158,5 +158,6 @@ int loop_unregister_transfer(int number)
 #define LOOP_SET_STATUS64	0x4C04
 #define LOOP_GET_STATUS64	0x4C05
 #define LOOP_CHANGE_FD		0x4C06
+#define LOOP_UPDATE_SIZE	0x4C07
 
 #endif
--- 2.6-mm/drivers/block/loop.c.orig	2006-05-23 12:51:11.000000000 +0800
+++ 2.6-mm/drivers/block/loop.c	2006-05-23 13:50:58.000000000 +0800
@@ -1108,7 +1108,8 @@ loop_set_status64(struct loop_device *lo
 }
 
 static int
-loop_get_status_old(struct loop_device *lo, struct loop_info __user *arg) {
+loop_get_status_old(struct loop_device *lo, struct loop_info __user *arg)
+{
 	struct loop_info info;
 	struct loop_info64 info64;
 	int err = 0;
@@ -1126,7 +1127,8 @@ loop_get_status_old(struct loop_device *
 }
 
 static int
-loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg) {
+loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg)
+{
 	struct loop_info64 info64;
 	int err = 0;
 
@@ -1140,6 +1142,17 @@ loop_get_status64(struct loop_device *lo
 	return err;
 }
 
+static int loop_update_size(struct loop_device *lo)
+{
+	int err = figure_loop_size(lo);
+
+	if (!err)
+		i_size_write(lo->lo_device->bd_inode,
+			     (loff_t) get_capacity(disks[lo->lo_number]) << 9);
+
+	return err;
+}
+
 static int lo_ioctl(struct inode * inode, struct file * file,
 	unsigned int cmd, unsigned long arg)
 {
@@ -1169,6 +1182,9 @@ static int lo_ioctl(struct inode * inode
 	case LOOP_GET_STATUS64:
 		err = loop_get_status64(lo, (struct loop_info64 __user *) arg);
 		break;
+	case LOOP_UPDATE_SIZE:
+		err = loop_update_size(lo);
+		break;
 	default:
 		err = lo->ioctl ? lo->ioctl(lo, cmd, arg) : -EINVAL;
 	}

             reply	other threads:[~2006-05-23  7:31 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-23  7:31 Akinobu Mita [this message]
2006-05-24 19:37 ` [PATCH] loop: online resize support Andrew Morton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060523073129.GA6507@miraclelinux.com \
    --to=mita@miraclelinux.com \
    --cc=akpm@osdl.org \
    --cc=axboe@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.