Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f993fe4 authored by Anton Altaparmakov's avatar Anton Altaparmakov
Browse files

NTFS: Fix a bug in address space operations error recovery code paths where


      if the runlist was not mapped at all and a mapping error occured we
      would leave the runlist locked on exit to the function so that the
      next access to the same file would try to take the lock and deadlock.

Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent 3f2faef0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -121,6 +121,10 @@ ToDo/Notes:
	- Stamp the transaction log ($UsnJrnl), aka user space journal, if it
	  is active on the volume and we are mounting read-write or remounting
	  from read-only to read-write.
	- Fix a bug in address space operations error recovery code paths where
	  if the runlist was not mapped at all and a mapping error occured we
	  would leave the runlist locked on exit to the function so that the
	  next access to the same file would try to take the lock and deadlock.

2.1.22 - Many bug and race fixes and error handling improvements.

+12 −4
Original line number Diff line number Diff line
@@ -264,7 +264,8 @@ lock_retry_remap:
					goto lock_retry_remap;
				rl = NULL;
				lcn = err;
			}
			} else if (!rl)
				up_read(&ni->runlist.lock);
			/* Hard error, zero out region. */
			bh->b_blocknr = -1;
			SetPageError(page);
@@ -690,7 +691,8 @@ lock_retry_remap:
				goto lock_retry_remap;
			rl = NULL;
			lcn = err;
		}
		} else if (!rl)
			up_read(&ni->runlist.lock);
		/* Failed to map the buffer, even after retrying. */
		bh->b_blocknr = -1;
		ntfs_error(vol->sb, "Failed to write to inode 0x%lx, "
@@ -965,8 +967,11 @@ lock_retry_remap:
					if (err2 == -ENOMEM)
						page_is_dirty = TRUE;
					lcn = err2;
				} else
				} else {
					err2 = -EIO;
					if (!rl)
						up_read(&ni->runlist.lock);
				}
				/* Hard error.  Abort writing this record. */
				if (!err || err == -ENOMEM)
					err = err2;
@@ -1660,6 +1665,8 @@ lock_retry_remap:
							"not supported yet. "
							"Sorry.");
					err = -EOPNOTSUPP;
					if (!rl)
						up_read(&ni->runlist.lock);
					goto err_out;
				} else if (!is_retry &&
						lcn == LCN_RL_NOT_MAPPED) {
@@ -1674,7 +1681,8 @@ lock_retry_remap:
						goto lock_retry_remap;
					rl = NULL;
					lcn = err;
				}
				} else if (!rl)
					up_read(&ni->runlist.lock);
				/*
				 * Failed to map the buffer, even after
				 * retrying.
+1 −1
Original line number Diff line number Diff line
@@ -936,7 +936,7 @@ typedef struct {
		/* 56*/	le64 quota_charged;	/* Byte size of the charge to
				the quota for all streams of the file. Note: Is
				zero if quotas are disabled. */
		/* 64*/	USN usn;		/* Last update sequence number
		/* 64*/	leUSN usn;		/* Last update sequence number
				of the file.  This is a direct index into the
				transaction log file ($UsnJrnl).  It is zero if
				the usn journal is disabled or this file has