return next->do_ops->do_attr_set(ctxt, next, attr, handle);
}
+int mdd_attr_set_internal_locked(const struct lu_context *ctxt,
+ struct mdd_object *o,
+ const struct lu_attr *attr,
+ struct thandle *handle)
+{
+ int rc;
+ mdd_lock(ctxt, o, DT_WRITE_LOCK);
+ rc = mdd_attr_set_internal(ctxt, o, attr, handle);
+ mdd_unlock(ctxt, o, DT_WRITE_LOCK);
+ return rc;
+}
+
static int __mdd_xattr_set(const struct lu_context *ctxt, struct mdd_object *o,
const void *buf, int buf_len, const char *name,
int fl, struct thandle *handle)
if (rc)
RETURN(rc);
- if (!(ma->ma_attr_flags & MD_CTIME_SET))
+ if (!(la->la_valid & LA_CTIME)) {
la->la_ctime = now;
- if (!(ma->ma_attr_flags & MD_ATIME_SET))
+ la->la_valid |= LA_CTIME;
+ } else
+ la->la_valid &= ~LA_CTIME;
+
+ if (!(la->la_valid & LA_ATIME)) {
la->la_atime = now;
- if (!(ma->ma_attr_flags & MD_MTIME_SET))
+ la->la_valid |= LA_ATIME;
+ }
+ if (!(la->la_valid & LA_MTIME)) {
la->la_mtime = now;
+ la->la_valid |= LA_MTIME;
+ }
/*XXX Check permission */
#if 0
rc = mdd_fix_attr(ctxt, mdd_obj, ma, la_copy);
if (rc)
GOTO(cleanup, rc);
- if (la_copy->la_valid) { /* setattr */
- mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
- rc = mdd_attr_set_internal(ctxt, mdd_obj, la_copy, handle);
- mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
-
+
+ if (ma->ma_valid & MA_FLAGS) {
+ la_copy->la_flags = ma->ma_attr_flags;
+ la_copy->la_valid |= LA_FLAGS;
+ rc = mdd_attr_set_internal_locked(ctxt, mdd_obj, la_copy,
+ handle);
+ }else if (la_copy->la_valid) { /* setattr */
+ rc = mdd_attr_set_internal_locked(ctxt, mdd_obj, la_copy,
+ handle);
/* journal chown/chgrp in llog, just like unlink */
if (rc == 0 && lmm_size){
/*TODO set_attr llog */
}
static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr,
- struct md_attr *ma)
+ struct md_attr *ma, __u32 attr_flags)
{
__u64 out;
out |= LA_GID;
if (in & ATTR_SIZE)
out |= LA_SIZE;
- if (in & ATTR_ATIME)
- out |= LA_ATIME;
- if (in & ATTR_MTIME)
- out |= LA_MTIME;
- if (in & ATTR_CTIME)
- out |= LA_CTIME;
- if (in & ATTR_ATTR_FLAG)
- out |= LA_FLAGS;
if (in & ATTR_FROM_OPEN)
rr->rr_flags |= MRF_SETATTR_LOCKED;
if (in & ATTR_ATIME_SET)
- ma->ma_attr_flags |= MD_ATIME_SET;
+ out |= LA_ATIME;
if (in & ATTR_CTIME_SET)
- ma->ma_attr_flags |= MD_CTIME_SET;
+ out |= LA_CTIME;
if (in & ATTR_MTIME_SET)
- ma->ma_attr_flags |= MD_MTIME_SET;
-
- if (in & ATTR_RAW)
- ma->ma_attr_flags |= MD_ATTR_RAW;
+ out |= LA_MTIME;
+ if (in & ATTR_ATTR_FLAG) {
+ ma->ma_valid |= MA_FLAGS;
+ ma->ma_attr_flags = attr_flags;
+ }
+ /*XXX need ATTR_RAW?*/
in &= ~(ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|
ATTR_ATIME|ATTR_MTIME|ATTR_CTIME|ATTR_FROM_OPEN|
ATTR_ATIME_SET|ATTR_CTIME_SET|ATTR_MTIME_SET|
- ATTR_ATTR_FLAG|ATTR_RAW);
+ ATTR_ATTR_FLAG|ATTR_RAW);
if (in != 0)
CERROR("Unknown attr bits: %#llx\n", in);
return out;
RETURN(-EFAULT);
rr->rr_fid1 = &rec->sa_fid;
- la->la_valid = mdt_attr_valid_xlate(rec->sa_valid, rr, ma);
+ la->la_valid = mdt_attr_valid_xlate(rec->sa_valid, rr, ma,
+ rec->sa_attr_flags);
la->la_mode = rec->sa_mode;
la->la_uid = rec->sa_uid;
la->la_gid = rec->sa_gid;
la->la_size = rec->sa_size;
- la->la_flags = rec->sa_attr_flags;
la->la_ctime = rec->sa_ctime;
la->la_atime = rec->sa_atime;
la->la_mtime = rec->sa_mtime;