Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / drivers / ide / ide-tape.c
index 9cfc2d7..f04791a 100644 (file)
 
 #define IDETAPE_VERSION "1.19"
 
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/interrupt.h>
 #include <linux/jiffies.h>
 #include <linux/major.h>
+#include <linux/devfs_fs_kernel.h>
 #include <linux/errno.h>
 #include <linux/genhd.h>
 #include <linux/slab.h>
@@ -2644,23 +2646,21 @@ static idetape_stage_t *idetape_kmalloc_stage (idetape_tape_t *tape)
        return __idetape_kmalloc_stage(tape, 0, 0);
 }
 
-static int idetape_copy_stage_from_user (idetape_tape_t *tape, idetape_stage_t *stage, const char __user *buf, int n)
+static void idetape_copy_stage_from_user (idetape_tape_t *tape, idetape_stage_t *stage, const char __user *buf, int n)
 {
        struct idetape_bh *bh = tape->bh;
        int count;
-       int ret = 0;
 
        while (n) {
 #if IDETAPE_DEBUG_BUGS
                if (bh == NULL) {
                        printk(KERN_ERR "ide-tape: bh == NULL in "
                                "idetape_copy_stage_from_user\n");
-                       return 1;
+                       return;
                }
 #endif /* IDETAPE_DEBUG_BUGS */
                count = min((unsigned int)(bh->b_size - atomic_read(&bh->b_count)), (unsigned int)n);
-               if (copy_from_user(bh->b_data + atomic_read(&bh->b_count), buf, count))
-                       ret = 1;
+               copy_from_user(bh->b_data + atomic_read(&bh->b_count), buf, count);
                n -= count;
                atomic_add(count, &bh->b_count);
                buf += count;
@@ -2671,26 +2671,23 @@ static int idetape_copy_stage_from_user (idetape_tape_t *tape, idetape_stage_t *
                }
        }
        tape->bh = bh;
-       return ret;
 }
 
-static int idetape_copy_stage_to_user (idetape_tape_t *tape, char __user *buf, idetape_stage_t *stage, int n)
+static void idetape_copy_stage_to_user (idetape_tape_t *tape, char __user *buf, idetape_stage_t *stage, int n)
 {
        struct idetape_bh *bh = tape->bh;
        int count;
-       int ret = 0;
 
        while (n) {
 #if IDETAPE_DEBUG_BUGS
                if (bh == NULL) {
                        printk(KERN_ERR "ide-tape: bh == NULL in "
                                "idetape_copy_stage_to_user\n");
-                       return 1;
+                       return;
                }
 #endif /* IDETAPE_DEBUG_BUGS */
                count = min(tape->b_count, n);
-               if  (copy_to_user(buf, tape->b_data, count))
-                       ret = 1;
+               copy_to_user(buf, tape->b_data, count);
                n -= count;
                tape->b_data += count;
                tape->b_count -= count;
@@ -2703,7 +2700,6 @@ static int idetape_copy_stage_to_user (idetape_tape_t *tape, char __user *buf, i
                        }
                }
        }
-       return ret;
 }
 
 static void idetape_init_merge_stage (idetape_tape_t *tape)
@@ -2764,7 +2760,7 @@ static void idetape_add_stage_tail (ide_drive_t *drive,idetape_stage_t *stage)
  */
 static void idetape_wait_for_request (ide_drive_t *drive, struct request *rq)
 {
-       DECLARE_COMPLETION_ONSTACK(wait);
+       DECLARE_COMPLETION(wait);
        idetape_tape_t *tape = drive->driver_data;
 
 #if IDETAPE_DEBUG_BUGS
@@ -3723,7 +3719,6 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf,
        struct ide_tape_obj *tape = ide_tape_f(file);
        ide_drive_t *drive = tape->drive;
        ssize_t bytes_read,temp, actually_read = 0, rc;
-       ssize_t ret = 0;
 
 #if IDETAPE_DEBUG_LOG
        if (tape->debug_level >= 3)
@@ -3742,8 +3737,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf,
                return (0);
        if (tape->merge_stage_size) {
                actually_read = min((unsigned int)(tape->merge_stage_size), (unsigned int)count);
-               if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage, actually_read))
-                       ret = -EFAULT;
+               idetape_copy_stage_to_user(tape, buf, tape->merge_stage, actually_read);
                buf += actually_read;
                tape->merge_stage_size -= actually_read;
                count -= actually_read;
@@ -3752,8 +3746,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf,
                bytes_read = idetape_add_chrdev_read_request(drive, tape->capabilities.ctl);
                if (bytes_read <= 0)
                        goto finish;
-               if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage, bytes_read))
-                       ret = -EFAULT;
+               idetape_copy_stage_to_user(tape, buf, tape->merge_stage, bytes_read);
                buf += bytes_read;
                count -= bytes_read;
                actually_read += bytes_read;
@@ -3763,8 +3756,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf,
                if (bytes_read <= 0)
                        goto finish;
                temp = min((unsigned long)count, (unsigned long)bytes_read);
-               if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage, temp))
-                       ret = -EFAULT;
+               idetape_copy_stage_to_user(tape, buf, tape->merge_stage, temp);
                actually_read += temp;
                tape->merge_stage_size = bytes_read-temp;
        }
@@ -3777,8 +3769,7 @@ finish:
                idetape_space_over_filemarks(drive, MTFSF, 1);
                return 0;
        }
-
-       return (ret) ? ret : actually_read;
+       return actually_read;
 }
 
 static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf,
@@ -3786,8 +3777,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf,
 {
        struct ide_tape_obj *tape = ide_tape_f(file);
        ide_drive_t *drive = tape->drive;
-       ssize_t actually_written = 0;
-       ssize_t ret = 0;
+       ssize_t retval, actually_written = 0;
 
        /* The drive is write protected. */
        if (tape->write_prot)
@@ -3823,7 +3813,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf,
                 *      some drives (Seagate STT3401A) will return an error.
                 */
                if (drive->dsc_overlap) {
-                       ssize_t retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
+                       retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
                        if (retval < 0) {
                                __idetape_kfree_stage(tape->merge_stage);
                                tape->merge_stage = NULL;
@@ -3844,14 +3834,12 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf,
                }
 #endif /* IDETAPE_DEBUG_BUGS */
                actually_written = min((unsigned int)(tape->stage_size - tape->merge_stage_size), (unsigned int)count);
-               if (idetape_copy_stage_from_user(tape, tape->merge_stage, buf, actually_written))
-                               ret = -EFAULT;
+               idetape_copy_stage_from_user(tape, tape->merge_stage, buf, actually_written);
                buf += actually_written;
                tape->merge_stage_size += actually_written;
                count -= actually_written;
 
                if (tape->merge_stage_size == tape->stage_size) {
-                       ssize_t retval;
                        tape->merge_stage_size = 0;
                        retval = idetape_add_chrdev_write_request(drive, tape->capabilities.ctl);
                        if (retval <= 0)
@@ -3859,9 +3847,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf,
                }
        }
        while (count >= tape->stage_size) {
-               ssize_t retval;
-               if (idetape_copy_stage_from_user(tape, tape->merge_stage, buf, tape->stage_size))
-                       ret = -EFAULT;
+               idetape_copy_stage_from_user(tape, tape->merge_stage, buf, tape->stage_size);
                buf += tape->stage_size;
                count -= tape->stage_size;
                retval = idetape_add_chrdev_write_request(drive, tape->capabilities.ctl);
@@ -3871,11 +3857,10 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf,
        }
        if (count) {
                actually_written += count;
-               if (idetape_copy_stage_from_user(tape, tape->merge_stage, buf, count))
-                       ret = -EFAULT;
+               idetape_copy_stage_from_user(tape, tape->merge_stage, buf, count);
                tape->merge_stage_size += count;
        }
-       return (ret) ? ret : actually_written;
+       return (actually_written);
 }
 
 static int idetape_write_filemark (ide_drive_t *drive)
@@ -4724,6 +4709,9 @@ static void ide_tape_release(struct kref *kref)
                        MKDEV(IDETAPE_MAJOR, tape->minor));
        class_device_destroy(idetape_sysfs_class,
                        MKDEV(IDETAPE_MAJOR, tape->minor + 128));
+       devfs_remove("%s/mt", drive->devfs_name);
+       devfs_remove("%s/mtn", drive->devfs_name);
+       devfs_unregister_tape(g->number);
        idetape_devs[tape->minor] = NULL;
        g->private_data = NULL;
        put_disk(g);
@@ -4897,6 +4885,14 @@ static int ide_tape_probe(ide_drive_t *drive)
        class_device_create(idetape_sysfs_class, NULL,
                        MKDEV(IDETAPE_MAJOR, minor + 128), &drive->gendev, "n%s", tape->name);
 
+       devfs_mk_cdev(MKDEV(HWIF(drive)->major, minor),
+                       S_IFCHR | S_IRUGO | S_IWUGO,
+                       "%s/mt", drive->devfs_name);
+       devfs_mk_cdev(MKDEV(HWIF(drive)->major, minor + 128),
+                       S_IFCHR | S_IRUGO | S_IWUGO,
+                       "%s/mtn", drive->devfs_name);
+
+       g->number = devfs_register_tape(drive->devfs_name);
        g->fops = &idetape_block_ops;
        ide_register_region(g);