- if (body->valid & OBD_MD_FLGENER)
- lli->lli_st_generation = body->generation;
-
- /* fillin fid */
- if (body->valid & OBD_MD_FLID)
- lli->lli_fid.id = body->ino;
- if (body->valid & OBD_MD_FLGENER)
- lli->lli_fid.generation = body->generation;
- if (body->valid & OBD_MD_FLTYPE)
- lli->lli_fid.f_type = body->mode & S_IFMT;
-}
-
-void obdo_to_inode(struct inode *dst, struct obdo *src, obd_flag valid)
-{
- struct llu_inode_info *lli = llu_i2info(dst);
- struct intnl_stat *st = llu_i2stat(dst);
-
- valid &= src->o_valid;
-
- if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
- CDEBUG(D_INODE,"valid "LPX64", cur time %lu/%lu, new %lu/%lu\n",
- src->o_valid,
- LTIME_S(st->st_mtime), LTIME_S(st->st_ctime),
- (long)src->o_mtime, (long)src->o_ctime);
-
- if (valid & OBD_MD_FLATIME)
- LTIME_S(st->st_atime) = src->o_atime;
- if (valid & OBD_MD_FLMTIME)
- LTIME_S(st->st_mtime) = src->o_mtime;
- if (valid & OBD_MD_FLCTIME && src->o_ctime > LTIME_S(st->st_ctime))
- LTIME_S(st->st_ctime) = src->o_ctime;
- if (valid & OBD_MD_FLSIZE)
- st->st_size = src->o_size;
- if (valid & OBD_MD_FLBLOCKS) /* allocation of space */
- st->st_blocks = src->o_blocks;
- if (valid & OBD_MD_FLBLKSZ)
- st->st_blksize = src->o_blksize;
- if (valid & OBD_MD_FLTYPE)
- st->st_mode = (st->st_mode & ~S_IFMT) | (src->o_mode & S_IFMT);
- if (valid & OBD_MD_FLMODE)
- st->st_mode = (st->st_mode & S_IFMT) | (src->o_mode & ~S_IFMT);
- if (valid & OBD_MD_FLUID)
- st->st_uid = src->o_uid;
- if (valid & OBD_MD_FLGID)
- st->st_gid = src->o_gid;
- if (valid & OBD_MD_FLFLAGS)
- lli->lli_st_flags = src->o_flags;
- if (valid & OBD_MD_FLGENER)
- lli->lli_st_generation = src->o_generation;
-}
-
-#define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
-#define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
-
-void obdo_from_inode(struct obdo *dst, struct inode *src, obd_flag valid)
-{
- struct llu_inode_info *lli = llu_i2info(src);
- struct intnl_stat *st = llu_i2stat(src);
- obd_flag newvalid = 0;
-
- if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
- CDEBUG(D_INODE, "valid %x, new time %lu/%lu\n",
- valid, LTIME_S(st->st_mtime),
- LTIME_S(st->st_ctime));
+ if (body->valid & OBD_MD_FLSIZE) {
+ if ((llu_i2sbi(inode)->ll_lco.lco_flags & OBD_CONNECT_SOM) &&
+ S_ISREG(st->st_mode) && lli->lli_has_smd) {
+ struct lustre_handle lockh;
+ ldlm_mode_t mode;
+
+ /* As it is possible a blocking ast has been processed
+ * by this time, we need to check there is an UPDATE
+ * lock on the client and set LLIF_MDS_SIZE_LOCK holding
+ * it. */
+ mode = llu_take_md_lock(inode, MDS_INODELOCK_UPDATE,
+ &lockh);
+ if (mode) {
+ st->st_size = body->size;
+ lli->lli_flags |= LLIF_MDS_SIZE_LOCK;
+ ldlm_lock_decref(&lockh, mode);
+ }
+ } else {
+ st->st_size = body->size;
+ }