mirror of https://gitee.com/openkylin/linux.git
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs fixes from Al Viro: "Two old bugs..." * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: propagate_one(): mnt_set_mountpoint() needs mount_lock dlmfs_file_write(): fix the bogosity in handling non-zero *ppos
This commit is contained in:
commit
96c9a7802a
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
|
|
@ -261,14 +261,13 @@ static int propagate_one(struct mount *m)
|
|||
child = copy_tree(last_source, last_source->mnt.mnt_root, type);
|
||||
if (IS_ERR(child))
|
||||
return PTR_ERR(child);
|
||||
read_seqlock_excl(&mount_lock);
|
||||
mnt_set_mountpoint(m, mp, child);
|
||||
if (m->mnt_master != dest_master)
|
||||
SET_MNT_MARK(m->mnt_master);
|
||||
read_sequnlock_excl(&mount_lock);
|
||||
last_dest = m;
|
||||
last_source = child;
|
||||
if (m->mnt_master != dest_master) {
|
||||
read_seqlock_excl(&mount_lock);
|
||||
SET_MNT_MARK(m->mnt_master);
|
||||
read_sequnlock_excl(&mount_lock);
|
||||
}
|
||||
hlist_add_head(&child->mnt_hash, list);
|
||||
return count_mounts(m->mnt_ns, child);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue