]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/block/dcssblk.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/chrisw...
[linux-2.6-omap-h63xx.git] / drivers / s390 / block / dcssblk.c
index e6c94dbfdeaa8f7a744fbb5e08708f61e8bfe4f3..bb52d2fbac183b7a98e4e7872ace113a92a8cecc 100644 (file)
@@ -36,7 +36,7 @@ static int dcssblk_open(struct inode *inode, struct file *filp);
 static int dcssblk_release(struct inode *inode, struct file *filp);
 static int dcssblk_make_request(struct request_queue *q, struct bio *bio);
 static int dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
-                                unsigned long *data);
+                                void **kaddr, unsigned long *pfn);
 
 static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
 
@@ -142,57 +142,6 @@ dcssblk_get_device_by_name(char *name)
        return NULL;
 }
 
-/*
- * print appropriate error message for segment_load()/segment_type()
- * return code
- */
-static void
-dcssblk_segment_warn(int rc, char* seg_name)
-{
-       switch (rc) {
-       case -ENOENT:
-               PRINT_WARN("cannot load/query segment %s, does not exist\n",
-                          seg_name);
-               break;
-       case -ENOSYS:
-               PRINT_WARN("cannot load/query segment %s, not running on VM\n",
-                          seg_name);
-               break;
-       case -EIO:
-               PRINT_WARN("cannot load/query segment %s, hardware error\n",
-                          seg_name);
-               break;
-       case -ENOTSUPP:
-               PRINT_WARN("cannot load/query segment %s, is a multi-part "
-                          "segment\n", seg_name);
-               break;
-       case -ENOSPC:
-               PRINT_WARN("cannot load/query segment %s, overlaps with "
-                          "storage\n", seg_name);
-               break;
-       case -EBUSY:
-               PRINT_WARN("cannot load/query segment %s, overlaps with "
-                          "already loaded dcss\n", seg_name);
-               break;
-       case -EPERM:
-               PRINT_WARN("cannot load/query segment %s, already loaded in "
-                          "incompatible mode\n", seg_name);
-               break;
-       case -ENOMEM:
-               PRINT_WARN("cannot load/query segment %s, out of memory\n",
-                          seg_name);
-               break;
-       case -ERANGE:
-               PRINT_WARN("cannot load/query segment %s, exceeds kernel "
-                          "mapping range\n", seg_name);
-               break;
-       default:
-               PRINT_WARN("cannot load/query segment %s, return value %i\n",
-                          seg_name, rc);
-               break;
-       }
-}
-
 static void dcssblk_unregister_callback(struct device *dev)
 {
        device_unregister(dev);
@@ -423,7 +372,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
        rc = segment_load(local_buf, SEGMENT_SHARED,
                                &dev_info->start, &dev_info->end);
        if (rc < 0) {
-               dcssblk_segment_warn(rc, dev_info->segment_name);
+               segment_warning(rc, dev_info->segment_name);
                goto dealloc_gendisk;
        }
        seg_byte_size = (dev_info->end - dev_info->start + 1);
@@ -687,7 +636,7 @@ fail:
 
 static int
 dcssblk_direct_access (struct block_device *bdev, sector_t secnum,
-                       unsigned long *data)
+                       void **kaddr, unsigned long *pfn)
 {
        struct dcssblk_dev_info *dev_info;
        unsigned long pgoff;
@@ -700,7 +649,9 @@ dcssblk_direct_access (struct block_device *bdev, sector_t secnum,
        pgoff = secnum / (PAGE_SIZE / 512);
        if ((pgoff+1)*PAGE_SIZE-1 > dev_info->end - dev_info->start)
                return -ERANGE;
-       *data = (unsigned long) (dev_info->start+pgoff*PAGE_SIZE);
+       *kaddr = (void *) (dev_info->start+pgoff*PAGE_SIZE);
+       *pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT;
+
        return 0;
 }