Whamcloud - gitweb
LU-6085 mdt: return valid attribute only to client 44/13344/3
authorJinshan Xiong <jinshan.xiong@intel.com>
Mon, 12 Jan 2015 07:50:13 +0000 (23:50 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 16 Jan 2015 03:26:15 +0000 (03:26 +0000)
In mdt_pack_attr2body(), it didn't check the valid bit of lu_attr.
This causes that clients see different file type.

Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Change-Id: Ib79f868205918a52f66c619d80468c4637b99bb5
Reviewed-on: http://review.whamcloud.com/13344
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdt/mdt_handler.c

index 09cb211..b19f7c7 100644 (file)
@@ -454,27 +454,60 @@ void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b,
 
        LASSERT(ma->ma_valid & MA_INODE);
 
-       b->mbo_atime      = attr->la_atime;
-       b->mbo_mtime      = attr->la_mtime;
-       b->mbo_ctime      = attr->la_ctime;
-       b->mbo_mode       = attr->la_mode;
-       b->mbo_size       = attr->la_size;
-       b->mbo_blocks     = attr->la_blocks;
-       b->mbo_uid        = nodemap_map_id(nodemap, NODEMAP_UID,
-                                          NODEMAP_FS_TO_CLIENT,
-                                          attr->la_uid);
-       b->mbo_gid        = nodemap_map_id(nodemap, NODEMAP_GID,
-                                          NODEMAP_FS_TO_CLIENT,
-                                          attr->la_gid);
-       b->mbo_flags      = attr->la_flags;
-       b->mbo_nlink      = attr->la_nlink;
-       b->mbo_rdev       = attr->la_rdev;
-
-       /* XXX should pack the reply body according to lu_valid */
-       b->mbo_valid |= OBD_MD_FLCTIME | OBD_MD_FLUID   |
-                       OBD_MD_FLGID   | OBD_MD_FLTYPE  |
-                       OBD_MD_FLMODE  | OBD_MD_FLNLINK | OBD_MD_FLFLAGS |
-                       OBD_MD_FLATIME | OBD_MD_FLMTIME ;
+       if (attr->la_valid & LA_ATIME) {
+               b->mbo_atime = attr->la_atime;
+               b->mbo_valid |= OBD_MD_FLATIME;
+       }
+       if (attr->la_valid & LA_MTIME) {
+               b->mbo_mtime = attr->la_mtime;
+               b->mbo_valid |= OBD_MD_FLMTIME;
+       }
+       if (attr->la_valid & LA_CTIME) {
+               b->mbo_ctime = attr->la_ctime;
+               b->mbo_valid |= OBD_MD_FLCTIME;
+       }
+       if (attr->la_valid & LA_FLAGS) {
+               b->mbo_flags = attr->la_flags;
+               b->mbo_valid |= OBD_MD_FLFLAGS;
+       }
+       if (attr->la_valid & LA_NLINK) {
+               b->mbo_nlink = attr->la_nlink;
+               b->mbo_valid |= OBD_MD_FLNLINK;
+       }
+       if (attr->la_valid & LA_UID) {
+               b->mbo_uid = nodemap_map_id(nodemap, NODEMAP_UID,
+                                           NODEMAP_FS_TO_CLIENT,
+                                           attr->la_uid);
+               b->mbo_valid |= OBD_MD_FLUID;
+       }
+       if (attr->la_valid & LA_GID) {
+               b->mbo_gid = nodemap_map_id(nodemap, NODEMAP_GID,
+                                           NODEMAP_FS_TO_CLIENT,
+                                           attr->la_gid);
+               b->mbo_valid |= OBD_MD_FLGID;
+       }
+       b->mbo_mode = attr->la_mode;
+       if (attr->la_valid & LA_MODE)
+               b->mbo_valid |= OBD_MD_FLMODE;
+       if (attr->la_valid & LA_TYPE)
+               b->mbo_valid |= OBD_MD_FLTYPE;
+
+       if (fid != NULL) {
+               b->mbo_fid1 = *fid;
+               b->mbo_valid |= OBD_MD_FLID;
+               CDEBUG(D_INODE, DFID": nlink=%d, mode=%o, valid="LPX64"\n",
+                      PFID(fid), b->mbo_nlink, b->mbo_mode, b->mbo_valid);
+       }
+
+       if (info != NULL)
+               mdt_body_reverse_idmap(info, b);
+
+       if (!(attr->la_valid & LA_TYPE))
+               return;
+
+       b->mbo_rdev   = attr->la_rdev;
+       b->mbo_size   = attr->la_size;
+       b->mbo_blocks = attr->la_blocks;
 
        if (!S_ISREG(attr->la_mode)) {
                b->mbo_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS | OBD_MD_FLRDEV;
@@ -499,17 +532,6 @@ void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b,
                b->mbo_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
        }
 
-       if (fid) {
-               b->mbo_fid1 = *fid;
-               b->mbo_valid |= OBD_MD_FLID;
-               CDEBUG(D_INODE, DFID": nlink=%d, mode=%o, size="LPU64"\n",
-                               PFID(fid), b->mbo_nlink,
-                      b->mbo_mode, b->mbo_size);
-       }
-
-       if (info)
-               mdt_body_reverse_idmap(info, b);
-
        if (fid != NULL && (b->mbo_valid & OBD_MD_FLSIZE))
                CDEBUG(D_VFSTRACE, DFID": returning size %llu\n",
                       PFID(fid), (unsigned long long)b->mbo_size);