[PATCH] loop: online resize support



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@xxxxxxx>
CC: "Theodore Ts'o" <tytso@xxxxxxx>
Signed-off-by: Akinobu Mita <mita@xxxxxxxxxxxxxxxx>

--- 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;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: Fridays the thirteenth. (And a little puzzle.)
    ... -- compiler) is the usual method ... int febdays ... -- We're going to go round a loop dealing with each year in turn. ... -- other languages call) ...
    (uk.people.silversurfers)
  • Re: C code is not generating required results.
    ... int main ... the array by the size of an element. ... prevent the user of your program from entering more characters than ... want to loop. ...
    (comp.lang.c)
  • Re: long double versions of functions in gcc under Cygwin
    ... rather than the nearest enclosing one) and a decent exception ... them it doesn't seem like goto usage would be affected ... int typfun() ... Why use a for loop when it is just a while loop in disguise? ...
    (comp.lang.c)
  • Re: enum type int or unsigned int?
    ... that have type int and may appear wherever such are permitted. ... values of all the members of the enumeration. ... "enum" types are declared via the following syntax: ... so the loop will continue to run. ...
    (comp.lang.c)
  • Re: malloc + 4??
    ... >>information into the malloc is solid. ... The variable inSize is a plain int and has ... > the loop will never terminate. ... > yet also return the special marker value EOF. ...
    (comp.lang.c)