| .. | .. | 
|---|
 | 1 | +// SPDX-License-Identifier: GPL-2.0-only  | 
|---|
| 1 | 2 |  /* | 
|---|
| 2 | 3 |   * This file is part of UBIFS. | 
|---|
| 3 | 4 |   * | 
|---|
| 4 | 5 |   * Copyright (C) 2006-2008 Nokia Corporation. | 
|---|
| 5 |  | - *  | 
|---|
| 6 |  | - * This program is free software; you can redistribute it and/or modify it  | 
|---|
| 7 |  | - * under the terms of the GNU General Public License version 2 as published by  | 
|---|
| 8 |  | - * the Free Software Foundation.  | 
|---|
| 9 |  | - *  | 
|---|
| 10 |  | - * This program is distributed in the hope that it will be useful, but WITHOUT  | 
|---|
| 11 |  | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  | 
|---|
| 12 |  | - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  | 
|---|
| 13 |  | - * more details.  | 
|---|
| 14 |  | - *  | 
|---|
| 15 |  | - * You should have received a copy of the GNU General Public License along with  | 
|---|
| 16 |  | - * this program; if not, write to the Free Software Foundation, Inc., 51  | 
|---|
| 17 |  | - * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA  | 
|---|
| 18 | 6 |   * | 
|---|
| 19 | 7 |   * Authors: Artem Bityutskiy (Битюцкий Артём) | 
|---|
| 20 | 8 |   *          Adrian Hunter | 
|---|
| .. | .. | 
|---|
| 79 | 67 |   | 
|---|
| 80 | 68 |  	dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ; | 
|---|
| 81 | 69 |   | 
|---|
| 82 |  | -	if (ubifs_crypt_is_encrypted(inode)) {  | 
|---|
 | 70 | +	if (IS_ENCRYPTED(inode)) {  | 
|---|
| 83 | 71 |  		err = ubifs_decrypt(inode, dn, &dlen, block); | 
|---|
| 84 | 72 |  		if (err) | 
|---|
| 85 | 73 |  			goto dump; | 
|---|
| .. | .. | 
|---|
| 234 | 222 |  	struct ubifs_info *c = inode->i_sb->s_fs_info; | 
|---|
| 235 | 223 |  	pgoff_t index = pos >> PAGE_SHIFT; | 
|---|
| 236 | 224 |  	struct ubifs_budget_req req = { .new_page = 1 }; | 
|---|
| 237 |  | -	int uninitialized_var(err), appending = !!(pos + len > inode->i_size);  | 
|---|
 | 225 | +	int err, appending = !!(pos + len > inode->i_size);  | 
|---|
| 238 | 226 |  	struct page *page; | 
|---|
| 239 | 227 |   | 
|---|
| 240 | 228 |  	dbg_gen("ino %lu, pos %llu, len %u, i_size %lld", | 
|---|
| .. | .. | 
|---|
| 438 | 426 |  	struct ubifs_info *c = inode->i_sb->s_fs_info; | 
|---|
| 439 | 427 |  	struct ubifs_inode *ui = ubifs_inode(inode); | 
|---|
| 440 | 428 |  	pgoff_t index = pos >> PAGE_SHIFT; | 
|---|
| 441 |  | -	int uninitialized_var(err), appending = !!(pos + len > inode->i_size);  | 
|---|
 | 429 | +	int err, appending = !!(pos + len > inode->i_size);  | 
|---|
| 442 | 430 |  	int skipped_read = 0; | 
|---|
| 443 | 431 |  	struct page *page; | 
|---|
| 444 | 432 |   | 
|---|
| .. | .. | 
|---|
| 582 | 570 |  	} | 
|---|
| 583 | 571 |   | 
|---|
| 584 | 572 |  	if (!PagePrivate(page)) { | 
|---|
| 585 |  | -		SetPagePrivate(page);  | 
|---|
 | 573 | +		attach_page_private(page, (void *)1);  | 
|---|
| 586 | 574 |  		atomic_long_inc(&c->dirty_pg_cnt); | 
|---|
| 587 | 575 |  		__set_page_dirty_nobuffers(page); | 
|---|
| 588 | 576 |  	} | 
|---|
| .. | .. | 
|---|
| 659 | 647 |  			dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ; | 
|---|
| 660 | 648 |  			out_len = UBIFS_BLOCK_SIZE; | 
|---|
| 661 | 649 |   | 
|---|
| 662 |  | -			if (ubifs_crypt_is_encrypted(inode)) {  | 
|---|
 | 650 | +			if (IS_ENCRYPTED(inode)) {  | 
|---|
| 663 | 651 |  				err = ubifs_decrypt(inode, dn, &dlen, page_block); | 
|---|
| 664 | 652 |  				if (err) | 
|---|
| 665 | 653 |  					goto out_err; | 
|---|
| .. | .. | 
|---|
| 959 | 947 |  		release_existing_page_budget(c); | 
|---|
| 960 | 948 |   | 
|---|
| 961 | 949 |  	atomic_long_dec(&c->dirty_pg_cnt); | 
|---|
| 962 |  | -	ClearPagePrivate(page);  | 
|---|
 | 950 | +	detach_page_private(page);  | 
|---|
| 963 | 951 |  	ClearPageChecked(page); | 
|---|
| 964 | 952 |   | 
|---|
| 965 | 953 |  	kunmap(page); | 
|---|
| .. | .. | 
|---|
| 1043 | 1031 |  		if (page->index >= synced_i_size >> PAGE_SHIFT) { | 
|---|
| 1044 | 1032 |  			err = inode->i_sb->s_op->write_inode(inode, NULL); | 
|---|
| 1045 | 1033 |  			if (err) | 
|---|
| 1046 |  | -				goto out_unlock;  | 
|---|
 | 1034 | +				goto out_redirty;  | 
|---|
| 1047 | 1035 |  			/* | 
|---|
| 1048 | 1036 |  			 * The inode has been written, but the write-buffer has | 
|---|
| 1049 | 1037 |  			 * not been synchronized, so in case of an unclean | 
|---|
| .. | .. | 
|---|
| 1071 | 1059 |  	if (i_size > synced_i_size) { | 
|---|
| 1072 | 1060 |  		err = inode->i_sb->s_op->write_inode(inode, NULL); | 
|---|
| 1073 | 1061 |  		if (err) | 
|---|
| 1074 |  | -			goto out_unlock;  | 
|---|
 | 1062 | +			goto out_redirty;  | 
|---|
| 1075 | 1063 |  	} | 
|---|
| 1076 | 1064 |   | 
|---|
| 1077 | 1065 |  	return do_writepage(page, len); | 
|---|
| 1078 |  | -  | 
|---|
 | 1066 | +out_redirty:  | 
|---|
 | 1067 | +	/*  | 
|---|
 | 1068 | +	 * redirty_page_for_writepage() won't call ubifs_dirty_inode() because  | 
|---|
 | 1069 | +	 * it passes I_DIRTY_PAGES flag while calling __mark_inode_dirty(), so  | 
|---|
 | 1070 | +	 * there is no need to do space budget for dirty inode.  | 
|---|
 | 1071 | +	 */  | 
|---|
 | 1072 | +	redirty_page_for_writepage(wbc, page);  | 
|---|
| 1079 | 1073 |  out_unlock: | 
|---|
| 1080 | 1074 |  	unlock_page(page); | 
|---|
| 1081 | 1075 |  	return err; | 
|---|
| .. | .. | 
|---|
| 1093 | 1087 |  	if (attr->ia_valid & ATTR_GID) | 
|---|
| 1094 | 1088 |  		inode->i_gid = attr->ia_gid; | 
|---|
| 1095 | 1089 |  	if (attr->ia_valid & ATTR_ATIME) | 
|---|
| 1096 |  | -		inode->i_atime = timespec64_trunc(attr->ia_atime,  | 
|---|
| 1097 |  | -						  inode->i_sb->s_time_gran);  | 
|---|
 | 1090 | +		inode->i_atime = attr->ia_atime;  | 
|---|
| 1098 | 1091 |  	if (attr->ia_valid & ATTR_MTIME) | 
|---|
| 1099 |  | -		inode->i_mtime = timespec64_trunc(attr->ia_mtime,  | 
|---|
| 1100 |  | -						  inode->i_sb->s_time_gran);  | 
|---|
 | 1092 | +		inode->i_mtime = attr->ia_mtime;  | 
|---|
| 1101 | 1093 |  	if (attr->ia_valid & ATTR_CTIME) | 
|---|
| 1102 |  | -		inode->i_ctime = timespec64_trunc(attr->ia_ctime,  | 
|---|
| 1103 |  | -						  inode->i_sb->s_time_gran);  | 
|---|
 | 1094 | +		inode->i_ctime = attr->ia_ctime;  | 
|---|
| 1104 | 1095 |  	if (attr->ia_valid & ATTR_MODE) { | 
|---|
| 1105 | 1096 |  		umode_t mode = attr->ia_mode; | 
|---|
| 1106 | 1097 |   | 
|---|
| .. | .. | 
|---|
| 1318 | 1309 |  		release_existing_page_budget(c); | 
|---|
| 1319 | 1310 |   | 
|---|
| 1320 | 1311 |  	atomic_long_dec(&c->dirty_pg_cnt); | 
|---|
| 1321 |  | -	ClearPagePrivate(page);  | 
|---|
 | 1312 | +	detach_page_private(page);  | 
|---|
| 1322 | 1313 |  	ClearPageChecked(page); | 
|---|
| 1323 | 1314 |  } | 
|---|
| 1324 | 1315 |   | 
|---|
| .. | .. | 
|---|
| 1377 | 1368 |  	return 0; | 
|---|
| 1378 | 1369 |  } | 
|---|
| 1379 | 1370 |   | 
|---|
| 1380 |  | -#ifdef CONFIG_UBIFS_ATIME_SUPPORT  | 
|---|
| 1381 | 1371 |  /** | 
|---|
| 1382 | 1372 |   * ubifs_update_time - update time of inode. | 
|---|
| 1383 | 1373 |   * @inode: inode to update | 
|---|
| .. | .. | 
|---|
| 1392 | 1382 |  	struct ubifs_budget_req req = { .dirtied_ino = 1, | 
|---|
| 1393 | 1383 |  			.dirtied_ino_d = ALIGN(ui->data_len, 8) }; | 
|---|
| 1394 | 1384 |  	int err, release; | 
|---|
 | 1385 | +  | 
|---|
 | 1386 | +	if (!IS_ENABLED(CONFIG_UBIFS_ATIME_SUPPORT))  | 
|---|
 | 1387 | +		return generic_update_time(inode, time, flags);  | 
|---|
| 1395 | 1388 |   | 
|---|
| 1396 | 1389 |  	err = ubifs_budget_space(c, &req); | 
|---|
| 1397 | 1390 |  	if (err) | 
|---|
| .. | .. | 
|---|
| 1412 | 1405 |  		ubifs_release_budget(c, &req); | 
|---|
| 1413 | 1406 |  	return 0; | 
|---|
| 1414 | 1407 |  } | 
|---|
| 1415 |  | -#endif  | 
|---|
| 1416 | 1408 |   | 
|---|
| 1417 | 1409 |  /** | 
|---|
| 1418 | 1410 |   * update_mctime - update mtime and ctime of an inode. | 
|---|
| .. | .. | 
|---|
| 1479 | 1471 |  { | 
|---|
| 1480 | 1472 |  	int rc; | 
|---|
| 1481 | 1473 |   | 
|---|
| 1482 |  | -	rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode, 0);  | 
|---|
 | 1474 | +	rc = migrate_page_move_mapping(mapping, newpage, page, 0);  | 
|---|
| 1483 | 1475 |  	if (rc != MIGRATEPAGE_SUCCESS) | 
|---|
| 1484 | 1476 |  		return rc; | 
|---|
| 1485 | 1477 |   | 
|---|
| 1486 | 1478 |  	if (PagePrivate(page)) { | 
|---|
| 1487 |  | -		ClearPagePrivate(page);  | 
|---|
| 1488 |  | -		SetPagePrivate(newpage);  | 
|---|
 | 1479 | +		detach_page_private(page);  | 
|---|
 | 1480 | +		attach_page_private(newpage, (void *)1);  | 
|---|
| 1489 | 1481 |  	} | 
|---|
| 1490 | 1482 |   | 
|---|
| 1491 | 1483 |  	if (mode != MIGRATE_SYNC_NO_COPY) | 
|---|
| .. | .. | 
|---|
| 1509 | 1501 |  		return 0; | 
|---|
| 1510 | 1502 |  	ubifs_assert(c, PagePrivate(page)); | 
|---|
| 1511 | 1503 |  	ubifs_assert(c, 0); | 
|---|
| 1512 |  | -	ClearPagePrivate(page);  | 
|---|
 | 1504 | +	detach_page_private(page);  | 
|---|
| 1513 | 1505 |  	ClearPageChecked(page); | 
|---|
| 1514 | 1506 |  	return 1; | 
|---|
| 1515 | 1507 |  } | 
|---|
| .. | .. | 
|---|
| 1580 | 1572 |  	else { | 
|---|
| 1581 | 1573 |  		if (!PageChecked(page)) | 
|---|
| 1582 | 1574 |  			ubifs_convert_page_budget(c); | 
|---|
| 1583 |  | -		SetPagePrivate(page);  | 
|---|
 | 1575 | +		attach_page_private(page, (void *)1);  | 
|---|
| 1584 | 1576 |  		atomic_long_inc(&c->dirty_pg_cnt); | 
|---|
| 1585 | 1577 |  		__set_page_dirty_nobuffers(page); | 
|---|
| 1586 | 1578 |  	} | 
|---|
| .. | .. | 
|---|
| 1621 | 1613 |  	if (err) | 
|---|
| 1622 | 1614 |  		return err; | 
|---|
| 1623 | 1615 |  	vma->vm_ops = &ubifs_file_vm_ops; | 
|---|
| 1624 |  | -#ifdef CONFIG_UBIFS_ATIME_SUPPORT  | 
|---|
| 1625 |  | -	file_accessed(file);  | 
|---|
| 1626 |  | -#endif  | 
|---|
 | 1616 | +  | 
|---|
 | 1617 | +	if (IS_ENABLED(CONFIG_UBIFS_ATIME_SUPPORT))  | 
|---|
 | 1618 | +		file_accessed(file);  | 
|---|
 | 1619 | +  | 
|---|
| 1627 | 1620 |  	return 0; | 
|---|
| 1628 | 1621 |  } | 
|---|
| 1629 | 1622 |   | 
|---|
| .. | .. | 
|---|
| 1671 | 1664 |  #ifdef CONFIG_UBIFS_FS_XATTR | 
|---|
| 1672 | 1665 |  	.listxattr   = ubifs_listxattr, | 
|---|
| 1673 | 1666 |  #endif | 
|---|
| 1674 |  | -#ifdef CONFIG_UBIFS_ATIME_SUPPORT  | 
|---|
| 1675 | 1667 |  	.update_time = ubifs_update_time, | 
|---|
| 1676 |  | -#endif  | 
|---|
| 1677 | 1668 |  }; | 
|---|
| 1678 | 1669 |   | 
|---|
| 1679 | 1670 |  const struct inode_operations ubifs_symlink_inode_operations = { | 
|---|
| .. | .. | 
|---|
| 1683 | 1674 |  #ifdef CONFIG_UBIFS_FS_XATTR | 
|---|
| 1684 | 1675 |  	.listxattr   = ubifs_listxattr, | 
|---|
| 1685 | 1676 |  #endif | 
|---|
| 1686 |  | -#ifdef CONFIG_UBIFS_ATIME_SUPPORT  | 
|---|
| 1687 | 1677 |  	.update_time = ubifs_update_time, | 
|---|
| 1688 |  | -#endif  | 
|---|
| 1689 | 1678 |  }; | 
|---|
| 1690 | 1679 |   | 
|---|
| 1691 | 1680 |  const struct file_operations ubifs_file_operations = { | 
|---|