Commit 71d4abfa authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman

vc_screen: rewrite vcs_size to accept vc, not inode

It is weird to fetch the information from the inode over and over. Read
and write already have the needed information, so rewrite vcs_size to
accept a vc, attr and unicode and adapt vcs_lseek to that.

Also make sure all sites check the return value of vcs_size for errors.

And document it using kernel-doc.
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20200818085706.12163-5-jslaby@suse.czSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7d62549a
...@@ -202,39 +202,47 @@ static struct vc_data *vcs_vc(struct inode *inode, bool *viewed) ...@@ -202,39 +202,47 @@ static struct vc_data *vcs_vc(struct inode *inode, bool *viewed)
return vc_cons[currcons].d; return vc_cons[currcons].d;
} }
/* /**
* Returns size for VC carried by inode. * vcs_size -- return size for a VC in @vc
* @vc: which VC
* @attr: does it use attributes?
* @unicode: is it unicode?
*
* Must be called with console_lock. * Must be called with console_lock.
*/ */
static int static int vcs_size(const struct vc_data *vc, bool attr, bool unicode)
vcs_size(struct inode *inode)
{ {
int size; int size;
struct vc_data *vc;
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
vc = vcs_vc(inode, NULL);
if (!vc)
return -ENXIO;
size = vc->vc_rows * vc->vc_cols; size = vc->vc_rows * vc->vc_cols;
if (use_attributes(inode)) { if (attr) {
if (use_unicode(inode)) if (unicode)
return -EOPNOTSUPP; return -EOPNOTSUPP;
size = 2*size + HEADER_SIZE;
} else if (use_unicode(inode)) size = 2 * size + HEADER_SIZE;
} else if (unicode)
size *= 4; size *= 4;
return size; return size;
} }
static loff_t vcs_lseek(struct file *file, loff_t offset, int orig) static loff_t vcs_lseek(struct file *file, loff_t offset, int orig)
{ {
struct inode *inode = file_inode(file);
struct vc_data *vc;
int size; int size;
console_lock(); console_lock();
size = vcs_size(file_inode(file)); vc = vcs_vc(inode, NULL);
if (!vc) {
console_unlock();
return -ENXIO;
}
size = vcs_size(vc, use_attributes(inode), use_unicode(inode));
console_unlock(); console_unlock();
if (size < 0) if (size < 0)
return size; return size;
...@@ -295,7 +303,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) ...@@ -295,7 +303,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
* as copy_to_user at the end of this loop * as copy_to_user at the end of this loop
* could sleep. * could sleep.
*/ */
size = vcs_size(inode); size = vcs_size(vc, attr, uni_mode);
if (size < 0) { if (size < 0) {
if (read) if (read)
break; break;
...@@ -480,7 +488,11 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) ...@@ -480,7 +488,11 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
if (!vc) if (!vc)
goto unlock_out; goto unlock_out;
size = vcs_size(inode); size = vcs_size(vc, attr, false);
if (size < 0) {
ret = size;
goto unlock_out;
}
ret = -EINVAL; ret = -EINVAL;
if (pos < 0 || pos > size) if (pos < 0 || pos > size)
goto unlock_out; goto unlock_out;
...@@ -519,7 +531,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) ...@@ -519,7 +531,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
* the user buffer, so recheck. * the user buffer, so recheck.
* Return data written up to now on failure. * Return data written up to now on failure.
*/ */
size = vcs_size(inode); size = vcs_size(vc, attr, false);
if (size < 0) { if (size < 0) {
if (written) if (written)
break; break;
......
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