Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36a4c72d authored by Chengguang Xu's avatar Chengguang Xu Committed by Ilya Dryomov
Browse files

ceph: add additional size check in ceph_setattr()



ceph_setattr() finally calls vfs function inode_newsize_ok()
to do offset validation and that is based on sb->s_maxbytes.
Because we set sb->s_maxbytes to MAX_LFS_FILESIZE to through
VFS check and do proper offset validation in cephfs level,
we need adding proper offset validation before calling
inode_newsize_ok().

Signed-off-by: default avatarChengguang Xu <cgxu519@gmx.com>
Reviewed-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 8687a3e2
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -2157,6 +2157,7 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
int ceph_setattr(struct dentry *dentry, struct iattr *attr)
int ceph_setattr(struct dentry *dentry, struct iattr *attr)
{
{
	struct inode *inode = d_inode(dentry);
	struct inode *inode = d_inode(dentry);
	struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
	int err;
	int err;


	if (ceph_snap(inode) != CEPH_NOSNAP)
	if (ceph_snap(inode) != CEPH_NOSNAP)
@@ -2166,6 +2167,10 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
	if (err != 0)
	if (err != 0)
		return err;
		return err;


	if ((attr->ia_valid & ATTR_SIZE) &&
	    attr->ia_size > max(inode->i_size, fsc->max_file_size))
		return -EFBIG;

	if ((attr->ia_valid & ATTR_SIZE) &&
	if ((attr->ia_valid & ATTR_SIZE) &&
	    ceph_quota_is_max_bytes_exceeded(inode, attr->ia_size))
	    ceph_quota_is_max_bytes_exceeded(inode, attr->ia_size))
		return -EDQUOT;
		return -EDQUOT;