@@ -1877,6 +1877,8 @@ struct cl_io {
int sa_falloc_mode;
loff_t sa_falloc_offset;
loff_t sa_falloc_end;
+ uid_t sa_falloc_uid;
+ gid_t sa_falloc_gid;
} ci_setattr;
struct cl_data_version_io {
u64 dv_data_version;
@@ -5244,6 +5244,14 @@ int cl_falloc(struct file *file, struct inode *inode, int mode, loff_t offset,
io->u.ci_setattr.sa_falloc_offset = offset;
io->u.ci_setattr.sa_falloc_end = offset + len;
io->u.ci_setattr.sa_subtype = CL_SETATTR_FALLOCATE;
+
+ CDEBUG(D_INODE, "UID %u GID %u\n",
+ from_kuid(&init_user_ns, inode->i_uid),
+ from_kgid(&init_user_ns, inode->i_gid));
+
+ io->u.ci_setattr.sa_falloc_uid = from_kuid(&init_user_ns, inode->i_uid);
+ io->u.ci_setattr.sa_falloc_gid = from_kgid(&init_user_ns, inode->i_gid);
+
if (io->u.ci_setattr.sa_falloc_end > size) {
loff_t newsize = io->u.ci_setattr.sa_falloc_end;
@@ -680,6 +680,10 @@ static void lov_io_sub_inherit(struct lov_io_sub *sub, struct lov_io *lio,
if (cl_io_is_fallocate(io)) {
io->u.ci_setattr.sa_falloc_offset = start;
io->u.ci_setattr.sa_falloc_end = end;
+ io->u.ci_setattr.sa_falloc_uid =
+ parent->u.ci_setattr.sa_falloc_uid;
+ io->u.ci_setattr.sa_falloc_gid =
+ parent->u.ci_setattr.sa_falloc_gid;
}
if (cl_io_is_trunc(io)) {
loff_t new_size = parent->u.ci_setattr.sa_attr.lvb_size;
@@ -669,7 +669,13 @@ static int osc_io_setattr_start(const struct lu_env *env,
oa->o_size = io->u.ci_setattr.sa_falloc_offset;
oa->o_blocks = io->u.ci_setattr.sa_falloc_end;
- oa->o_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
+ oa->o_uid = io->u.ci_setattr.sa_falloc_uid;
+ oa->o_gid = io->u.ci_setattr.sa_falloc_gid;
+ oa->o_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
+ OBD_MD_FLUID | OBD_MD_FLGID;
+
+ CDEBUG(D_INODE, "size %llu blocks %llu uid %u gid %u\n",
+ oa->o_size, oa->o_blocks, oa->o_uid, oa->o_gid);
result = osc_fallocate_base(osc_export(cl2osc(obj)),
oa, osc_async_upcall,
cbargs, falloc_mode);