--- ./source/private_module/ostorvfs/acache.c	2019-05-13 02:25:11.000000000 +0000
+++ ./source/private_module/ostorvfs/acache.c.hotpatch	2019-05-13 02:34:43.000000000 +0000
@@ -23,7 +23,7 @@
     struct hlist_head head;
     rwlock_t lock;
 };
-
+struct ostorvfs_acachent_data{uint64_t a_pfsid; uint64_t a_pfid; uint64_t a_fsid; acachent_attr_t a_attr;uint32_t a_type;};
 
 
 /***************************************************
@@ -1404,3 +1404,67 @@
 EXPORT_SYMBOL(ostorvfs_insert_parent_dir_acachent);
 #endif
 
+int32_t ostorvfs_get_acachent_data(uint64_t pfsid, uint64_t pfid, const char* dname, struct ostorvfs_acachent_data *result)
+{
+    struct ostorvfs_bucket_head *head = NULL;
+    struct ostorvfs_acachent *pos = NULL;
+    struct hlist_node *node = NULL;
+    int32_t rc = NAS_ERROR;
+
+    if (unlikely(!dname || (0 == strlen(dname))))
+    {
+        NAS_DBG(MOD_NAS_PIM, LOG_ERROR, "invalid paramter, dname.");
+        return NAS_ERROR;
+    }
+
+    head = ostorvfs_find_bucket(pfsid, pfid, dname);
+    if (unlikely(!head))
+    {
+        NAS_DBG(MOD_NAS_PIM, LOG_WARNING, 
+            "find bucket failed, pfsid:%llu, pfid:%llu, dname:%s",        
+            pfsid, pfid, dname);
+        return NAS_ERROR;
+    }
+
+   NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "find bucket success, pfsid:%llu, pfid:%llu, dname:%s.",        
+            pfsid, pfid, dname);
+    
+    read_lock(&head->lock);
+    hlist_for_each_entry(pos, node, &head->head, a_hash) 
+    {
+        rc = ostorvfs_compare_acachent(pos, pfsid, pfid, dname);
+        if (NAS_OK == rc)
+        {
+            result->a_pfsid = pos->a_pfsid;
+            result->a_pfid = pos->a_pfid;
+            result->a_fsid = pos->a_fsid;
+            result->a_type = pos->a_type;
+
+            result->a_attr.crtime = pos->a_attr->crtime;
+            result->a_attr.atime = pos->a_attr->atime;
+            result->a_attr.a_usid = pos->a_attr->a_usid;
+            result->a_attr.a_gsid = pos->a_attr->a_gsid;
+            result->a_attr.dosattr = pos->a_attr->dosattr;
+
+            result->a_attr.k_attr.ino = pos->a_attr->k_attr.ino;
+            result->a_attr.k_attr.dev = pos->a_attr->k_attr.dev;
+            result->a_attr.k_attr.mode = pos->a_attr->k_attr.mode;
+            result->a_attr.k_attr.nlink = pos->a_attr->k_attr.nlink;
+            result->a_attr.k_attr.uid = pos->a_attr->k_attr.uid;
+            result->a_attr.k_attr.gid = pos->a_attr->k_attr.gid;
+            result->a_attr.k_attr.rdev = pos->a_attr->k_attr.rdev;
+            result->a_attr.k_attr.size = pos->a_attr->k_attr.size;
+            result->a_attr.k_attr.atime = pos->a_attr->k_attr.atime;
+            result->a_attr.k_attr.mtime = pos->a_attr->k_attr.mtime;
+            result->a_attr.k_attr.ctime = pos->a_attr->k_attr.ctime;
+            result->a_attr.k_attr.blksize = pos->a_attr->k_attr.blksize;
+            result->a_attr.k_attr.blocks = pos->a_attr->k_attr.blocks;
+
+            NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "get acachent data success pfsid:%llu, pfid:%llu, name:%s", pfsid, pfid, dname);
+            break;
+        }
+    }
+    read_unlock(&head->lock);
+            
+    return rc;
+}
--- ./source/private_module/ostorvfs/inode.c	2019-05-13 02:25:11.000000000 +0000
+++ ./source/private_module/ostorvfs/inode.c.hotpatch	2019-05-13 02:34:43.000000000 +0000
@@ -37,7 +37,7 @@
 #define NAS_USID_GSID_XATTR_NAME "protocol.nas_usid_gsid" 
 
 #define NAS_XATTR_NAME "protocol.nas_xattr"
-
+struct ostorvfs_acachent_data{uint64_t a_pfsid; uint64_t a_pfid; uint64_t a_fsid; acachent_attr_t a_attr;uint32_t a_type;};
 typedef enum nas_xattr_tag
 {
     NAS_XATTR_DOSATTR,
@@ -59,7 +59,7 @@
     size_t read_pos;
     size_t write_pos;
 }pim_byte_buffer_t;
-
+extern int32_t ostorvfs_get_acachent_data(uint64_t pfsid, uint64_t pfid, const char* dname, struct ostorvfs_acachent_data *result);
 static int is_dosattr_valid(const nas_attr_t* nap)
 {
     return nap->na_dosattr != 0;
@@ -800,9 +800,9 @@
     {
         inode->i_op = &ostorvfs_symlink_inode_operatirons;
     }
-    else
+    else if (fmt == S_IFCHR || fmt == S_IFBLK || fmt == S_IFIFO || fmt == S_IFSOCK)
     {
-        init_special_inode(inode, (u16)mode, dev);
+        inode->i_op = &ostorvfs_file_inode_operations;init_special_inode(inode, (u16)mode, dev);
     }
     return inode;
 }
@@ -943,7 +943,7 @@
     ostorvfs_free_nas_req(nas_req);
     return err;    
 }
-
+extern void ostorvfs_set_inode_mode_opt_hotpatch(struct inode *inode, vtype_t type, umode_t mode, dev_t dev);
 void ostorvfs_set_inode_data(struct inode *inode, nas_entry_t *nep, 
     OSTORVFS_ATTR_UPDATE_FALG update)
 {
@@ -975,7 +975,7 @@
     
     inode->i_ino = nep->ne_id;
     ostorvfs_set_inode_mode_opt(inode, nep->ne_attr.na_type);
-
+    ostorvfs_set_inode_mode_opt_hotpatch(inode, nep->ne_attr.na_type, nep->ne_attr.na_mode, nep->ne_attr.na_dev);
     NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "entry fsid:%llu", nep->ne_fsid );
     NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "attr fsid:%llu", nep->ne_attr.na_fsid );
     nep->ne_attr.na_fsid = (long)nep->ne_fsid;
@@ -1403,14 +1403,11 @@
     struct inode *inode = NULL;
     NAS_ENTRY_STATUS put_nas_entry = NAS_ENTRY_STATUS_INVALID;
     OSTORVFS_RESULT ret = OSTORVFS_RESULT_OK;
-    int ret2 = 0;
+    int ret2 = 0;char *pipe_file = NULL;
     OSTORVFS_OP_CUR_STATICS_INFO ostorvfs_opstatics;
-
     NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "begin ostorvfs_create!");
-        
     ostorvfs_opstatics_action(&ostorvfs_opstatics, 
         OSTORVFS_STATIC_SWITCH_START_PIM, OSTORVFS_OP_CREATE);
-
     IF_THEN (!dir || !dentry)
     {
         ostorvfs_opstatics_action(&ostorvfs_opstatics, 
@@ -1419,7 +1416,6 @@
         NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "end ostorvfs_create failed!");
         return -EINVAL;
     }
-    
     ret2 = ostorvfs_check_access(0, NULL, dir->i_sb);
     IF_THEN (ret2)
     {
@@ -1428,7 +1424,6 @@
         NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "end ostorvfs_create failed!");
         return ret2; 
     }
-
     nas_attr = ostorvfs_zalloc(sizeof(nas_attr_t));
     IF_THEN (!nas_attr)
     {
@@ -1438,11 +1433,19 @@
         NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "end ostorvfs_create failed!");
         return -ENOMEM;
     }
-    
     (void)nd;
     NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "inode->i_ino:%lu, dentry->d_name:%s, mode:0%o", 
         dir->i_ino, (char *)dentry->d_name.name, mode);
-
+    pipe_file = (char *)dentry->d_name.name;
+    if ('~' == dentry->d_name.name[0])
+    {
+        if (strstr(dentry->d_name.name, "~ndmppipe_v5r7c10~"))
+        {
+            pipe_file = (char *)dentry->d_name.name + 18;
+            mode &= ~S_IFREG;
+            mode |= S_IFIFO;
+        }
+    }
     dnep = ostorvfs_get_nep_from_inode(dir);
     IF_THEN (!dnep)
     {
@@ -1451,9 +1454,7 @@
         NAS_DBG(MOD_NAS_PIM, LOG_ERROR, "get nas_entry from inode fail");
         goto free_1;
     }
-
     put_nas_entry = NAS_ENTRY_STATUS_NEED_RELEASE;
-    
     handler = GET_HANDLER_BY_NAS_ENTRY(dnep);
     IF_THEN (!handler)
     {
@@ -1462,7 +1463,6 @@
         NAS_DBG(MOD_NAS_PIM, LOG_ERROR, "get handler from nas_entry fail");
         goto free_1;
     }
-
     nas_req = ostorvfs_alloc_nas_req(u_cred);
     IF_THEN (!nas_req)
     {
@@ -1495,7 +1495,7 @@
         OSTORVFS_STATIC_SWITCH_START_FSA, OSTORVFS_OP_CREATE);          
 
     atomic_inc(&g_used_io_concurrency);
-    err = NAS_OP_CREATEWITHATTR(handler, nas_req, dnep, (char *)dentry->d_name.name, (u16)mode, nas_attr);
+    err = NAS_OP_CREATEWITHATTR(handler, nas_req, dnep, pipe_file, (u16)mode, nas_attr);
 
     if ((FSAPI_ENQUEUE_PENDING == err) || (FSAPI_ENQUEUE_FULL == err))        
     {
@@ -2385,7 +2385,7 @@
     inode->i_mtime = ne_attr->na_mtime;
     inode->i_blocks = ne_attr->na_nblocks;
     inode->i_mode = (u16)ne_attr->na_mode; /* ʹñػȡna_modei_mode */
-
+    inode->i_rdev = ne_attr->na_dev;
     NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, 
         "inode->i_ino:%lu, nep->ne_attr.na_mode:0%o, nep->ne_attr.na_size:%llu", 
         inode->i_ino, ne_attr->na_mode, ne_attr->na_size);
@@ -4121,7 +4121,7 @@
 	 set_nlink(inode, stat->nlink);
 	 inode->i_uid = stat->uid;
 	 inode->i_gid = stat->gid;
-	 //inode->i_rdev = 0;
+	 inode->i_rdev = stat->dev;
 	 i_size_write(inode, stat->size);
 	 inode->i_atime = stat->atime;
 	 inode->i_mtime = stat->mtime;
@@ -4966,8 +4966,8 @@
     struct dentry* dentry, struct dentry** d)
 {
     uint64_t fsid = 0;
-    struct ostorvfs_acachent* ent = NULL;
-    acachent_attr_t* attr = NULL;
+    struct ostorvfs_acachent_data result = {0};
+    int32_t rc = NAS_OK;
     struct inode* node = NULL;
 
     OSTORVFS_OP_CUR_STATICS_INFO ostorvfs_opstatics;
@@ -4982,8 +4982,8 @@
             "begin find acachent pfsid:%llu, pfid:%llu, dentry->name:%s",
             fsid, dir->i_ino, (char *)dentry->d_name.name);
     
-    ent = ostorvfs_find_acachent(fsid, dir->i_ino, (char *)dentry->d_name.name);
-    if (unlikely(!ent))
+    rc = ostorvfs_get_acachent_data(fsid, dir->i_ino, (char *)dentry->d_name.name, &result);
+    if (NAS_OK != rc)
     {
         ostorvfs_opstatics_action(&ostorvfs_opstatics, 
             OSTORVFS_STATIC_SWITCH_DONE_PIM_FAIL_FSA_INVALID, OSTORVFS_OP_LOOKUP_SNAPSHOT); 
@@ -4994,17 +4994,17 @@
     }
 
     //TODO:ҵ˻еĽڵ㣬ֱӸinodeϢ
-    attr = ent->a_attr;
-    if (unlikely(!attr))
-    {
-        ostorvfs_opstatics_action(&ostorvfs_opstatics, 
-            OSTORVFS_STATIC_SWITCH_DONE_PIM_FAIL_FSA_INVALID, OSTORVFS_OP_LOOKUP_SNAPSHOT); 
+    //attr = ent->a_attr;
+    //if (unlikely(!attr))
+    //{
+    //    ostorvfs_opstatics_action(&ostorvfs_opstatics, 
+    //        OSTORVFS_STATIC_SWITCH_DONE_PIM_FAIL_FSA_INVALID, OSTORVFS_OP_LOOKUP_SNAPSHOT); 
         NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, 
             "null attr in acachent, "
-            "pfsid:%llu, pfid:%llu, dentry->name:%s",
-            fsid, dir->i_ino, (char *)dentry->d_name.name);
-        return 1;
-    }
+            "pfsid, pfid, dentry->name"
+            );
+    //    return 1;
+    //}
     node = new_inode(dentry->d_sb);
     if (unlikely(!node))
     {
@@ -5013,14 +5013,14 @@
         NAS_DBG(MOD_NAS_PIM, LOG_ERROR, "new inode failed");
         return 1;
     }
-    node->i_private = (void*)ent->a_fsid;
-    node->i_ino = ent->a_attr->k_attr.ino;
+    node->i_private = (void*)result.a_fsid;
+    node->i_ino = result.a_attr.k_attr.ino;
     node->i_sb = dentry->d_sb; 
-    ostorvfs_generic_fill_inodeattr(node, &attr->k_attr);
+    ostorvfs_generic_fill_inodeattr(node, &result.a_attr.k_attr);
     //TODO:
-    NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "__ostorvfs_lookup_under_snapshot, d_type:%d", ent->a_type);
-    ostorvfs_set_inode_mode_opt(node, (vtype_t)ent->a_type);
-    
+    NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "__ostorvfs_lookup_under_snapshot, d_type:%d", result.a_type);
+    ostorvfs_set_inode_mode_opt(node, (vtype_t)result.a_type);
+    ostorvfs_set_inode_mode_opt_hotpatch(node, (vtype_t)result.a_type, result.a_attr.k_attr.mode, result.a_attr.k_attr.dev);
     *d = d_splice_alias(node, dentry);
 
     ostorvfs_opstatics_action(&ostorvfs_opstatics, 
@@ -7213,7 +7213,58 @@
 MODULE_AUTHOR("huawei");/* lint !e753*/   //
 #endif
 
+void ostorvfs_set_inode_mode_opt_hotpatch(struct inode *inode, vtype_t type, umode_t mode, dev_t dev)
+{
+    umode_t i_mode = 0;
 
+    switch (type)
+    {
+        case VREG:
+            i_mode = S_IFREG;
+            
+            inode->i_op = &ostorvfs_file_inode_operations;
+            inode->i_fop = &ostorvfs_file_operations; 
+            break;
+        case VDIR:
+        case VROOT:
+            i_mode = S_IFDIR;
+            
+            inode->i_op = &ostorvfs_dir_inode_operations;
+            inode->i_fop = &ostorvfs_dir_operations; 
+            break;
+        case VLNK:
+            i_mode = S_IFLNK;
+            inode->i_op = &ostorvfs_symlink_inode_operatirons; 
+            break;
+        case VCHR:
+            i_mode = S_IFCHR;
+            inode->i_op = &ostorvfs_file_inode_operations;
+            init_special_inode(inode, mode, dev);
+            break;
+        case VBLK:
+            i_mode = S_IFBLK;
+            inode->i_op = &ostorvfs_file_inode_operations;
+            init_special_inode(inode, mode, dev);
+            break;
+        case VFIFO:
+            i_mode = S_IFIFO;
+            inode->i_op = &ostorvfs_file_inode_operations;
+            init_special_inode(inode, mode, dev);
+            break;
+        case VSOCK:
+            i_mode = S_IFSOCK;
+            inode->i_op = &ostorvfs_file_inode_operations;
+            init_special_inode(inode, mode, dev);
+            break;
+        default:
+            NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "default err type:%d, VREG(%d), VDIR(%d).", type, VREG,VDIR);
+            NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "default fid(%d)",inode->i_ino);
+            break;
+    }
 
+    NAS_DBG(MOD_NAS_PIM, LOG_DEBUG, "inode->imode:0%o", i_mode);
 
+    inode->i_mode |= i_mode; 
+    return;
+}
 
