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