From: Jinshan Xiong Date: Mon, 12 Jan 2015 07:50:13 +0000 (-0800) Subject: LU-6085 mdt: return valid attribute only to client X-Git-Tag: 2.6.93~54 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=0e638c2fb9dd45323ccff0d9fb43f378faf6127f LU-6085 mdt: return valid attribute only to client 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 Change-Id: Ib79f868205918a52f66c619d80468c4637b99bb5 Reviewed-on: http://review.whamcloud.com/13344 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 09cb211..b19f7c7 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -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);