Skip to content

Commit

Permalink
dlmfs_file_write(): fix the bogosity in handling non-zero *ppos
Browse files Browse the repository at this point in the history
'count' is how much you want written, not the final position.
Moreover, it can legitimately be less than the current position...

Cc: [email protected]
Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Al Viro committed Apr 23, 2020
1 parent 8f3d9f3 commit 3815f1b
Showing 1 changed file with 12 additions and 15 deletions.
27 changes: 12 additions & 15 deletions fs/ocfs2/dlmfs/dlmfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,6 @@ static ssize_t dlmfs_file_write(struct file *filp,
loff_t *ppos)
{
int bytes_left;
ssize_t writelen;
char *lvb_buf;
struct inode *inode = file_inode(filp);

Expand All @@ -285,32 +284,30 @@ static ssize_t dlmfs_file_write(struct file *filp,
if (*ppos >= i_size_read(inode))
return -ENOSPC;

/* don't write past the lvb */
if (count > i_size_read(inode) - *ppos)
count = i_size_read(inode) - *ppos;

if (!count)
return 0;

if (!access_ok(buf, count))
return -EFAULT;

/* don't write past the lvb */
if ((count + *ppos) > i_size_read(inode))
writelen = i_size_read(inode) - *ppos;
else
writelen = count - *ppos;

lvb_buf = kmalloc(writelen, GFP_NOFS);
lvb_buf = kmalloc(count, GFP_NOFS);
if (!lvb_buf)
return -ENOMEM;

bytes_left = copy_from_user(lvb_buf, buf, writelen);
writelen -= bytes_left;
if (writelen)
user_dlm_write_lvb(inode, lvb_buf, writelen);
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 + writelen;
mlog(0, "wrote %zd bytes\n", writelen);
return writelen;
*ppos = *ppos + count;
mlog(0, "wrote %zu bytes\n", count);
return count;
}

static void dlmfs_init_once(void *foo)
Expand Down

0 comments on commit 3815f1b

Please sign in to comment.