From 02842e25230f4fb18f4b8fb62239d4905d567b01 Mon Sep 17 00:00:00 2001 From: fanyong Date: Tue, 7 Nov 2006 14:07:09 +0000 Subject: [PATCH] (1) provide locked and unlocked version for mdd_permission. (2) fix some outdated comment. (3) other small fix. --- lustre/mdd/mdd_dir.c | 38 ++++++++++++++++---------------------- lustre/mdd/mdd_internal.h | 18 ++++++++++++++++-- lustre/mdd/mdd_object.c | 31 ++++++++++++++++--------------- lustre/mdd/mdd_permission.c | 6 +++--- 4 files changed, 51 insertions(+), 42 deletions(-) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 5d18292..799cd64 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -196,17 +196,13 @@ static int mdd_may_create(const struct lu_env *env, struct mdd_object *pobj, 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) @@ -224,9 +220,8 @@ static inline int mdd_is_sticky(const struct lu_env *env, 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); @@ -270,8 +265,8 @@ static int mdd_may_delete(const struct lu_env *env, 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); } @@ -617,8 +612,8 @@ static int mdd_ni_sanity_check(const struct lu_env *env, 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)); } /* @@ -667,7 +662,6 @@ static int mdd_nr_sanity_check(const struct lu_env *env, const char *name) { struct mdd_object *obj = md2mdd_obj(pobj); - int rc; ENTRY; /* EEXIST check */ @@ -677,8 +671,8 @@ static int mdd_nr_sanity_check(const struct lu_env *env, } /* 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)); } /* @@ -913,7 +907,7 @@ __mdd_lookup(const struct lu_env *env, struct md_object *pobj, 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); @@ -1008,7 +1002,7 @@ static int mdd_create_sanity_check(const struct lu_env *env, /* * 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); } @@ -1302,8 +1296,8 @@ static int mdd_rename_sanity_check(const struct lu_env *env, 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); diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 54b7d49..be4623a 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -284,12 +284,26 @@ int __mdd_acl_init(const struct lu_env *env, struct mdd_object *obj, 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); diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index f3a6ca8..35db61d 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -357,9 +357,13 @@ int mdd_attr_get_internal_locked(const struct lu_env *env, 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; } @@ -572,8 +576,8 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, 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; @@ -583,7 +587,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, /* 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); } @@ -669,7 +673,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, /* 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); @@ -1039,9 +1043,7 @@ unlock: 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) { @@ -1072,7 +1074,10 @@ static int mdd_ref_add(const struct lu_env *env, 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; @@ -1118,7 +1123,7 @@ static int mdd_open_sanity_check(const struct lu_env *env, 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); } @@ -1222,11 +1227,7 @@ static int mdd_readpage_sanity_check(const struct lu_env *env, 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; diff --git a/lustre/mdd/mdd_permission.c b/lustre/mdd/mdd_permission.c index ff963e4..8bc7e2b 100644 --- a/lustre/mdd/mdd_permission.c +++ b/lustre/mdd/mdd_permission.c @@ -495,8 +495,8 @@ static int mdd_check_acl(const struct lu_env *env, struct mdd_object *obj, #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; @@ -570,7 +570,7 @@ int mdd_permission(const struct lu_env *env, struct md_object *obj, int mask) 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); } -- 1.8.3.1