1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/hmdfs/hmdfs_dentryfile.c
4 *
5 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
6 */
7
8#include "hmdfs_dentryfile.h"
9
10#include <linux/ctype.h>
11#include <linux/file.h>
12#include <linux/mount.h>
13#include <linux/pagemap.h>
14#include <linux/slab.h>
15#include <linux/xattr.h>
16#include <linux/err.h>
17#include <linux/filelock.h>
18
19#include "authority/authentication.h"
20#include "comm/transport.h"
21#include "hmdfs_client.h"
22#include "hmdfs_device_view.h"
23#include "hmdfs_merge_view.h"
24
25/* Hashing code copied from f2fs */
26#define HMDFS_HASH_COL_BIT ((0x1ULL) << 63)
27#define DELTA		   0x9E3779B9
28
29static bool is_dot_dotdot(const unsigned char *name, __u32 len)
30{
31	if (len == 1 && name[0] == '.')
32		return true;
33
34	if (len == 2 && name[0] == '.' && name[1] == '.')
35		return true;
36
37	return false;
38}
39
40static void str2hashbuf(const unsigned char *msg, size_t len, unsigned int *buf,
41			int num, bool case_sense)
42{
43	unsigned int pad, val;
44	int i;
45	unsigned char c;
46
47	pad = (__u32)len | ((__u32)len << 8);
48	pad |= pad << 16;
49
50	val = pad;
51	if (len > (size_t)num * 4)
52		len = (size_t)num * 4;
53	for (i = 0; i < len; i++) {
54		if ((i % 4) == 0)
55			val = pad;
56		c = msg[i];
57		if (!case_sense)
58			c = tolower(c);
59		val = c + (val << 8);
60		if ((i % 4) == 3) {
61			*buf++ = val;
62			val = pad;
63			num--;
64		}
65	}
66	if (--num >= 0)
67		*buf++ = val;
68	while (--num >= 0)
69		*buf++ = pad;
70}
71
72static void tea_transform(unsigned int buf[4], unsigned int const in[])
73{
74	__u32 sum = 0;
75	__u32 b0 = buf[0], b1 = buf[1];
76	__u32 a = in[0], b = in[1], c = in[2], d = in[3];
77	int n = 16;
78
79	do {
80		sum += DELTA;
81		b0 += ((b1 << 4) + a) ^ (b1 + sum) ^ ((b1 >> 5) + b);
82		b1 += ((b0 << 4) + c) ^ (b0 + sum) ^ ((b0 >> 5) + d);
83	} while (--n);
84
85	buf[0] += b0;
86	buf[1] += b1;
87}
88
89__u32 hmdfs_dentry_hash(const struct qstr *qstr, bool case_sense)
90{
91	__u32 hash;
92	__u32 hmdfs_hash;
93	const unsigned char *p = qstr->name;
94	__u32 len = qstr->len;
95	__u32 in[8], buf[4];
96
97	if (is_dot_dotdot(p, len))
98		return 0;
99
100	/* Initialize the default seed for the hash checksum functions */
101	buf[0] = 0x67452301;
102	buf[1] = 0xefcdab89;
103	buf[2] = 0x98badcfe;
104	buf[3] = 0x10325476;
105
106	while (1) {
107		str2hashbuf(p, len, in, 4, case_sense);
108		tea_transform(buf, in);
109		p += 16;
110		if (len <= 16)
111			break;
112		len -= 16;
113	}
114	hash = buf[0];
115	hmdfs_hash = hash & ~HMDFS_HASH_COL_BIT;
116	return hmdfs_hash;
117}
118
119static atomic_t curr_ino = ATOMIC_INIT(INUNUMBER_START);
120int get_inonumber(void)
121{
122	return atomic_inc_return(&curr_ino);
123}
124
125static int hmdfs_get_root_dentry_type(struct dentry *dentry, int *is_root)
126{
127	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
128
129	*is_root = 1;
130	switch (d_info->dentry_type) {
131	case HMDFS_LAYER_OTHER_LOCAL:
132		*is_root = 0;
133		fallthrough;
134	case HMDFS_LAYER_SECOND_LOCAL:
135		return HMDFS_LAYER_SECOND_LOCAL;
136	case HMDFS_LAYER_OTHER_CLOUD:
137		*is_root = 0;
138		fallthrough;
139	case HMDFS_LAYER_SECOND_CLOUD:
140		return HMDFS_LAYER_SECOND_CLOUD;
141	case HMDFS_LAYER_OTHER_REMOTE:
142		*is_root = 0;
143		fallthrough;
144	case HMDFS_LAYER_SECOND_REMOTE:
145		return HMDFS_LAYER_SECOND_REMOTE;
146	default:
147		hmdfs_info("Unexpected dentry type %d", d_info->dentry_type);
148		return -EINVAL;
149	}
150}
151
152static int prepend(char **buffer, int *buflen, const char *str, int namelen)
153{
154	*buflen -= namelen;
155	if (*buflen < 0)
156		return -ENAMETOOLONG;
157	*buffer -= namelen;
158	memcpy(*buffer, str, namelen);
159	return 0;
160}
161
162static int prepend_name(char **buffer, int *buflen, const struct qstr *name)
163{
164	const char *dname = name->name;
165	u32 dlen = name->len;
166	char *p = NULL;
167
168	*buflen -= dlen + 1;
169	if (*buflen < 0)
170		return -ENAMETOOLONG;
171	p = *buffer -= dlen + 1;
172	*p++ = '/';
173	while (dlen--) {
174		char c = *dname++;
175
176		if (!c)
177			break;
178		*p++ = c;
179	}
180	return 0;
181}
182
183static char *hmdfs_dentry_path_raw(struct dentry *d, char *buf, int buflen)
184{
185	struct dentry *dentry = NULL;
186	char *end = NULL;
187	char *retval = NULL;
188	unsigned int len;
189	unsigned int seq = 0;
190	int root_flag = 0;
191	int error = 0;
192	struct hmdfs_dentry_info *di = hmdfs_d(d);
193	int hmdfs_root_dentry_type = 0;
194
195	di->time = jiffies;
196	hmdfs_root_dentry_type = hmdfs_get_root_dentry_type(d, &root_flag);
197	if (hmdfs_root_dentry_type < 0)
198		return NULL;
199	if (root_flag) {
200		strcpy(buf, "/");
201		return buf;
202	}
203	rcu_read_lock();
204restart:
205	dentry = d;
206	di = hmdfs_d(dentry);
207	di->time = jiffies;
208	end = buf + buflen;
209	len = buflen;
210	prepend(&end, &len, "\0", 1);
211	retval = end - 1;
212	*retval = '/';
213	read_seqbegin_or_lock(&rename_lock, &seq);
214	while (di->dentry_type != hmdfs_root_dentry_type) {
215		struct dentry *parent = dentry->d_parent;
216
217		prefetch(parent);
218		error = prepend_name(&end, &len, &dentry->d_name);
219		if (error)
220			break;
221		retval = end;
222		dentry = parent;
223		di = hmdfs_d(dentry);
224		di->time = jiffies;
225	}
226	if (!(seq & 1))
227		rcu_read_unlock();
228	if (need_seqretry(&rename_lock, seq)) {
229		seq = 1;
230		goto restart;
231	}
232	done_seqretry(&rename_lock, seq);
233	if (error)
234		goto Elong;
235	return retval;
236Elong:
237	return ERR_PTR(-ENAMETOOLONG);
238}
239
240char *hmdfs_get_dentry_relative_path(struct dentry *dentry)
241{
242	char *final_buf = NULL;
243	char *buf = NULL;
244	char *p = NULL;
245
246	buf = kzalloc(PATH_MAX, GFP_KERNEL);
247	if (!buf)
248		return NULL;
249
250	final_buf = kzalloc(PATH_MAX, GFP_KERNEL);
251	if (!final_buf) {
252		kfree(buf);
253		return NULL;
254	}
255
256	/* NULL dentry return root dir */
257	if (!dentry) {
258		strcpy(final_buf, "/");
259		kfree(buf);
260		return final_buf;
261	}
262	p = hmdfs_dentry_path_raw(dentry, buf, PATH_MAX);
263	if (IS_ERR_OR_NULL(p)) {
264		kfree(buf);
265		kfree(final_buf);
266		return NULL;
267	}
268
269	if (strlen(p) >= PATH_MAX) {
270		kfree(buf);
271		kfree(final_buf);
272		return NULL;
273	}
274	strcpy(final_buf, p);
275	kfree(buf);
276	return final_buf;
277}
278
279static char *hmdfs_merge_dentry_path_raw(struct dentry *d, char *buf, int buflen)
280{
281	struct dentry *dentry = NULL;
282	char *end = NULL;
283	char *retval = NULL;
284	unsigned int len;
285	unsigned int seq = 0;
286	int error = 0;
287	struct hmdfs_dentry_info_merge *mdi = NULL;
288
289	rcu_read_lock();
290restart:
291	mdi = hmdfs_dm(d);
292	dentry = d;
293	end = buf + buflen;
294	len = buflen;
295	prepend(&end, &len, "\0", 1);
296	retval = end - 1;
297	*retval = '/';
298	read_seqbegin_or_lock(&rename_lock, &seq);
299	while (mdi->dentry_type != HMDFS_LAYER_FIRST_MERGE &&
300	       mdi->dentry_type != HMDFS_LAYER_FIRST_MERGE_CLOUD) {
301		struct dentry *parent = dentry->d_parent;
302
303		prefetch(parent);
304		error = prepend_name(&end, &len, &dentry->d_name);
305		if (error)
306			break;
307		retval = end;
308		dentry = parent;
309		mdi = hmdfs_dm(dentry);
310	}
311	if (!(seq & 1))
312		rcu_read_unlock();
313	if (need_seqretry(&rename_lock, seq)) {
314		seq = 1;
315		goto restart;
316	}
317	done_seqretry(&rename_lock, seq);
318	if (error)
319		goto Elong;
320	return retval;
321Elong:
322	return ERR_PTR(-ENAMETOOLONG);
323}
324
325char *hmdfs_merge_get_dentry_relative_path(struct dentry *dentry)
326{
327	char *final_buf = NULL;
328	char *buf = NULL;
329	char *p = NULL;
330
331	buf = kzalloc(PATH_MAX, GFP_KERNEL);
332	if (!buf)
333		return NULL;
334
335	final_buf = kzalloc(PATH_MAX, GFP_KERNEL);
336	if (!final_buf) {
337		kfree(buf);
338		return NULL;
339	}
340
341	/* NULL dentry return root dir */
342	if (!dentry) {
343		strcpy(final_buf, "/");
344		kfree(buf);
345		return final_buf;
346	}
347	p = hmdfs_merge_dentry_path_raw(dentry, buf, PATH_MAX);
348	if (IS_ERR_OR_NULL(p)) {
349		kfree(buf);
350		kfree(final_buf);
351		return NULL;
352	}
353
354	if (strlen(p) >= PATH_MAX) {
355		kfree(buf);
356		kfree(final_buf);
357		return NULL;
358	}
359	strcpy(final_buf, p);
360	kfree(buf);
361	return final_buf;
362}
363
364char *hmdfs_get_dentry_absolute_path(const char *rootdir,
365				     const char *relative_path)
366{
367	char *buf = 0;
368
369	if (!rootdir || !relative_path)
370		return NULL;
371	if (strlen(rootdir) + strlen(relative_path) >= PATH_MAX)
372		return NULL;
373
374	buf = kzalloc(PATH_MAX, GFP_KERNEL);
375	if (!buf)
376		return NULL;
377
378	strcpy(buf, rootdir);
379	strcat(buf, relative_path);
380	return buf;
381}
382
383char *hmdfs_connect_path(const char *path, const char *name)
384{
385	char *buf = 0;
386	size_t path_len, name_len;
387
388	if (!path || !name)
389		return NULL;
390
391	path_len = strnlen(path, PATH_MAX);
392	name_len = strnlen(name, PATH_MAX);
393	if (path_len + name_len + 1 >= PATH_MAX)
394		return NULL;
395
396	buf = kzalloc(PATH_MAX, GFP_KERNEL);
397	if (!buf)
398		return NULL;
399
400	strncpy(buf, path, path_len);
401	strcat(buf, "/");
402	strncat(buf, name, name_len);
403	return buf;
404}
405
406int hmdfs_metainfo_read_nocred(struct file *filp,
407		void *buffer, int size, int bidx)
408{
409	loff_t pos = get_dentry_group_pos(bidx);
410
411	return kernel_read(filp, buffer, (size_t)size, &pos);
412}
413
414int hmdfs_metainfo_read(struct hmdfs_sb_info *sbi, struct file *filp,
415			void *buffer, int size, int bidx)
416{
417	loff_t pos = get_dentry_group_pos(bidx);
418
419	return cache_file_read(sbi, filp, buffer, (size_t)size, &pos);
420}
421
422int hmdfs_metainfo_write(struct hmdfs_sb_info *sbi, struct file *filp,
423			 const void *buffer, int size, int bidx)
424{
425	loff_t pos = get_dentry_group_pos(bidx);
426
427	return cache_file_write(sbi, filp, buffer, (size_t)size, &pos);
428}
429
430/* for each level */
431/* bucketseq start offset by 0,for example
432 * level0  bucket0(0)
433 * level1  bucket0(1) bucket1(2)
434 * level2  bucket0(3) bucket1(4) bucket2(5) bucket3(6)
435 * return bucket number.
436 */
437__u64 get_bucketaddr(unsigned int level, __u64 buckoffset)
438{
439	__u64 all_level_bucketaddr = 0;
440	__u64 curlevelmaxbucks;
441
442	if (level >= MAX_BUCKET_LEVEL) {
443		hmdfs_err("level = %d overflow", level);
444		return all_level_bucketaddr;
445	}
446	curlevelmaxbucks = ((__u64)1 << level);
447	if (buckoffset >= curlevelmaxbucks) {
448		hmdfs_err("buckoffset %llu overflow, level %d has %llu buckets max",
449			  buckoffset, level, curlevelmaxbucks);
450		return all_level_bucketaddr;
451	}
452	all_level_bucketaddr = curlevelmaxbucks + buckoffset - 1;
453
454	return all_level_bucketaddr;
455}
456
457__u64 get_bucket_by_level(unsigned int level)
458{
459	__u64 buckets = 0;
460
461	if (level >= MAX_BUCKET_LEVEL) {
462		hmdfs_err("level = %d overflow", level);
463		return buckets;
464	}
465
466	buckets = ((__u64)1 << level);
467	return buckets;
468}
469
470static __u64 get_overall_bucket(unsigned int level)
471{
472	__u64 buckets = 0;
473
474	if (level >= MAX_BUCKET_LEVEL) {
475		hmdfs_err("level = %d overflow", level);
476		return buckets;
477	}
478	buckets = ((__u64)1 << (level + 1)) - 1;
479	return buckets;
480}
481
482static inline loff_t get_dcache_file_size(unsigned int level)
483{
484	loff_t buckets = get_overall_bucket(level);
485
486	return buckets * DENTRYGROUP_SIZE * BUCKET_BLOCKS + DENTRYGROUP_HEADER;
487}
488
489static char *get_relative_path(struct hmdfs_sb_info *sbi, char *from)
490{
491	char *relative;
492
493	if (strncmp(from, sbi->local_src, strlen(sbi->local_src))) {
494		hmdfs_warning("orig path do not start with local_src");
495		return NULL;
496	}
497	relative = from + strlen(sbi->local_src);
498	if (*relative == '/')
499		relative++;
500	return relative;
501}
502
503struct file *hmdfs_get_or_create_dents(struct hmdfs_sb_info *sbi, char *name)
504{
505	struct path root_path, path;
506	struct file *filp = NULL;
507	char *relative;
508	int err;
509
510	err = kern_path(sbi->local_src, 0, &root_path);
511	if (err) {
512		hmdfs_err("kern_path failed err = %d", err);
513		return NULL;
514	}
515	relative = get_relative_path(sbi, name);
516	if (!relative) {
517		hmdfs_err("get relative path failed");
518		goto err_root_path;
519	}
520	err = vfs_path_lookup(root_path.dentry, root_path.mnt, relative, 0,
521			      &path);
522	if (err) {
523		hmdfs_err("lookup failed err = %d", err);
524		goto err_root_path;
525	}
526
527	filp = hmdfs_server_cache_revalidate(sbi, relative, &path);
528	if (IS_ERR_OR_NULL(filp)) {
529		filp = hmdfs_server_rebuild_dents(sbi, &path, NULL, relative);
530		if (IS_ERR_OR_NULL(filp))
531			goto err_lookup_path;
532	}
533
534err_lookup_path:
535	path_put(&path);
536err_root_path:
537	path_put(&root_path);
538	return filp;
539}
540
541/* read all dentry in target path directory */
542int read_dentry(struct hmdfs_sb_info *sbi, char *file_name,
543		struct dir_context *ctx)
544{
545	unsigned long pos = (unsigned long)(ctx->pos);
546	unsigned long group_id = (pos << (1 + DEV_ID_BIT_NUM)) >>
547				 (POS_BIT_NUM - GROUP_ID_BIT_NUM);
548	unsigned long offset = pos & OFFSET_BIT_MASK;
549	struct hmdfs_dentry_group *dentry_group = NULL;
550	struct file *handler = NULL;
551	int group_num = 0;
552	int iterate_result = 0;
553	int i, j;
554	const struct cred *saved_cred;
555
556	saved_cred = hmdfs_override_fsids(false);
557	if (!saved_cred) {
558		hmdfs_err("prepare cred failed!");
559		return -ENOMEM;
560	}
561
562
563	if (!file_name)
564		return -EINVAL;
565
566	dentry_group = kzalloc(sizeof(*dentry_group), GFP_KERNEL);
567	if (!dentry_group)
568		return -ENOMEM;
569
570	handler = hmdfs_get_or_create_dents(sbi, file_name);
571	if (IS_ERR_OR_NULL(handler)) {
572		kfree(dentry_group);
573		return -ENOENT;
574	}
575
576	group_num = get_dentry_group_cnt(file_inode(handler));
577
578	for (i = group_id; i < group_num; i++) {
579		hmdfs_metainfo_read(sbi, handler, dentry_group,
580				    sizeof(struct hmdfs_dentry_group), i);
581		for (j = offset; j < DENTRY_PER_GROUP; j++) {
582			int len;
583			int file_type = 0;
584			bool is_continue;
585
586			len = le16_to_cpu(dentry_group->nsl[j].namelen);
587			if (!test_bit_le(j, dentry_group->bitmap) || len == 0)
588				continue;
589
590			if (S_ISDIR(le16_to_cpu(dentry_group->nsl[j].i_mode)))
591				file_type = DT_DIR;
592			else if (S_ISREG(le16_to_cpu(
593					 dentry_group->nsl[j].i_mode)))
594				file_type = DT_REG;
595			else if (S_ISLNK(le16_to_cpu(
596					 dentry_group->nsl[j].i_mode)))
597				file_type = DT_LNK;
598			else
599				continue;
600
601			pos = hmdfs_set_pos(0, i, j);
602			is_continue = dir_emit(
603				ctx, dentry_group->filename[j], len,
604				le64_to_cpu(dentry_group->nsl[j].i_ino),
605				file_type);
606			if (!is_continue) {
607				ctx->pos = pos;
608				iterate_result = 1;
609				goto done;
610			}
611		}
612		offset = 0;
613	}
614
615done:
616	hmdfs_revert_fsids(saved_cred);
617	kfree(dentry_group);
618	fput(handler);
619	return iterate_result;
620}
621
622unsigned int get_max_depth(struct file *filp)
623{
624	size_t isize;
625
626	isize = get_dentry_group_cnt(file_inode(filp)) / BUCKET_BLOCKS;
627
628	return get_count_order(isize + 1);
629}
630
631struct hmdfs_dentry_group *find_dentry_page(struct hmdfs_sb_info *sbi,
632					    pgoff_t index, struct file *filp)
633{
634	int size;
635	struct hmdfs_dentry_group *dentry_blk = NULL;
636	loff_t pos = get_dentry_group_pos(index);
637	int err;
638
639	dentry_blk = kmalloc(sizeof(*dentry_blk), GFP_KERNEL);
640	if (!dentry_blk)
641		return NULL;
642
643	err = hmdfs_wlock_file(filp, pos, DENTRYGROUP_SIZE);
644	if (err) {
645		hmdfs_err("lock file pos %lld failed", pos);
646		kfree(dentry_blk);
647		return NULL;
648	}
649
650	size = cache_file_read(sbi, filp, dentry_blk, (size_t)DENTRYGROUP_SIZE,
651			       &pos);
652	if (size != DENTRYGROUP_SIZE) {
653		hmdfs_unlock_file(filp, pos, DENTRYGROUP_SIZE);
654		kfree(dentry_blk);
655		dentry_blk = NULL;
656	}
657
658	return dentry_blk;
659}
660
661static ssize_t write_dentry_page(struct file *filp, const void *buffer,
662				 int buffersize, loff_t position)
663{
664	ssize_t size;
665
666	size = kernel_write(filp, buffer, (size_t)buffersize, &position);
667	if (size != buffersize)
668		hmdfs_err("write failed, ret = %zd", size);
669
670	return size;
671}
672
673static struct hmdfs_dentry *find_in_block(struct hmdfs_dentry_group *dentry_blk,
674					  __u32 namehash,
675					  const struct qstr *qstr,
676					  struct hmdfs_dentry **insense_de,
677					  bool case_sense)
678{
679	struct hmdfs_dentry *de;
680	unsigned long bit_pos = 0;
681	int max_len = 0;
682
683	while (bit_pos < DENTRY_PER_GROUP) {
684		if (!test_bit_le(bit_pos, dentry_blk->bitmap)) {
685			bit_pos++;
686			max_len++;
687			continue;
688		}
689		de = &dentry_blk->nsl[bit_pos];
690		if (unlikely(!de->namelen)) {
691			bit_pos++;
692			continue;
693		}
694
695		if (le32_to_cpu(de->hash) == namehash &&
696		    le16_to_cpu(de->namelen) == qstr->len &&
697		    !memcmp(qstr->name, dentry_blk->filename[bit_pos],
698			    le16_to_cpu(de->namelen)))
699			goto found;
700		if (!(*insense_de) && !case_sense &&
701		    le32_to_cpu(de->hash) == namehash &&
702		    le16_to_cpu(de->namelen) == qstr->len &&
703		    str_n_case_eq(qstr->name, dentry_blk->filename[bit_pos],
704				  le16_to_cpu(de->namelen)))
705			*insense_de = de;
706		max_len = 0;
707		bit_pos += get_dentry_slots(le16_to_cpu(de->namelen));
708	}
709	de = NULL;
710found:
711	return de;
712}
713
714static struct hmdfs_dentry *hmdfs_in_level(struct dentry *child_dentry,
715					   unsigned int level,
716					   struct hmdfs_dcache_lookup_ctx *ctx)
717{
718	unsigned long nbucket;
719	unsigned long bidx, end_block;
720	struct hmdfs_dentry *de = NULL;
721	struct hmdfs_dentry *tmp_insense_de = NULL;
722	struct hmdfs_dentry_group *dentry_blk;
723
724	nbucket = get_bucket_by_level(level);
725	if (!nbucket)
726		return de;
727
728	bidx = get_bucketaddr(level, ctx->hash % nbucket) * BUCKET_BLOCKS;
729	end_block = bidx + BUCKET_BLOCKS;
730
731	for (; bidx < end_block; bidx++) {
732		dentry_blk = find_dentry_page(ctx->sbi, bidx, ctx->filp);
733		if (!dentry_blk)
734			break;
735
736		de = find_in_block(dentry_blk, ctx->hash, ctx->name,
737				   &tmp_insense_de, ctx->sbi->s_case_sensitive);
738		if (!de && !(ctx->insense_de) && tmp_insense_de) {
739			ctx->insense_de = tmp_insense_de;
740			ctx->insense_page = dentry_blk;
741			ctx->insense_bidx = bidx;
742		} else if (!de) {
743			hmdfs_unlock_file(ctx->filp, get_dentry_group_pos(bidx),
744					  DENTRYGROUP_SIZE);
745			kfree(dentry_blk);
746		} else {
747			ctx->page = dentry_blk;
748			break;
749		}
750	}
751	ctx->bidx = bidx;
752	return de;
753}
754
755struct hmdfs_dentry *hmdfs_find_dentry(struct dentry *child_dentry,
756				       struct hmdfs_dcache_lookup_ctx *ctx)
757{
758	struct hmdfs_dentry *de = NULL;
759	unsigned int max_depth;
760	unsigned int level;
761
762	if (!ctx->filp)
763		return NULL;
764
765	ctx->hash = hmdfs_dentry_hash(ctx->name, ctx->sbi->s_case_sensitive);
766
767	max_depth = get_max_depth(ctx->filp);
768	for (level = 0; level < max_depth; level++) {
769		de = hmdfs_in_level(child_dentry, level, ctx);
770		if (de) {
771			if (ctx->insense_page) {
772				hmdfs_unlock_file(ctx->filp,
773					get_dentry_group_pos(ctx->insense_bidx),
774					DENTRYGROUP_SIZE);
775				kfree(ctx->insense_page);
776				ctx->insense_page = NULL;
777			}
778			return de;
779		}
780	}
781	if (ctx->insense_de) {
782		ctx->bidx = ctx->insense_bidx;
783		ctx->page = ctx->insense_page;
784		ctx->insense_bidx = 0;
785		ctx->insense_page = NULL;
786	}
787	return ctx->insense_de;
788}
789
790void update_dentry(struct hmdfs_dentry_group *d, struct dentry *child_dentry,
791		   		   struct inode *inode, struct super_block *hmdfs_sb,
792		  		   __u32 name_hash, unsigned int bit_pos)
793{
794	struct hmdfs_dentry *de;
795	struct hmdfs_dentry_info *gdi;
796	const struct qstr name = child_dentry->d_name;
797	int slots = get_dentry_slots(name.len);
798	int i;
799	unsigned long ino;
800	__u32 igen;
801
802	gdi = hmdfs_sb == child_dentry->d_sb ? hmdfs_d(child_dentry) : NULL;
803	if (!gdi && S_ISLNK(d_inode(child_dentry)->i_mode)) {
804		ino = d_inode(child_dentry)->i_ino;
805		igen = d_inode(child_dentry)->i_generation;
806	} else {
807		ino = inode->i_ino;
808		igen = inode->i_generation;
809	}
810
811	de = &d->nsl[bit_pos];
812	de->hash = cpu_to_le32(name_hash);
813	de->namelen = cpu_to_le16(name.len);
814	memcpy(d->filename[bit_pos], name.name, name.len);
815	de->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
816	de->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
817	de->i_size = cpu_to_le64(inode->i_size);
818	de->i_ino = cpu_to_le64(generate_u64_ino(ino, igen));
819	de->i_flag = 0;
820	if (gdi && hm_islnk(gdi->file_type))
821		de->i_mode = cpu_to_le16(S_IFLNK);
822	else if (!gdi && S_ISLNK(d_inode(child_dentry)->i_mode))
823		de->i_mode = d_inode(child_dentry)->i_mode;
824	else
825		de->i_mode = cpu_to_le16(inode->i_mode);
826
827	for (i = 0; i < slots; i++) {
828		__set_bit_le(bit_pos + i, d->bitmap);
829		/* avoid wrong garbage data for readdir */
830		if (i)
831			(de + i)->namelen = 0;
832	}
833}
834
835int room_for_filename(const void *bitmap, int slots, int max_slots)
836{
837	int bit_start = 0;
838	int zero_start, zero_end;
839next:
840	zero_start = find_next_zero_bit_le(bitmap, max_slots, bit_start);
841	if (zero_start >= max_slots)
842		return max_slots;
843
844	zero_end = find_next_bit_le(bitmap, max_slots, zero_start);
845	if (zero_end - zero_start >= slots)
846		return zero_start;
847
848	bit_start = zero_end + 1;
849
850	if (zero_end + 1 >= max_slots)
851		return max_slots;
852	goto next;
853}
854
855void create_in_cache_file(uint64_t dev_id, struct dentry *dentry)
856{
857	struct clearcache_item *item = NULL;
858
859	item = hmdfs_find_cache_item(dev_id, dentry->d_parent);
860	if (item) {
861		if (d_inode(dentry))
862			create_dentry(dentry, d_inode(dentry), item->filp,
863				      hmdfs_sb(dentry->d_sb));
864		else
865			hmdfs_err("inode is null!");
866		kref_put(&item->ref, release_cache_item);
867	} else {
868		hmdfs_info("find cache item failed, device_id:%llu", dev_id);
869	}
870}
871
872int create_dentry(struct dentry *child_dentry, struct inode *inode,
873		  struct file *file, struct hmdfs_sb_info *sbi)
874{
875	unsigned int bit_pos, level;
876	unsigned long bidx, end_block;
877	const struct qstr qstr = child_dentry->d_name;
878	__u32 namehash;
879	loff_t pos;
880	ssize_t size;
881	int ret = 0;
882	struct hmdfs_dentry_group *dentry_blk = NULL;
883
884	level = 0;
885
886	namehash = hmdfs_dentry_hash(&qstr, sbi->s_case_sensitive);
887
888	dentry_blk = kmalloc(sizeof(*dentry_blk), GFP_KERNEL);
889	if (!dentry_blk) {
890		ret = -ENOMEM;
891		goto out_err;
892	}
893find:
894	if (level == MAX_BUCKET_LEVEL) {
895		ret = -ENOSPC;
896		goto out;
897	}
898	bidx = BUCKET_BLOCKS *
899	       get_bucketaddr(level, namehash % get_bucket_by_level(level));
900	end_block = bidx + BUCKET_BLOCKS;
901	if (end_block > get_dentry_group_cnt(file_inode(file))) {
902		if (cache_file_truncate(sbi, &(file->f_path),
903					get_dcache_file_size(level))) {
904			ret = -ENOSPC;
905			goto out;
906		}
907	}
908
909	for (; bidx < end_block; bidx++) {
910		int size;
911
912		pos = get_dentry_group_pos(bidx);
913		ret = hmdfs_wlock_file(file, pos, DENTRYGROUP_SIZE);
914		if (ret)
915			goto out;
916
917		size = cache_file_read(sbi, file, dentry_blk,
918				       (size_t)DENTRYGROUP_SIZE, &pos);
919		if (size != DENTRYGROUP_SIZE) {
920			ret = -ENOSPC;
921			hmdfs_unlock_file(file, pos, DENTRYGROUP_SIZE);
922			goto out;
923		}
924
925		bit_pos = room_for_filename(&dentry_blk->bitmap,
926					    get_dentry_slots(qstr.len),
927					    DENTRY_PER_GROUP);
928		if (bit_pos < DENTRY_PER_GROUP)
929			goto add;
930		hmdfs_unlock_file(file, pos, DENTRYGROUP_SIZE);
931	}
932	++level;
933	goto find;
934add:
935	pos = get_dentry_group_pos(bidx);
936	update_dentry(dentry_blk, child_dentry, inode, sbi->sb, namehash,
937				  bit_pos);
938	size = cache_file_write(sbi, file, dentry_blk,
939				sizeof(struct hmdfs_dentry_group), &pos);
940	if (size != sizeof(struct hmdfs_dentry_group))
941		hmdfs_err("cache file write failed!, ret = %zd", size);
942	hmdfs_unlock_file(file, pos, DENTRYGROUP_SIZE);
943out:
944	kfree(dentry_blk);
945out_err:
946	return ret;
947}
948
949void hmdfs_init_dcache_lookup_ctx(struct hmdfs_dcache_lookup_ctx *ctx,
950				  struct hmdfs_sb_info *sbi,
951				  const struct qstr *qstr, struct file *filp)
952{
953	ctx->sbi = sbi;
954	ctx->name = qstr;
955	ctx->filp = filp;
956	ctx->bidx = 0;
957	ctx->page = NULL;
958	ctx->insense_de = NULL;
959	ctx->insense_bidx = 0;
960	ctx->insense_page = NULL;
961}
962
963int update_inode_to_dentry(struct dentry *child_dentry, struct inode *inode)
964{
965	struct hmdfs_sb_info *sbi = d_inode(child_dentry)->i_sb->s_fs_info;
966	struct hmdfs_dentry *de = NULL;
967	loff_t ipos;
968	struct dentry *parent_dentry;
969	struct cache_file_node *cfn = NULL;
970	char *relative_path = NULL;
971	struct hmdfs_dcache_lookup_ctx ctx;
972
973	parent_dentry = child_dentry->d_parent;
974	if (hmdfs_d(parent_dentry)->dentry_type == HMDFS_LAYER_FIRST_DEVICE)
975		return 0;
976
977	relative_path = hmdfs_get_dentry_relative_path(parent_dentry);
978	if (!relative_path)
979		return -ENOMEM;
980
981	cfn = find_cfn(sbi, HMDFS_SERVER_CID, relative_path, true);
982	if (!cfn)
983		goto out;
984
985	hmdfs_init_dcache_lookup_ctx(&ctx, sbi, &child_dentry->d_name,
986				     cfn->filp);
987	de = hmdfs_find_dentry(child_dentry, &ctx);
988	if (!de)
989		goto out_cfn;
990
991	de->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
992	de->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
993	de->i_size = cpu_to_le64(inode->i_size);
994	de->i_ino = cpu_to_le64(
995		generate_u64_ino(inode->i_ino, inode->i_generation));
996	de->i_flag = 0;
997
998	ipos = get_dentry_group_pos(ctx.bidx);
999	write_dentry_page(cfn->filp, ctx.page,
1000			  sizeof(struct hmdfs_dentry_group), ipos);
1001	hmdfs_unlock_file(cfn->filp, ipos, DENTRYGROUP_SIZE);
1002	kfree(ctx.page);
1003out_cfn:
1004	release_cfn(cfn);
1005out:
1006	kfree(relative_path);
1007	return 0;
1008}
1009
1010void hmdfs_delete_dentry(struct dentry *d, struct file *filp)
1011{
1012	struct hmdfs_dentry *de = NULL;
1013	unsigned int bit_pos;
1014	int slots, i;
1015	loff_t ipos;
1016	ssize_t size;
1017	struct hmdfs_dcache_lookup_ctx ctx;
1018
1019	hmdfs_init_dcache_lookup_ctx(&ctx, hmdfs_sb(d->d_sb), &d->d_name, filp);
1020
1021	de = hmdfs_find_dentry(d, &ctx);
1022	if (IS_ERR_OR_NULL(de)) {
1023		hmdfs_info("find dentry failed!, err=%ld", PTR_ERR(de));
1024		return;
1025	}
1026	slots = get_dentry_slots(le16_to_cpu(de->namelen));
1027
1028	bit_pos = de - ctx.page->nsl;
1029	for (i = 0; i < slots; i++)
1030		__clear_bit_le(bit_pos + i, &ctx.page->bitmap);
1031
1032	ipos = get_dentry_group_pos(ctx.bidx);
1033	size = cache_file_write(hmdfs_sb(d->d_sb), filp, ctx.page,
1034				sizeof(struct hmdfs_dentry_group), &ipos);
1035	if (size != sizeof(struct hmdfs_dentry_group))
1036		hmdfs_err("cache file write failed!, ret = %zd", size);
1037	hmdfs_unlock_file(filp, ipos, DENTRYGROUP_SIZE);
1038	kfree(ctx.page);
1039}
1040
1041static int hmdfs_get_cache_path(struct hmdfs_sb_info *sbi, struct path *dir)
1042{
1043	struct hmdfs_dentry_info *di = hmdfs_d(sbi->sb->s_root);
1044	int err;
1045
1046	if (!sbi->s_dentry_cache) {
1047		*dir = di->lower_path;
1048		return 0;
1049	}
1050
1051	err = kern_path(sbi->cache_dir, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, dir);
1052	if (err)
1053		hmdfs_err("open failed, errno = %d", err);
1054
1055	return err;
1056}
1057
1058static void hmdfs_put_cache_path(struct hmdfs_sb_info *sbi, struct path *dir)
1059{
1060	if (!sbi->s_dentry_cache)
1061		return;
1062	path_put(dir);
1063}
1064
1065struct file *create_local_dentry_file_cache(struct hmdfs_sb_info *sbi)
1066{
1067	struct file *filp = NULL;
1068	const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred);
1069	struct path cache_dir;
1070	int err;
1071
1072	err = hmdfs_get_cache_path(sbi, &cache_dir);
1073	if (err) {
1074		filp = ERR_PTR(err);
1075		goto out;
1076	}
1077
1078	filp = file_open_root(&cache_dir, ".",
1079			      O_RDWR | O_LARGEFILE | O_TMPFILE,
1080			      DENTRY_FILE_PERM);
1081	if (IS_ERR(filp))
1082		hmdfs_err("dentryfile open failed and exit err=%ld",
1083			  PTR_ERR(filp));
1084
1085	hmdfs_put_cache_path(sbi, &cache_dir);
1086out:
1087	hmdfs_revert_creds(old_cred);
1088	return filp;
1089}
1090
1091static int hmdfs_linkat(struct path *old_path, const char *newname)
1092{
1093	struct dentry *new_dentry = NULL;
1094	struct path new_path;
1095	int error;
1096
1097	new_dentry = kern_path_create(AT_FDCWD, newname, &new_path, 0);
1098	if (IS_ERR(new_dentry)) {
1099		hmdfs_err("create kernel path failed, error: %ld",
1100			  PTR_ERR(new_dentry));
1101		return PTR_ERR(new_dentry);
1102	}
1103
1104	error = -EXDEV;
1105	if (old_path->mnt != new_path.mnt)
1106		goto out_dput;
1107
1108	error = vfs_link(old_path->dentry, &nop_mnt_idmap, new_path.dentry->d_inode, new_dentry,
1109			 NULL);
1110
1111out_dput:
1112	done_path_create(&new_path, new_dentry);
1113	return error;
1114}
1115
1116static int cache_file_mkdir(const char *name, umode_t mode)
1117{
1118	struct dentry *dentry;
1119	struct path path;
1120	int err;
1121
1122	dentry = kern_path_create(AT_FDCWD, name, &path, LOOKUP_DIRECTORY);
1123	if (IS_ERR(dentry))
1124		return PTR_ERR(dentry);
1125
1126	err = vfs_mkdir(&nop_mnt_idmap, d_inode(path.dentry), dentry, mode);
1127	if (err && err != -EEXIST)
1128		hmdfs_err("vfs_mkdir failed, err = %d", err);
1129
1130	done_path_create(&path, dentry);
1131	return err;
1132}
1133
1134static int cache_file_create_path(const char *fullpath)
1135{
1136	char *path;
1137	char *s;
1138	int err = 0;
1139
1140	path = kstrdup(fullpath, GFP_KERNEL);
1141	if (!path)
1142		return -ENOMEM;
1143
1144	s = path + 1;
1145	while (true) {
1146		s = strchr(s, '/');
1147		if (!s)
1148			break;
1149		s[0] = '\0';
1150		err = cache_file_mkdir(path, 0755);
1151		if (err && err != -EEXIST)
1152			break;
1153		s[0] = '/';
1154		s++;
1155	}
1156	kfree(path);
1157	return err;
1158}
1159
1160static void hmdfs_cache_path_create(char *s, const char *dir, bool server)
1161{
1162	if (server)
1163		snprintf(s, PATH_MAX, "%s/dentry_cache/server/", dir);
1164	else
1165		snprintf(s, PATH_MAX, "%s/dentry_cache/client/", dir);
1166}
1167
1168static void concat_cachefile_name(char *s, uint64_t hash, const char *id,
1169				    bool server)
1170{
1171	int offset = strlen(s);
1172
1173	if (server)
1174		snprintf(s + offset, PATH_MAX - offset, "%016llx", hash);
1175	else
1176		snprintf(s + offset, PATH_MAX - offset, "%s_%016llx", id, hash);
1177}
1178
1179int cache_file_name_generate(char *fullname, struct hmdfs_peer *con,
1180			     const char *relative_path, bool server)
1181{
1182	struct hmdfs_sb_info *sbi = con->sbi;
1183	uint64_t  hash;
1184	char cid[HMDFS_CFN_CID_SIZE];
1185	int err;
1186
1187	hmdfs_cache_path_create(fullname, sbi->cache_dir, server);
1188
1189	err = cache_file_create_path(fullname);
1190	if (err && err != -EEXIST) {
1191		hmdfs_err("making dir failed %d", err);
1192		return err;
1193	}
1194
1195	strncpy(cid, con->cid, HMDFS_CFN_CID_SIZE - 1);
1196	cid[HMDFS_CFN_CID_SIZE - 1] = '\0';
1197
1198	hash = path_hash(relative_path, strlen(relative_path),
1199			 sbi->s_case_sensitive);
1200	concat_cachefile_name(fullname, hash, cid, server);
1201
1202	return 0;
1203}
1204
1205static void free_cfn(struct cache_file_node *cfn)
1206{
1207	if (!IS_ERR_OR_NULL(cfn->filp))
1208		filp_close(cfn->filp, NULL);
1209
1210	kfree(cfn->relative_path);
1211	kfree(cfn);
1212}
1213
1214static bool path_cmp(const char *path1, const char *path2, bool case_sensitive)
1215{
1216	int ret;
1217
1218	if (case_sensitive)
1219		ret = strcmp(path1, path2);
1220	else
1221		ret = strcasecmp(path1, path2);
1222
1223	return !ret;
1224}
1225
1226static bool dentry_file_match(struct cache_file_node *cfn, const char *id,
1227			      const char *path)
1228{
1229	return (path_cmp(cfn->relative_path, path, cfn->sbi->s_case_sensitive) &&
1230		!strncmp((cfn)->cid, id, HMDFS_CFN_CID_SIZE - 1));
1231}
1232
1233struct cache_file_node *__find_cfn(struct hmdfs_sb_info *sbi, const char *cid,
1234				   const char *path, bool server)
1235{
1236	struct cache_file_node *cfn = NULL;
1237	struct list_head *head = NULL;
1238
1239	head = get_list_head(sbi, server);
1240
1241	list_for_each_entry(cfn, head, list) {
1242		if (dentry_file_match(cfn, cid, path)) {
1243			refcount_inc(&cfn->ref);
1244			return cfn;
1245		}
1246	}
1247	return NULL;
1248}
1249
1250struct cache_file_node *create_cfn(struct hmdfs_sb_info *sbi, const char *path,
1251				   const char *cid, bool server)
1252{
1253	struct cache_file_node *cfn = kzalloc(sizeof(*cfn), GFP_KERNEL);
1254
1255	if (!cfn)
1256		return NULL;
1257
1258	cfn->relative_path = kstrdup(path, GFP_KERNEL);
1259	if (!cfn->relative_path)
1260		goto out;
1261
1262	refcount_set(&cfn->ref, 1);
1263	strncpy(cfn->cid, cid, HMDFS_CFN_CID_SIZE - 1);
1264	cfn->cid[HMDFS_CFN_CID_SIZE - 1] = '\0';
1265	cfn->sbi = sbi;
1266	cfn->server = server;
1267	return cfn;
1268out:
1269	free_cfn(cfn);
1270	return NULL;
1271}
1272
1273static struct file *insert_cfn(struct hmdfs_sb_info *sbi, const char *filename,
1274	       const char *path, const char *cid, bool server)
1275{
1276	const struct cred *old_cred = NULL;
1277	struct cache_file_node *cfn = NULL;
1278	struct cache_file_node *exist = NULL;
1279	struct list_head *head = NULL;
1280	struct file *filp = NULL;
1281
1282	cfn = create_cfn(sbi, path, cid, server);
1283	if (!cfn)
1284		return ERR_PTR(-ENOMEM);
1285
1286	old_cred = hmdfs_override_creds(sbi->system_cred);
1287	filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0);
1288	hmdfs_revert_creds(old_cred);
1289	if (IS_ERR(filp)) {
1290		hmdfs_err("open file failed, err=%ld", PTR_ERR(filp));
1291		goto out;
1292	}
1293
1294	head = get_list_head(sbi, server);
1295
1296	mutex_lock(&sbi->cache_list_lock);
1297	exist = __find_cfn(sbi, cid, path, server);
1298	if (!exist) {
1299		cfn->filp = filp;
1300		list_add_tail(&cfn->list, head);
1301	} else {
1302		mutex_unlock(&sbi->cache_list_lock);
1303		release_cfn(exist);
1304		filp_close(filp, NULL);
1305		filp = ERR_PTR(-EEXIST);
1306		goto out;
1307	}
1308	mutex_unlock(&sbi->cache_list_lock);
1309	return filp;
1310out:
1311	free_cfn(cfn);
1312	return filp;
1313}
1314
1315int hmdfs_rename_dentry(struct dentry *old_dentry, struct dentry *new_dentry,
1316			struct file *old_filp, struct file *new_filp)
1317{
1318	int ret;
1319	struct hmdfs_sb_info *sbi = hmdfs_sb(new_dentry->d_sb);
1320
1321	/*
1322	 * Try to delete first, because stale dentry might exist after
1323	 * coverwrite.
1324	 */
1325	hmdfs_delete_dentry(new_dentry, new_filp);
1326
1327	ret = create_dentry(new_dentry, d_inode(old_dentry), new_filp, sbi);
1328	if (ret) {
1329		hmdfs_err("create dentry failed!, err=%d", ret);
1330		return ret;
1331	}
1332
1333	hmdfs_delete_dentry(old_dentry, old_filp);
1334	return 0;
1335}
1336
1337/**
1338 * cache_file_persistent - link the tmpfile to the cache dir
1339 * @con:	the connection peer
1340 * @filp:	the file handler of the tmpfile
1341 * @relative_path: the relative path which the tmpfile belongs
1342 * @server:	server or client
1343 *
1344 * Return value: the new file handler of the persistent file if the
1345 * persistent operation succeed. Otherwise will return the original handler
1346 * of the tmpfile passed in, so that the caller does not have to check
1347 * the returned handler.
1348 *
1349 */
1350struct file *cache_file_persistent(struct hmdfs_peer *con, struct file *filp,
1351			   const char *relative_path, bool server)
1352{
1353	struct cache_file_node *cfn = NULL;
1354	char *fullname = NULL;
1355	char *cid = server ? HMDFS_SERVER_CID : (char *)con->cid;
1356	struct file *newf = NULL;
1357	int i = 0;
1358	int len;
1359	int err;
1360
1361	if (!con->sbi->s_dentry_cache)
1362		return filp;
1363
1364	cfn = find_cfn(con->sbi, cid, relative_path, server);
1365	if (cfn) {
1366		release_cfn(cfn);
1367		return filp;
1368	}
1369	fullname = kzalloc(PATH_MAX, GFP_KERNEL);
1370	if (!fullname)
1371		return filp;
1372
1373	err = cache_file_name_generate(fullname, con, relative_path, server);
1374	if (err)
1375		goto out;
1376
1377	err = __vfs_setxattr(&nop_mnt_idmap, file_dentry(filp), file_inode(filp),
1378			     DENTRY_FILE_XATTR_NAME, relative_path,
1379			     strlen(relative_path), 0);
1380	if (err) {
1381		hmdfs_err("setxattr for file failed, err=%d", err);
1382		goto out;
1383	}
1384
1385	len = strlen(fullname);
1386
1387	do {
1388		err = hmdfs_linkat(&filp->f_path, fullname);
1389		if (!err)
1390			break;
1391
1392		snprintf(fullname + len, PATH_MAX - len, "_%d", i);
1393	} while (i++ < DENTRY_FILE_NAME_RETRY);
1394
1395	if (err) {
1396		hmdfs_err("link for file failed, err=%d", err);
1397		goto out;
1398	}
1399
1400	newf = insert_cfn(con->sbi, fullname, relative_path, cid, server);
1401	if (!IS_ERR(newf))
1402		filp = newf;
1403out:
1404	kfree(fullname);
1405	return filp;
1406}
1407
1408int get_cloud_cache_file(struct dentry *dentry, struct hmdfs_sb_info *sbi)
1409{
1410	int ret;
1411	ssize_t res;
1412	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
1413	struct clearcache_item *item;
1414	struct file *filp = NULL;
1415	uint64_t  hash;
1416	char *relative_path = NULL;
1417	char *dirname = NULL;
1418	char *fullname = NULL;
1419	char *cache_file_name = NULL;
1420	char *kvalue = NULL;
1421
1422	item = hmdfs_find_cache_item(CLOUD_DEVICE, dentry);
1423	if (item) {
1424		kref_put(&item->ref, release_cache_item);
1425		return 0;
1426	}
1427
1428	relative_path = hmdfs_get_dentry_relative_path(dentry);
1429	if (unlikely(!relative_path)) {
1430		hmdfs_err("get relative path failed %d", -ENOMEM);
1431		ret = -ENOMEM;
1432		goto out;
1433	}
1434
1435	dirname = kzalloc(PATH_MAX, GFP_KERNEL);
1436	if (!dirname) {
1437		ret = -ENOMEM;
1438		goto out;
1439	}
1440
1441	cache_file_name = kzalloc(PATH_MAX, GFP_KERNEL);
1442	if (!cache_file_name) {
1443		ret = -ENOMEM;
1444		goto out;
1445	}
1446
1447	fullname = kzalloc(PATH_MAX, GFP_KERNEL);
1448	if (!fullname) {
1449		ret = -ENOMEM;
1450		goto out;
1451	}
1452
1453	kvalue = kzalloc(PATH_MAX, GFP_KERNEL);
1454	if (!kvalue) {
1455		ret = -ENOMEM;
1456		goto out;
1457	}
1458
1459	hash = path_hash(relative_path, strlen(relative_path),
1460			 sbi->s_case_sensitive);
1461	concat_cachefile_name(cache_file_name, hash, CLOUD_CID, false);
1462	snprintf(dirname, PATH_MAX, "%s/dentry_cache/cloud/",
1463		 sbi->cache_dir);
1464	snprintf(fullname, PATH_MAX, "%s%s", dirname, cache_file_name);
1465
1466	filp = filp_open(fullname, O_RDWR | O_LARGEFILE, 0);
1467	if (IS_ERR(filp)) {
1468		hmdfs_debug("open fail %ld", PTR_ERR(filp));
1469		ret = PTR_ERR(filp);
1470		goto out;
1471	}
1472
1473	res = __vfs_getxattr(file_dentry(filp), file_inode(filp),
1474			       DENTRY_FILE_XATTR_NAME, kvalue, PATH_MAX);
1475	if (res <= 0 || res >= PATH_MAX) {
1476		hmdfs_err("getxattr return: %zd", res);
1477		filp_close(filp, NULL);
1478		ret = -ENOENT;
1479		goto out;
1480	}
1481	kvalue[res] = '\0';
1482
1483	if (!path_cmp(relative_path, kvalue, sbi->s_case_sensitive)) {
1484		hmdfs_err("relative path from xattr do not match");
1485		filp_close(filp, NULL);
1486		ret = -ENOENT;
1487		goto out;
1488	}
1489
1490	mutex_lock(&d_info->cache_pull_lock);
1491	hmdfs_add_cache_list(CLOUD_DEVICE, dentry, filp);
1492	mutex_unlock(&d_info->cache_pull_lock);
1493
1494	ret = 0;
1495out:
1496	kfree(relative_path);
1497	kfree(dirname);
1498	kfree(fullname);
1499	kfree(cache_file_name);
1500	kfree(kvalue);
1501
1502	return ret;
1503}
1504
1505void __destroy_cfn(struct list_head *head)
1506{
1507	struct cache_file_node *cfn = NULL;
1508	struct cache_file_node *n = NULL;
1509
1510	list_for_each_entry_safe(cfn, n, head, list) {
1511		list_del_init(&cfn->list);
1512		release_cfn(cfn);
1513	}
1514}
1515
1516void hmdfs_cfn_destroy(struct hmdfs_sb_info *sbi)
1517{
1518	mutex_lock(&sbi->cache_list_lock);
1519	__destroy_cfn(&sbi->client_cache);
1520	__destroy_cfn(&sbi->server_cache);
1521	mutex_unlock(&sbi->cache_list_lock);
1522}
1523
1524struct cache_file_node *find_cfn(struct hmdfs_sb_info *sbi, const char *cid,
1525				 const char *path, bool server)
1526{
1527	struct cache_file_node *cfn = NULL;
1528
1529	mutex_lock(&sbi->cache_list_lock);
1530	cfn = __find_cfn(sbi, cid, path, server);
1531	mutex_unlock(&sbi->cache_list_lock);
1532	return cfn;
1533}
1534
1535void release_cfn(struct cache_file_node *cfn)
1536{
1537	if (refcount_dec_and_test(&cfn->ref))
1538		free_cfn(cfn);
1539}
1540
1541void remove_cfn(struct cache_file_node *cfn)
1542{
1543	struct hmdfs_sb_info *sbi = cfn->sbi;
1544	bool deleted;
1545
1546	mutex_lock(&sbi->cache_list_lock);
1547	deleted = list_empty(&cfn->list);
1548	if (!deleted)
1549		list_del_init(&cfn->list);
1550	mutex_unlock(&sbi->cache_list_lock);
1551	if (!deleted) {
1552		delete_dentry_file(cfn->filp);
1553		release_cfn(cfn);
1554	}
1555}
1556
1557int hmdfs_do_lock_file(struct file *filp, unsigned char fl_type, loff_t start,
1558		       loff_t len)
1559{
1560	struct file_lock fl;
1561	int err;
1562
1563	locks_init_lock(&fl);
1564
1565	fl.fl_type = fl_type;
1566	fl.fl_flags = FL_POSIX | FL_CLOSE | FL_SLEEP;
1567	fl.fl_start = start;
1568	fl.fl_end = start + len - 1;
1569	fl.fl_owner = filp;
1570	fl.fl_pid = current->tgid;
1571	fl.fl_file = filp;
1572	fl.fl_ops = NULL;
1573	fl.fl_lmops = NULL;
1574
1575	err = locks_lock_file_wait(filp, &fl);
1576	if (err)
1577		hmdfs_err("lock file wait failed: %d", err);
1578
1579	return err;
1580}
1581
1582int hmdfs_wlock_file(struct file *filp, loff_t start, loff_t len)
1583{
1584	return hmdfs_do_lock_file(filp, F_WRLCK, start, len);
1585}
1586
1587int hmdfs_rlock_file(struct file *filp, loff_t start, loff_t len)
1588{
1589	return hmdfs_do_lock_file(filp, F_RDLCK, start, len);
1590}
1591
1592int hmdfs_unlock_file(struct file *filp, loff_t start, loff_t len)
1593{
1594	return hmdfs_do_lock_file(filp, F_UNLCK, start, len);
1595}
1596
1597long cache_file_truncate(struct hmdfs_sb_info *sbi, const struct path *path,
1598			 loff_t length)
1599{
1600	const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred);
1601	long ret = vfs_truncate(path, length);
1602
1603	hmdfs_revert_creds(old_cred);
1604
1605	return ret;
1606}
1607
1608ssize_t cache_file_read(struct hmdfs_sb_info *sbi, struct file *filp, void *buf,
1609			size_t count, loff_t *pos)
1610{
1611	const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred);
1612	ssize_t ret = kernel_read(filp, buf, count, pos);
1613
1614	hmdfs_revert_creds(old_cred);
1615
1616	return ret;
1617}
1618
1619ssize_t cache_file_write(struct hmdfs_sb_info *sbi, struct file *filp,
1620			 const void *buf, size_t count, loff_t *pos)
1621{
1622	const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred);
1623	ssize_t ret = kernel_write(filp, buf, count, pos);
1624
1625	hmdfs_revert_creds(old_cred);
1626
1627	return ret;
1628}
1629
1630
1631int read_header(struct hmdfs_sb_info *sbi, struct file *filp,
1632		struct hmdfs_dcache_header *header)
1633{
1634	ssize_t bytes;
1635	loff_t pos = 0;
1636
1637	bytes = cache_file_read(sbi, filp, header, sizeof(*header), &pos);
1638	if (bytes != sizeof(*header)) {
1639		hmdfs_err("read file failed, err:%zd", bytes);
1640		return -EIO;
1641	}
1642
1643	return 0;
1644}
1645
1646static unsigned long long cache_get_dentry_count(struct hmdfs_sb_info *sbi,
1647						 struct file *filp)
1648{
1649	struct hmdfs_dcache_header header;
1650	int overallpage;
1651
1652	overallpage = get_dentry_group_cnt(file_inode(filp));
1653	if (overallpage == 0)
1654		return 0;
1655
1656	if (read_header(sbi, filp, &header))
1657		return 0;
1658
1659	return le64_to_cpu(header.num);
1660}
1661
1662static int cache_check_case_sensitive(struct hmdfs_sb_info *sbi,
1663				struct file *filp)
1664{
1665	struct hmdfs_dcache_header header;
1666
1667	if (read_header(sbi, filp, &header))
1668		return 0;
1669
1670	if (sbi->s_case_sensitive != (bool)header.case_sensitive) {
1671		hmdfs_info("Case sensitive inconsistent, current fs is: %d, cache is %d, will drop cache",
1672			   sbi->s_case_sensitive, header.case_sensitive);
1673		return 0;
1674	}
1675	return 1;
1676}
1677
1678int write_header(struct file *filp, struct hmdfs_dcache_header *header)
1679{
1680	loff_t pos = 0;
1681	ssize_t size;
1682
1683	size = kernel_write(filp, header, sizeof(*header), &pos);
1684	if (size != sizeof(*header)) {
1685		hmdfs_err("update dcache header failed %zd", size);
1686		return -EIO;
1687	}
1688
1689	return 0;
1690}
1691
1692void add_to_delete_list(struct hmdfs_sb_info *sbi, struct cache_file_node *cfn)
1693{
1694	mutex_lock(&sbi->cache_list_lock);
1695	list_add_tail(&cfn->list, &sbi->to_delete);
1696	mutex_unlock(&sbi->cache_list_lock);
1697}
1698
1699void load_cfn(struct hmdfs_sb_info *sbi, const char *fullname, const char *path,
1700	      const char *cid, bool server)
1701{
1702	struct cache_file_node *cfn = NULL;
1703	struct cache_file_node *cfn1 = NULL;
1704	struct list_head *head = NULL;
1705
1706	cfn = create_cfn(sbi, path, cid, server);
1707	if (!cfn)
1708		return;
1709
1710	cfn->filp = filp_open(fullname, O_RDWR | O_LARGEFILE, 0);
1711	if (IS_ERR(cfn->filp)) {
1712		hmdfs_err("open fail %ld", PTR_ERR(cfn->filp));
1713		goto out;
1714	}
1715
1716	if (cache_get_dentry_count(sbi, cfn->filp) < sbi->dcache_threshold && strcmp(cid, CLOUD_CID)) {
1717		add_to_delete_list(sbi, cfn);
1718		return;
1719	}
1720
1721	if (!cache_check_case_sensitive(sbi, cfn->filp) && strcmp(cid, CLOUD_CID)) {
1722		add_to_delete_list(sbi, cfn);
1723		return;
1724	}
1725
1726	head = get_list_head(sbi, server);
1727
1728	mutex_lock(&sbi->cache_list_lock);
1729	cfn1 = __find_cfn(sbi, cid, path, server);
1730	if (!cfn1) {
1731		list_add_tail(&cfn->list, head);
1732	} else {
1733		release_cfn(cfn1);
1734		mutex_unlock(&sbi->cache_list_lock);
1735		add_to_delete_list(sbi, cfn);
1736		return;
1737	}
1738	mutex_unlock(&sbi->cache_list_lock);
1739
1740	return;
1741out:
1742	free_cfn(cfn);
1743}
1744
1745static int get_cid_and_hash(const char *name, uint64_t *hash, char *cid)
1746{
1747	int len;
1748	char *p = strstr(name, "_");
1749
1750	if (!p)
1751		return -EINVAL;
1752
1753	len = p - name;
1754	if (len >= HMDFS_CFN_CID_SIZE)
1755		return -EINVAL;
1756
1757	memcpy(cid, name, len);
1758	cid[len] = '\0';
1759
1760	if (sscanf(++p, "%llx", hash) != 1)
1761		return -EINVAL;
1762	return 0;
1763}
1764
1765static void store_one(const char *name, struct cache_file_callback *cb)
1766{
1767	struct file *file = NULL;
1768	char *fullname = NULL;
1769	char *kvalue = NULL;
1770	char cid[HMDFS_CFN_CID_SIZE];
1771	uint64_t hash;
1772	ssize_t error;
1773
1774	if (strlen(name) + strlen(cb->dirname) >= PATH_MAX)
1775		return;
1776
1777	fullname = kzalloc(PATH_MAX, GFP_KERNEL);
1778	if (!fullname)
1779		return;
1780
1781	snprintf(fullname, PATH_MAX, "%s%s", cb->dirname, name);
1782
1783	file = filp_open(fullname, O_RDWR | O_LARGEFILE, 0);
1784	if (IS_ERR(file)) {
1785		hmdfs_err("open fail %ld", PTR_ERR(file));
1786		goto out;
1787	}
1788
1789	kvalue = kzalloc(PATH_MAX, GFP_KERNEL);
1790	if (!kvalue)
1791		goto out_file;
1792
1793	error = __vfs_getxattr(file_dentry(file), file_inode(file),
1794			       DENTRY_FILE_XATTR_NAME, kvalue, PATH_MAX);
1795	if (error <= 0 || error >= PATH_MAX) {
1796		hmdfs_err("getxattr return: %zd", error);
1797		goto out_kvalue;
1798	}
1799
1800	kvalue[error] = '\0';
1801	cid[0] = '\0';
1802
1803	if (!cb->server) {
1804		if (get_cid_and_hash(name, &hash, cid)) {
1805			hmdfs_err("get cid and hash fail");
1806			goto out_kvalue;
1807		}
1808	}
1809
1810	load_cfn(cb->sbi, fullname, kvalue, cid, cb->server);
1811
1812out_kvalue:
1813	kfree(kvalue);
1814out_file:
1815	filp_close(file, NULL);
1816out:
1817	kfree(fullname);
1818}
1819
1820static bool cache_file_iterate(struct dir_context *ctx, const char *name,
1821			      int name_len, loff_t offset, u64 ino,
1822			      unsigned int d_type)
1823{
1824	struct cache_file_item *cfi = NULL;
1825	struct cache_file_callback *cb =
1826			container_of(ctx, struct cache_file_callback, ctx);
1827
1828	if (name_len > NAME_MAX) {
1829		hmdfs_err("name_len:%d NAME_MAX:%u", name_len, NAME_MAX);
1830		return true;
1831	}
1832
1833	if (d_type != DT_REG)
1834		return true;
1835
1836	cfi = kmalloc(sizeof(*cfi), GFP_KERNEL);
1837	if (!cfi)
1838		return false;
1839
1840	cfi->name = kstrndup(name, name_len, GFP_KERNEL);
1841	if (!cfi->name) {
1842		kfree(cfi);
1843		return false;
1844	}
1845
1846	list_add_tail(&cfi->list, &cb->list);
1847
1848	return true;
1849}
1850
1851void hmdfs_do_load(struct hmdfs_sb_info *sbi, const char *fullname, bool server)
1852{
1853	struct file *file = NULL;
1854	struct path dirpath;
1855	int err;
1856	struct cache_file_item *cfi = NULL;
1857	struct cache_file_item *n = NULL;
1858	struct cache_file_callback cb = {
1859		.ctx.actor = cache_file_iterate,
1860		.ctx.pos = 0,
1861		.dirname = fullname,
1862		.sbi = sbi,
1863		.server = server,
1864	};
1865	INIT_LIST_HEAD(&cb.list);
1866
1867
1868	err = kern_path(fullname, LOOKUP_DIRECTORY, &dirpath);
1869	if (err) {
1870		hmdfs_info("No file path");
1871		return;
1872	}
1873
1874	file = dentry_open(&dirpath, O_RDONLY, current_cred());
1875	if (IS_ERR_OR_NULL(file)) {
1876		hmdfs_err("dentry_open failed, error: %ld", PTR_ERR(file));
1877		path_put(&dirpath);
1878		return;
1879	}
1880
1881	err = iterate_dir(file, &cb.ctx);
1882	if (err)
1883		hmdfs_err("iterate_dir failed, err: %d", err);
1884
1885	list_for_each_entry_safe(cfi, n, &cb.list, list) {
1886		store_one(cfi->name, &cb);
1887		list_del_init(&cfi->list);
1888		kfree(cfi->name);
1889		kfree(cfi);
1890	}
1891
1892	fput(file);
1893	path_put(&dirpath);
1894}
1895
1896/**
1897 * This function just used for delete dentryfile.dat
1898 */
1899int delete_dentry_file(struct file *filp)
1900{
1901	int err = 0;
1902	struct dentry *dentry = file_dentry(filp);
1903	struct dentry *parent = lock_parent(dentry);
1904
1905	if (dentry->d_parent == parent) {
1906		dget(dentry);
1907		err = vfs_unlink(&nop_mnt_idmap, d_inode(parent), dentry, NULL);
1908		dput(dentry);
1909	}
1910	unlock_dir(parent);
1911
1912	return err;
1913}
1914
1915void hmdfs_delete_useless_cfn(struct hmdfs_sb_info *sbi)
1916{
1917	struct cache_file_node *cfn = NULL;
1918	struct cache_file_node *n = NULL;
1919
1920	mutex_lock(&sbi->cache_list_lock);
1921
1922	list_for_each_entry_safe(cfn, n, &sbi->to_delete, list) {
1923		delete_dentry_file(cfn->filp);
1924		list_del_init(&cfn->list);
1925		release_cfn(cfn);
1926	}
1927	mutex_unlock(&sbi->cache_list_lock);
1928}
1929
1930void hmdfs_cfn_load(struct hmdfs_sb_info *sbi)
1931{
1932	char *fullname = NULL;
1933
1934	if (!sbi->s_dentry_cache)
1935		return;
1936
1937	fullname = kzalloc(PATH_MAX, GFP_KERNEL);
1938	if (!fullname)
1939		return;
1940
1941	snprintf(fullname, PATH_MAX, "%s/dentry_cache/client/",
1942		 sbi->cache_dir);
1943	hmdfs_do_load(sbi, fullname, false);
1944
1945	snprintf(fullname, PATH_MAX, "%s/dentry_cache/server/",
1946		 sbi->cache_dir);
1947	hmdfs_do_load(sbi, fullname, true);
1948
1949	kfree(fullname);
1950
1951	hmdfs_delete_useless_cfn(sbi);
1952}
1953
1954static void __cache_file_destroy_by_path(struct list_head *head,
1955					 const char *path)
1956{
1957	struct cache_file_node *cfn = NULL;
1958	struct cache_file_node *n = NULL;
1959
1960	list_for_each_entry_safe(cfn, n, head, list) {
1961		if (strcmp(path, cfn->relative_path) != 0)
1962			continue;
1963		list_del_init(&cfn->list);
1964		delete_dentry_file(cfn->filp);
1965		release_cfn(cfn);
1966	}
1967}
1968
1969static void cache_file_destroy_by_path(struct hmdfs_sb_info *sbi,
1970				       const char *path)
1971{
1972	mutex_lock(&sbi->cache_list_lock);
1973
1974	__cache_file_destroy_by_path(&sbi->server_cache, path);
1975	__cache_file_destroy_by_path(&sbi->client_cache, path);
1976
1977	mutex_unlock(&sbi->cache_list_lock);
1978}
1979
1980static void cache_file_find_and_delete(struct hmdfs_peer *con,
1981				       const char *relative_path)
1982{
1983	struct cache_file_node *cfn;
1984
1985	cfn = find_cfn(con->sbi, con->cid, relative_path, false);
1986	if (!cfn)
1987		return;
1988
1989	remove_cfn(cfn);
1990	release_cfn(cfn);
1991}
1992
1993void cache_file_delete_by_dentry(struct hmdfs_peer *con, struct dentry *dentry)
1994{
1995	char *relative_path = NULL;
1996
1997	relative_path = hmdfs_get_dentry_relative_path(dentry);
1998	if (unlikely(!relative_path)) {
1999		hmdfs_err("get relative path failed %d", -ENOMEM);
2000		return;
2001	}
2002	cache_file_find_and_delete(con, relative_path);
2003	kfree(relative_path);
2004}
2005
2006struct file *hmdfs_get_new_dentry_file(struct hmdfs_peer *con,
2007				       const char *relative_path,
2008				       struct hmdfs_dcache_header *header)
2009{
2010	struct hmdfs_sb_info *sbi = con->sbi;
2011	int len = strlen(relative_path);
2012	struct file *filp = NULL;
2013	int err;
2014
2015	filp = create_local_dentry_file_cache(sbi);
2016	if (IS_ERR(filp))
2017		return filp;
2018
2019	err = hmdfs_client_start_readdir(con, filp, relative_path, len, header);
2020	if (err) {
2021		if (err != -ENOENT)
2022			hmdfs_err("readdir failed dev: %llu err: %d",
2023				  con->device_id, err);
2024		fput(filp);
2025		filp = ERR_PTR(err);
2026	}
2027
2028	return filp;
2029}
2030
2031void add_cfn_to_item(struct dentry *dentry, struct hmdfs_peer *con,
2032		     struct cache_file_node *cfn)
2033{
2034	struct file *file = cfn->filp;
2035	int err;
2036
2037	err = hmdfs_add_cache_list(con->device_id, dentry, file);
2038	if (unlikely(err)) {
2039		hmdfs_err("add cache list failed devid:%llu err:%d",
2040			  con->device_id, err);
2041		return;
2042	}
2043}
2044
2045int hmdfs_add_file_to_cache(struct dentry *dentry, struct hmdfs_peer *con,
2046			    struct file *file, const char *relative_path)
2047{
2048	struct hmdfs_sb_info *sbi = con->sbi;
2049	struct file *newf = file;
2050
2051	if (cache_get_dentry_count(sbi, file) >= sbi->dcache_threshold)
2052		newf = cache_file_persistent(con, file, relative_path, false);
2053	else
2054		cache_file_find_and_delete(con, relative_path);
2055
2056	return hmdfs_add_cache_list(con->device_id, dentry, newf);
2057}
2058
2059static struct file *read_header_and_revalidate(struct hmdfs_peer *con,
2060					       struct file *filp,
2061					       const char *relative_path)
2062{
2063	struct hmdfs_dcache_header header;
2064	struct hmdfs_dcache_header *p = NULL;
2065
2066	if (read_header(con->sbi, filp, &header) == 0)
2067		p = &header;
2068
2069	return hmdfs_get_new_dentry_file(con, relative_path, p);
2070}
2071
2072void remote_file_revalidate_cfn(struct dentry *dentry, struct hmdfs_peer *con,
2073				struct cache_file_node *cfn,
2074				const char *relative_path)
2075{
2076	struct file *file = NULL;
2077	int err;
2078
2079	file = read_header_and_revalidate(con, cfn->filp, relative_path);
2080	if (IS_ERR(file))
2081		return;
2082
2083	/*
2084	 * If the request returned ok but file length is 0, we assume
2085	 * that the server verified the client cache file is uptodate.
2086	 */
2087	if (i_size_read(file->f_inode) == 0) {
2088		hmdfs_info("The cfn cache for dev:%llu is uptodate",
2089			    con->device_id);
2090		fput(file);
2091		add_cfn_to_item(dentry, con, cfn);
2092		return;
2093	}
2094
2095	/* OK, cfn is not uptodate, let's remove it and add the new file */
2096	remove_cfn(cfn);
2097
2098	err = hmdfs_add_file_to_cache(dentry, con, file, relative_path);
2099	if (unlikely(err))
2100		hmdfs_err("add cache list failed devid:%llu err:%d",
2101			  con->device_id, err);
2102	fput(file);
2103}
2104
2105void remote_file_revalidate_item(struct dentry *dentry, struct hmdfs_peer *con,
2106				 struct clearcache_item *item,
2107				 const char *relative_path)
2108{
2109	struct file *file = NULL;
2110	int err;
2111
2112	file = read_header_and_revalidate(con, item->filp, relative_path);
2113	if (IS_ERR(file))
2114		return;
2115
2116	/*
2117	 * If the request returned ok but file length is 0, we assume
2118	 * that the server verified the client cache file is uptodate.
2119	 */
2120	if (i_size_read(file->f_inode) == 0) {
2121		hmdfs_info("The item cache for dev:%llu is uptodate",
2122			    con->device_id);
2123		item->time = jiffies;
2124		fput(file);
2125		return;
2126	}
2127
2128	/* We need to replace the old item */
2129	remove_cache_item(item);
2130	cache_file_find_and_delete(con, relative_path);
2131
2132	err = hmdfs_add_file_to_cache(dentry, con, file, relative_path);
2133	if (unlikely(err))
2134		hmdfs_err("add cache list failed devid:%llu err:%d",
2135			  con->device_id, err);
2136	fput(file);
2137}
2138
2139bool get_remote_dentry_file(struct dentry *dentry, struct hmdfs_peer *con)
2140{
2141	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
2142	struct cache_file_node *cfn = NULL;
2143	struct hmdfs_sb_info *sbi = con->sbi;
2144	char *relative_path = NULL;
2145	int err = 0;
2146	struct file *filp = NULL;
2147	struct clearcache_item *item;
2148
2149	if (hmdfs_cache_revalidate(READ_ONCE(con->conn_time), con->device_id,
2150				   dentry))
2151		return false;
2152
2153	relative_path = hmdfs_get_dentry_relative_path(dentry);
2154	if (unlikely(!relative_path)) {
2155		hmdfs_err("get relative path failed %d", -ENOMEM);
2156		return false;
2157	}
2158	mutex_lock(&d_info->cache_pull_lock);
2159	if (hmdfs_cache_revalidate(READ_ONCE(con->conn_time), con->device_id,
2160				   dentry))
2161		goto out_unlock;
2162
2163	item = hmdfs_find_cache_item(con->device_id, dentry);
2164	if (item) {
2165		remote_file_revalidate_item(dentry, con, item, relative_path);
2166		kref_put(&item->ref, release_cache_item);
2167		goto out_unlock;
2168	}
2169
2170	cfn = find_cfn(sbi, con->cid, relative_path, false);
2171	if (cfn) {
2172		remote_file_revalidate_cfn(dentry, con, cfn, relative_path);
2173		release_cfn(cfn);
2174		goto out_unlock;
2175	}
2176
2177	filp = hmdfs_get_new_dentry_file(con, relative_path, NULL);
2178	if (IS_ERR(filp)) {
2179		err = PTR_ERR(filp);
2180		goto out_unlock;
2181	}
2182
2183	err = hmdfs_add_file_to_cache(dentry, con, filp, relative_path);
2184	if (unlikely(err))
2185		hmdfs_err("add cache list failed devid:%lu err:%d",
2186			  (unsigned long)con->device_id, err);
2187	fput(filp);
2188
2189out_unlock:
2190	mutex_unlock(&d_info->cache_pull_lock);
2191	if (err && err != -ENOENT)
2192		hmdfs_err("readdir failed dev:%lu err:%d",
2193			  (unsigned long)con->device_id, err);
2194	kfree(relative_path);
2195	return true;
2196}
2197
2198int hmdfs_file_type(const char *name)
2199{
2200	if (!name)
2201		return -EINVAL;
2202
2203	if (!strcmp(name, CURRENT_DIR) || !strcmp(name, PARENT_DIR))
2204		return HMDFS_TYPE_DOT;
2205
2206	return HMDFS_TYPE_COMMON;
2207}
2208
2209struct clearcache_item *hmdfs_find_cache_item(uint64_t dev_id,
2210					      struct dentry *dentry)
2211{
2212	struct clearcache_item *item = NULL;
2213	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
2214
2215	if (!d_info)
2216		return NULL;
2217
2218	spin_lock(&d_info->cache_list_lock);
2219	list_for_each_entry(item, &(d_info->cache_list_head), list) {
2220		if (dev_id == item->dev_id) {
2221			kref_get(&item->ref);
2222			spin_unlock(&d_info->cache_list_lock);
2223			return item;
2224		}
2225	}
2226	spin_unlock(&d_info->cache_list_lock);
2227	return NULL;
2228}
2229
2230bool hmdfs_cache_revalidate(unsigned long conn_time, uint64_t dev_id,
2231			    struct dentry *dentry)
2232{
2233	bool ret = false;
2234	struct clearcache_item *item = NULL;
2235	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
2236	unsigned int timeout;
2237
2238	if (!d_info)
2239		return ret;
2240
2241	timeout = hmdfs_sb(dentry->d_sb)->dcache_timeout;
2242	spin_lock(&d_info->cache_list_lock);
2243	list_for_each_entry(item, &(d_info->cache_list_head), list) {
2244		if (dev_id == item->dev_id) {
2245			ret = cache_item_revalidate(conn_time, item->time,
2246						    timeout);
2247			break;
2248		}
2249	}
2250	spin_unlock(&d_info->cache_list_lock);
2251	return ret;
2252}
2253
2254void remove_cache_item(struct clearcache_item *item)
2255{
2256	bool deleted;
2257
2258	spin_lock(&item->d_info->cache_list_lock);
2259	deleted = list_empty(&item->list);
2260	if (!deleted)
2261		list_del_init(&item->list);
2262	spin_unlock(&item->d_info->cache_list_lock);
2263	if (!deleted)
2264		kref_put(&item->ref, release_cache_item);
2265}
2266
2267void release_cache_item(struct kref *ref)
2268{
2269	struct clearcache_item *item =
2270		container_of(ref, struct clearcache_item, ref);
2271
2272	if (item->filp)
2273		fput(item->filp);
2274	kfree(item);
2275}
2276
2277void hmdfs_remove_cache_filp(struct hmdfs_peer *con, struct dentry *dentry)
2278{
2279	struct clearcache_item *item = NULL;
2280	struct clearcache_item *item_temp = NULL;
2281	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
2282	//	struct path *lower_path = NULL;
2283
2284	if (!d_info)
2285		return;
2286
2287	spin_lock(&d_info->cache_list_lock);
2288	list_for_each_entry_safe(item, item_temp, &(d_info->cache_list_head),
2289				  list) {
2290		if (con->device_id == item->dev_id) {
2291			list_del_init(&item->list);
2292			spin_unlock(&d_info->cache_list_lock);
2293			cache_file_delete_by_dentry(con, dentry);
2294			kref_put(&item->ref, release_cache_item);
2295			return;
2296		}
2297	}
2298	spin_unlock(&d_info->cache_list_lock);
2299}
2300
2301int hmdfs_add_cache_list(uint64_t dev_id, struct dentry *dentry,
2302			 struct file *filp)
2303{
2304	struct clearcache_item *item = NULL;
2305	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
2306
2307	if (!d_info)
2308		return -ENOMEM;
2309
2310	item = kzalloc(sizeof(*item), GFP_KERNEL);
2311	if (!item)
2312		return -ENOMEM;
2313
2314	item->dev_id = dev_id;
2315	item->filp = get_file(filp);
2316	item->time = jiffies;
2317	item->d_info = d_info;
2318	kref_init(&item->ref);
2319	spin_lock(&d_info->cache_list_lock);
2320	list_add_tail(&(item->list), &(d_info->cache_list_head));
2321	spin_unlock(&d_info->cache_list_lock);
2322	return 0;
2323}
2324
2325void hmdfs_add_remote_cache_list(struct hmdfs_peer *con, const char *dir_path)
2326{
2327	int err = 0;
2328	struct remotecache_item *item = NULL;
2329	struct remotecache_item *item_temp = NULL;
2330	struct path path, root_path;
2331	struct hmdfs_dentry_info *d_info = NULL;
2332
2333	err = kern_path(con->sbi->local_dst, 0, &root_path);
2334	if (err) {
2335		hmdfs_err("kern_path failed err = %d", err);
2336		return;
2337	}
2338
2339	err = vfs_path_lookup(root_path.dentry, root_path.mnt, dir_path, 0,
2340			      &path);
2341	if (err)
2342		goto out_put_root;
2343
2344	d_info = hmdfs_d(path.dentry);
2345	if (!d_info) {
2346		err = -EINVAL;
2347		goto out;
2348	}
2349
2350	/* find duplicate con */
2351	mutex_lock(&d_info->remote_cache_list_lock);
2352	list_for_each_entry_safe(item, item_temp,
2353				  &(d_info->remote_cache_list_head), list) {
2354		if (item->con->device_id == con->device_id) {
2355			mutex_unlock(&d_info->remote_cache_list_lock);
2356			goto out;
2357		}
2358	}
2359
2360	item = kzalloc(sizeof(*item), GFP_KERNEL);
2361	if (!item) {
2362		err = -ENOMEM;
2363		mutex_unlock(&d_info->remote_cache_list_lock);
2364		goto out;
2365	}
2366
2367	item->con = con;
2368	item->drop_flag = 0;
2369	list_add(&(item->list), &(d_info->remote_cache_list_head));
2370	mutex_unlock(&d_info->remote_cache_list_lock);
2371
2372out:
2373	path_put(&path);
2374out_put_root:
2375	path_put(&root_path);
2376}
2377
2378int hmdfs_drop_remote_cache_dents(struct dentry *dentry)
2379{
2380	struct path lower_path;
2381	struct inode *lower_inode = NULL;
2382	struct remotecache_item *item = NULL;
2383	struct remotecache_item *item_temp = NULL;
2384	struct hmdfs_dentry_info *d_info = NULL;
2385	char *relative_path = NULL;
2386
2387	if (!dentry) {
2388		hmdfs_err("dentry null and return");
2389		return 0;
2390	}
2391
2392	d_info = hmdfs_d(dentry);
2393	if (!d_info) {
2394		hmdfs_err("d_info null and return");
2395		return 0;
2396	}
2397	hmdfs_get_lower_path(dentry, &lower_path);
2398	if (IS_ERR_OR_NULL(lower_path.dentry)) {
2399		hmdfs_put_lower_path(&lower_path);
2400		return 0;
2401	}
2402	lower_inode = d_inode(lower_path.dentry);
2403	hmdfs_put_lower_path(&lower_path);
2404	if (IS_ERR_OR_NULL(lower_inode))
2405		return 0;
2406	/* only for directory */
2407	if (!S_ISDIR(lower_inode->i_mode))
2408		return 0;
2409
2410	relative_path = hmdfs_get_dentry_relative_path(dentry);
2411	if (!relative_path) {
2412		hmdfs_err("get dentry relative path failed");
2413		return 0;
2414	}
2415	mutex_lock(&d_info->remote_cache_list_lock);
2416	list_for_each_entry_safe(item, item_temp,
2417				  &(d_info->remote_cache_list_head), list) {
2418		if (item->drop_flag) {
2419			item->drop_flag = 0;
2420			continue;
2421		}
2422		mutex_unlock(&d_info->remote_cache_list_lock);
2423		hmdfs_send_drop_push(item->con, relative_path);
2424		mutex_lock(&d_info->remote_cache_list_lock);
2425		list_del(&item->list);
2426		kfree(item);
2427	}
2428	mutex_unlock(&d_info->remote_cache_list_lock);
2429
2430	kfree(relative_path);
2431	return 0;
2432}
2433
2434/* Clear the dentry cache files of target directory */
2435int hmdfs_clear_cache_dents(struct dentry *dentry, bool remove_cache)
2436{
2437	struct clearcache_item *item = NULL;
2438	struct clearcache_item *item_temp = NULL;
2439	struct hmdfs_dentry_info *d_info = hmdfs_d(dentry);
2440	char *path = NULL;
2441
2442	if (!d_info)
2443		return 0;
2444
2445	spin_lock(&d_info->cache_list_lock);
2446	list_for_each_entry_safe(item, item_temp, &(d_info->cache_list_head),
2447				  list) {
2448		list_del_init(&item->list);
2449		kref_put(&item->ref, release_cache_item);
2450	}
2451	spin_unlock(&d_info->cache_list_lock);
2452
2453	if (!remove_cache)
2454		return 0;
2455
2456	/* it also need confirm that there are no dentryfile_dev*
2457	 * under this dentry
2458	 */
2459	path = hmdfs_get_dentry_relative_path(dentry);
2460
2461	if (unlikely(!path)) {
2462		hmdfs_err("get relative path failed");
2463		return 0;
2464	}
2465
2466	cache_file_destroy_by_path(hmdfs_sb(dentry->d_sb), path);
2467
2468	kfree(path);
2469	return 0;
2470}
2471
2472void hmdfs_mark_drop_flag(uint64_t device_id, struct dentry *dentry)
2473{
2474	struct remotecache_item *item = NULL;
2475	struct hmdfs_dentry_info *d_info = NULL;
2476
2477	d_info = hmdfs_d(dentry);
2478	if (!d_info) {
2479		hmdfs_err("d_info null and return");
2480		return;
2481	}
2482
2483	mutex_lock(&d_info->remote_cache_list_lock);
2484	list_for_each_entry(item, &(d_info->remote_cache_list_head), list) {
2485		if (item->con->device_id == device_id) {
2486			item->drop_flag = 1;
2487			break;
2488		}
2489	}
2490	mutex_unlock(&d_info->remote_cache_list_lock);
2491}
2492
2493void hmdfs_clear_drop_flag(struct dentry *dentry)
2494{
2495	struct remotecache_item *item = NULL;
2496	struct hmdfs_dentry_info *d_info = NULL;
2497
2498	if (!dentry) {
2499		hmdfs_err("dentry null and return");
2500		return;
2501	}
2502
2503	d_info = hmdfs_d(dentry);
2504	if (!d_info) {
2505		hmdfs_err("d_info null and return");
2506		return;
2507	}
2508
2509	mutex_lock(&d_info->remote_cache_list_lock);
2510	list_for_each_entry(item, &(d_info->remote_cache_list_head), list) {
2511		if (item->drop_flag)
2512			item->drop_flag = 0;
2513	}
2514	mutex_unlock(&d_info->remote_cache_list_lock);
2515}
2516
2517#define DUSTBIN_SUFFIX ".hwbk"
2518static void hmdfs_rename_bak(struct dentry *dentry)
2519{
2520	struct path lower_path;
2521	struct dentry *lower_parent = NULL;
2522	struct dentry *lower_dentry = NULL;
2523	struct dentry *new_dentry = NULL;
2524	struct renamedata rename_data;
2525	char *name = NULL;
2526	int len = 0;
2527	int err = 0;
2528
2529	hmdfs_get_lower_path(dentry, &lower_path);
2530	lower_dentry = lower_path.dentry;
2531	len = strlen(lower_dentry->d_name.name) + strlen(DUSTBIN_SUFFIX) + 2;
2532	if (len >= NAME_MAX) {
2533		err = -ENAMETOOLONG;
2534		goto put_lower_path;
2535	}
2536
2537	name = kmalloc(len, GFP_KERNEL);
2538	if (!name) {
2539		err = -ENOMEM;
2540		goto put_lower_path;
2541	}
2542
2543	snprintf(name, len, ".%s%s", lower_dentry->d_name.name, DUSTBIN_SUFFIX);
2544	err = mnt_want_write(lower_path.mnt);
2545	if (err) {
2546		hmdfs_info("get write access failed, err %d", err);
2547		goto free_name;
2548	}
2549
2550	lower_parent = lock_parent(lower_dentry);
2551	new_dentry = lookup_one_len(name, lower_parent, strlen(name));
2552	if (IS_ERR(new_dentry)) {
2553		err = PTR_ERR(new_dentry);
2554		hmdfs_info("lookup new dentry failed, err %d", err);
2555		goto unlock_parent;
2556	}
2557
2558	rename_data.old_mnt_idmap  = &nop_mnt_idmap;
2559	rename_data.old_dir = d_inode(lower_parent);
2560	rename_data.old_dentry = lower_dentry;
2561	rename_data.new_mnt_idmap = &nop_mnt_idmap;
2562	rename_data.new_dir = d_inode(lower_parent);
2563	rename_data.new_dentry = new_dentry;
2564	rename_data.flags = 0;
2565	err = vfs_rename(&rename_data);
2566
2567	dput(new_dentry);
2568unlock_parent:
2569	unlock_dir(lower_parent);
2570	mnt_drop_write(lower_path.mnt);
2571free_name:
2572	kfree(name);
2573put_lower_path:
2574	hmdfs_put_lower_path(&lower_path);
2575
2576	if (err)
2577		hmdfs_err("failed to rename file, err %d", err);
2578}
2579
2580int hmdfs_root_unlink(uint64_t device_id, struct path *root_path,
2581		      const char *unlink_dir, const char *unlink_name)
2582{
2583	int err = 0;
2584	struct path path;
2585	struct dentry *child_dentry = NULL;
2586	struct inode *dir = NULL;
2587	struct inode *child_inode = NULL;
2588	kuid_t tmp_uid;
2589
2590	err = vfs_path_lookup(root_path->dentry, root_path->mnt,
2591			      unlink_dir, LOOKUP_DIRECTORY, &path);
2592	if (err) {
2593		hmdfs_err("found path failed err = %d", err);
2594		return err;
2595	}
2596	dir = d_inode(path.dentry);
2597	inode_lock_nested(dir, I_MUTEX_PARENT);
2598
2599	child_dentry = lookup_one_len(unlink_name, path.dentry,
2600				      strlen(unlink_name));
2601	if (IS_ERR(child_dentry)) {
2602		err = PTR_ERR(child_dentry);
2603		hmdfs_err("lookup_one_len failed, err = %d", err);
2604		goto unlock_out;
2605	}
2606	if (d_is_negative(child_dentry)) {
2607		err = -ENOENT;
2608		dput(child_dentry);
2609		goto unlock_out;
2610	}
2611	child_inode = d_inode(child_dentry);
2612	if (!child_inode)
2613		goto unlock_out;
2614
2615	tmp_uid = hmdfs_override_inode_uid(dir);
2616
2617	hmdfs_mark_drop_flag(device_id, path.dentry);
2618	ihold(child_inode);
2619	err = vfs_unlink(&nop_mnt_idmap, dir, child_dentry, NULL);
2620	/*
2621	 * -EOWNERDEAD means we want to put the file in a specail dir instead of
2622	 *  deleting it, specifically dustbin in phone, so that user can
2623	 *  recover the deleted images and videos.
2624	 */
2625	if (err == -EOWNERDEAD) {
2626		hmdfs_rename_bak(child_dentry);
2627		err = 0;
2628	}
2629	if (err)
2630		hmdfs_err("unlink path failed err = %d", err);
2631	hmdfs_revert_inode_uid(dir, tmp_uid);
2632	dput(child_dentry);
2633
2634unlock_out:
2635	inode_unlock(dir);
2636	if (child_inode)
2637		iput(child_inode);
2638	path_put(&path);
2639	return err;
2640}
2641
2642struct dentry *hmdfs_root_mkdir(uint64_t device_id, const char *local_dst_path,
2643				const char *mkdir_dir, const char *mkdir_name,
2644				umode_t mode)
2645{
2646	int err;
2647	struct path path;
2648	struct dentry *child_dentry = NULL;
2649	struct dentry *ret = NULL;
2650	char *mkdir_path = NULL;
2651	char *mkdir_abs_path = NULL;
2652
2653	mkdir_path = hmdfs_connect_path(mkdir_dir, mkdir_name);
2654	if (!mkdir_path)
2655		return ERR_PTR(-EACCES);
2656
2657	mkdir_abs_path =
2658		hmdfs_get_dentry_absolute_path(local_dst_path, mkdir_path);
2659	if (!mkdir_abs_path) {
2660		ret = ERR_PTR(-ENOMEM);
2661		goto out;
2662	}
2663
2664	child_dentry = kern_path_create(AT_FDCWD, mkdir_abs_path,
2665					&path, LOOKUP_DIRECTORY);
2666	if (IS_ERR(child_dentry)) {
2667		ret = child_dentry;
2668		goto out;
2669	}
2670
2671	hmdfs_mark_drop_flag(device_id, child_dentry->d_parent);
2672	err = vfs_mkdir(&nop_mnt_idmap, d_inode(path.dentry), child_dentry, mode);
2673	if (err) {
2674		hmdfs_err("mkdir failed! err=%d", err);
2675		ret = ERR_PTR(err);
2676		goto out_put;
2677	}
2678	ret = dget(child_dentry);
2679out_put:
2680	done_path_create(&path, child_dentry);
2681out:
2682	kfree(mkdir_path);
2683	kfree(mkdir_abs_path);
2684	return ret;
2685}
2686
2687struct dentry *hmdfs_root_create(uint64_t device_id, const char *local_dst_path,
2688				 const char *create_dir,
2689				 const char *create_name,
2690				 umode_t mode, bool want_excl)
2691{
2692	int err;
2693	struct path path;
2694	struct dentry *child_dentry = NULL;
2695	struct dentry *ret = NULL;
2696	char *create_path = NULL;
2697	char *create_abs_path = NULL;
2698
2699	create_path = hmdfs_connect_path(create_dir, create_name);
2700	if (!create_path)
2701		return ERR_PTR(-EACCES);
2702
2703	create_abs_path =
2704		hmdfs_get_dentry_absolute_path(local_dst_path, create_path);
2705	if (!create_abs_path) {
2706		ret = ERR_PTR(-ENOMEM);
2707		goto out;
2708	}
2709
2710	child_dentry = kern_path_create(AT_FDCWD, create_abs_path, &path, 0);
2711
2712	if (IS_ERR(child_dentry)) {
2713		ret = child_dentry;
2714		goto out;
2715	}
2716	hmdfs_mark_drop_flag(device_id, child_dentry->d_parent);
2717	err = vfs_create(&nop_mnt_idmap, d_inode(path.dentry), child_dentry, mode, want_excl);
2718	if (err) {
2719		hmdfs_err("path create failed! err=%d", err);
2720		ret = ERR_PTR(err);
2721		goto out_put;
2722	}
2723	ret = dget(child_dentry);
2724out_put:
2725	done_path_create(&path, child_dentry);
2726out:
2727	kfree(create_path);
2728	kfree(create_abs_path);
2729	return ret;
2730}
2731
2732int hmdfs_root_rmdir(uint64_t device_id, struct path *root_path,
2733		     const char *rmdir_dir, const char *rmdir_name)
2734{
2735	int err = 0;
2736	struct path path;
2737	struct dentry *child_dentry = NULL;
2738	struct inode *dir = NULL;
2739
2740	err = vfs_path_lookup(root_path->dentry, root_path->mnt,
2741			      rmdir_dir, LOOKUP_DIRECTORY, &path);
2742	if (err) {
2743		hmdfs_err("found path failed err = %d", err);
2744		return err;
2745	}
2746	dir = d_inode(path.dentry);
2747	inode_lock_nested(dir, I_MUTEX_PARENT);
2748
2749	child_dentry = lookup_one_len(rmdir_name, path.dentry,
2750				      strlen(rmdir_name));
2751	if (IS_ERR(child_dentry)) {
2752		err = PTR_ERR(child_dentry);
2753		hmdfs_err("lookup_one_len failed, err = %d", err);
2754		goto unlock_out;
2755	}
2756	if (d_is_negative(child_dentry)) {
2757		err = -ENOENT;
2758		dput(child_dentry);
2759		goto unlock_out;
2760	}
2761
2762	hmdfs_mark_drop_flag(device_id, path.dentry);
2763	err = vfs_rmdir(&nop_mnt_idmap, dir, child_dentry);
2764	if (err)
2765		hmdfs_err("rmdir failed err = %d", err);
2766	dput(child_dentry);
2767
2768unlock_out:
2769	inode_unlock(dir);
2770	path_put(&path);
2771	return err;
2772}
2773
2774int hmdfs_root_rename(struct hmdfs_sb_info *sbi, uint64_t device_id,
2775		      const char *oldpath, const char *oldname,
2776		      const char *newpath, const char *newname,
2777		      unsigned int flags)
2778{
2779	int err = 0;
2780	struct path path_dst;
2781	struct path path_old;
2782	struct path path_new;
2783	struct dentry *trap = NULL;
2784	struct dentry *old_dentry = NULL;
2785	struct dentry *new_dentry = NULL;
2786	struct renamedata rename_data;
2787
2788	err = kern_path(sbi->local_dst, 0, &path_dst);
2789	if (err) {
2790		hmdfs_err("kern_path for local dst failed %d", err);
2791		return err;
2792	}
2793
2794	err = vfs_path_lookup(path_dst.dentry, path_dst.mnt, oldpath, 0,
2795			      &path_old);
2796	if (err) {
2797		hmdfs_info("lookup oldpath from local_dst failed, err %d", err);
2798		goto put_path_dst;
2799	}
2800
2801	err = vfs_path_lookup(path_dst.dentry, path_dst.mnt, newpath, 0,
2802			      &path_new);
2803	if (err) {
2804		hmdfs_info("lookup newpath from local_dst failed, err %d", err);
2805		goto put_path_old;
2806	}
2807
2808	err = mnt_want_write(path_dst.mnt);
2809	if (err) {
2810		hmdfs_info("get write access failed for local_dst, err %d",
2811			   err);
2812		goto put_path_new;
2813	}
2814
2815	trap = lock_rename(path_new.dentry, path_old.dentry);
2816
2817	old_dentry = lookup_one_len(oldname, path_old.dentry, strlen(oldname));
2818	if (IS_ERR(old_dentry)) {
2819		err = PTR_ERR(old_dentry);
2820		hmdfs_info("lookup old dentry failed, err %d", err);
2821		goto unlock;
2822	}
2823
2824	/* source should not be ancestor of target */
2825	if (old_dentry == trap) {
2826		err = -EINVAL;
2827		goto put_old_dentry;
2828	}
2829
2830	new_dentry = lookup_one_len(newname, path_new.dentry, strlen(newname));
2831	if (IS_ERR(new_dentry)) {
2832		err = PTR_ERR(new_dentry);
2833		hmdfs_info("lookup new dentry failed, err %d", err);
2834		goto put_old_dentry;
2835	}
2836
2837	/*
2838	 * Exchange rename is not supported, thus target should not be an
2839	 * ancestor of source.
2840	 */
2841	if (trap == new_dentry) {
2842		err = -ENOTEMPTY;
2843		goto put_new_dentry;
2844	}
2845
2846	if (d_is_positive(new_dentry) && (flags & RENAME_NOREPLACE)) {
2847		err = -EEXIST;
2848		goto put_new_dentry;
2849	}
2850
2851	hmdfs_mark_drop_flag(device_id, path_old.dentry);
2852	if (path_old.dentry != path_new.dentry)
2853		hmdfs_mark_drop_flag(device_id, path_new.dentry);
2854
2855	rename_data.old_mnt_idmap = &nop_mnt_idmap;
2856	rename_data.old_dir = d_inode(path_old.dentry);
2857	rename_data.old_dentry = old_dentry;
2858	rename_data.new_mnt_idmap = &nop_mnt_idmap;
2859	rename_data.new_dir = d_inode(path_new.dentry);
2860	rename_data.new_dentry = new_dentry;
2861	rename_data.flags = flags;
2862	err = vfs_rename(&rename_data);
2863
2864put_new_dentry:
2865	dput(new_dentry);
2866put_old_dentry:
2867	dput(old_dentry);
2868unlock:
2869	unlock_rename(path_new.dentry, path_old.dentry);
2870	mnt_drop_write(path_dst.mnt);
2871put_path_new:
2872	path_put(&path_new);
2873put_path_old:
2874	path_put(&path_old);
2875put_path_dst:
2876	path_put(&path_dst);
2877
2878	return err;
2879}
2880
2881int hmdfs_get_path_in_sb(struct super_block *sb, const char *name,
2882			 unsigned int flags, struct path *path)
2883{
2884	int err;
2885
2886	err = kern_path(name, flags, path);
2887	if (err) {
2888		hmdfs_err("can't get %s %d\n", name, err);
2889		return err;
2890	}
2891
2892	/* should ensure the path is belong sb */
2893	if (path->dentry->d_sb != sb) {
2894		err = -EINVAL;
2895		hmdfs_err("Wrong sb: %s on %s", name,
2896			  path->dentry->d_sb->s_type->name);
2897		path_put(path);
2898	}
2899
2900	return err;
2901}
2902