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;
}
next 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.