Commit 5c31dfe3 authored by David S. Miller's avatar David S. Miller

[SPARC64]: Fix direct f_pos fiddling in openpromfs.

Signed-off-by: default avatarDavid S. Miller <davem@redhat.com>
parent 5e125db8
...@@ -79,7 +79,7 @@ static ssize_t nodenum_read(struct file *file, char __user *buf, ...@@ -79,7 +79,7 @@ static ssize_t nodenum_read(struct file *file, char __user *buf,
count = 9 - file->f_pos; count = 9 - file->f_pos;
if (copy_to_user(buf, buffer + file->f_pos, count)) if (copy_to_user(buf, buffer + file->f_pos, count))
return -EFAULT; return -EFAULT;
file->f_pos += count; *ppos += count;
return count; return count;
} }
...@@ -94,7 +94,7 @@ static ssize_t property_read(struct file *filp, char __user *buf, ...@@ -94,7 +94,7 @@ static ssize_t property_read(struct file *filp, char __user *buf,
openprom_property *op; openprom_property *op;
char buffer[64]; char buffer[64];
if (filp->f_pos >= 0xffffff || count >= 0xffffff) if (*ppos >= 0xffffff || count >= 0xffffff)
return -EINVAL; return -EINVAL;
if (!filp->private_data) { if (!filp->private_data) {
node = nodes[(u16)((long)inode->u.generic_ip)].node; node = nodes[(u16)((long)inode->u.generic_ip)].node;
...@@ -180,7 +180,7 @@ static ssize_t property_read(struct file *filp, char __user *buf, ...@@ -180,7 +180,7 @@ static ssize_t property_read(struct file *filp, char __user *buf,
} else { } else {
i = (op->len << 1) + 1; i = (op->len << 1) + 1;
} }
k = filp->f_pos; k = *ppos;
if (k >= i) return 0; if (k >= i) return 0;
if (count > i - k) count = i - k; if (count > i - k) count = i - k;
if (op->flag & OPP_STRING) { if (op->flag & OPP_STRING) {
...@@ -197,7 +197,7 @@ static ssize_t property_read(struct file *filp, char __user *buf, ...@@ -197,7 +197,7 @@ static ssize_t property_read(struct file *filp, char __user *buf,
j = count; j = count;
if (j >= 0) { if (j >= 0) {
if (copy_to_user(buf + k - filp->f_pos, if (copy_to_user(buf + k - *ppos,
op->value + k - 1, j)) op->value + k - 1, j))
return -EFAULT; return -EFAULT;
count -= j; count -= j;
...@@ -205,11 +205,11 @@ static ssize_t property_read(struct file *filp, char __user *buf, ...@@ -205,11 +205,11 @@ static ssize_t property_read(struct file *filp, char __user *buf,
} }
if (count) { if (count) {
if (put_user('\'', &buf [k++ - filp->f_pos])) if (put_user('\'', &buf [k++ - *ppos]))
return -EFAULT; return -EFAULT;
} }
if (count > 1) { if (count > 1) {
if (put_user('\n', &buf [k++ - filp->f_pos])) if (put_user('\n', &buf [k++ - *ppos]))
return -EFAULT; return -EFAULT;
} }
} else if (op->flag & OPP_STRINGLIST) { } else if (op->flag & OPP_STRINGLIST) {
...@@ -287,7 +287,7 @@ static ssize_t property_read(struct file *filp, char __user *buf, ...@@ -287,7 +287,7 @@ static ssize_t property_read(struct file *filp, char __user *buf,
if ((k < i - 1) && (k & 1)) { if ((k < i - 1) && (k & 1)) {
sprintf (buffer, "%02x", sprintf (buffer, "%02x",
(unsigned char) *(op->value + (k >> 1)) & 0xff); (unsigned char) *(op->value + (k >> 1)) & 0xff);
if (put_user(buffer[1], &buf[k++ - filp->f_pos])) if (put_user(buffer[1], &buf[k++ - *ppos]))
return -EFAULT; return -EFAULT;
count--; count--;
} }
...@@ -295,7 +295,7 @@ static ssize_t property_read(struct file *filp, char __user *buf, ...@@ -295,7 +295,7 @@ static ssize_t property_read(struct file *filp, char __user *buf,
for (; (count > 1) && (k < i - 1); k += 2) { for (; (count > 1) && (k < i - 1); k += 2) {
sprintf (buffer, "%02x", sprintf (buffer, "%02x",
(unsigned char) *(op->value + (k >> 1)) & 0xff); (unsigned char) *(op->value + (k >> 1)) & 0xff);
if (copy_to_user(buf + k - filp->f_pos, buffer, 2)) if (copy_to_user(buf + k - *ppos, buffer, 2))
return -EFAULT; return -EFAULT;
count -= 2; count -= 2;
} }
...@@ -303,18 +303,18 @@ static ssize_t property_read(struct file *filp, char __user *buf, ...@@ -303,18 +303,18 @@ static ssize_t property_read(struct file *filp, char __user *buf,
if (count && (k < i - 1)) { if (count && (k < i - 1)) {
sprintf (buffer, "%02x", sprintf (buffer, "%02x",
(unsigned char) *(op->value + (k >> 1)) & 0xff); (unsigned char) *(op->value + (k >> 1)) & 0xff);
if (put_user(buffer[0], &buf[k++ - filp->f_pos])) if (put_user(buffer[0], &buf[k++ - *ppos]))
return -EFAULT; return -EFAULT;
count--; count--;
} }
if (count) { if (count) {
if (put_user('\n', &buf [k++ - filp->f_pos])) if (put_user('\n', &buf [k++ - *ppos]))
return -EFAULT; return -EFAULT;
} }
} }
count = k - filp->f_pos; count = k - *ppos;
filp->f_pos = k; *ppos = k;
return count; return count;
} }
...@@ -327,14 +327,14 @@ static ssize_t property_write(struct file *filp, const char __user *buf, ...@@ -327,14 +327,14 @@ static ssize_t property_write(struct file *filp, const char __user *buf,
void *b; void *b;
openprom_property *op; openprom_property *op;
if (filp->f_pos >= 0xffffff || count >= 0xffffff) if (*ppos >= 0xffffff || count >= 0xffffff)
return -EINVAL; return -EINVAL;
if (!filp->private_data) { if (!filp->private_data) {
i = property_read (filp, NULL, 0, NULL); i = property_read (filp, NULL, 0, NULL);
if (i) if (i)
return i; return i;
} }
k = filp->f_pos; k = *ppos;
op = (openprom_property *)filp->private_data; op = (openprom_property *)filp->private_data;
if (!(op->flag & OPP_STRING)) { if (!(op->flag & OPP_STRING)) {
u32 *first, *last; u32 *first, *last;
...@@ -462,7 +462,7 @@ static ssize_t property_write(struct file *filp, const char __user *buf, ...@@ -462,7 +462,7 @@ static ssize_t property_write(struct file *filp, const char __user *buf,
op->len = i; op->len = i;
} else } else
op->len = i; op->len = i;
filp->f_pos += count; *ppos += count;
} }
write_try_string: write_try_string:
if (!(op->flag & OPP_BINARY)) { if (!(op->flag & OPP_BINARY)) {
...@@ -480,7 +480,7 @@ static ssize_t property_write(struct file *filp, const char __user *buf, ...@@ -480,7 +480,7 @@ static ssize_t property_write(struct file *filp, const char __user *buf,
op->flag |= OPP_QUOTED; op->flag |= OPP_QUOTED;
buf++; buf++;
count--; count--;
filp->f_pos++; (*ppos)++;
if (!count) { if (!count) {
op->flag |= OPP_STRING; op->flag |= OPP_STRING;
return 1; return 1;
...@@ -489,9 +489,9 @@ static ssize_t property_write(struct file *filp, const char __user *buf, ...@@ -489,9 +489,9 @@ static ssize_t property_write(struct file *filp, const char __user *buf,
op->flag |= OPP_NOTQUOTED; op->flag |= OPP_NOTQUOTED;
} }
op->flag |= OPP_STRING; op->flag |= OPP_STRING;
if (op->alloclen <= count + filp->f_pos) { if (op->alloclen <= count + *ppos) {
b = kmalloc (sizeof (openprom_property) b = kmalloc (sizeof (openprom_property)
+ 2 * (count + filp->f_pos), GFP_KERNEL); + 2 * (count + *ppos), GFP_KERNEL);
if (!b) if (!b)
return -ENOMEM; return -ENOMEM;
memcpy (b, filp->private_data, memcpy (b, filp->private_data,
...@@ -499,14 +499,14 @@ static ssize_t property_write(struct file *filp, const char __user *buf, ...@@ -499,14 +499,14 @@ static ssize_t property_write(struct file *filp, const char __user *buf,
+ strlen (op->name) + op->alloclen); + strlen (op->name) + op->alloclen);
memset (((char *)b) + sizeof (openprom_property) memset (((char *)b) + sizeof (openprom_property)
+ strlen (op->name) + op->alloclen, + strlen (op->name) + op->alloclen,
0, 2*(count - filp->f_pos) - op->alloclen); 0, 2*(count - *ppos) - op->alloclen);
op = (openprom_property *)b; op = (openprom_property *)b;
op->alloclen = 2*(count + filp->f_pos); op->alloclen = 2*(count + *ppos);
b = filp->private_data; b = filp->private_data;
filp->private_data = (void *)op; filp->private_data = (void *)op;
kfree (b); kfree (b);
} }
p = op->value + filp->f_pos - ((op->flag & OPP_QUOTED) ? 1 : 0); p = op->value + *ppos - ((op->flag & OPP_QUOTED) ? 1 : 0);
if (copy_from_user(p, buf, count)) if (copy_from_user(p, buf, count))
return -EFAULT; return -EFAULT;
op->flag |= OPP_DIRTY; op->flag |= OPP_DIRTY;
...@@ -517,17 +517,17 @@ static ssize_t property_write(struct file *filp, const char __user *buf, ...@@ -517,17 +517,17 @@ static ssize_t property_write(struct file *filp, const char __user *buf,
} }
if (i < count) { if (i < count) {
op->len = p - op->value; op->len = p - op->value;
filp->f_pos += i + 1; *ppos += i + 1;
if ((p > op->value) && (op->flag & OPP_QUOTED) if ((p > op->value) && (op->flag & OPP_QUOTED)
&& (*(p - 1) == '\'')) && (*(p - 1) == '\''))
op->len--; op->len--;
} else { } else {
if (p - op->value > op->len) if (p - op->value > op->len)
op->len = p - op->value; op->len = p - op->value;
filp->f_pos += count; *ppos += count;
} }
} }
return filp->f_pos - k; return *ppos - k;
} }
int property_release (struct inode *inode, struct file *filp) int property_release (struct inode *inode, struct file *filp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment