Whamcloud - gitweb
b=22731 server should not fall into LBUG if client send invalid parameter
[fs/lustre-release.git] / lustre / mdt / mdt_lib.c
index 973571e..5afad12 100644 (file)
@@ -70,7 +70,7 @@ void mdt_exit_ucred(struct mdt_thread_info *info)
         if (uc->mu_valid != UCRED_INIT) {
                 uc->mu_suppgids[0] = uc->mu_suppgids[1] = -1;
                 if (uc->mu_ginfo) {
-                        groups_free(uc->mu_ginfo);
+                        cfs_put_group_info(uc->mu_ginfo);
                         uc->mu_ginfo = NULL;
                 }
                 if (uc->mu_identity) {
@@ -82,15 +82,15 @@ void mdt_exit_ucred(struct mdt_thread_info *info)
         }
 }
 
-static int match_nosquash_list(struct rw_semaphore *sem,
-                               struct list_head *nidlist,
+static int match_nosquash_list(cfs_rw_semaphore_t *sem,
+                               cfs_list_t *nidlist,
                                lnet_nid_t peernid)
 {
         int rc;
         ENTRY;
-        down_read(sem);
+        cfs_down_read(sem);
         rc = cfs_match_nid(peernid, nidlist);
-        up_read(sem);
+        cfs_up_read(sem);
         RETURN(rc);
 }
 
@@ -251,7 +251,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type,
         if (!remote && perm & CFS_SETGRP_PERM) {
                 if (pud->pud_ngroups) {
                         /* setgroups for local client */
-                        ucred->mu_ginfo = groups_alloc(pud->pud_ngroups);
+                        ucred->mu_ginfo = cfs_groups_alloc(pud->pud_ngroups);
                         if (!ucred->mu_ginfo) {
                                 CERROR("failed to alloc %d groups\n",
                                        pud->pud_ngroups);
@@ -293,7 +293,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type,
 out:
         if (rc) {
                 if (ucred->mu_ginfo) {
-                        groups_free(ucred->mu_ginfo);
+                        cfs_put_group_info(ucred->mu_ginfo);
                         ucred->mu_ginfo = NULL;
                 }
                 if (ucred->mu_identity) {
@@ -753,9 +753,9 @@ static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr,
                 ATTR_ATIME|ATTR_MTIME|ATTR_CTIME|ATTR_FROM_OPEN|
                 ATTR_ATIME_SET|ATTR_CTIME_SET|ATTR_MTIME_SET|
                 ATTR_ATTR_FLAG|ATTR_RAW|MDS_OPEN_OWNEROVERRIDE|
-                ATTR_FORCE|ATTR_KILL_SUID);
+                ATTR_FORCE|ATTR_KILL_SUID|ATTR_KILL_SGID);
         if (in != 0)
-                CERROR("Unknown attr bits: %#llx\n", in);
+                CERROR("Unknown attr bits: "LPX64"\n", in);
         return out;
 }
 /* unpacking */
@@ -801,16 +801,17 @@ static int mdt_setattr_unpack_rec(struct mdt_thread_info *info)
         RETURN(0);
 }
 
-static int mdt_epoch_unpack(struct mdt_thread_info *info)
+static int mdt_ioepoch_unpack(struct mdt_thread_info *info)
 {
         struct req_capsule *pill = info->mti_pill;
         ENTRY;
 
         if (req_capsule_get_size(pill, &RMF_MDT_EPOCH, RCL_CLIENT))
-                info->mti_epoch = req_capsule_client_get(pill, &RMF_MDT_EPOCH);
+                info->mti_ioepoch =
+                        req_capsule_client_get(pill, &RMF_MDT_EPOCH);
         else
-                info->mti_epoch = NULL;
-        RETURN(info->mti_epoch == NULL ? -EFAULT : 0);
+                info->mti_ioepoch = NULL;
+        RETURN(info->mti_ioepoch == NULL ? -EFAULT : 0);
 }
 
 static inline int mdt_dlmreq_unpack(struct mdt_thread_info *info) {
@@ -837,7 +838,7 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info)
                 RETURN(rc);
 
         /* Epoch may be absent */
-        mdt_epoch_unpack(info);
+        mdt_ioepoch_unpack(info);
 
         ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT);
         if (ma->ma_lmm_size) {
@@ -861,7 +862,7 @@ int mdt_close_unpack(struct mdt_thread_info *info)
         int rc;
         ENTRY;
 
-        rc = mdt_epoch_unpack(info);
+        rc = mdt_ioepoch_unpack(info);
         if (rc)
                 RETURN(rc);
 
@@ -1070,8 +1071,7 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info)
         else
                 ma->ma_attr_flags &= ~MDS_VTX_BYPASS;
 
-        if (lustre_msg_get_flags(mdt_info_req(info)->rq_reqmsg) & MSG_REPLAY)
-                info->mti_spec.no_create = 1;
+        info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info));
 
         rc = mdt_dlmreq_unpack(info);
         RETURN(rc);
@@ -1131,6 +1131,8 @@ static int mdt_rename_unpack(struct mdt_thread_info *info)
         else
                 ma->ma_attr_flags &= ~MDS_VTX_BYPASS;
 
+        info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info));
+
         rc = mdt_dlmreq_unpack(info);
         RETURN(rc);
 }
@@ -1171,6 +1173,9 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
                          LA_CTIME | LA_MTIME | LA_ATIME;
         memset(&info->mti_spec.u, 0, sizeof(info->mti_spec.u));
         info->mti_spec.sp_cr_flags = rec->cr_flags;
+        /* Do not trigger ASSERTION if client miss to set such flags. */
+        if (unlikely(info->mti_spec.sp_cr_flags == 0))
+                RETURN(-EPROTO);
         info->mti_replayepoch = rec->cr_ioepoch;
 
         info->mti_spec.sp_ck_split = !!(rec->cr_bias & MDS_CHECK_SPLIT);
@@ -1179,8 +1184,8 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
         if (req_capsule_get_size(pill, &RMF_CAPA1, RCL_CLIENT))
                 mdt_set_capainfo(info, 0, rr->rr_fid1,
                                  req_capsule_client_get(pill, &RMF_CAPA1));
-        if ((lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) &&
-            (req_capsule_get_size(pill, &RMF_CAPA2, RCL_CLIENT))) {
+        if (req_is_replay(req) &&
+            req_capsule_get_size(pill, &RMF_CAPA2, RCL_CLIENT)) {
 #if 0
                 mdt_set_capainfo(info, 1, rr->rr_fid2,
                                  req_capsule_client_get(pill, &RMF_CAPA2));
@@ -1203,8 +1208,7 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
                                                      RCL_CLIENT);
         if (sp->u.sp_ea.eadatalen) {
                 sp->u.sp_ea.eadata = req_capsule_client_get(pill, &RMF_EADATA);
-                if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY)
-                        sp->no_create = 1;
+                sp->no_create = !!req_is_replay(req);
         }
 
         RETURN(0);