--- a/drivers/char/mem.c 2008-01-24 17:58:37.000000000 -0500 +++ b/drivers/char/mem.c 2008-03-31 16:30:51.000000000 -0400 @@ -6,6 +6,9 @@ * Added devfs support. * Jan-11-1998, C. Scott Ananian * Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar + * + * Added support for the /dev/one device. Originally intended for poly-p-ux + * Feb-09-2008, Marcin Koziuk */ #include @@ -654,6 +657,23 @@ return written ? written : -EFAULT; } +static ssize_t read_one(struct file * file, char __user * buf, + size_t count, loff_t *ppos) +{ + size_t written; + unsigned long unwritten; + static int one = ~0; + + for (written = 0; written < count; written++) { + unwritten = copy_to_user(&buf[written], &one, 1); + if (unwritten) + break; + cond_resched(); + } + + return written ? written : -EFAULT; +} + static int mmap_zero(struct file * file, struct vm_area_struct * vma) { #ifndef CONFIG_MMU @@ -724,6 +744,9 @@ #define open_mem open_port #define open_kmem open_mem #define open_oldmem open_mem +#define one_lseek null_lseek +#define write_one write_null +#define mmap_one mmap_zero static const struct file_operations mem_fops = { .llseek = memory_lseek, @@ -765,6 +788,12 @@ .write = write_zero, .mmap = mmap_zero, }; +static const struct file_operations one_fops = { + .llseek = one_lseek, + .read = read_one, + .write = write_one, + .mmap = mmap_one, +}; /* * capabilities for /dev/zero @@ -854,6 +883,10 @@ filp->f_op = &oldmem_fops; break; #endif + case 13: + filp->f_mapping->backing_dev_info = &zero_bdi; + filp->f_op = &one_fops; + break; default: return -ENXIO; } @@ -886,6 +919,7 @@ #ifdef CONFIG_CRASH_DUMP {12,"oldmem", S_IRUSR | S_IWUSR | S_IRGRP, &oldmem_fops}, #endif + {13,"one", S_IRUGO | S_IWUGO, &one_fops}, }; static struct class *mem_class;