Commit 9f29bd8b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'fs_for_v5.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs

Pull fs and udf fixes from Jan Kara:
 "A lazytime handling fix from Eric Biggers and a fix of UDF session
  handling for large devices"

* tag 'fs_for_v5.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
  udf: fix the problem that the disc content is not displayed
  fs: fix lazytime expiration handling in __writeback_single_inode()
parents 2561bbbe 5cdc4a69
...@@ -1474,21 +1474,25 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) ...@@ -1474,21 +1474,25 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
} }
/* /*
* Some filesystems may redirty the inode during the writeback * If the inode has dirty timestamps and we need to write them, call
* due to delalloc, clear dirty metadata flags right before * mark_inode_dirty_sync() to notify the filesystem about it and to
* write_inode() * change I_DIRTY_TIME into I_DIRTY_SYNC.
*/ */
spin_lock(&inode->i_lock);
dirty = inode->i_state & I_DIRTY;
if ((inode->i_state & I_DIRTY_TIME) && if ((inode->i_state & I_DIRTY_TIME) &&
((dirty & I_DIRTY_INODE) || (wbc->sync_mode == WB_SYNC_ALL || wbc->for_sync ||
wbc->sync_mode == WB_SYNC_ALL || wbc->for_sync ||
time_after(jiffies, inode->dirtied_time_when + time_after(jiffies, inode->dirtied_time_when +
dirtytime_expire_interval * HZ))) { dirtytime_expire_interval * HZ))) {
dirty |= I_DIRTY_TIME;
trace_writeback_lazytime(inode); trace_writeback_lazytime(inode);
mark_inode_dirty_sync(inode);
} }
/*
* Some filesystems may redirty the inode during the writeback
* due to delalloc, clear dirty metadata flags right before
* write_inode()
*/
spin_lock(&inode->i_lock);
dirty = inode->i_state & I_DIRTY;
inode->i_state &= ~dirty; inode->i_state &= ~dirty;
/* /*
...@@ -1509,8 +1513,6 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) ...@@ -1509,8 +1513,6 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
if (dirty & I_DIRTY_TIME)
mark_inode_dirty_sync(inode);
/* Don't write the inode if only I_DIRTY_PAGES was set */ /* Don't write the inode if only I_DIRTY_PAGES was set */
if (dirty & ~I_DIRTY_PAGES) { if (dirty & ~I_DIRTY_PAGES) {
int err = write_inode(inode, wbc); int err = write_inode(inode, wbc);
......
...@@ -705,6 +705,7 @@ static int udf_check_vsd(struct super_block *sb) ...@@ -705,6 +705,7 @@ static int udf_check_vsd(struct super_block *sb)
struct buffer_head *bh = NULL; struct buffer_head *bh = NULL;
int nsr = 0; int nsr = 0;
struct udf_sb_info *sbi; struct udf_sb_info *sbi;
loff_t session_offset;
sbi = UDF_SB(sb); sbi = UDF_SB(sb);
if (sb->s_blocksize < sizeof(struct volStructDesc)) if (sb->s_blocksize < sizeof(struct volStructDesc))
...@@ -712,7 +713,8 @@ static int udf_check_vsd(struct super_block *sb) ...@@ -712,7 +713,8 @@ static int udf_check_vsd(struct super_block *sb)
else else
sectorsize = sb->s_blocksize; sectorsize = sb->s_blocksize;
sector += (((loff_t)sbi->s_session) << sb->s_blocksize_bits); session_offset = (loff_t)sbi->s_session << sb->s_blocksize_bits;
sector += session_offset;
udf_debug("Starting at sector %u (%lu byte sectors)\n", udf_debug("Starting at sector %u (%lu byte sectors)\n",
(unsigned int)(sector >> sb->s_blocksize_bits), (unsigned int)(sector >> sb->s_blocksize_bits),
...@@ -757,8 +759,7 @@ static int udf_check_vsd(struct super_block *sb) ...@@ -757,8 +759,7 @@ static int udf_check_vsd(struct super_block *sb)
if (nsr > 0) if (nsr > 0)
return 1; return 1;
else if (!bh && sector - (sbi->s_session << sb->s_blocksize_bits) == else if (!bh && sector - session_offset == VSD_FIRST_SECTOR_OFFSET)
VSD_FIRST_SECTOR_OFFSET)
return -1; return -1;
else else
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment