dlmfs: clean up dlmfs_file_{read,write}() a bit
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 14 Jun 2020 23:04:42 +0000 (19:04 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 14 Jun 2020 23:04:42 +0000 (19:04 -0400)
The damn file is constant-sized - 64 bytes.  IOW,
* i_size_read() is pointless
* so's dynamic allocation
* so's the 'size' argument of user_dlm_read_lvb()
* ... and so's open-coding simple_read_from_buffer(), while we are at it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ocfs2/dlmfs/dlmfs.c
fs/ocfs2/dlmfs/userdlm.c
fs/ocfs2/dlmfs/userdlm.h

index ea868c6..583820e 100644 (file)
@@ -221,47 +221,17 @@ static __poll_t dlmfs_file_poll(struct file *file, poll_table *wait)
        return event;
 }
 
-static ssize_t dlmfs_file_read(struct file *filp,
+static ssize_t dlmfs_file_read(struct file *file,
                               char __user *buf,
                               size_t count,
                               loff_t *ppos)
 {
-       int bytes_left;
-       ssize_t got;
-       char *lvb_buf;
-       struct inode *inode = file_inode(filp);
-
-       mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
-               inode->i_ino, count, *ppos);
+       char lvb[DLM_LVB_LEN];
 
-       if (*ppos >= i_size_read(inode))
+       if (!user_dlm_read_lvb(file_inode(file), lvb))
                return 0;
 
-       /* don't read past the lvb */
-       if (count > i_size_read(inode) - *ppos)
-               count = i_size_read(inode) - *ppos;
-
-       if (!count)
-               return 0;
-
-       lvb_buf = kmalloc(count, GFP_NOFS);
-       if (!lvb_buf)
-               return -ENOMEM;
-
-       got = user_dlm_read_lvb(inode, lvb_buf, count);
-       if (got) {
-               BUG_ON(got != count);
-               bytes_left = copy_to_user(buf, lvb_buf, count);
-               count -= bytes_left;
-       } else
-               count = 0;
-
-       kfree(lvb_buf);
-
-       *ppos = *ppos + count;
-
-       mlog(0, "read %zu bytes\n", count);
-       return count;
+       return simple_read_from_buffer(buf, count, ppos, lvb, sizeof(lvb));
 }
 
 static ssize_t dlmfs_file_write(struct file *filp,
@@ -269,34 +239,28 @@ static ssize_t dlmfs_file_write(struct file *filp,
                                size_t count,
                                loff_t *ppos)
 {
+       char lvb_buf[DLM_LVB_LEN];
        int bytes_left;
-       char *lvb_buf;
        struct inode *inode = file_inode(filp);
 
        mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
                inode->i_ino, count, *ppos);
 
-       if (*ppos >= i_size_read(inode))
+       if (*ppos >= DLM_LVB_LEN)
                return -ENOSPC;
 
        /* don't write past the lvb */
-       if (count > i_size_read(inode) - *ppos)
-               count = i_size_read(inode) - *ppos;
+       if (count > DLM_LVB_LEN - *ppos)
+               count = DLM_LVB_LEN - *ppos;
 
        if (!count)
                return 0;
 
-       lvb_buf = kmalloc(count, GFP_NOFS);
-       if (!lvb_buf)
-               return -ENOMEM;
-
        bytes_left = copy_from_user(lvb_buf, buf, count);
        count -= bytes_left;
        if (count)
                user_dlm_write_lvb(inode, lvb_buf, count);
 
-       kfree(lvb_buf);
-
        *ppos = *ppos + count;
        mlog(0, "wrote %zu bytes\n", count);
        return count;
index 3df5be2..339f098 100644 (file)
@@ -547,24 +547,20 @@ void user_dlm_write_lvb(struct inode *inode,
        spin_unlock(&lockres->l_lock);
 }
 
-ssize_t user_dlm_read_lvb(struct inode *inode,
-                         char *val,
-                         unsigned int len)
+bool user_dlm_read_lvb(struct inode *inode, char *val)
 {
        struct user_lock_res *lockres = &DLMFS_I(inode)->ip_lockres;
        char *lvb;
-       ssize_t ret = len;
-
-       BUG_ON(len > DLM_LVB_LEN);
+       bool ret = true;
 
        spin_lock(&lockres->l_lock);
 
        BUG_ON(lockres->l_level < DLM_LOCK_PR);
        if (ocfs2_dlm_lvb_valid(&lockres->l_lksb)) {
                lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
-               memcpy(val, lvb, len);
+               memcpy(val, lvb, DLM_LVB_LEN);
        } else
-               ret = 0;
+               ret = false;
 
        spin_unlock(&lockres->l_lock);
        return ret;
index 4bef7cd..0558ae7 100644 (file)
@@ -66,9 +66,7 @@ void user_dlm_cluster_unlock(struct user_lock_res *lockres,
 void user_dlm_write_lvb(struct inode *inode,
                        const char *val,
                        unsigned int len);
-ssize_t user_dlm_read_lvb(struct inode *inode,
-                         char *val,
-                         unsigned int len);
+bool user_dlm_read_lvb(struct inode *inode, char *val);
 struct ocfs2_cluster_connection *user_dlm_register(const struct qstr *name);
 void user_dlm_unregister(struct ocfs2_cluster_connection *conn);
 void user_dlm_set_locking_protocol(void);