diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/inode.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/inode.c b/fs/inode.c index 006c85ca06eb..74d7c20fac88 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -1542,9 +1542,11 @@ void touch_atime(struct path *path) | |||
1542 | if (timespec_equal(&inode->i_atime, &now)) | 1542 | if (timespec_equal(&inode->i_atime, &now)) |
1543 | return; | 1543 | return; |
1544 | 1544 | ||
1545 | if (mnt_want_write(mnt)) | 1545 | if (!sb_start_write_trylock(inode->i_sb)) |
1546 | return; | 1546 | return; |
1547 | 1547 | ||
1548 | if (__mnt_want_write(mnt)) | ||
1549 | goto skip_update; | ||
1548 | /* | 1550 | /* |
1549 | * File systems can error out when updating inodes if they need to | 1551 | * File systems can error out when updating inodes if they need to |
1550 | * allocate new space to modify an inode (such is the case for | 1552 | * allocate new space to modify an inode (such is the case for |
@@ -1553,7 +1555,9 @@ void touch_atime(struct path *path) | |||
1553 | * so just ignore the return value. | 1555 | * so just ignore the return value. |
1554 | */ | 1556 | */ |
1555 | update_time(inode, &now, S_ATIME); | 1557 | update_time(inode, &now, S_ATIME); |
1556 | mnt_drop_write(mnt); | 1558 | __mnt_drop_write(mnt); |
1559 | skip_update: | ||
1560 | sb_end_write(inode->i_sb); | ||
1557 | } | 1561 | } |
1558 | EXPORT_SYMBOL(touch_atime); | 1562 | EXPORT_SYMBOL(touch_atime); |
1559 | 1563 | ||