|
@@ -257,12 +257,22 @@ const struct file_operations udf_file_operations = {
|
|
|
static int udf_setattr(struct dentry *dentry, struct iattr *attr)
|
|
|
{
|
|
|
struct inode *inode = d_inode(dentry);
|
|
|
+ struct super_block *sb = inode->i_sb;
|
|
|
int error;
|
|
|
|
|
|
error = setattr_prepare(dentry, attr);
|
|
|
if (error)
|
|
|
return error;
|
|
|
|
|
|
+ if ((attr->ia_valid & ATTR_UID) &&
|
|
|
+ UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET) &&
|
|
|
+ !uid_eq(attr->ia_uid, UDF_SB(sb)->s_uid))
|
|
|
+ return -EPERM;
|
|
|
+ if ((attr->ia_valid & ATTR_GID) &&
|
|
|
+ UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET) &&
|
|
|
+ !gid_eq(attr->ia_gid, UDF_SB(sb)->s_gid))
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
if ((attr->ia_valid & ATTR_SIZE) &&
|
|
|
attr->ia_size != i_size_read(inode)) {
|
|
|
error = udf_setsize(inode, attr->ia_size);
|