-
-/* this isn't where truncate starts. roughly:
- * llu_iop_{open,setattr}->llu_setattr_raw->llu_vmtruncate->llu_truncate
- * we grab the lock back in setattr_raw to avoid races. */
-static void llu_truncate(struct inode *inode, obd_flag flags)
-{
- struct llu_inode_info *lli = llu_i2info(inode);
- struct intnl_stat *st = llu_i2stat(inode);
- struct obd_info oinfo = { { { 0 } } };
- struct obdo oa = { 0 };
- int rc;
- ENTRY;
- CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu(%p) to %llu\n",
- (long long)st->st_ino, lli->lli_st_generation, inode,
- (long long)st->st_size);
-
- if (!lli->lli_smd) {
- CDEBUG(D_INODE, "truncate on inode %llu with no objects\n",
- (long long)st->st_ino);
- EXIT;
- return;
- }
-
- oinfo.oi_md = lli->lli_smd;
- oinfo.oi_policy.l_extent.start = st->st_size;
- oinfo.oi_policy.l_extent.end = OBD_OBJECT_EOF;
- oinfo.oi_oa = &oa;
- oa.o_id = lli->lli_smd->lsm_object_id;
- oa.o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS;
- oa.o_flags = flags; /* We don't actually want to copy inode flags */
-
- obdo_from_inode(&oa, inode,
- OBD_MD_FLTYPE | OBD_MD_FLMODE | OBD_MD_FLATIME |
- OBD_MD_FLMTIME | OBD_MD_FLCTIME);
-
- obd_adjust_kms(llu_i2obdexp(inode), lli->lli_smd, st->st_size, 1);
-
- CDEBUG(D_INFO, "calling punch for "LPX64" (all bytes after %Lu)\n",
- oa.o_id, (long long)st->st_size);
-
- /* truncate == punch from new size to absolute end of file */
- rc = obd_punch_rqset(llu_i2obdexp(inode), &oinfo, NULL);
- if (rc)
- CERROR("obd_truncate fails (%d) ino %llu\n",
- rc, (long long)st->st_ino);
- else
- obdo_to_inode(inode, &oa, OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
- OBD_MD_FLATIME | OBD_MD_FLMTIME |
- OBD_MD_FLCTIME);
-
- EXIT;
- return;
-} /* llu_truncate */
-
-int llu_vmtruncate(struct inode * inode, loff_t offset, obd_flag flags)
-{
- llu_i2stat(inode)->st_size = offset;
-
- /*
- * llu_truncate() is only called from this
- * point. llu_vmtruncate/llu_truncate split exists to mimic the
- * structure of Linux VFS truncate code path.
- */
-
- llu_truncate(inode, flags);
-
- return 0;
-}