Commit 067c054f authored by Al Viro's avatar Al Viro
Browse files

dlmfs: clean up dlmfs_file_{read,write}() a bit



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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b3a9e3b9
Loading
Loading
Loading
Loading
+8 −44
Original line number Diff line number Diff line
@@ -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;
+4 −8
Original line number Diff line number Diff line
@@ -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;
+1 −3
Original line number Diff line number Diff line
@@ -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);