dir.c 28.9 KB
Newer Older
C
Chao Yu 已提交
1
// SPDX-License-Identifier: GPL-2.0
J
Jaegeuk Kim 已提交
2
/*
J
Jaegeuk Kim 已提交
3 4 5 6 7 8 9
 * fs/f2fs/dir.c
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *             http://www.samsung.com/
 */
#include <linux/fs.h>
#include <linux/f2fs_fs.h>
C
Chao Yu 已提交
10
#include <linux/sched/signal.h>
11
#include <linux/unicode.h>
J
Jaegeuk Kim 已提交
12
#include "f2fs.h"
13
#include "node.h"
J
Jaegeuk Kim 已提交
14
#include "acl.h"
15
#include "xattr.h"
C
Chao Yu 已提交
16
#include <trace/events/f2fs.h>
J
Jaegeuk Kim 已提交
17 18 19

static unsigned long dir_blocks(struct inode *inode)
{
20 21
	return ((unsigned long long) (i_size_read(inode) + PAGE_SIZE - 1))
							>> PAGE_SHIFT;
J
Jaegeuk Kim 已提交
22 23
}

24
static unsigned int dir_buckets(unsigned int level, int dir_level)
J
Jaegeuk Kim 已提交
25
{
26
	if (level + dir_level < MAX_DIR_HASH_DEPTH / 2)
27
		return 1 << (level + dir_level);
J
Jaegeuk Kim 已提交
28
	else
29
		return MAX_DIR_BUCKETS;
J
Jaegeuk Kim 已提交
30 31 32 33 34 35 36 37 38 39
}

static unsigned int bucket_blocks(unsigned int level)
{
	if (level < MAX_DIR_HASH_DEPTH / 2)
		return 2;
	else
		return 4;
}

C
Chao Yu 已提交
40
static unsigned char f2fs_filetype_table[F2FS_FT_MAX] = {
J
Jaegeuk Kim 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
	[F2FS_FT_UNKNOWN]	= DT_UNKNOWN,
	[F2FS_FT_REG_FILE]	= DT_REG,
	[F2FS_FT_DIR]		= DT_DIR,
	[F2FS_FT_CHRDEV]	= DT_CHR,
	[F2FS_FT_BLKDEV]	= DT_BLK,
	[F2FS_FT_FIFO]		= DT_FIFO,
	[F2FS_FT_SOCK]		= DT_SOCK,
	[F2FS_FT_SYMLINK]	= DT_LNK,
};

static unsigned char f2fs_type_by_mode[S_IFMT >> S_SHIFT] = {
	[S_IFREG >> S_SHIFT]	= F2FS_FT_REG_FILE,
	[S_IFDIR >> S_SHIFT]	= F2FS_FT_DIR,
	[S_IFCHR >> S_SHIFT]	= F2FS_FT_CHRDEV,
	[S_IFBLK >> S_SHIFT]	= F2FS_FT_BLKDEV,
	[S_IFIFO >> S_SHIFT]	= F2FS_FT_FIFO,
	[S_IFSOCK >> S_SHIFT]	= F2FS_FT_SOCK,
	[S_IFLNK >> S_SHIFT]	= F2FS_FT_SYMLINK,
};

C
Chao Yu 已提交
61
static void set_de_type(struct f2fs_dir_entry *de, umode_t mode)
J
Jaegeuk Kim 已提交
62 63 64 65
{
	de->file_type = f2fs_type_by_mode[(mode & S_IFMT) >> S_SHIFT];
}

C
Chao Yu 已提交
66
unsigned char f2fs_get_de_type(struct f2fs_dir_entry *de)
67 68 69 70 71 72
{
	if (de->file_type < F2FS_FT_MAX)
		return f2fs_filetype_table[de->file_type];
	return DT_UNKNOWN;
}

E
Eric Biggers 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
/* If @dir is casefolded, initialize @fname->cf_name from @fname->usr_fname. */
int f2fs_init_casefolded_name(const struct inode *dir,
			      struct f2fs_filename *fname)
{
#ifdef CONFIG_UNICODE
	struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);

	if (IS_CASEFOLDED(dir)) {
		fname->cf_name.name = f2fs_kmalloc(sbi, F2FS_NAME_LEN,
						   GFP_NOFS);
		if (!fname->cf_name.name)
			return -ENOMEM;
		fname->cf_name.len = utf8_casefold(sbi->s_encoding,
						   fname->usr_fname,
						   fname->cf_name.name,
						   F2FS_NAME_LEN);
		if ((int)fname->cf_name.len <= 0) {
			kfree(fname->cf_name.name);
			fname->cf_name.name = NULL;
			if (f2fs_has_strict_mode(sbi))
				return -EINVAL;
			/* fall back to treating name as opaque byte sequence */
		}
	}
#endif
	return 0;
}

static int __f2fs_setup_filename(const struct inode *dir,
				 const struct fscrypt_name *crypt_name,
				 struct f2fs_filename *fname)
{
	int err;

	memset(fname, 0, sizeof(*fname));

	fname->usr_fname = crypt_name->usr_fname;
	fname->disk_name = crypt_name->disk_name;
#ifdef CONFIG_FS_ENCRYPTION
	fname->crypto_buf = crypt_name->crypto_buf;
#endif
	if (crypt_name->is_ciphertext_name) {
		/* hash was decoded from the no-key name */
		fname->hash = cpu_to_le32(crypt_name->hash);
	} else {
		err = f2fs_init_casefolded_name(dir, fname);
		if (err) {
			f2fs_free_filename(fname);
			return err;
		}
		f2fs_hash_filename(dir, fname);
	}
	return 0;
}

/*
 * Prepare to search for @iname in @dir.  This is similar to
 * fscrypt_setup_filename(), but this also handles computing the casefolded name
 * and the f2fs dirhash if needed, then packing all the information about this
 * filename up into a 'struct f2fs_filename'.
 */
int f2fs_setup_filename(struct inode *dir, const struct qstr *iname,
			int lookup, struct f2fs_filename *fname)
{
	struct fscrypt_name crypt_name;
	int err;

	err = fscrypt_setup_filename(dir, iname, lookup, &crypt_name);
	if (err)
		return err;

	return __f2fs_setup_filename(dir, &crypt_name, fname);
}

/*
 * Prepare to look up @dentry in @dir.  This is similar to
 * fscrypt_prepare_lookup(), but this also handles computing the casefolded name
 * and the f2fs dirhash if needed, then packing all the information about this
 * filename up into a 'struct f2fs_filename'.
 */
int f2fs_prepare_lookup(struct inode *dir, struct dentry *dentry,
			struct f2fs_filename *fname)
{
	struct fscrypt_name crypt_name;
	int err;

	err = fscrypt_prepare_lookup(dir, dentry, &crypt_name);
	if (err)
		return err;

	return __f2fs_setup_filename(dir, &crypt_name, fname);
}

void f2fs_free_filename(struct f2fs_filename *fname)
{
#ifdef CONFIG_FS_ENCRYPTION
	kfree(fname->crypto_buf.name);
	fname->crypto_buf.name = NULL;
#endif
#ifdef CONFIG_UNICODE
	kfree(fname->cf_name.name);
	fname->cf_name.name = NULL;
#endif
}

178 179
static unsigned long dir_block_index(unsigned int level,
				int dir_level, unsigned int idx)
J
Jaegeuk Kim 已提交
180 181 182 183 184
{
	unsigned long i;
	unsigned long bidx = 0;

	for (i = 0; i < level; i++)
185
		bidx += dir_buckets(i, dir_level) * bucket_blocks(i);
J
Jaegeuk Kim 已提交
186 187 188 189
	bidx += idx * bucket_blocks(level);
	return bidx;
}

190 191
static struct f2fs_dir_entry *find_in_block(struct inode *dir,
				struct page *dentry_page,
E
Eric Biggers 已提交
192
				const struct f2fs_filename *fname,
193
				int *max_slots,
194 195 196 197
				struct page **res_page)
{
	struct f2fs_dentry_block *dentry_blk;
	struct f2fs_dir_entry *de;
198
	struct f2fs_dentry_ptr d;
199

200
	dentry_blk = (struct f2fs_dentry_block *)page_address(dentry_page);
201

202
	make_dentry_ptr_block(dir, &d, dentry_blk);
E
Eric Biggers 已提交
203
	de = f2fs_find_target_dentry(&d, fname, max_slots);
204 205 206 207 208 209
	if (de)
		*res_page = dentry_page;

	return de;
}

210 211 212 213 214
#ifdef CONFIG_UNICODE
/*
 * Test whether a case-insensitive directory entry matches the filename
 * being searched for.
 */
215
static bool f2fs_match_ci_name(const struct inode *dir, const struct qstr *name,
E
Eric Biggers 已提交
216
			       const u8 *de_name, u32 de_name_len)
217
{
218
	const struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
219
	const struct unicode_map *um = sbi->s_encoding;
E
Eric Biggers 已提交
220
	struct qstr entry = QSTR_INIT(de_name, de_name_len);
221
	int res;
222

E
Eric Biggers 已提交
223
	res = utf8_strncasecmp_folded(um, name, &entry);
224 225 226 227
	if (res < 0) {
		/*
		 * In strict mode, ignore invalid names.  In non-strict mode,
		 * fall back to treating them as opaque byte sequences.
228
		 */
E
Eric Biggers 已提交
229
		if (f2fs_has_strict_mode(sbi) || name->len != entry.len)
230
			return false;
E
Eric Biggers 已提交
231
		return !memcmp(name->name, entry.name, name->len);
232
	}
233
	return res == 0;
234
}
E
Eric Biggers 已提交
235
#endif /* CONFIG_UNICODE */
236

E
Eric Biggers 已提交
237 238 239
static inline bool f2fs_match_name(const struct inode *dir,
				   const struct f2fs_filename *fname,
				   const u8 *de_name, u32 de_name_len)
240
{
E
Eric Biggers 已提交
241
	struct fscrypt_name f;
242

243
#ifdef CONFIG_UNICODE
E
Eric Biggers 已提交
244 245
	if (fname->cf_name.name) {
		struct qstr cf = FSTR_TO_QSTR(&fname->cf_name);
246

E
Eric Biggers 已提交
247
		return f2fs_match_ci_name(dir, &cf, de_name, de_name_len);
248
	}
249
#endif
E
Eric Biggers 已提交
250 251 252 253 254 255
	f.usr_fname = fname->usr_fname;
	f.disk_name = fname->disk_name;
#ifdef CONFIG_FS_ENCRYPTION
	f.crypto_buf = fname->crypto_buf;
#endif
	return fscrypt_match_name(&f, de_name, de_name_len);
256 257
}

E
Eric Biggers 已提交
258 259
struct f2fs_dir_entry *f2fs_find_target_dentry(const struct f2fs_dentry_ptr *d,
			const struct f2fs_filename *fname, int *max_slots)
J
Jaegeuk Kim 已提交
260 261
{
	struct f2fs_dir_entry *de;
262 263
	unsigned long bit_pos = 0;
	int max_len = 0;
J
Jaegeuk Kim 已提交
264

265 266 267 268
	if (max_slots)
		*max_slots = 0;
	while (bit_pos < d->max) {
		if (!test_bit_le(bit_pos, d->bitmap)) {
269
			bit_pos++;
270
			max_len++;
271 272
			continue;
		}
273

274
		de = &d->dentry[bit_pos];
275

276 277 278 279 280
		if (unlikely(!de->name_len)) {
			bit_pos++;
			continue;
		}

E
Eric Biggers 已提交
281 282 283
		if (de->hash_code == fname->hash &&
		    f2fs_match_name(d->inode, fname, d->filename[bit_pos],
				    le16_to_cpu(de->name_len)))
284
			goto found;
285

286
		if (max_slots && max_len > *max_slots)
287
			*max_slots = max_len;
288
		max_len = 0;
289

290
		bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
J
Jaegeuk Kim 已提交
291 292 293 294
	}

	de = NULL;
found:
295
	if (max_slots && max_len > *max_slots)
296
		*max_slots = max_len;
J
Jaegeuk Kim 已提交
297 298 299 300
	return de;
}

static struct f2fs_dir_entry *find_in_level(struct inode *dir,
301
					unsigned int level,
E
Eric Biggers 已提交
302
					const struct f2fs_filename *fname,
303
					struct page **res_page)
J
Jaegeuk Kim 已提交
304
{
E
Eric Biggers 已提交
305
	int s = GET_DENTRY_SLOTS(fname->disk_name.len);
J
Jaegeuk Kim 已提交
306 307 308 309 310
	unsigned int nbucket, nblock;
	unsigned int bidx, end_block;
	struct page *dentry_page;
	struct f2fs_dir_entry *de = NULL;
	bool room = false;
311
	int max_slots;
J
Jaegeuk Kim 已提交
312

313
	nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level);
J
Jaegeuk Kim 已提交
314 315
	nblock = bucket_blocks(level);

316
	bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level,
E
Eric Biggers 已提交
317
			       le32_to_cpu(fname->hash) % nbucket);
J
Jaegeuk Kim 已提交
318 319 320 321
	end_block = bidx + nblock;

	for (; bidx < end_block; bidx++) {
		/* no need to allocate new dentry pages to all the indices */
C
Chao Yu 已提交
322
		dentry_page = f2fs_find_data_page(dir, bidx);
J
Jaegeuk Kim 已提交
323
		if (IS_ERR(dentry_page)) {
324 325 326 327 328 329 330
			if (PTR_ERR(dentry_page) == -ENOENT) {
				room = true;
				continue;
			} else {
				*res_page = dentry_page;
				break;
			}
J
Jaegeuk Kim 已提交
331 332
		}

E
Eric Biggers 已提交
333 334
		de = find_in_block(dir, dentry_page, fname, &max_slots,
				   res_page);
J
Jaegeuk Kim 已提交
335 336 337 338 339 340 341 342
		if (de)
			break;

		if (max_slots >= s)
			room = true;
		f2fs_put_page(dentry_page, 0);
	}

E
Eric Biggers 已提交
343 344
	if (!de && room && F2FS_I(dir)->chash != fname->hash) {
		F2FS_I(dir)->chash = fname->hash;
345
		F2FS_I(dir)->clevel = level;
J
Jaegeuk Kim 已提交
346 347 348 349 350
	}

	return de;
}

351
struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
E
Eric Biggers 已提交
352 353
					 const struct f2fs_filename *fname,
					 struct page **res_page)
J
Jaegeuk Kim 已提交
354 355 356 357 358
{
	unsigned long npages = dir_blocks(dir);
	struct f2fs_dir_entry *de = NULL;
	unsigned int max_depth;
	unsigned int level;
359 360

	if (f2fs_has_inline_dentry(dir)) {
361
		*res_page = NULL;
C
Chao Yu 已提交
362
		de = f2fs_find_in_inline_dir(dir, fname, res_page);
363 364
		goto out;
	}
C
Chao Yu 已提交
365

366 367
	if (npages == 0) {
		*res_page = NULL;
368
		goto out;
369
	}
J
Jaegeuk Kim 已提交
370 371

	max_depth = F2FS_I(dir)->i_current_depth;
372
	if (unlikely(max_depth > MAX_DIR_HASH_DEPTH)) {
373 374
		f2fs_warn(F2FS_I_SB(dir), "Corrupted max_depth of %lu: %u",
			  dir->i_ino, max_depth);
375
		max_depth = MAX_DIR_HASH_DEPTH;
376
		f2fs_i_depth_write(dir, max_depth);
377
	}
J
Jaegeuk Kim 已提交
378 379

	for (level = 0; level < max_depth; level++) {
380
		*res_page = NULL;
381
		de = find_in_level(dir, level, fname, res_page);
382
		if (de || IS_ERR(*res_page))
J
Jaegeuk Kim 已提交
383 384
			break;
	}
385
out:
386 387 388
	/* This is to increase the speed of f2fs_create */
	if (!de)
		F2FS_I(dir)->task = current;
389 390 391 392 393 394 395 396 397 398 399 400 401
	return de;
}

/*
 * Find an entry in the specified directory with the wanted name.
 * It returns the page where the entry was found (as a parameter - res_page),
 * and the entry itself. Page is returned mapped and unlocked.
 * Entry is guaranteed to be valid.
 */
struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
			const struct qstr *child, struct page **res_page)
{
	struct f2fs_dir_entry *de = NULL;
E
Eric Biggers 已提交
402
	struct f2fs_filename fname;
403 404
	int err;

E
Eric Biggers 已提交
405
	err = f2fs_setup_filename(dir, child, 1, &fname);
406
	if (err) {
407 408 409 410
		if (err == -ENOENT)
			*res_page = NULL;
		else
			*res_page = ERR_PTR(err);
411 412 413 414 415
		return NULL;
	}

	de = __f2fs_find_entry(dir, &fname, res_page);

E
Eric Biggers 已提交
416
	f2fs_free_filename(&fname);
J
Jaegeuk Kim 已提交
417 418 419 420 421
	return de;
}

struct f2fs_dir_entry *f2fs_parent_dir(struct inode *dir, struct page **p)
{
S
Sheng Yong 已提交
422
	struct qstr dotdot = QSTR_INIT("..", 2);
C
Chao Yu 已提交
423

S
Sheng Yong 已提交
424
	return f2fs_find_entry(dir, &dotdot, p);
J
Jaegeuk Kim 已提交
425 426
}

427
ino_t f2fs_inode_by_name(struct inode *dir, const struct qstr *qstr,
428
							struct page **page)
J
Jaegeuk Kim 已提交
429 430 431 432
{
	ino_t res = 0;
	struct f2fs_dir_entry *de;

433
	de = f2fs_find_entry(dir, qstr, page);
J
Jaegeuk Kim 已提交
434 435
	if (de) {
		res = le32_to_cpu(de->ino);
436
		f2fs_put_page(*page, 0);
J
Jaegeuk Kim 已提交
437 438 439 440 441 442 443 444
	}

	return res;
}

void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
		struct page *page, struct inode *inode)
{
J
Jaegeuk Kim 已提交
445
	enum page_type type = f2fs_has_inline_dentry(dir) ? NODE : DATA;
J
Jaegeuk Kim 已提交
446
	lock_page(page);
447
	f2fs_wait_on_page_writeback(page, type, true, true);
J
Jaegeuk Kim 已提交
448
	de->ino = cpu_to_le32(inode->i_ino);
449
	set_de_type(de, inode->i_mode);
J
Jaegeuk Kim 已提交
450
	set_page_dirty(page);
451

452
	dir->i_mtime = dir->i_ctime = current_time(dir);
453
	f2fs_mark_inode_dirty_sync(dir, false);
J
Jaegeuk Kim 已提交
454 455 456
	f2fs_put_page(page, 1);
}

E
Eric Biggers 已提交
457 458
static void init_dent_inode(const struct f2fs_filename *fname,
			    struct page *ipage)
J
Jaegeuk Kim 已提交
459
{
460
	struct f2fs_inode *ri;
J
Jaegeuk Kim 已提交
461

462
	f2fs_wait_on_page_writeback(ipage, NODE, true, true);
463

464
	/* copy name info. to this inode page */
465
	ri = F2FS_INODE(ipage);
E
Eric Biggers 已提交
466 467
	ri->i_namelen = cpu_to_le32(fname->disk_name.len);
	memcpy(ri->i_name, fname->disk_name.name, fname->disk_name.len);
J
Jaegeuk Kim 已提交
468 469 470
	set_page_dirty(ipage);
}

C
Chao Yu 已提交
471
void f2fs_do_make_empty_dir(struct inode *inode, struct inode *parent,
472 473
					struct f2fs_dentry_ptr *d)
{
E
Eric Biggers 已提交
474 475
	struct fscrypt_str dot = FSTR_INIT(".", 1);
	struct fscrypt_str dotdot = FSTR_INIT("..", 2);
476

477 478
	/* update dirent of "." */
	f2fs_update_dentry(inode->i_ino, inode->i_mode, d, &dot, 0, 0);
479

480 481
	/* update dirent of ".." */
	f2fs_update_dentry(parent->i_ino, parent->i_mode, d, &dotdot, 0, 1);
482 483
}

484 485
static int make_empty_dir(struct inode *inode,
		struct inode *parent, struct page *page)
486 487 488
{
	struct page *dentry_page;
	struct f2fs_dentry_block *dentry_blk;
489
	struct f2fs_dentry_ptr d;
490

C
Chao Yu 已提交
491
	if (f2fs_has_inline_dentry(inode))
C
Chao Yu 已提交
492
		return f2fs_make_empty_inline_dir(inode, parent, page);
C
Chao Yu 已提交
493

C
Chao Yu 已提交
494
	dentry_page = f2fs_get_new_data_page(inode, page, 0, true);
495 496 497
	if (IS_ERR(dentry_page))
		return PTR_ERR(dentry_page);

498
	dentry_blk = page_address(dentry_page);
499

500
	make_dentry_ptr_block(NULL, &d, dentry_blk);
C
Chao Yu 已提交
501
	f2fs_do_make_empty_dir(inode, parent, &d);
502 503 504 505 506 507

	set_page_dirty(dentry_page);
	f2fs_put_page(dentry_page, 1);
	return 0;
}

C
Chao Yu 已提交
508
struct page *f2fs_init_inode_metadata(struct inode *inode, struct inode *dir,
E
Eric Biggers 已提交
509
			const struct f2fs_filename *fname, struct page *dpage)
J
Jaegeuk Kim 已提交
510
{
511 512 513
	struct page *page;
	int err;

514
	if (is_inode_flag_set(inode, FI_NEW_INODE)) {
C
Chao Yu 已提交
515
		page = f2fs_new_inode_page(inode);
516 517
		if (IS_ERR(page))
			return page;
J
Jaegeuk Kim 已提交
518 519

		if (S_ISDIR(inode->i_mode)) {
J
Jaegeuk Kim 已提交
520 521
			/* in order to handle error case */
			get_page(page);
522
			err = make_empty_dir(inode, dir, page);
J
Jaegeuk Kim 已提交
523 524 525 526 527
			if (err) {
				lock_page(page);
				goto put_error;
			}
			put_page(page);
J
Jaegeuk Kim 已提交
528 529
		}

530
		err = f2fs_init_acl(inode, dir, page, dpage);
531
		if (err)
532
			goto put_error;
533

E
Eric Biggers 已提交
534 535
		err = f2fs_init_security(inode, dir,
					 fname ? fname->usr_fname : NULL, page);
536
		if (err)
537
			goto put_error;
538

C
Chao Yu 已提交
539
		if (IS_ENCRYPTED(inode)) {
540
			err = fscrypt_inherit_context(dir, inode, page, false);
541 542 543
			if (err)
				goto put_error;
		}
J
Jaegeuk Kim 已提交
544
	} else {
C
Chao Yu 已提交
545
		page = f2fs_get_node_page(F2FS_I_SB(dir), inode->i_ino);
546 547
		if (IS_ERR(page))
			return page;
J
Jaegeuk Kim 已提交
548
	}
549

E
Eric Biggers 已提交
550 551
	if (fname) {
		init_dent_inode(fname, page);
552
		if (IS_ENCRYPTED(dir))
553 554
			file_set_enc_name(inode);
	}
555

556 557 558 559
	/*
	 * This file should be checkpointed during fsync.
	 * We lost i_pino from now on.
	 */
560
	if (is_inode_flag_set(inode, FI_INC_LINK)) {
561 562
		if (!S_ISDIR(inode->i_mode))
			file_lost_pino(inode);
C
Chao Yu 已提交
563 564 565 566 567
		/*
		 * If link the tmpfile to alias through linkat path,
		 * we should remove this inode from orphan list.
		 */
		if (inode->i_nlink == 0)
C
Chao Yu 已提交
568
			f2fs_remove_orphan_inode(F2FS_I_SB(dir), inode->i_ino);
569
		f2fs_i_links_write(inode, true);
J
Jaegeuk Kim 已提交
570
	}
571 572
	return page;

573
put_error:
J
Jaegeuk Kim 已提交
574
	clear_nlink(inode);
C
Chao Yu 已提交
575
	f2fs_update_inode(inode, page);
J
Jaegeuk Kim 已提交
576
	f2fs_put_page(page, 1);
577
	return ERR_PTR(err);
J
Jaegeuk Kim 已提交
578 579
}

C
Chao Yu 已提交
580
void f2fs_update_parent_metadata(struct inode *dir, struct inode *inode,
J
Jaegeuk Kim 已提交
581 582
						unsigned int current_depth)
{
583
	if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) {
584
		if (S_ISDIR(inode->i_mode))
585
			f2fs_i_links_write(dir, true);
586
		clear_inode_flag(inode, FI_NEW_INODE);
J
Jaegeuk Kim 已提交
587
	}
588
	dir->i_mtime = dir->i_ctime = current_time(dir);
589
	f2fs_mark_inode_dirty_sync(dir, false);
590

591
	if (F2FS_I(dir)->i_current_depth != current_depth)
592
		f2fs_i_depth_write(dir, current_depth);
J
Jaegeuk Kim 已提交
593

594 595
	if (inode && is_inode_flag_set(inode, FI_INC_LINK))
		clear_inode_flag(inode, FI_INC_LINK);
J
Jaegeuk Kim 已提交
596 597
}

C
Chao Yu 已提交
598
int f2fs_room_for_filename(const void *bitmap, int slots, int max_slots)
J
Jaegeuk Kim 已提交
599 600 601 602
{
	int bit_start = 0;
	int zero_start, zero_end;
next:
603 604 605 606 607
	zero_start = find_next_zero_bit_le(bitmap, max_slots, bit_start);
	if (zero_start >= max_slots)
		return max_slots;

	zero_end = find_next_bit_le(bitmap, max_slots, zero_start);
J
Jaegeuk Kim 已提交
608 609 610 611 612
	if (zero_end - zero_start >= slots)
		return zero_start;

	bit_start = zero_end + 1;

613 614
	if (zero_end + 1 >= max_slots)
		return max_slots;
J
Jaegeuk Kim 已提交
615 616 617
	goto next;
}

618
bool f2fs_has_enough_room(struct inode *dir, struct page *ipage,
E
Eric Biggers 已提交
619
			  const struct f2fs_filename *fname)
620 621 622
{
	struct f2fs_dentry_ptr d;
	unsigned int bit_pos;
E
Eric Biggers 已提交
623
	int slots = GET_DENTRY_SLOTS(fname->disk_name.len);
624 625 626 627 628 629 630 631

	make_dentry_ptr_inline(dir, &d, inline_data_addr(dir, ipage));

	bit_pos = f2fs_room_for_filename(d.bitmap, slots, d.max);

	return bit_pos < d.max;
}

632
void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d,
E
Eric Biggers 已提交
633 634
			const struct fscrypt_str *name, f2fs_hash_t name_hash,
			unsigned int bit_pos)
635 636 637 638 639 640 641 642 643
{
	struct f2fs_dir_entry *de;
	int slots = GET_DENTRY_SLOTS(name->len);
	int i;

	de = &d->dentry[bit_pos];
	de->hash_code = name_hash;
	de->name_len = cpu_to_le16(name->len);
	memcpy(d->filename[bit_pos], name->name, name->len);
644 645
	de->ino = cpu_to_le32(ino);
	set_de_type(de, mode);
646
	for (i = 0; i < slots; i++) {
647
		__set_bit_le(bit_pos + i, (void *)d->bitmap);
648 649 650 651
		/* avoid wrong garbage data for readdir */
		if (i)
			(de + i)->name_len = 0;
	}
652 653
}

E
Eric Biggers 已提交
654 655
int f2fs_add_regular_entry(struct inode *dir, const struct f2fs_filename *fname,
			   struct inode *inode, nid_t ino, umode_t mode)
J
Jaegeuk Kim 已提交
656 657 658 659 660 661 662 663
{
	unsigned int bit_pos;
	unsigned int level;
	unsigned int current_depth;
	unsigned long bidx, block;
	unsigned int nbucket, nblock;
	struct page *dentry_page = NULL;
	struct f2fs_dentry_block *dentry_blk = NULL;
664
	struct f2fs_dentry_ptr d;
665
	struct page *page = NULL;
666
	int slots, err = 0;
C
Chao Yu 已提交
667

J
Jaegeuk Kim 已提交
668
	level = 0;
E
Eric Biggers 已提交
669
	slots = GET_DENTRY_SLOTS(fname->disk_name.len);
670

J
Jaegeuk Kim 已提交
671
	current_depth = F2FS_I(dir)->i_current_depth;
E
Eric Biggers 已提交
672
	if (F2FS_I(dir)->chash == fname->hash) {
J
Jaegeuk Kim 已提交
673 674 675 676 677
		level = F2FS_I(dir)->clevel;
		F2FS_I(dir)->chash = 0;
	}

start:
678
	if (time_to_inject(F2FS_I_SB(dir), FAULT_DIR_DEPTH)) {
679
		f2fs_show_injection_info(F2FS_I_SB(dir), FAULT_DIR_DEPTH);
J
Jaegeuk Kim 已提交
680
		return -ENOSPC;
681
	}
682

683 684
	if (unlikely(current_depth == MAX_DIR_HASH_DEPTH))
		return -ENOSPC;
J
Jaegeuk Kim 已提交
685 686 687 688 689

	/* Increase the depth, if required */
	if (level == current_depth)
		++current_depth;

690
	nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level);
J
Jaegeuk Kim 已提交
691 692
	nblock = bucket_blocks(level);

693
	bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level,
E
Eric Biggers 已提交
694
				(le32_to_cpu(fname->hash) % nbucket));
J
Jaegeuk Kim 已提交
695 696

	for (block = bidx; block <= (bidx + nblock - 1); block++) {
C
Chao Yu 已提交
697
		dentry_page = f2fs_get_new_data_page(dir, NULL, block, true);
698 699
		if (IS_ERR(dentry_page))
			return PTR_ERR(dentry_page);
J
Jaegeuk Kim 已提交
700

701
		dentry_blk = page_address(dentry_page);
C
Chao Yu 已提交
702
		bit_pos = f2fs_room_for_filename(&dentry_blk->dentry_bitmap,
703
						slots, NR_DENTRY_IN_BLOCK);
J
Jaegeuk Kim 已提交
704 705 706 707 708 709 710 711 712 713
		if (bit_pos < NR_DENTRY_IN_BLOCK)
			goto add_dentry;

		f2fs_put_page(dentry_page, 1);
	}

	/* Move to next level to find the empty slot for new dentry */
	++level;
	goto start;
add_dentry:
714
	f2fs_wait_on_page_writeback(dentry_page, DATA, true, true);
J
Jaegeuk Kim 已提交
715

716 717
	if (inode) {
		down_write(&F2FS_I(inode)->i_sem);
E
Eric Biggers 已提交
718
		page = f2fs_init_inode_metadata(inode, dir, fname, NULL);
719 720 721 722
		if (IS_ERR(page)) {
			err = PTR_ERR(page);
			goto fail;
		}
723
	}
724

725
	make_dentry_ptr_block(NULL, &d, dentry_blk);
E
Eric Biggers 已提交
726 727
	f2fs_update_dentry(ino, mode, &d, &fname->disk_name, fname->hash,
			   bit_pos);
728

J
Jaegeuk Kim 已提交
729
	set_page_dirty(dentry_page);
730

731
	if (inode) {
732
		f2fs_i_pino_write(inode, dir->i_ino);
733 734 735 736 737

		/* synchronize inode page's data from inode cache */
		if (is_inode_flag_set(inode, FI_NEW_INODE))
			f2fs_update_inode(inode, page);

738 739
		f2fs_put_page(page, 1);
	}
740

C
Chao Yu 已提交
741
	f2fs_update_parent_metadata(dir, inode, current_depth);
J
Jaegeuk Kim 已提交
742
fail:
743 744
	if (inode)
		up_write(&F2FS_I(inode)->i_sem);
745

J
Jaegeuk Kim 已提交
746
	f2fs_put_page(dentry_page, 1);
747 748 749 750

	return err;
}

E
Eric Biggers 已提交
751 752
int f2fs_add_dentry(struct inode *dir, const struct f2fs_filename *fname,
		    struct inode *inode, nid_t ino, umode_t mode)
753 754 755 756
{
	int err = -EAGAIN;

	if (f2fs_has_inline_dentry(dir))
E
Eric Biggers 已提交
757
		err = f2fs_add_inline_entry(dir, fname, inode, ino, mode);
758
	if (err == -EAGAIN)
E
Eric Biggers 已提交
759
		err = f2fs_add_regular_entry(dir, fname, inode, ino, mode);
760 761 762 763 764

	f2fs_update_time(F2FS_I_SB(dir), REQ_TIME);
	return err;
}

765 766 767 768
/*
 * Caller should grab and release a rwsem by calling f2fs_lock_op() and
 * f2fs_unlock_op().
 */
C
Chao Yu 已提交
769
int f2fs_do_add_link(struct inode *dir, const struct qstr *name,
770 771
				struct inode *inode, nid_t ino, umode_t mode)
{
E
Eric Biggers 已提交
772
	struct f2fs_filename fname;
773 774
	struct page *page = NULL;
	struct f2fs_dir_entry *de = NULL;
775 776
	int err;

E
Eric Biggers 已提交
777
	err = f2fs_setup_filename(dir, name, 0, &fname);
778 779 780
	if (err)
		return err;

781
	/*
782
	 * An immature stackable filesystem shows a race condition between lookup
783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
	 * and create. If we have same task when doing lookup and create, it's
	 * definitely fine as expected by VFS normally. Otherwise, let's just
	 * verify on-disk dentry one more time, which guarantees filesystem
	 * consistency more.
	 */
	if (current != F2FS_I(dir)->task) {
		de = __f2fs_find_entry(dir, &fname, &page);
		F2FS_I(dir)->task = NULL;
	}
	if (de) {
		f2fs_put_page(page, 0);
		err = -EEXIST;
	} else if (IS_ERR(page)) {
		err = PTR_ERR(page);
	} else {
C
Chao Yu 已提交
798
		err = f2fs_add_dentry(dir, &fname, inode, ino, mode);
799
	}
E
Eric Biggers 已提交
800
	f2fs_free_filename(&fname);
J
Jaegeuk Kim 已提交
801 802 803
	return err;
}

804 805 806 807 808 809
int f2fs_do_tmpfile(struct inode *inode, struct inode *dir)
{
	struct page *page;
	int err = 0;

	down_write(&F2FS_I(inode)->i_sem);
E
Eric Biggers 已提交
810
	page = f2fs_init_inode_metadata(inode, dir, NULL, NULL);
811 812 813 814 815 816
	if (IS_ERR(page)) {
		err = PTR_ERR(page);
		goto fail;
	}
	f2fs_put_page(page, 1);

817
	clear_inode_flag(inode, FI_NEW_INODE);
818
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
819 820 821 822 823
fail:
	up_write(&F2FS_I(inode)->i_sem);
	return err;
}

J
Jaegeuk Kim 已提交
824
void f2fs_drop_nlink(struct inode *dir, struct inode *inode)
825 826 827 828 829
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);

	down_write(&F2FS_I(inode)->i_sem);

830
	if (S_ISDIR(inode->i_mode))
831
		f2fs_i_links_write(dir, false);
832
	inode->i_ctime = current_time(inode);
833

834
	f2fs_i_links_write(inode, false);
835
	if (S_ISDIR(inode->i_mode)) {
836
		f2fs_i_links_write(inode, false);
837
		f2fs_i_size_write(inode, 0);
838 839 840 841
	}
	up_write(&F2FS_I(inode)->i_sem);

	if (inode->i_nlink == 0)
C
Chao Yu 已提交
842
		f2fs_add_orphan_inode(inode);
843
	else
C
Chao Yu 已提交
844
		f2fs_release_orphan_inode(sbi);
845 846
}

J
Jaegeuk Kim 已提交
847
/*
A
arter97 已提交
848
 * It only removes the dentry from the dentry page, corresponding name
J
Jaegeuk Kim 已提交
849 850 851
 * entry in name page does not need to be touched during deletion.
 */
void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
852
					struct inode *dir, struct inode *inode)
J
Jaegeuk Kim 已提交
853 854 855
{
	struct	f2fs_dentry_block *dentry_blk;
	unsigned int bit_pos;
856
	int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
J
Jaegeuk Kim 已提交
857 858
	int i;

859 860
	f2fs_update_time(F2FS_I_SB(dir), REQ_TIME);

861
	if (F2FS_OPTION(F2FS_I_SB(dir)).fsync_mode == FSYNC_MODE_STRICT)
C
Chao Yu 已提交
862
		f2fs_add_ino_entry(F2FS_I_SB(dir), dir->i_ino, TRANS_DIR_INO);
863

C
Chao Yu 已提交
864 865 866
	if (f2fs_has_inline_dentry(dir))
		return f2fs_delete_inline_entry(dentry, page, dir, inode);

J
Jaegeuk Kim 已提交
867
	lock_page(page);
868
	f2fs_wait_on_page_writeback(page, DATA, true, true);
J
Jaegeuk Kim 已提交
869

G
Gu Zheng 已提交
870 871
	dentry_blk = page_address(page);
	bit_pos = dentry - dentry_blk->dentry;
J
Jaegeuk Kim 已提交
872
	for (i = 0; i < slots; i++)
J
Jaegeuk Kim 已提交
873
		__clear_bit_le(bit_pos + i, &dentry_blk->dentry_bitmap);
J
Jaegeuk Kim 已提交
874 875 876 877 878 879 880

	/* Let's check and deallocate this dentry page */
	bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
			NR_DENTRY_IN_BLOCK,
			0);
	set_page_dirty(page);

C
Chao Yu 已提交
881
	if (bit_pos == NR_DENTRY_IN_BLOCK &&
C
Chao Yu 已提交
882
		!f2fs_truncate_hole(dir, page->index, page->index + 1)) {
M
Matthew Wilcox 已提交
883
		f2fs_clear_page_cache_dirty_tag(page);
J
Jaegeuk Kim 已提交
884
		clear_page_dirty_for_io(page);
885
		f2fs_clear_page_private(page);
J
Jaegeuk Kim 已提交
886
		ClearPageUptodate(page);
C
Chao Yu 已提交
887
		clear_cold_data(page);
888
		inode_dec_dirty_pages(dir);
C
Chao Yu 已提交
889
		f2fs_remove_dirty_inode(dir);
J
Jaegeuk Kim 已提交
890
	}
891
	f2fs_put_page(page, 1);
892 893 894 895 896 897

	dir->i_ctime = dir->i_mtime = current_time(dir);
	f2fs_mark_inode_dirty_sync(dir, false);

	if (inode)
		f2fs_drop_nlink(dir, inode);
J
Jaegeuk Kim 已提交
898 899 900 901 902 903 904
}

bool f2fs_empty_dir(struct inode *dir)
{
	unsigned long bidx;
	struct page *dentry_page;
	unsigned int bit_pos;
905
	struct f2fs_dentry_block *dentry_blk;
J
Jaegeuk Kim 已提交
906 907
	unsigned long nblock = dir_blocks(dir);

C
Chao Yu 已提交
908 909 910
	if (f2fs_has_inline_dentry(dir))
		return f2fs_empty_inline_dir(dir);

J
Jaegeuk Kim 已提交
911
	for (bidx = 0; bidx < nblock; bidx++) {
C
Chao Yu 已提交
912
		dentry_page = f2fs_get_lock_data_page(dir, bidx, false);
J
Jaegeuk Kim 已提交
913 914 915 916 917 918 919
		if (IS_ERR(dentry_page)) {
			if (PTR_ERR(dentry_page) == -ENOENT)
				continue;
			else
				return false;
		}

920
		dentry_blk = page_address(dentry_page);
J
Jaegeuk Kim 已提交
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
		if (bidx == 0)
			bit_pos = 2;
		else
			bit_pos = 0;
		bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
						NR_DENTRY_IN_BLOCK,
						bit_pos);

		f2fs_put_page(dentry_page, 1);

		if (bit_pos < NR_DENTRY_IN_BLOCK)
			return false;
	}
	return true;
}

C
Chao Yu 已提交
937
int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
938
			unsigned int start_pos, struct fscrypt_str *fstr)
939 940 941 942
{
	unsigned char d_type = DT_UNKNOWN;
	unsigned int bit_pos;
	struct f2fs_dir_entry *de = NULL;
943
	struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
944
	struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
C
Chao Yu 已提交
945 946 947
	struct blk_plug plug;
	bool readdir_ra = sbi->readdir_ra == 1;
	int err = 0;
948

949
	bit_pos = ((unsigned long)ctx->pos % d->max);
950

C
Chao Yu 已提交
951 952 953
	if (readdir_ra)
		blk_start_plug(&plug);

954 955 956
	while (bit_pos < d->max) {
		bit_pos = find_next_bit_le(d->bitmap, d->max, bit_pos);
		if (bit_pos >= d->max)
957 958
			break;

959
		de = &d->dentry[bit_pos];
960 961 962
		if (de->name_len == 0) {
			bit_pos++;
			ctx->pos = start_pos + bit_pos;
963
			printk_ratelimited(
964 965 966
				"%sF2FS-fs (%s): invalid namelen(0), ino:%u, run fsck to fix.",
				KERN_WARNING, sbi->sb->s_id,
				le32_to_cpu(de->ino));
967
			set_sbi_flag(sbi, SBI_NEED_FSCK);
968 969 970
			continue;
		}

C
Chao Yu 已提交
971
		d_type = f2fs_get_de_type(de);
972 973 974 975

		de_name.name = d->filename[bit_pos];
		de_name.len = le16_to_cpu(de->name_len);

976 977
		/* check memory boundary before moving forward */
		bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
978 979
		if (unlikely(bit_pos > d->max ||
				le16_to_cpu(de->name_len) > F2FS_NAME_LEN)) {
980 981
			f2fs_warn(sbi, "%s: corrupted namelen=%d, run fsck to fix.",
				  __func__, le16_to_cpu(de->name_len));
982
			set_sbi_flag(sbi, SBI_NEED_FSCK);
983
			err = -EFSCORRUPTED;
984 985 986
			goto out;
		}

987
		if (IS_ENCRYPTED(d->inode)) {
988 989
			int save_len = fstr->len;

990
			err = fscrypt_fname_disk_to_usr(d->inode,
C
Chao Yu 已提交
991 992
						(u32)le32_to_cpu(de->hash_code),
						0, &de_name, fstr);
993
			if (err)
C
Chao Yu 已提交
994
				goto out;
995 996 997

			de_name = *fstr;
			fstr->len = save_len;
998 999 1000
		}

		if (!dir_emit(ctx, de_name.name, de_name.len,
C
Chao Yu 已提交
1001 1002 1003 1004
					le32_to_cpu(de->ino), d_type)) {
			err = 1;
			goto out;
		}
1005

C
Chao Yu 已提交
1006
		if (readdir_ra)
C
Chao Yu 已提交
1007
			f2fs_ra_node_page(sbi, le32_to_cpu(de->ino));
1008

1009 1010
		ctx->pos = start_pos + bit_pos;
	}
C
Chao Yu 已提交
1011 1012 1013 1014
out:
	if (readdir_ra)
		blk_finish_plug(&plug);
	return err;
1015 1016
}

A
Al Viro 已提交
1017
static int f2fs_readdir(struct file *file, struct dir_context *ctx)
J
Jaegeuk Kim 已提交
1018
{
A
Al Viro 已提交
1019
	struct inode *inode = file_inode(file);
J
Jaegeuk Kim 已提交
1020 1021 1022
	unsigned long npages = dir_blocks(inode);
	struct f2fs_dentry_block *dentry_blk = NULL;
	struct page *dentry_page = NULL;
1023
	struct file_ra_state *ra = &file->f_ra;
C
Chao Yu 已提交
1024
	loff_t start_pos = ctx->pos;
A
Al Viro 已提交
1025
	unsigned int n = ((unsigned long)ctx->pos / NR_DENTRY_IN_BLOCK);
1026
	struct f2fs_dentry_ptr d;
1027
	struct fscrypt_str fstr = FSTR_INIT(NULL, 0);
1028
	int err = 0;
J
Jaegeuk Kim 已提交
1029

1030
	if (IS_ENCRYPTED(inode)) {
1031
		err = fscrypt_get_encryption_info(inode);
1032
		if (err)
C
Chao Yu 已提交
1033
			goto out;
1034

1035
		err = fscrypt_fname_alloc_buffer(F2FS_NAME_LEN, &fstr);
1036
		if (err < 0)
C
Chao Yu 已提交
1037
			goto out;
1038 1039 1040 1041
	}

	if (f2fs_has_inline_dentry(inode)) {
		err = f2fs_read_inline_dir(file, ctx, &fstr);
C
Chao Yu 已提交
1042
		goto out_free;
1043
	}
C
Chao Yu 已提交
1044

1045
	for (; n < npages; n++, ctx->pos = n * NR_DENTRY_IN_BLOCK) {
C
Chao Yu 已提交
1046 1047 1048 1049 1050 1051 1052 1053

		/* allow readdir() to be interrupted */
		if (fatal_signal_pending(current)) {
			err = -ERESTARTSYS;
			goto out_free;
		}
		cond_resched();

1054 1055 1056 1057 1058
		/* readahead for multi pages of dir */
		if (npages - n > 1 && !ra_has_index(ra, n))
			page_cache_sync_readahead(inode->i_mapping, ra, file, n,
				min(npages - n, (pgoff_t)MAX_DIR_RA_PAGES));

1059
		dentry_page = f2fs_find_data_page(inode, n);
1060 1061
		if (IS_ERR(dentry_page)) {
			err = PTR_ERR(dentry_page);
C
Chao Yu 已提交
1062 1063
			if (err == -ENOENT) {
				err = 0;
1064
				continue;
C
Chao Yu 已提交
1065
			} else {
C
Chao Yu 已提交
1066
				goto out_free;
C
Chao Yu 已提交
1067
			}
1068
		}
J
Jaegeuk Kim 已提交
1069

1070
		dentry_blk = page_address(dentry_page);
J
Jaegeuk Kim 已提交
1071

1072
		make_dentry_ptr_block(inode, &d, dentry_blk);
1073

C
Chao Yu 已提交
1074 1075 1076
		err = f2fs_fill_dentries(ctx, &d,
				n * NR_DENTRY_IN_BLOCK, &fstr);
		if (err) {
1077
			f2fs_put_page(dentry_page, 0);
1078 1079
			break;
		}
1080

1081
		f2fs_put_page(dentry_page, 0);
J
Jaegeuk Kim 已提交
1082
	}
C
Chao Yu 已提交
1083
out_free:
1084
	fscrypt_fname_free_buffer(&fstr);
C
Chao Yu 已提交
1085 1086
out:
	trace_f2fs_readdir(inode, start_pos, ctx->pos, err);
C
Chao Yu 已提交
1087
	return err < 0 ? err : 0;
J
Jaegeuk Kim 已提交
1088 1089
}

1090 1091
static int f2fs_dir_open(struct inode *inode, struct file *filp)
{
1092
	if (IS_ENCRYPTED(inode))
1093
		return fscrypt_get_encryption_info(inode) ? -EACCES : 0;
1094 1095 1096
	return 0;
}

J
Jaegeuk Kim 已提交
1097 1098 1099
const struct file_operations f2fs_dir_operations = {
	.llseek		= generic_file_llseek,
	.read		= generic_read_dir,
A
Al Viro 已提交
1100
	.iterate_shared	= f2fs_readdir,
J
Jaegeuk Kim 已提交
1101
	.fsync		= f2fs_sync_file,
1102
	.open		= f2fs_dir_open,
J
Jaegeuk Kim 已提交
1103
	.unlocked_ioctl	= f2fs_ioctl,
1104 1105 1106
#ifdef CONFIG_COMPAT
	.compat_ioctl   = f2fs_compat_ioctl,
#endif
J
Jaegeuk Kim 已提交
1107
};
1108 1109 1110 1111 1112

#ifdef CONFIG_UNICODE
static int f2fs_d_compare(const struct dentry *dentry, unsigned int len,
			  const char *str, const struct qstr *name)
{
1113
	const struct dentry *parent = READ_ONCE(dentry->d_parent);
1114 1115 1116
	const struct inode *dir = READ_ONCE(parent->d_inode);
	const struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
	struct qstr entry = QSTR_INIT(str, len);
1117
	char strbuf[DNAME_INLINE_LEN];
1118 1119 1120 1121 1122
	int res;

	if (!dir || !IS_CASEFOLDED(dir))
		goto fallback;

1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
	/*
	 * If the dentry name is stored in-line, then it may be concurrently
	 * modified by a rename.  If this happens, the VFS will eventually retry
	 * the lookup, so it doesn't matter what ->d_compare() returns.
	 * However, it's unsafe to call utf8_strncasecmp() with an unstable
	 * string.  Therefore, we have to copy the name into a temporary buffer.
	 */
	if (len <= DNAME_INLINE_LEN - 1) {
		memcpy(strbuf, str, len);
		strbuf[len] = 0;
		entry.name = strbuf;
		/* prevent compiler from optimizing out the temporary buffer */
		barrier();
	}

1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
	res = utf8_strncasecmp(sbi->s_encoding, name, &entry);
	if (res >= 0)
		return res;

	if (f2fs_has_strict_mode(sbi))
		return -EINVAL;
fallback:
	if (len != name->len)
		return 1;
	return !!memcmp(str, name->name, len);
1148 1149 1150 1151 1152 1153
}

static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str)
{
	struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
	const struct unicode_map *um = sbi->s_encoding;
1154
	const struct inode *inode = READ_ONCE(dentry->d_inode);
1155 1156 1157
	unsigned char *norm;
	int len, ret = 0;

1158
	if (!inode || !IS_CASEFOLDED(inode))
1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181
		return 0;

	norm = f2fs_kmalloc(sbi, PATH_MAX, GFP_ATOMIC);
	if (!norm)
		return -ENOMEM;

	len = utf8_casefold(um, str, norm, PATH_MAX);
	if (len < 0) {
		if (f2fs_has_strict_mode(sbi))
			ret = -EINVAL;
		goto out;
	}
	str->hash = full_name_hash(dentry, norm, len);
out:
	kvfree(norm);
	return ret;
}

const struct dentry_operations f2fs_dentry_ops = {
	.d_hash = f2fs_d_hash,
	.d_compare = f2fs_d_compare,
};
#endif