Whamcloud - gitweb
(1) provide locked and unlocked version for mdd_permission.
authorfanyong <fanyong>
Tue, 7 Nov 2006 14:07:09 +0000 (14:07 +0000)
committerfanyong <fanyong>
Tue, 7 Nov 2006 14:07:09 +0000 (14:07 +0000)
(2) fix some outdated comment.
(3) other small fix.

lustre/mdd/mdd_dir.c
lustre/mdd/mdd_internal.h
lustre/mdd/mdd_object.c
lustre/mdd/mdd_permission.c

index 5d18292..799cd64 100644 (file)
@@ -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);
 
index 54b7d49..be4623a 100644 (file)
@@ -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);
index f3a6ca8..35db61d 100644 (file)
@@ -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;
 
index ff963e4..8bc7e2b 100644 (file)
@@ -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);
 }