lkml.org 
[lkml]   [2020]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/16] vc_screen: rewrite vcs_size to accept vc, not inode
    Date
    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: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/tty/vt/vc_screen.c | 46 ++++++++++++++++++++++++--------------
    1 file changed, 29 insertions(+), 17 deletions(-)

    diff --git a/drivers/tty/vt/vc_screen.c b/drivers/tty/vt/vc_screen.c
    index adc3c786b621..8aa0d50bcac7 100644
    --- a/drivers/tty/vt/vc_screen.c
    +++ b/drivers/tty/vt/vc_screen.c
    @@ -202,39 +202,47 @@ static struct vc_data *vcs_vc(struct inode *inode, bool *viewed)
    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.
    */
    -static int
    -vcs_size(struct inode *inode)
    +static int vcs_size(const struct vc_data *vc, bool attr, bool unicode)
    {
    int size;
    - struct vc_data *vc;

    WARN_CONSOLE_UNLOCKED();

    - vc = vcs_vc(inode, NULL);
    - if (!vc)
    - return -ENXIO;
    -
    size = vc->vc_rows * vc->vc_cols;

    - if (use_attributes(inode)) {
    - if (use_unicode(inode))
    + if (attr) {
    + if (unicode)
    return -EOPNOTSUPP;
    - size = 2*size + HEADER_SIZE;
    - } else if (use_unicode(inode))
    +
    + size = 2 * size + HEADER_SIZE;
    + } else if (unicode)
    size *= 4;
    +
    return size;
    }

    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;

    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();
    if (size < 0)
    return size;
    @@ -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
    * could sleep.
    */
    - size = vcs_size(inode);
    + size = vcs_size(vc, attr, uni_mode);
    if (size < 0) {
    if (read)
    break;
    @@ -480,7 +488,11 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
    if (!vc)
    goto unlock_out;

    - size = vcs_size(inode);
    + size = vcs_size(vc, attr, false);
    + if (size < 0) {
    + ret = size;
    + goto unlock_out;
    + }
    ret = -EINVAL;
    if (pos < 0 || pos > size)
    goto unlock_out;
    @@ -519,7 +531,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
    * the user buffer, so recheck.
    * Return data written up to now on failure.
    */
    - size = vcs_size(inode);
    + size = vcs_size(vc, attr, false);
    if (size < 0) {
    if (written)
    break;
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-08-18 10:57    [W:4.160 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site