aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf
diff options
context:
space:
mode:
authorDeepa Dinamani <deepa.kernel@gmail.com>2018-05-08 22:36:02 -0400
committerDeepa Dinamani <deepa.kernel@gmail.com>2018-06-05 19:57:31 -0400
commit95582b00838837fc07e042979320caf917ce3fe6 (patch)
treeda001bc61ee76d836b91d3d80a77dbd302be222b /fs/udf
parent7aaa822ed060719bd4ea012609883b6bc6950508 (diff)
vfs: change inode times to use struct timespec64
struct timespec is not y2038 safe. Transition vfs to use y2038 safe struct timespec64 instead. The change was made with the help of the following cocinelle script. This catches about 80% of the changes. All the header file and logic changes are included in the first 5 rules. The rest are trivial substitutions. I avoid changing any of the function signatures or any other filesystem specific data structures to keep the patch simple for review. The script can be a little shorter by combining different cases. But, this version was sufficient for my usecase. virtual patch @ depends on patch @ identifier now; @@ - struct timespec + struct timespec64 current_time ( ... ) { - struct timespec now = current_kernel_time(); + struct timespec64 now = current_kernel_time64(); ... - return timespec_trunc( + return timespec64_trunc( ... ); } @ depends on patch @ identifier xtime; @@ struct \( iattr \| inode \| kstat \) { ... - struct timespec xtime; + struct timespec64 xtime; ... } @ depends on patch @ identifier t; @@ struct inode_operations { ... int (*update_time) (..., - struct timespec t, + struct timespec64 t, ...); ... } @ depends on patch @ identifier t; identifier fn_update_time =~ "update_time$"; @@ fn_update_time (..., - struct timespec *t, + struct timespec64 *t, ...) { ... } @ depends on patch @ identifier t; @@ lease_get_mtime( ... , - struct timespec *t + struct timespec64 *t ) { ... } @te depends on patch forall@ identifier ts; local idexpression struct inode *inode_node; identifier i_xtime =~ "^i_[acm]time$"; identifier ia_xtime =~ "^ia_[acm]time$"; identifier fn_update_time =~ "update_time$"; identifier fn; expression e, E3; local idexpression struct inode *node1; local idexpression struct inode *node2; local idexpression struct iattr *attr1; local idexpression struct iattr *attr2; local idexpression struct iattr attr; identifier i_xtime1 =~ "^i_[acm]time$"; identifier i_xtime2 =~ "^i_[acm]time$"; identifier ia_xtime1 =~ "^ia_[acm]time$"; identifier ia_xtime2 =~ "^ia_[acm]time$"; @@ ( ( - struct timespec ts; + struct timespec64 ts; | - struct timespec ts = current_time(inode_node); + struct timespec64 ts = current_time(inode_node); ) <+... when != ts ( - timespec_equal(&inode_node->i_xtime, &ts) + timespec64_equal(&inode_node->i_xtime, &ts) | - timespec_equal(&ts, &inode_node->i_xtime) + timespec64_equal(&ts, &inode_node->i_xtime) | - timespec_compare(&inode_node->i_xtime, &ts) + timespec64_compare(&inode_node->i_xtime, &ts) | - timespec_compare(&ts, &inode_node->i_xtime) + timespec64_compare(&ts, &inode_node->i_xtime) | ts = current_time(e) | fn_update_time(..., &ts,...) | inode_node->i_xtime = ts | node1->i_xtime = ts | ts = inode_node->i_xtime | <+... attr1->ia_xtime ...+> = ts | ts = attr1->ia_xtime | ts.tv_sec | ts.tv_nsec | btrfs_set_stack_timespec_sec(..., ts.tv_sec) | btrfs_set_stack_timespec_nsec(..., ts.tv_nsec) | - ts = timespec64_to_timespec( + ts = ... -) | - ts = ktime_to_timespec( + ts = ktime_to_timespec64( ...) | - ts = E3 + ts = timespec_to_timespec64(E3) | - ktime_get_real_ts(&ts) + ktime_get_real_ts64(&ts) | fn(..., - ts + timespec64_to_timespec(ts) ,...) ) ...+> ( <... when != ts - return ts; + return timespec64_to_timespec(ts); ...> ) | - timespec_equal(&node1->i_xtime1, &node2->i_xtime2) + timespec64_equal(&node1->i_xtime2, &node2->i_xtime2) | - timespec_equal(&node1->i_xtime1, &attr2->ia_xtime2) + timespec64_equal(&node1->i_xtime2, &attr2->ia_xtime2) | - timespec_compare(&node1->i_xtime1, &node2->i_xtime2) + timespec64_compare(&node1->i_xtime1, &node2->i_xtime2) | node1->i_xtime1 = - timespec_trunc(attr1->ia_xtime1, + timespec64_trunc(attr1->ia_xtime1, ...) | - attr1->ia_xtime1 = timespec_trunc(attr2->ia_xtime2, + attr1->ia_xtime1 = timespec64_trunc(attr2->ia_xtime2, ...) | - ktime_get_real_ts(&attr1->ia_xtime1) + ktime_get_real_ts64(&attr1->ia_xtime1) | - ktime_get_real_ts(&attr.ia_xtime1) + ktime_get_real_ts64(&attr.ia_xtime1) ) @ depends on patch @ struct inode *node; struct iattr *attr; identifier fn; identifier i_xtime =~ "^i_[acm]time$"; identifier ia_xtime =~ "^ia_[acm]time$"; expression e; @@ ( - fn(node->i_xtime); + fn(timespec64_to_timespec(node->i_xtime)); | fn(..., - node->i_xtime); + timespec64_to_timespec(node->i_xtime)); | - e = fn(attr->ia_xtime); + e = fn(timespec64_to_timespec(attr->ia_xtime)); ) @ depends on patch forall @ struct inode *node; struct iattr *attr; identifier i_xtime =~ "^i_[acm]time$"; identifier ia_xtime =~ "^ia_[acm]time$"; identifier fn; @@ { + struct timespec ts; <+... ( + ts = timespec64_to_timespec(node->i_xtime); fn (..., - &node->i_xtime, + &ts, ...); | + ts = timespec64_to_timespec(attr->ia_xtime); fn (..., - &attr->ia_xtime, + &ts, ...); ) ...+> } @ depends on patch forall @ struct inode *node; struct iattr *attr; struct kstat *stat; identifier ia_xtime =~ "^ia_[acm]time$"; identifier i_xtime =~ "^i_[acm]time$"; identifier xtime =~ "^[acm]time$"; identifier fn, ret; @@ { + struct timespec ts; <+... ( + ts = timespec64_to_timespec(node->i_xtime); ret = fn (..., - &node->i_xtime, + &ts, ...); | + ts = timespec64_to_timespec(node->i_xtime); ret = fn (..., - &node->i_xtime); + &ts); | + ts = timespec64_to_timespec(attr->ia_xtime); ret = fn (..., - &attr->ia_xtime, + &ts, ...); | + ts = timespec64_to_timespec(attr->ia_xtime); ret = fn (..., - &attr->ia_xtime); + &ts); | + ts = timespec64_to_timespec(stat->xtime); ret = fn (..., - &stat->xtime); + &ts); ) ...+> } @ depends on patch @ struct inode *node; struct inode *node2; identifier i_xtime1 =~ "^i_[acm]time$"; identifier i_xtime2 =~ "^i_[acm]time$"; identifier i_xtime3 =~ "^i_[acm]time$"; struct iattr *attrp; struct iattr *attrp2; struct iattr attr ; identifier ia_xtime1 =~ "^ia_[acm]time$"; identifier ia_xtime2 =~ "^ia_[acm]time$"; struct kstat *stat; struct kstat stat1; struct timespec64 ts; identifier xtime =~ "^[acmb]time$"; expression e; @@ ( ( node->i_xtime2 \| attrp->ia_xtime2 \| attr.ia_xtime2 \) = node->i_xtime1 ; | node->i_xtime2 = \( node2->i_xtime1 \| timespec64_trunc(...) \); | node->i_xtime2 = node->i_xtime1 = node->i_xtime3 = \(ts \| current_time(...) \); | node->i_xtime1 = node->i_xtime3 = \(ts \| current_time(...) \); | stat->xtime = node2->i_xtime1; | stat1.xtime = node2->i_xtime1; | ( node->i_xtime2 \| attrp->ia_xtime2 \) = attrp->ia_xtime1 ; | ( attrp->ia_xtime1 \| attr.ia_xtime1 \) = attrp2->ia_xtime2; | - e = node->i_xtime1; + e = timespec64_to_timespec( node->i_xtime1 ); | - e = attrp->ia_xtime1; + e = timespec64_to_timespec( attrp->ia_xtime1 ); | node->i_xtime1 = current_time(...); | node->i_xtime2 = node->i_xtime1 = node->i_xtime3 = - e; + timespec_to_timespec64(e); | node->i_xtime1 = node->i_xtime3 = - e; + timespec_to_timespec64(e); | - node->i_xtime1 = e; + node->i_xtime1 = timespec_to_timespec64(e); ) Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com> Cc: <anton@tuxera.com> Cc: <balbi@kernel.org> Cc: <bfields@fieldses.org> Cc: <darrick.wong@oracle.com> Cc: <dhowells@redhat.com> Cc: <dsterba@suse.com> Cc: <dwmw2@infradead.org> Cc: <hch@lst.de> Cc: <hirofumi@mail.parknet.co.jp> Cc: <hubcap@omnibond.com> Cc: <jack@suse.com> Cc: <jaegeuk@kernel.org> Cc: <jaharkes@cs.cmu.edu> Cc: <jslaby@suse.com> Cc: <keescook@chromium.org> Cc: <mark@fasheh.com> Cc: <miklos@szeredi.hu> Cc: <nico@linaro.org> Cc: <reiserfs-devel@vger.kernel.org> Cc: <richard@nod.at> Cc: <sage@redhat.com> Cc: <sfrench@samba.org> Cc: <swhiteho@redhat.com> Cc: <tj@kernel.org> Cc: <trond.myklebust@primarydata.com> Cc: <tytso@mit.edu> Cc: <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/udf')
-rw-r--r--fs/udf/ialloc.c4
-rw-r--r--fs/udf/inode.c43
2 files changed, 30 insertions, 17 deletions
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c
index b7a0d4b4bda1..56569023783b 100644
--- a/fs/udf/ialloc.c
+++ b/fs/udf/ialloc.c
@@ -124,8 +124,8 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode)
124 iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; 124 iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT;
125 else 125 else
126 iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; 126 iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
127 inode->i_mtime = inode->i_atime = inode->i_ctime = 127 inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
128 iinfo->i_crtime = current_time(inode); 128 iinfo->i_crtime = timespec64_to_timespec(inode->i_mtime);
129 if (unlikely(insert_inode_locked(inode) < 0)) { 129 if (unlikely(insert_inode_locked(inode) < 0)) {
130 make_bad_inode(inode); 130 make_bad_inode(inode);
131 iput(inode); 131 iput(inode);
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index df2378d6ebb4..7f39d17352c9 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -1271,6 +1271,7 @@ static int udf_read_inode(struct inode *inode, bool hidden_inode)
1271 struct udf_inode_info *iinfo = UDF_I(inode); 1271 struct udf_inode_info *iinfo = UDF_I(inode);
1272 struct udf_sb_info *sbi = UDF_SB(inode->i_sb); 1272 struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
1273 struct kernel_lb_addr *iloc = &iinfo->i_location; 1273 struct kernel_lb_addr *iloc = &iinfo->i_location;
1274 struct timespec ts;
1274 unsigned int link_count; 1275 unsigned int link_count;
1275 unsigned int indirections = 0; 1276 unsigned int indirections = 0;
1276 int bs = inode->i_sb->s_blocksize; 1277 int bs = inode->i_sb->s_blocksize;
@@ -1443,9 +1444,12 @@ reread:
1443 inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << 1444 inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
1444 (inode->i_sb->s_blocksize_bits - 9); 1445 (inode->i_sb->s_blocksize_bits - 9);
1445 1446
1446 udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime); 1447 udf_disk_stamp_to_time(&ts, fe->accessTime);
1447 udf_disk_stamp_to_time(&inode->i_mtime, fe->modificationTime); 1448 inode->i_atime = timespec_to_timespec64(ts);
1448 udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime); 1449 udf_disk_stamp_to_time(&ts, fe->modificationTime);
1450 inode->i_mtime = timespec_to_timespec64(ts);
1451 udf_disk_stamp_to_time(&ts, fe->attrTime);
1452 inode->i_ctime = timespec_to_timespec64(ts);
1449 1453
1450 iinfo->i_unique = le64_to_cpu(fe->uniqueID); 1454 iinfo->i_unique = le64_to_cpu(fe->uniqueID);
1451 iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr); 1455 iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
@@ -1455,10 +1459,13 @@ reread:
1455 inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << 1459 inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
1456 (inode->i_sb->s_blocksize_bits - 9); 1460 (inode->i_sb->s_blocksize_bits - 9);
1457 1461
1458 udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime); 1462 udf_disk_stamp_to_time(&ts, efe->accessTime);
1459 udf_disk_stamp_to_time(&inode->i_mtime, efe->modificationTime); 1463 inode->i_atime = timespec_to_timespec64(ts);
1464 udf_disk_stamp_to_time(&ts, efe->modificationTime);
1465 inode->i_mtime = timespec_to_timespec64(ts);
1460 udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime); 1466 udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime);
1461 udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime); 1467 udf_disk_stamp_to_time(&ts, efe->attrTime);
1468 inode->i_ctime = timespec_to_timespec64(ts);
1462 1469
1463 iinfo->i_unique = le64_to_cpu(efe->uniqueID); 1470 iinfo->i_unique = le64_to_cpu(efe->uniqueID);
1464 iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr); 1471 iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
@@ -1708,9 +1715,12 @@ static int udf_update_inode(struct inode *inode, int do_sync)
1708 inode->i_sb->s_blocksize - sizeof(struct fileEntry)); 1715 inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1709 fe->logicalBlocksRecorded = cpu_to_le64(lb_recorded); 1716 fe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
1710 1717
1711 udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime); 1718 udf_time_to_disk_stamp(&fe->accessTime,
1712 udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime); 1719 timespec64_to_timespec(inode->i_atime));
1713 udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime); 1720 udf_time_to_disk_stamp(&fe->modificationTime,
1721 timespec64_to_timespec(inode->i_mtime));
1722 udf_time_to_disk_stamp(&fe->attrTime,
1723 timespec64_to_timespec(inode->i_ctime));
1714 memset(&(fe->impIdent), 0, sizeof(struct regid)); 1724 memset(&(fe->impIdent), 0, sizeof(struct regid));
1715 strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER); 1725 strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
1716 fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; 1726 fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
@@ -1729,14 +1739,17 @@ static int udf_update_inode(struct inode *inode, int do_sync)
1729 efe->objectSize = cpu_to_le64(inode->i_size); 1739 efe->objectSize = cpu_to_le64(inode->i_size);
1730 efe->logicalBlocksRecorded = cpu_to_le64(lb_recorded); 1740 efe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
1731 1741
1732 udf_adjust_time(iinfo, inode->i_atime); 1742 udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_atime));
1733 udf_adjust_time(iinfo, inode->i_mtime); 1743 udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_mtime));
1734 udf_adjust_time(iinfo, inode->i_ctime); 1744 udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_ctime));
1735 1745
1736 udf_time_to_disk_stamp(&efe->accessTime, inode->i_atime); 1746 udf_time_to_disk_stamp(&efe->accessTime,
1737 udf_time_to_disk_stamp(&efe->modificationTime, inode->i_mtime); 1747 timespec64_to_timespec(inode->i_atime));
1748 udf_time_to_disk_stamp(&efe->modificationTime,
1749 timespec64_to_timespec(inode->i_mtime));
1738 udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime); 1750 udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime);
1739 udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime); 1751 udf_time_to_disk_stamp(&efe->attrTime,
1752 timespec64_to_timespec(inode->i_ctime));
1740 1753
1741 memset(&(efe->impIdent), 0, sizeof(efe->impIdent)); 1754 memset(&(efe->impIdent), 0, sizeof(efe->impIdent));
1742 strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER); 1755 strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);