diff -ru linux-2.6.28/drivers/scsi/sd.c linux-2.6.28/drivers/scsi/sd.c
--- linux-2.6.28/drivers/scsi/sd.c	2009-03-21 13:36:48.000000000 +0100
+++ linux-2.6.28/drivers/scsi/sd.c	2009-03-21 13:07:43.000000000 +0100
@@ -725,6 +725,19 @@
 	return 0;
 }
 
+static int scsi_ioctl_set_capacity(struct scsi_disk *sdkp, void __user *arg)
+{
+    int val, result;
+
+    result = get_user(val, (int __user *)arg);
+    if (result)
+	return result;
+    sdkp->capacity = val;
+    set_capacity(sdkp->disk, sdkp->capacity);
+
+    return 0;
+}
+
 /**
  *	sd_ioctl - process an ioctl
  *	@inode: only i_rdev/i_bdev members may be used
@@ -770,6 +786,11 @@
 		case SCSI_IOCTL_GET_IDLUN:
 		case SCSI_IOCTL_GET_BUS_NUMBER:
 			return scsi_ioctl(sdp, cmd, p);
+		case SCSI_IOCTL_SET_CAPACITY:
+			return scsi_ioctl_set_capacity(scsi_disk(disk), (int __user *)arg);
+		case SCSI_IOCTL_GET_CAPACITY:
+			return put_user(scsi_disk(disk)->capacity, (int __user *)arg);
+
 		default:
 			error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p);
 			if (error != -ENOTTY)
diff -ru linux-2.6.28/include/scsi/scsi_ioctl.h linux-2.6.28/include/scsi/scsi_ioctl.h
--- linux-2.6.28/include/scsi/scsi_ioctl.h	2008-12-25 00:26:37.000000000 +0100
+++ linux-2.6.28/include/scsi/scsi_ioctl.h	2009-03-21 12:48:45.000000000 +0100
@@ -11,6 +11,8 @@
    the cdrom */
 #define SCSI_IOCTL_DOORLOCK 0x5380		/* lock the eject mechanism */
 #define SCSI_IOCTL_DOORUNLOCK 0x5381		/* unlock the mechanism	  */
+#define SCSI_IOCTL_SET_CAPACITY 0x5388		/* set capacity */
+#define SCSI_IOCTL_GET_CAPACITY 0x5389		/* get capacity */
 
 #define	SCSI_REMOVAL_PREVENT	1
 #define	SCSI_REMOVAL_ALLOW	0
