Linux Audio

Check our new training course

Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
  4 */
  5
  6#include <linux/init.h>
  7#include <linux/buffer_head.h>
  8#include <linux/mpage.h>
  9#include <linux/bio.h>
 10#include <linux/blkdev.h>
 11#include <linux/time.h>
 12#include <linux/writeback.h>
 13#include <linux/uio.h>
 14#include <linux/random.h>
 15#include <linux/iversion.h>
 16
 17#include "exfat_raw.h"
 18#include "exfat_fs.h"
 19
 20static int __exfat_write_inode(struct inode *inode, int sync)
 21{
 22	unsigned long long on_disk_size;
 23	struct exfat_dentry *ep, *ep2;
 24	struct exfat_entry_set_cache *es = NULL;
 25	struct super_block *sb = inode->i_sb;
 26	struct exfat_sb_info *sbi = EXFAT_SB(sb);
 27	struct exfat_inode_info *ei = EXFAT_I(inode);
 28	bool is_dir = (ei->type == TYPE_DIR) ? true : false;
 29
 30	if (inode->i_ino == EXFAT_ROOT_INO)
 31		return 0;
 32
 33	/*
 34	 * If the indode is already unlinked, there is no need for updating it.
 35	 */
 36	if (ei->dir.dir == DIR_DELETED)
 37		return 0;
 38
 39	if (is_dir && ei->dir.dir == sbi->root_dir && ei->entry == -1)
 40		return 0;
 41
 42	exfat_set_volume_dirty(sb);
 43
 44	/* get the directory entry of given file or directory */
 45	es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry, ES_ALL_ENTRIES);
 46	if (!es)
 47		return -EIO;
 48	ep = exfat_get_dentry_cached(es, 0);
 49	ep2 = exfat_get_dentry_cached(es, 1);
 50
 51	ep->dentry.file.attr = cpu_to_le16(exfat_make_attr(inode));
 52
 53	/* set FILE_INFO structure using the acquired struct exfat_dentry */
 54	exfat_set_entry_time(sbi, &ei->i_crtime,
 55			&ep->dentry.file.create_tz,
 56			&ep->dentry.file.create_time,
 57			&ep->dentry.file.create_date,
 58			&ep->dentry.file.create_time_cs);
 59	exfat_set_entry_time(sbi, &inode->i_mtime,
 60			&ep->dentry.file.modify_tz,
 61			&ep->dentry.file.modify_time,
 62			&ep->dentry.file.modify_date,
 63			&ep->dentry.file.modify_time_cs);
 64	exfat_set_entry_time(sbi, &inode->i_atime,
 65			&ep->dentry.file.access_tz,
 66			&ep->dentry.file.access_time,
 67			&ep->dentry.file.access_date,
 68			NULL);
 69
 70	/* File size should be zero if there is no cluster allocated */
 71	on_disk_size = i_size_read(inode);
 72
 73	if (ei->start_clu == EXFAT_EOF_CLUSTER)
 74		on_disk_size = 0;
 75
 76	ep2->dentry.stream.valid_size = cpu_to_le64(on_disk_size);
 77	ep2->dentry.stream.size = ep2->dentry.stream.valid_size;
 78
 79	exfat_update_dir_chksum_with_entry_set(es);
 80	return exfat_free_dentry_set(es, sync);
 81}
 82
 83int exfat_write_inode(struct inode *inode, struct writeback_control *wbc)
 84{
 85	int ret;
 86
 87	mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
 88	ret = __exfat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
 89	mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock);
 90
 91	return ret;
 92}
 93
 94void exfat_sync_inode(struct inode *inode)
 95{
 96	lockdep_assert_held(&EXFAT_SB(inode->i_sb)->s_lock);
 97	__exfat_write_inode(inode, 1);
 98}
 99
100/*
101 * Input: inode, (logical) clu_offset, target allocation area
102 * Output: errcode, cluster number
103 * *clu = (~0), if it's unable to allocate a new cluster
104 */
105static int exfat_map_cluster(struct inode *inode, unsigned int clu_offset,
106		unsigned int *clu, int create)
107{
108	int ret, modified = false;
109	unsigned int last_clu;
110	struct exfat_chain new_clu;
111	struct super_block *sb = inode->i_sb;
112	struct exfat_sb_info *sbi = EXFAT_SB(sb);
113	struct exfat_inode_info *ei = EXFAT_I(inode);
114	unsigned int local_clu_offset = clu_offset;
115	unsigned int num_to_be_allocated = 0, num_clusters = 0;
116
117	ei->rwoffset = EXFAT_CLU_TO_B(clu_offset, sbi);
118
119	if (EXFAT_I(inode)->i_size_ondisk > 0)
120		num_clusters =
121			EXFAT_B_TO_CLU_ROUND_UP(EXFAT_I(inode)->i_size_ondisk,
122			sbi);
123
124	if (clu_offset >= num_clusters)
125		num_to_be_allocated = clu_offset - num_clusters + 1;
126
127	if (!create && (num_to_be_allocated > 0)) {
128		*clu = EXFAT_EOF_CLUSTER;
129		return 0;
130	}
131
132	*clu = last_clu = ei->start_clu;
133
134	if (ei->flags == ALLOC_NO_FAT_CHAIN) {
135		if (clu_offset > 0 && *clu != EXFAT_EOF_CLUSTER) {
136			last_clu += clu_offset - 1;
137
138			if (clu_offset == num_clusters)
139				*clu = EXFAT_EOF_CLUSTER;
140			else
141				*clu += clu_offset;
142		}
143	} else if (ei->type == TYPE_FILE) {
144		unsigned int fclus = 0;
145		int err = exfat_get_cluster(inode, clu_offset,
146				&fclus, clu, &last_clu, 1);
147		if (err)
148			return -EIO;
149
150		clu_offset -= fclus;
151	} else {
152		/* hint information */
153		if (clu_offset > 0 && ei->hint_bmap.off != EXFAT_EOF_CLUSTER &&
154		    ei->hint_bmap.off > 0 && clu_offset >= ei->hint_bmap.off) {
155			clu_offset -= ei->hint_bmap.off;
156			/* hint_bmap.clu should be valid */
157			WARN_ON(ei->hint_bmap.clu < 2);
158			*clu = ei->hint_bmap.clu;
159		}
160
161		while (clu_offset > 0 && *clu != EXFAT_EOF_CLUSTER) {
162			last_clu = *clu;
163			if (exfat_get_next_cluster(sb, clu))
164				return -EIO;
165			clu_offset--;
166		}
167	}
168
169	if (*clu == EXFAT_EOF_CLUSTER) {
170		exfat_set_volume_dirty(sb);
171
172		new_clu.dir = (last_clu == EXFAT_EOF_CLUSTER) ?
173				EXFAT_EOF_CLUSTER : last_clu + 1;
174		new_clu.size = 0;
175		new_clu.flags = ei->flags;
176
177		/* allocate a cluster */
178		if (num_to_be_allocated < 1) {
179			/* Broken FAT (i_sze > allocated FAT) */
180			exfat_fs_error(sb, "broken FAT chain.");
181			return -EIO;
182		}
183
184		ret = exfat_alloc_cluster(inode, num_to_be_allocated, &new_clu);
 
185		if (ret)
186			return ret;
187
188		if (new_clu.dir == EXFAT_EOF_CLUSTER ||
189		    new_clu.dir == EXFAT_FREE_CLUSTER) {
190			exfat_fs_error(sb,
191				"bogus cluster new allocated (last_clu : %u, new_clu : %u)",
192				last_clu, new_clu.dir);
193			return -EIO;
194		}
195
196		/* append to the FAT chain */
197		if (last_clu == EXFAT_EOF_CLUSTER) {
198			if (new_clu.flags == ALLOC_FAT_CHAIN)
199				ei->flags = ALLOC_FAT_CHAIN;
200			ei->start_clu = new_clu.dir;
201			modified = true;
202		} else {
203			if (new_clu.flags != ei->flags) {
204				/* no-fat-chain bit is disabled,
205				 * so fat-chain should be synced with
206				 * alloc-bitmap
207				 */
208				exfat_chain_cont_cluster(sb, ei->start_clu,
209					num_clusters);
210				ei->flags = ALLOC_FAT_CHAIN;
211				modified = true;
212			}
213			if (new_clu.flags == ALLOC_FAT_CHAIN)
214				if (exfat_ent_set(sb, last_clu, new_clu.dir))
215					return -EIO;
216		}
217
218		num_clusters += num_to_be_allocated;
219		*clu = new_clu.dir;
220
221		if (ei->dir.dir != DIR_DELETED && modified) {
222			struct exfat_dentry *ep;
223			struct exfat_entry_set_cache *es;
224			int err;
225
226			es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry,
227				ES_ALL_ENTRIES);
228			if (!es)
229				return -EIO;
230			/* get stream entry */
231			ep = exfat_get_dentry_cached(es, 1);
232
233			/* update directory entry */
234			ep->dentry.stream.flags = ei->flags;
235			ep->dentry.stream.start_clu =
236				cpu_to_le32(ei->start_clu);
237			ep->dentry.stream.valid_size =
238				cpu_to_le64(i_size_read(inode));
239			ep->dentry.stream.size =
240				ep->dentry.stream.valid_size;
241
242			exfat_update_dir_chksum_with_entry_set(es);
243			err = exfat_free_dentry_set(es, inode_needs_sync(inode));
244			if (err)
245				return err;
246		} /* end of if != DIR_DELETED */
247
248		inode->i_blocks +=
249			num_to_be_allocated << sbi->sect_per_clus_bits;
250
251		/*
252		 * Move *clu pointer along FAT chains (hole care) because the
253		 * caller of this function expect *clu to be the last cluster.
254		 * This only works when num_to_be_allocated >= 2,
255		 * *clu = (the first cluster of the allocated chain) =>
256		 * (the last cluster of ...)
257		 */
258		if (ei->flags == ALLOC_NO_FAT_CHAIN) {
259			*clu += num_to_be_allocated - 1;
260		} else {
261			while (num_to_be_allocated > 1) {
262				if (exfat_get_next_cluster(sb, clu))
263					return -EIO;
264				num_to_be_allocated--;
265			}
266		}
267
268	}
269
270	/* hint information */
271	ei->hint_bmap.off = local_clu_offset;
272	ei->hint_bmap.clu = *clu;
273
274	return 0;
275}
276
277static int exfat_map_new_buffer(struct exfat_inode_info *ei,
278		struct buffer_head *bh, loff_t pos)
279{
280	if (buffer_delay(bh) && pos > ei->i_size_aligned)
281		return -EIO;
282	set_buffer_new(bh);
283
284	/*
285	 * Adjust i_size_aligned if i_size_ondisk is bigger than it.
286	 */
287	if (ei->i_size_ondisk > ei->i_size_aligned)
288		ei->i_size_aligned = ei->i_size_ondisk;
289	return 0;
290}
291
292static int exfat_get_block(struct inode *inode, sector_t iblock,
293		struct buffer_head *bh_result, int create)
294{
295	struct exfat_inode_info *ei = EXFAT_I(inode);
296	struct super_block *sb = inode->i_sb;
297	struct exfat_sb_info *sbi = EXFAT_SB(sb);
298	unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits;
299	int err = 0;
300	unsigned long mapped_blocks = 0;
301	unsigned int cluster, sec_offset;
302	sector_t last_block;
303	sector_t phys = 0;
304	loff_t pos;
305
306	mutex_lock(&sbi->s_lock);
307	last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size_read(inode), sb);
308	if (iblock >= last_block && !create)
309		goto done;
310
311	/* Is this block already allocated? */
312	err = exfat_map_cluster(inode, iblock >> sbi->sect_per_clus_bits,
313			&cluster, create);
314	if (err) {
315		if (err != -ENOSPC)
316			exfat_fs_error_ratelimit(sb,
317				"failed to bmap (inode : %p iblock : %llu, err : %d)",
318				inode, (unsigned long long)iblock, err);
319		goto unlock_ret;
320	}
321
322	if (cluster == EXFAT_EOF_CLUSTER)
323		goto done;
324
325	/* sector offset in cluster */
326	sec_offset = iblock & (sbi->sect_per_clus - 1);
327
328	phys = exfat_cluster_to_sector(sbi, cluster) + sec_offset;
329	mapped_blocks = sbi->sect_per_clus - sec_offset;
330	max_blocks = min(mapped_blocks, max_blocks);
331
332	/* Treat newly added block / cluster */
333	if (iblock < last_block)
334		create = 0;
335
336	if (create || buffer_delay(bh_result)) {
337		pos = EXFAT_BLK_TO_B((iblock + 1), sb);
338		if (ei->i_size_ondisk < pos)
339			ei->i_size_ondisk = pos;
340	}
341
342	if (create) {
343		err = exfat_map_new_buffer(ei, bh_result, pos);
344		if (err) {
345			exfat_fs_error(sb,
346					"requested for bmap out of range(pos : (%llu) > i_size_aligned(%llu)\n",
347					pos, ei->i_size_aligned);
348			goto unlock_ret;
349		}
350	}
351
352	if (buffer_delay(bh_result))
353		clear_buffer_delay(bh_result);
354	map_bh(bh_result, sb, phys);
355done:
356	bh_result->b_size = EXFAT_BLK_TO_B(max_blocks, sb);
357unlock_ret:
358	mutex_unlock(&sbi->s_lock);
359	return err;
360}
361
362static int exfat_readpage(struct file *file, struct page *page)
363{
364	return mpage_readpage(page, exfat_get_block);
365}
366
367static void exfat_readahead(struct readahead_control *rac)
368{
369	mpage_readahead(rac, exfat_get_block);
370}
371
372static int exfat_writepage(struct page *page, struct writeback_control *wbc)
373{
374	return block_write_full_page(page, exfat_get_block, wbc);
375}
376
377static int exfat_writepages(struct address_space *mapping,
378		struct writeback_control *wbc)
379{
380	return mpage_writepages(mapping, wbc, exfat_get_block);
381}
382
383static void exfat_write_failed(struct address_space *mapping, loff_t to)
384{
385	struct inode *inode = mapping->host;
386
387	if (to > i_size_read(inode)) {
388		truncate_pagecache(inode, i_size_read(inode));
389		exfat_truncate(inode, EXFAT_I(inode)->i_size_aligned);
390	}
391}
392
393static int exfat_write_begin(struct file *file, struct address_space *mapping,
394		loff_t pos, unsigned int len, unsigned int flags,
395		struct page **pagep, void **fsdata)
396{
397	int ret;
398
399	*pagep = NULL;
400	ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
401			       exfat_get_block,
402			       &EXFAT_I(mapping->host)->i_size_ondisk);
403
404	if (ret < 0)
405		exfat_write_failed(mapping, pos+len);
406
407	return ret;
408}
409
410static int exfat_write_end(struct file *file, struct address_space *mapping,
411		loff_t pos, unsigned int len, unsigned int copied,
412		struct page *pagep, void *fsdata)
413{
414	struct inode *inode = mapping->host;
415	struct exfat_inode_info *ei = EXFAT_I(inode);
416	int err;
417
418	err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata);
419
420	if (EXFAT_I(inode)->i_size_aligned < i_size_read(inode)) {
421		exfat_fs_error(inode->i_sb,
422			"invalid size(size(%llu) > aligned(%llu)\n",
423			i_size_read(inode), EXFAT_I(inode)->i_size_aligned);
424		return -EIO;
425	}
426
427	if (err < len)
428		exfat_write_failed(mapping, pos+len);
429
430	if (!(err < 0) && !(ei->attr & ATTR_ARCHIVE)) {
431		inode->i_mtime = inode->i_ctime = current_time(inode);
432		ei->attr |= ATTR_ARCHIVE;
433		mark_inode_dirty(inode);
434	}
435
436	return err;
437}
438
439static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
440{
441	struct address_space *mapping = iocb->ki_filp->f_mapping;
442	struct inode *inode = mapping->host;
443	loff_t size = iocb->ki_pos + iov_iter_count(iter);
444	int rw = iov_iter_rw(iter);
445	ssize_t ret;
446
447	if (rw == WRITE) {
448		/*
449		 * FIXME: blockdev_direct_IO() doesn't use ->write_begin(),
450		 * so we need to update the ->i_size_aligned to block boundary.
451		 *
452		 * But we must fill the remaining area or hole by nul for
453		 * updating ->i_size_aligned
454		 *
455		 * Return 0, and fallback to normal buffered write.
456		 */
457		if (EXFAT_I(inode)->i_size_aligned < size)
458			return 0;
459	}
460
461	/*
462	 * Need to use the DIO_LOCKING for avoiding the race
463	 * condition of exfat_get_block() and ->truncate().
464	 */
465	ret = blockdev_direct_IO(iocb, inode, iter, exfat_get_block);
466	if (ret < 0 && (rw & WRITE))
467		exfat_write_failed(mapping, size);
468	return ret;
469}
470
471static sector_t exfat_aop_bmap(struct address_space *mapping, sector_t block)
472{
473	sector_t blocknr;
474
475	/* exfat_get_cluster() assumes the requested blocknr isn't truncated. */
476	down_read(&EXFAT_I(mapping->host)->truncate_lock);
477	blocknr = generic_block_bmap(mapping, block, exfat_get_block);
478	up_read(&EXFAT_I(mapping->host)->truncate_lock);
479	return blocknr;
480}
481
482/*
483 * exfat_block_truncate_page() zeroes out a mapping from file offset `from'
484 * up to the end of the block which corresponds to `from'.
485 * This is required during truncate to physically zeroout the tail end
486 * of that block so it doesn't yield old data if the file is later grown.
487 * Also, avoid causing failure from fsx for cases of "data past EOF"
488 */
489int exfat_block_truncate_page(struct inode *inode, loff_t from)
490{
491	return block_truncate_page(inode->i_mapping, from, exfat_get_block);
492}
493
494static const struct address_space_operations exfat_aops = {
 
495	.readpage	= exfat_readpage,
496	.readahead	= exfat_readahead,
497	.writepage	= exfat_writepage,
498	.writepages	= exfat_writepages,
499	.write_begin	= exfat_write_begin,
500	.write_end	= exfat_write_end,
501	.direct_IO	= exfat_direct_IO,
502	.bmap		= exfat_aop_bmap
503};
504
505static inline unsigned long exfat_hash(loff_t i_pos)
506{
507	return hash_32(i_pos, EXFAT_HASH_BITS);
508}
509
510void exfat_hash_inode(struct inode *inode, loff_t i_pos)
511{
512	struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb);
513	struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos);
514
515	spin_lock(&sbi->inode_hash_lock);
516	EXFAT_I(inode)->i_pos = i_pos;
517	hlist_add_head(&EXFAT_I(inode)->i_hash_fat, head);
518	spin_unlock(&sbi->inode_hash_lock);
519}
520
521void exfat_unhash_inode(struct inode *inode)
522{
523	struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb);
524
525	spin_lock(&sbi->inode_hash_lock);
526	hlist_del_init(&EXFAT_I(inode)->i_hash_fat);
527	EXFAT_I(inode)->i_pos = 0;
528	spin_unlock(&sbi->inode_hash_lock);
529}
530
531struct inode *exfat_iget(struct super_block *sb, loff_t i_pos)
532{
533	struct exfat_sb_info *sbi = EXFAT_SB(sb);
534	struct exfat_inode_info *info;
535	struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos);
536	struct inode *inode = NULL;
537
538	spin_lock(&sbi->inode_hash_lock);
539	hlist_for_each_entry(info, head, i_hash_fat) {
540		WARN_ON(info->vfs_inode.i_sb != sb);
541
542		if (i_pos != info->i_pos)
543			continue;
544		inode = igrab(&info->vfs_inode);
545		if (inode)
546			break;
547	}
548	spin_unlock(&sbi->inode_hash_lock);
549	return inode;
550}
551
552/* doesn't deal with root inode */
553static int exfat_fill_inode(struct inode *inode, struct exfat_dir_entry *info)
554{
555	struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb);
556	struct exfat_inode_info *ei = EXFAT_I(inode);
557	loff_t size = info->size;
558
559	memcpy(&ei->dir, &info->dir, sizeof(struct exfat_chain));
560	ei->entry = info->entry;
561	ei->attr = info->attr;
562	ei->start_clu = info->start_clu;
563	ei->flags = info->flags;
564	ei->type = info->type;
565
566	ei->version = 0;
567	ei->hint_stat.eidx = 0;
568	ei->hint_stat.clu = info->start_clu;
569	ei->hint_femp.eidx = EXFAT_HINT_NONE;
570	ei->rwoffset = 0;
571	ei->hint_bmap.off = EXFAT_EOF_CLUSTER;
572	ei->i_pos = 0;
573
574	inode->i_uid = sbi->options.fs_uid;
575	inode->i_gid = sbi->options.fs_gid;
576	inode_inc_iversion(inode);
577	inode->i_generation = prandom_u32();
578
579	if (info->attr & ATTR_SUBDIR) { /* directory */
580		inode->i_generation &= ~1;
581		inode->i_mode = exfat_make_mode(sbi, info->attr, 0777);
582		inode->i_op = &exfat_dir_inode_operations;
583		inode->i_fop = &exfat_dir_operations;
584		set_nlink(inode, info->num_subdirs);
585	} else { /* regular file */
586		inode->i_generation |= 1;
587		inode->i_mode = exfat_make_mode(sbi, info->attr, 0777);
588		inode->i_op = &exfat_file_inode_operations;
589		inode->i_fop = &exfat_file_operations;
590		inode->i_mapping->a_ops = &exfat_aops;
591		inode->i_mapping->nrpages = 0;
592	}
593
594	i_size_write(inode, size);
595
596	/* ondisk and aligned size should be aligned with block size */
597	if (size & (inode->i_sb->s_blocksize - 1)) {
598		size |= (inode->i_sb->s_blocksize - 1);
599		size++;
600	}
601
602	ei->i_size_aligned = size;
603	ei->i_size_ondisk = size;
604
605	exfat_save_attr(inode, info->attr);
606
607	inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) &
608		~(sbi->cluster_size - 1)) >> inode->i_blkbits;
609	inode->i_mtime = info->mtime;
610	inode->i_ctime = info->mtime;
611	ei->i_crtime = info->crtime;
612	inode->i_atime = info->atime;
613
614	return 0;
615}
616
617struct inode *exfat_build_inode(struct super_block *sb,
618		struct exfat_dir_entry *info, loff_t i_pos)
619{
620	struct inode *inode;
621	int err;
622
623	inode = exfat_iget(sb, i_pos);
624	if (inode)
625		goto out;
626	inode = new_inode(sb);
627	if (!inode) {
628		inode = ERR_PTR(-ENOMEM);
629		goto out;
630	}
631	inode->i_ino = iunique(sb, EXFAT_ROOT_INO);
632	inode_set_iversion(inode, 1);
633	err = exfat_fill_inode(inode, info);
634	if (err) {
635		iput(inode);
636		inode = ERR_PTR(err);
637		goto out;
638	}
639	exfat_hash_inode(inode, i_pos);
640	insert_inode_hash(inode);
641out:
642	return inode;
643}
644
645void exfat_evict_inode(struct inode *inode)
646{
647	truncate_inode_pages(&inode->i_data, 0);
648
649	if (!inode->i_nlink) {
650		i_size_write(inode, 0);
651		mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
652		__exfat_truncate(inode, 0);
653		mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock);
654	}
655
656	invalidate_inode_buffers(inode);
657	clear_inode(inode);
658	exfat_cache_inval_inode(inode);
659	exfat_unhash_inode(inode);
660}
v5.14.15
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
  4 */
  5
  6#include <linux/init.h>
  7#include <linux/buffer_head.h>
  8#include <linux/mpage.h>
  9#include <linux/bio.h>
 10#include <linux/blkdev.h>
 11#include <linux/time.h>
 12#include <linux/writeback.h>
 13#include <linux/uio.h>
 14#include <linux/random.h>
 15#include <linux/iversion.h>
 16
 17#include "exfat_raw.h"
 18#include "exfat_fs.h"
 19
 20static int __exfat_write_inode(struct inode *inode, int sync)
 21{
 22	unsigned long long on_disk_size;
 23	struct exfat_dentry *ep, *ep2;
 24	struct exfat_entry_set_cache *es = NULL;
 25	struct super_block *sb = inode->i_sb;
 26	struct exfat_sb_info *sbi = EXFAT_SB(sb);
 27	struct exfat_inode_info *ei = EXFAT_I(inode);
 28	bool is_dir = (ei->type == TYPE_DIR) ? true : false;
 29
 30	if (inode->i_ino == EXFAT_ROOT_INO)
 31		return 0;
 32
 33	/*
 34	 * If the indode is already unlinked, there is no need for updating it.
 35	 */
 36	if (ei->dir.dir == DIR_DELETED)
 37		return 0;
 38
 39	if (is_dir && ei->dir.dir == sbi->root_dir && ei->entry == -1)
 40		return 0;
 41
 42	exfat_set_volume_dirty(sb);
 43
 44	/* get the directory entry of given file or directory */
 45	es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry, ES_ALL_ENTRIES);
 46	if (!es)
 47		return -EIO;
 48	ep = exfat_get_dentry_cached(es, 0);
 49	ep2 = exfat_get_dentry_cached(es, 1);
 50
 51	ep->dentry.file.attr = cpu_to_le16(exfat_make_attr(inode));
 52
 53	/* set FILE_INFO structure using the acquired struct exfat_dentry */
 54	exfat_set_entry_time(sbi, &ei->i_crtime,
 55			&ep->dentry.file.create_tz,
 56			&ep->dentry.file.create_time,
 57			&ep->dentry.file.create_date,
 58			&ep->dentry.file.create_time_cs);
 59	exfat_set_entry_time(sbi, &inode->i_mtime,
 60			&ep->dentry.file.modify_tz,
 61			&ep->dentry.file.modify_time,
 62			&ep->dentry.file.modify_date,
 63			&ep->dentry.file.modify_time_cs);
 64	exfat_set_entry_time(sbi, &inode->i_atime,
 65			&ep->dentry.file.access_tz,
 66			&ep->dentry.file.access_time,
 67			&ep->dentry.file.access_date,
 68			NULL);
 69
 70	/* File size should be zero if there is no cluster allocated */
 71	on_disk_size = i_size_read(inode);
 72
 73	if (ei->start_clu == EXFAT_EOF_CLUSTER)
 74		on_disk_size = 0;
 75
 76	ep2->dentry.stream.valid_size = cpu_to_le64(on_disk_size);
 77	ep2->dentry.stream.size = ep2->dentry.stream.valid_size;
 78
 79	exfat_update_dir_chksum_with_entry_set(es);
 80	return exfat_free_dentry_set(es, sync);
 81}
 82
 83int exfat_write_inode(struct inode *inode, struct writeback_control *wbc)
 84{
 85	int ret;
 86
 87	mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
 88	ret = __exfat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
 89	mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock);
 90
 91	return ret;
 92}
 93
 94void exfat_sync_inode(struct inode *inode)
 95{
 96	lockdep_assert_held(&EXFAT_SB(inode->i_sb)->s_lock);
 97	__exfat_write_inode(inode, 1);
 98}
 99
100/*
101 * Input: inode, (logical) clu_offset, target allocation area
102 * Output: errcode, cluster number
103 * *clu = (~0), if it's unable to allocate a new cluster
104 */
105static int exfat_map_cluster(struct inode *inode, unsigned int clu_offset,
106		unsigned int *clu, int create)
107{
108	int ret, modified = false;
109	unsigned int last_clu;
110	struct exfat_chain new_clu;
111	struct super_block *sb = inode->i_sb;
112	struct exfat_sb_info *sbi = EXFAT_SB(sb);
113	struct exfat_inode_info *ei = EXFAT_I(inode);
114	unsigned int local_clu_offset = clu_offset;
115	unsigned int num_to_be_allocated = 0, num_clusters = 0;
116
 
 
117	if (EXFAT_I(inode)->i_size_ondisk > 0)
118		num_clusters =
119			EXFAT_B_TO_CLU_ROUND_UP(EXFAT_I(inode)->i_size_ondisk,
120			sbi);
121
122	if (clu_offset >= num_clusters)
123		num_to_be_allocated = clu_offset - num_clusters + 1;
124
125	if (!create && (num_to_be_allocated > 0)) {
126		*clu = EXFAT_EOF_CLUSTER;
127		return 0;
128	}
129
130	*clu = last_clu = ei->start_clu;
131
132	if (ei->flags == ALLOC_NO_FAT_CHAIN) {
133		if (clu_offset > 0 && *clu != EXFAT_EOF_CLUSTER) {
134			last_clu += clu_offset - 1;
135
136			if (clu_offset == num_clusters)
137				*clu = EXFAT_EOF_CLUSTER;
138			else
139				*clu += clu_offset;
140		}
141	} else if (ei->type == TYPE_FILE) {
142		unsigned int fclus = 0;
143		int err = exfat_get_cluster(inode, clu_offset,
144				&fclus, clu, &last_clu, 1);
145		if (err)
146			return -EIO;
147
148		clu_offset -= fclus;
149	} else {
150		/* hint information */
151		if (clu_offset > 0 && ei->hint_bmap.off != EXFAT_EOF_CLUSTER &&
152		    ei->hint_bmap.off > 0 && clu_offset >= ei->hint_bmap.off) {
153			clu_offset -= ei->hint_bmap.off;
154			/* hint_bmap.clu should be valid */
155			WARN_ON(ei->hint_bmap.clu < 2);
156			*clu = ei->hint_bmap.clu;
157		}
158
159		while (clu_offset > 0 && *clu != EXFAT_EOF_CLUSTER) {
160			last_clu = *clu;
161			if (exfat_get_next_cluster(sb, clu))
162				return -EIO;
163			clu_offset--;
164		}
165	}
166
167	if (*clu == EXFAT_EOF_CLUSTER) {
168		exfat_set_volume_dirty(sb);
169
170		new_clu.dir = (last_clu == EXFAT_EOF_CLUSTER) ?
171				EXFAT_EOF_CLUSTER : last_clu + 1;
172		new_clu.size = 0;
173		new_clu.flags = ei->flags;
174
175		/* allocate a cluster */
176		if (num_to_be_allocated < 1) {
177			/* Broken FAT (i_sze > allocated FAT) */
178			exfat_fs_error(sb, "broken FAT chain.");
179			return -EIO;
180		}
181
182		ret = exfat_alloc_cluster(inode, num_to_be_allocated, &new_clu,
183				inode_needs_sync(inode));
184		if (ret)
185			return ret;
186
187		if (new_clu.dir == EXFAT_EOF_CLUSTER ||
188		    new_clu.dir == EXFAT_FREE_CLUSTER) {
189			exfat_fs_error(sb,
190				"bogus cluster new allocated (last_clu : %u, new_clu : %u)",
191				last_clu, new_clu.dir);
192			return -EIO;
193		}
194
195		/* append to the FAT chain */
196		if (last_clu == EXFAT_EOF_CLUSTER) {
197			if (new_clu.flags == ALLOC_FAT_CHAIN)
198				ei->flags = ALLOC_FAT_CHAIN;
199			ei->start_clu = new_clu.dir;
200			modified = true;
201		} else {
202			if (new_clu.flags != ei->flags) {
203				/* no-fat-chain bit is disabled,
204				 * so fat-chain should be synced with
205				 * alloc-bitmap
206				 */
207				exfat_chain_cont_cluster(sb, ei->start_clu,
208					num_clusters);
209				ei->flags = ALLOC_FAT_CHAIN;
210				modified = true;
211			}
212			if (new_clu.flags == ALLOC_FAT_CHAIN)
213				if (exfat_ent_set(sb, last_clu, new_clu.dir))
214					return -EIO;
215		}
216
217		num_clusters += num_to_be_allocated;
218		*clu = new_clu.dir;
219
220		if (ei->dir.dir != DIR_DELETED && modified) {
221			struct exfat_dentry *ep;
222			struct exfat_entry_set_cache *es;
223			int err;
224
225			es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry,
226				ES_ALL_ENTRIES);
227			if (!es)
228				return -EIO;
229			/* get stream entry */
230			ep = exfat_get_dentry_cached(es, 1);
231
232			/* update directory entry */
233			ep->dentry.stream.flags = ei->flags;
234			ep->dentry.stream.start_clu =
235				cpu_to_le32(ei->start_clu);
236			ep->dentry.stream.valid_size =
237				cpu_to_le64(i_size_read(inode));
238			ep->dentry.stream.size =
239				ep->dentry.stream.valid_size;
240
241			exfat_update_dir_chksum_with_entry_set(es);
242			err = exfat_free_dentry_set(es, inode_needs_sync(inode));
243			if (err)
244				return err;
245		} /* end of if != DIR_DELETED */
246
247		inode->i_blocks +=
248			num_to_be_allocated << sbi->sect_per_clus_bits;
249
250		/*
251		 * Move *clu pointer along FAT chains (hole care) because the
252		 * caller of this function expect *clu to be the last cluster.
253		 * This only works when num_to_be_allocated >= 2,
254		 * *clu = (the first cluster of the allocated chain) =>
255		 * (the last cluster of ...)
256		 */
257		if (ei->flags == ALLOC_NO_FAT_CHAIN) {
258			*clu += num_to_be_allocated - 1;
259		} else {
260			while (num_to_be_allocated > 1) {
261				if (exfat_get_next_cluster(sb, clu))
262					return -EIO;
263				num_to_be_allocated--;
264			}
265		}
266
267	}
268
269	/* hint information */
270	ei->hint_bmap.off = local_clu_offset;
271	ei->hint_bmap.clu = *clu;
272
273	return 0;
274}
275
276static int exfat_map_new_buffer(struct exfat_inode_info *ei,
277		struct buffer_head *bh, loff_t pos)
278{
279	if (buffer_delay(bh) && pos > ei->i_size_aligned)
280		return -EIO;
281	set_buffer_new(bh);
282
283	/*
284	 * Adjust i_size_aligned if i_size_ondisk is bigger than it.
285	 */
286	if (ei->i_size_ondisk > ei->i_size_aligned)
287		ei->i_size_aligned = ei->i_size_ondisk;
288	return 0;
289}
290
291static int exfat_get_block(struct inode *inode, sector_t iblock,
292		struct buffer_head *bh_result, int create)
293{
294	struct exfat_inode_info *ei = EXFAT_I(inode);
295	struct super_block *sb = inode->i_sb;
296	struct exfat_sb_info *sbi = EXFAT_SB(sb);
297	unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits;
298	int err = 0;
299	unsigned long mapped_blocks = 0;
300	unsigned int cluster, sec_offset;
301	sector_t last_block;
302	sector_t phys = 0;
303	loff_t pos;
304
305	mutex_lock(&sbi->s_lock);
306	last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size_read(inode), sb);
307	if (iblock >= last_block && !create)
308		goto done;
309
310	/* Is this block already allocated? */
311	err = exfat_map_cluster(inode, iblock >> sbi->sect_per_clus_bits,
312			&cluster, create);
313	if (err) {
314		if (err != -ENOSPC)
315			exfat_fs_error_ratelimit(sb,
316				"failed to bmap (inode : %p iblock : %llu, err : %d)",
317				inode, (unsigned long long)iblock, err);
318		goto unlock_ret;
319	}
320
321	if (cluster == EXFAT_EOF_CLUSTER)
322		goto done;
323
324	/* sector offset in cluster */
325	sec_offset = iblock & (sbi->sect_per_clus - 1);
326
327	phys = exfat_cluster_to_sector(sbi, cluster) + sec_offset;
328	mapped_blocks = sbi->sect_per_clus - sec_offset;
329	max_blocks = min(mapped_blocks, max_blocks);
330
331	/* Treat newly added block / cluster */
332	if (iblock < last_block)
333		create = 0;
334
335	if (create || buffer_delay(bh_result)) {
336		pos = EXFAT_BLK_TO_B((iblock + 1), sb);
337		if (ei->i_size_ondisk < pos)
338			ei->i_size_ondisk = pos;
339	}
340
341	if (create) {
342		err = exfat_map_new_buffer(ei, bh_result, pos);
343		if (err) {
344			exfat_fs_error(sb,
345					"requested for bmap out of range(pos : (%llu) > i_size_aligned(%llu)\n",
346					pos, ei->i_size_aligned);
347			goto unlock_ret;
348		}
349	}
350
351	if (buffer_delay(bh_result))
352		clear_buffer_delay(bh_result);
353	map_bh(bh_result, sb, phys);
354done:
355	bh_result->b_size = EXFAT_BLK_TO_B(max_blocks, sb);
356unlock_ret:
357	mutex_unlock(&sbi->s_lock);
358	return err;
359}
360
361static int exfat_readpage(struct file *file, struct page *page)
362{
363	return mpage_readpage(page, exfat_get_block);
364}
365
366static void exfat_readahead(struct readahead_control *rac)
367{
368	mpage_readahead(rac, exfat_get_block);
369}
370
371static int exfat_writepage(struct page *page, struct writeback_control *wbc)
372{
373	return block_write_full_page(page, exfat_get_block, wbc);
374}
375
376static int exfat_writepages(struct address_space *mapping,
377		struct writeback_control *wbc)
378{
379	return mpage_writepages(mapping, wbc, exfat_get_block);
380}
381
382static void exfat_write_failed(struct address_space *mapping, loff_t to)
383{
384	struct inode *inode = mapping->host;
385
386	if (to > i_size_read(inode)) {
387		truncate_pagecache(inode, i_size_read(inode));
388		exfat_truncate(inode, EXFAT_I(inode)->i_size_aligned);
389	}
390}
391
392static int exfat_write_begin(struct file *file, struct address_space *mapping,
393		loff_t pos, unsigned int len, unsigned int flags,
394		struct page **pagep, void **fsdata)
395{
396	int ret;
397
398	*pagep = NULL;
399	ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
400			       exfat_get_block,
401			       &EXFAT_I(mapping->host)->i_size_ondisk);
402
403	if (ret < 0)
404		exfat_write_failed(mapping, pos+len);
405
406	return ret;
407}
408
409static int exfat_write_end(struct file *file, struct address_space *mapping,
410		loff_t pos, unsigned int len, unsigned int copied,
411		struct page *pagep, void *fsdata)
412{
413	struct inode *inode = mapping->host;
414	struct exfat_inode_info *ei = EXFAT_I(inode);
415	int err;
416
417	err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata);
418
419	if (EXFAT_I(inode)->i_size_aligned < i_size_read(inode)) {
420		exfat_fs_error(inode->i_sb,
421			"invalid size(size(%llu) > aligned(%llu)\n",
422			i_size_read(inode), EXFAT_I(inode)->i_size_aligned);
423		return -EIO;
424	}
425
426	if (err < len)
427		exfat_write_failed(mapping, pos+len);
428
429	if (!(err < 0) && !(ei->attr & ATTR_ARCHIVE)) {
430		inode->i_mtime = inode->i_ctime = current_time(inode);
431		ei->attr |= ATTR_ARCHIVE;
432		mark_inode_dirty(inode);
433	}
434
435	return err;
436}
437
438static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
439{
440	struct address_space *mapping = iocb->ki_filp->f_mapping;
441	struct inode *inode = mapping->host;
442	loff_t size = iocb->ki_pos + iov_iter_count(iter);
443	int rw = iov_iter_rw(iter);
444	ssize_t ret;
445
446	if (rw == WRITE) {
447		/*
448		 * FIXME: blockdev_direct_IO() doesn't use ->write_begin(),
449		 * so we need to update the ->i_size_aligned to block boundary.
450		 *
451		 * But we must fill the remaining area or hole by nul for
452		 * updating ->i_size_aligned
453		 *
454		 * Return 0, and fallback to normal buffered write.
455		 */
456		if (EXFAT_I(inode)->i_size_aligned < size)
457			return 0;
458	}
459
460	/*
461	 * Need to use the DIO_LOCKING for avoiding the race
462	 * condition of exfat_get_block() and ->truncate().
463	 */
464	ret = blockdev_direct_IO(iocb, inode, iter, exfat_get_block);
465	if (ret < 0 && (rw & WRITE))
466		exfat_write_failed(mapping, size);
467	return ret;
468}
469
470static sector_t exfat_aop_bmap(struct address_space *mapping, sector_t block)
471{
472	sector_t blocknr;
473
474	/* exfat_get_cluster() assumes the requested blocknr isn't truncated. */
475	down_read(&EXFAT_I(mapping->host)->truncate_lock);
476	blocknr = generic_block_bmap(mapping, block, exfat_get_block);
477	up_read(&EXFAT_I(mapping->host)->truncate_lock);
478	return blocknr;
479}
480
481/*
482 * exfat_block_truncate_page() zeroes out a mapping from file offset `from'
483 * up to the end of the block which corresponds to `from'.
484 * This is required during truncate to physically zeroout the tail end
485 * of that block so it doesn't yield old data if the file is later grown.
486 * Also, avoid causing failure from fsx for cases of "data past EOF"
487 */
488int exfat_block_truncate_page(struct inode *inode, loff_t from)
489{
490	return block_truncate_page(inode->i_mapping, from, exfat_get_block);
491}
492
493static const struct address_space_operations exfat_aops = {
494	.set_page_dirty	= __set_page_dirty_buffers,
495	.readpage	= exfat_readpage,
496	.readahead	= exfat_readahead,
497	.writepage	= exfat_writepage,
498	.writepages	= exfat_writepages,
499	.write_begin	= exfat_write_begin,
500	.write_end	= exfat_write_end,
501	.direct_IO	= exfat_direct_IO,
502	.bmap		= exfat_aop_bmap
503};
504
505static inline unsigned long exfat_hash(loff_t i_pos)
506{
507	return hash_32(i_pos, EXFAT_HASH_BITS);
508}
509
510void exfat_hash_inode(struct inode *inode, loff_t i_pos)
511{
512	struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb);
513	struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos);
514
515	spin_lock(&sbi->inode_hash_lock);
516	EXFAT_I(inode)->i_pos = i_pos;
517	hlist_add_head(&EXFAT_I(inode)->i_hash_fat, head);
518	spin_unlock(&sbi->inode_hash_lock);
519}
520
521void exfat_unhash_inode(struct inode *inode)
522{
523	struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb);
524
525	spin_lock(&sbi->inode_hash_lock);
526	hlist_del_init(&EXFAT_I(inode)->i_hash_fat);
527	EXFAT_I(inode)->i_pos = 0;
528	spin_unlock(&sbi->inode_hash_lock);
529}
530
531struct inode *exfat_iget(struct super_block *sb, loff_t i_pos)
532{
533	struct exfat_sb_info *sbi = EXFAT_SB(sb);
534	struct exfat_inode_info *info;
535	struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos);
536	struct inode *inode = NULL;
537
538	spin_lock(&sbi->inode_hash_lock);
539	hlist_for_each_entry(info, head, i_hash_fat) {
540		WARN_ON(info->vfs_inode.i_sb != sb);
541
542		if (i_pos != info->i_pos)
543			continue;
544		inode = igrab(&info->vfs_inode);
545		if (inode)
546			break;
547	}
548	spin_unlock(&sbi->inode_hash_lock);
549	return inode;
550}
551
552/* doesn't deal with root inode */
553static int exfat_fill_inode(struct inode *inode, struct exfat_dir_entry *info)
554{
555	struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb);
556	struct exfat_inode_info *ei = EXFAT_I(inode);
557	loff_t size = info->size;
558
559	ei->dir = info->dir;
560	ei->entry = info->entry;
561	ei->attr = info->attr;
562	ei->start_clu = info->start_clu;
563	ei->flags = info->flags;
564	ei->type = info->type;
565
566	ei->version = 0;
567	ei->hint_stat.eidx = 0;
568	ei->hint_stat.clu = info->start_clu;
569	ei->hint_femp.eidx = EXFAT_HINT_NONE;
 
570	ei->hint_bmap.off = EXFAT_EOF_CLUSTER;
571	ei->i_pos = 0;
572
573	inode->i_uid = sbi->options.fs_uid;
574	inode->i_gid = sbi->options.fs_gid;
575	inode_inc_iversion(inode);
576	inode->i_generation = prandom_u32();
577
578	if (info->attr & ATTR_SUBDIR) { /* directory */
579		inode->i_generation &= ~1;
580		inode->i_mode = exfat_make_mode(sbi, info->attr, 0777);
581		inode->i_op = &exfat_dir_inode_operations;
582		inode->i_fop = &exfat_dir_operations;
583		set_nlink(inode, info->num_subdirs);
584	} else { /* regular file */
585		inode->i_generation |= 1;
586		inode->i_mode = exfat_make_mode(sbi, info->attr, 0777);
587		inode->i_op = &exfat_file_inode_operations;
588		inode->i_fop = &exfat_file_operations;
589		inode->i_mapping->a_ops = &exfat_aops;
590		inode->i_mapping->nrpages = 0;
591	}
592
593	i_size_write(inode, size);
594
595	/* ondisk and aligned size should be aligned with block size */
596	if (size & (inode->i_sb->s_blocksize - 1)) {
597		size |= (inode->i_sb->s_blocksize - 1);
598		size++;
599	}
600
601	ei->i_size_aligned = size;
602	ei->i_size_ondisk = size;
603
604	exfat_save_attr(inode, info->attr);
605
606	inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) &
607		~(sbi->cluster_size - 1)) >> inode->i_blkbits;
608	inode->i_mtime = info->mtime;
609	inode->i_ctime = info->mtime;
610	ei->i_crtime = info->crtime;
611	inode->i_atime = info->atime;
612
613	return 0;
614}
615
616struct inode *exfat_build_inode(struct super_block *sb,
617		struct exfat_dir_entry *info, loff_t i_pos)
618{
619	struct inode *inode;
620	int err;
621
622	inode = exfat_iget(sb, i_pos);
623	if (inode)
624		goto out;
625	inode = new_inode(sb);
626	if (!inode) {
627		inode = ERR_PTR(-ENOMEM);
628		goto out;
629	}
630	inode->i_ino = iunique(sb, EXFAT_ROOT_INO);
631	inode_set_iversion(inode, 1);
632	err = exfat_fill_inode(inode, info);
633	if (err) {
634		iput(inode);
635		inode = ERR_PTR(err);
636		goto out;
637	}
638	exfat_hash_inode(inode, i_pos);
639	insert_inode_hash(inode);
640out:
641	return inode;
642}
643
644void exfat_evict_inode(struct inode *inode)
645{
646	truncate_inode_pages(&inode->i_data, 0);
647
648	if (!inode->i_nlink) {
649		i_size_write(inode, 0);
650		mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
651		__exfat_truncate(inode, 0);
652		mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock);
653	}
654
655	invalidate_inode_buffers(inode);
656	clear_inode(inode);
657	exfat_cache_inval_inode(inode);
658	exfat_unhash_inode(inode);
659}