MDS_CLOSE_LAYOUT_MERGE = 1 << 15,
MDS_CLOSE_RESYNC_DONE = 1 << 16,
MDS_CLOSE_LAYOUT_SPLIT = 1 << 17,
+ MDS_TRUNC_KEEP_LEASE = 1 << 18,
};
#define MDS_CLOSE_INTENT (MDS_HSM_RELEASE | MDS_CLOSE_LAYOUT_SWAP | \
ll_file_clear_flag(lli, LLIF_DATA_MODIFIED);
}
+ if (attr->ia_valid & ATTR_FILE) {
+ struct ll_file_data *fd = LUSTRE_FPRIVATE(attr->ia_file);
+
+ if (fd->fd_lease_och)
+ op_data->op_bias |= MDS_TRUNC_KEEP_LEASE;
+ }
+
op_data->op_attr = *attr;
rc = ll_md_setattr(dentry, op_data);
la->la_mtime = rec->sa_mtime;
ma->ma_valid = MA_INODE;
- if (rec->sa_bias & MDS_DATA_MODIFIED)
- ma->ma_attr_flags |= MDS_DATA_MODIFIED;
- else
- ma->ma_attr_flags &= ~MDS_DATA_MODIFIED;
-
- ma->ma_attr_flags &= ~MDS_CLOSE_INTENT;
- ma->ma_attr_flags |= rec->sa_bias & MDS_CLOSE_INTENT;
+ ma->ma_attr_flags |= rec->sa_bias & (MDS_CLOSE_INTENT |
+ MDS_DATA_MODIFIED | MDS_TRUNC_KEEP_LEASE);
RETURN(0);
}
if (mdt_object_remote(mo))
GOTO(out_put, rc = -EREMOTE);
+ /* revoke lease lock if size is going to be changed */
+ if (unlikely(ma->ma_attr.la_valid & LA_SIZE &&
+ !(ma->ma_attr_flags & MDS_TRUNC_KEEP_LEASE) &&
+ atomic_read(&mo->mot_lease_count) > 0)) {
+ down_read(&mo->mot_open_sem);
+
+ if (atomic_read(&mo->mot_lease_count) > 0) { /* lease exists */
+ lhc = &info->mti_lh[MDT_LH_LOCAL];
+ mdt_lock_reg_init(lhc, LCK_CW);
+
+ rc = mdt_object_lock(info, mo, lhc, MDS_INODELOCK_OPEN);
+ if (rc != 0) {
+ up_read(&mo->mot_open_sem);
+ GOTO(out_put, rc);
+ }
+
+ /* revoke lease lock */
+ mdt_object_unlock(info, mo, lhc, 1);
+ }
+ up_read(&mo->mot_open_sem);
+ }
+
if (ma->ma_attr.la_valid & LA_SIZE || rr->rr_flags & MRF_OPEN_TRUNC) {
/* Check write access for the O_TRUNC case */
if (mdt_write_read(mo) < 0)