(2) fix some outdated comment.
(3) other small fix.
if (mdd_is_dead_obj(pobj))
RETURN(-ENOENT);
- if (need_check) {
- rc = mdd_permission_internal(env, pobj, NULL,
- MAY_WRITE | MAY_EXEC, 1);
- }
+ if (need_check)
+ rc = mdd_permission_internal_locked(env, pobj, NULL,
+ MAY_WRITE | MAY_EXEC);
+
RETURN(rc);
}
-/*
- * It's inline, so penalty for filesystems that don't use sticky bit is
- * minimal.
- */
static inline int mdd_is_sticky(const struct lu_env *env,
struct mdd_object *pobj,
struct mdd_object *cobj)
rc = mdd_la_get(env, pobj, tmp_la, BYPASS_CAPA);
if (rc)
return rc;
- else if (!(tmp_la->la_mode & S_ISVTX))
- return 0;
- else if (tmp_la->la_uid == uc->mu_fsuid)
+ else if (!(tmp_la->la_mode & S_ISVTX) ||
+ (tmp_la->la_uid == uc->mu_fsuid))
return 0;
else
return !mdd_capable(uc, CAP_FOWNER);
RETURN(-EPERM);
if (need_check)
- rc = mdd_permission_internal(env, pobj, NULL,
- MAY_WRITE | MAY_EXEC, 1);
+ rc = mdd_permission_internal_locked(env, pobj, NULL,
+ MAY_WRITE | MAY_EXEC);
}
RETURN(rc);
}
RETURN(-ENOENT);
/* The exist of the name will be checked in _index_insert. */
- RETURN(mdd_permission_internal(env, obj, NULL,
- MAY_WRITE | MAY_EXEC, 1));
+ RETURN(mdd_permission_internal_locked(env, obj, NULL,
+ MAY_WRITE | MAY_EXEC));
}
/*
const char *name)
{
struct mdd_object *obj = md2mdd_obj(pobj);
- int rc;
ENTRY;
/* EEXIST check */
}
/* Name presense will be checked in _index_delete. */
- rc = mdd_permission_internal(env, obj, NULL, MAY_WRITE | MAY_EXEC, 1);
- RETURN(rc);
+ RETURN(mdd_permission_internal_locked(env, obj, NULL,
+ MAY_WRITE | MAY_EXEC));
}
/*
LBUG();
}
- rc = mdd_permission_internal(env, mdd_obj, NULL, mask, 1);
+ rc = mdd_permission_internal_locked(env, mdd_obj, NULL, mask);
if (rc)
RETURN(rc);
/*
* Check if has WRITE permission for the parent.
*/
- rc = mdd_permission_internal(env, obj, NULL, MAY_WRITE, 1);
+ rc = mdd_permission_internal_locked(env, obj, NULL, MAY_WRITE);
if (rc)
RETURN(rc);
}
RETURN(-ENOENT);
/* The sobj maybe on the remote, check parent permission only here */
- rc = mdd_permission_internal(env, src_pobj, NULL,
- MAY_WRITE | MAY_EXEC, 1);
+ rc = mdd_permission_internal_locked(env, src_pobj, NULL,
+ MAY_WRITE | MAY_EXEC);
if (rc)
RETURN(rc);
struct lu_buf *buf, __u32 *mode, struct thandle *handle);
int mdd_acl_init(const struct lu_env *env, struct mdd_object *pobj,
struct mdd_object *cobj, __u32 *mode, struct thandle *handle);
-int mdd_permission_internal(const struct lu_env *env, struct mdd_object *obj,
- struct lu_attr *la, int mask, int needlock);
+int __mdd_permission_internal(const struct lu_env *env, struct mdd_object *obj,
+ struct lu_attr *la, int mask, int needlock);
int mdd_permission(const struct lu_env *env, struct md_object *obj, int mask);
int mdd_capa_get(const struct lu_env *env, struct md_object *obj,
struct lustre_capa *capa, int renewal);
+static inline int mdd_permission_internal(const struct lu_env *env,
+ struct mdd_object *obj,
+ struct lu_attr *la, int mask)
+{
+ return __mdd_permission_internal(env, obj, la, mask, 0);
+}
+
+static inline int mdd_permission_internal_locked(const struct lu_env *env,
+ struct mdd_object *obj,
+ struct lu_attr *la, int mask)
+{
+ return __mdd_permission_internal(env, obj, la, mask, 1);
+}
+
static inline int lu_device_is_mdd(struct lu_device *d)
{
return ergo(d != NULL && d->ld_ops != NULL, d->ld_ops == &mdd_lu_ops);
struct mdd_object *mdd_obj, struct md_attr *ma)
{
int rc;
- mdd_read_lock(env, mdd_obj);
+ int needlock = ma->ma_need & (MA_LOV | MA_LMV | MA_ACL_DEF);
+
+ if (needlock)
+ mdd_read_lock(env, mdd_obj);
rc = mdd_attr_get_internal(env, mdd_obj, ma);
- mdd_read_unlock(env, mdd_obj);
+ if (needlock)
+ mdd_read_unlock(env, mdd_obj);
return rc;
}
RETURN(-EPERM);
/*
- * According to Ext3 implementation on this, the
- * Ctime will be changed, but not clear why?
+ * According to Ext3 implementation on this,
+ * the ctime will be changed, but not clear why?
*/
la->la_ctime = now;
la->la_valid |= LA_CTIME;
/* Check for setting the obj time. */
if ((la->la_valid & (LA_MTIME | LA_ATIME | LA_CTIME)) &&
!(la->la_valid & ~(LA_MTIME | LA_ATIME | LA_CTIME))) {
- rc = mdd_permission_internal(env, obj, tmp_la, MAY_WRITE, 1);
+ rc = mdd_permission_internal_locked(env, obj, tmp_la, MAY_WRITE);
if (rc)
RETURN(rc);
}
/* For tuncate (or setsize), we should have MAY_WRITE perm */
if (la->la_valid & (LA_SIZE | LA_BLOCKS)) {
- rc = mdd_permission_internal(env, obj, tmp_la, MAY_WRITE, 1);
+ rc = mdd_permission_internal_locked(env, obj, tmp_la, MAY_WRITE);
if (rc)
RETURN(rc);
return rc;
}
-/*
- * XXX: Do we need permission checks here?
- */
+/* partial link */
static int mdd_ref_add(const struct lu_env *env,
struct md_object *obj)
{
RETURN(rc);
}
-/* do NOT or the MAY_*'s, you'll get the weakest */
+/*
+ * do NOT or the MAY_*'s, you'll get the weakest
+ * XXX: Can NOT understand.
+ */
static int accmode(struct mdd_object *mdd_obj, int flags)
{
int res = 0;
RETURN(-EISDIR);
if (!(flag & MDS_OPEN_CREATED)) {
- rc = mdd_permission_internal(env, obj, tmp_la, mode, 0);
+ rc = mdd_permission_internal(env, obj, tmp_la, mode);
if (rc)
RETURN(rc);
}
ENTRY;
if (S_ISDIR(mdd_object_type(obj)) && dt_try_as_dir(env, next))
-#if 0
- rc = mdd_permission_internal(env, obj, NULL, MAY_READ, 0);
-#else
rc = 0;
-#endif
else
rc = -ENOTDIR;
#endif
}
-int mdd_permission_internal(const struct lu_env *env, struct mdd_object *obj,
- struct lu_attr *la, int mask, int needlock)
+int __mdd_permission_internal(const struct lu_env *env, struct mdd_object *obj,
+ struct lu_attr *la, int mask, int needlock)
{
struct md_ucred *uc = md_ucred(env);
__u32 mode;
int rc;
ENTRY;
- rc = mdd_permission_internal(env, mdd_obj, NULL, mask, 1);
+ rc = mdd_permission_internal_locked(env, mdd_obj, NULL, mask);
RETURN(rc);
}