Re: [PATCH] xfs: preserve i_mode if __xfs_set_acl() fails

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 15, 2017 at 04:29:39PM -0300, Ernesto A. Fernández wrote:
> On Tue, Aug 15, 2017 at 06:44:30PM +1000, Dave Chinner wrote:
> > On Tue, Aug 15, 2017 at 03:18:58AM -0300, Ernesto A. Fernández wrote:
> > But I have to ask - why do we even need to modify the mode first?
> > Why not change the ACL first, then modify the mode+timestamp? If
> > setting the ACL fails, then we don't have anything to undo and all
> > is good....
> 
> I intended for the mode to be committed as part of the same transaction
> that sets or removes the ACL. In my mind making the changes later, as part
> of a separate transaction, would have meant that a crash between the two
> left the filesystem in an inconsistent state,

No, it will not leave the fileystem in an inconsistent state. It
will leave the inode permissions in an /unwanted/ state, but there
is no filesystem metadata inconsistency. 

> with a new ACL but without
> the corresponding mode bits.

Yup, but that's no different from right now, where a crash after
setting the mode bits could be applied but the ACL update is
missing.

Either way is even rarely than "crash at the wrong time" implies,
because we've also got to have a complete journal checkpoint occur
between the two operations and then crash between the checkpoint and
the second operation. Yes, it's possible, but in the entire time
I've been working on XFS (almost 15 years now) I can count on one
hand the number of times such a problem has occurred and been
reported...

So, it's a rare problem, and one that will get solved in time
because there's much more to solving the problem than just this
case. e.g. I worte this in 2008:

http://xfs.org/index.php/Improving_Metadata_Performance_By_Reducing_Journal_Overhead#Atomic_Multi-Transaction_Operations

And we've really only got the infrastructure we could use to
implement this in a widespread manner with the rmap/reflink
functionality. But implementing it will require a large amount of
re-organisation of filesystem operations, so it's something that
will take time to roll out.

With that in mind, here's waht I suggested above: set the mode after
the xattr. I haven't tested it - can you check it solves the problem
case you are testing?

Cheers,

Dave.
-- 
Dave Chinner
david@xxxxxxxxxxxxx


xfs: don't change inode mode if ACL update fails

XXX: untested

---
 fs/xfs/xfs_acl.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c
index 7034e17535de..3354140de07e 100644
--- a/fs/xfs/xfs_acl.c
+++ b/fs/xfs/xfs_acl.c
@@ -247,6 +247,8 @@ xfs_set_mode(struct inode *inode, umode_t mode)
 int
 xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
+	umode_t mode;
+	bool set_mode = false;
 	int error = 0;
 
 	if (!acl)
@@ -257,16 +259,24 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 		return error;
 
 	if (type == ACL_TYPE_ACCESS) {
-		umode_t mode;
-
 		error = posix_acl_update_mode(inode, &mode, &acl);
 		if (error)
 			return error;
-		error = xfs_set_mode(inode, mode);
-		if (error)
-			return error;
+		set_mode = true;
 	}
 
  set_acl:
-	return __xfs_set_acl(inode, acl, type);
+	error =  __xfs_set_acl(inode, acl, type);
+	if (error)
+		return error;
+
+	/*
+	 * We set the mode after successfully updating the ACL xattr because the
+	 * xattr update can fail at ENOSPC and we don't want to change the mode
+	 * if the ACL update hasn't been applied.
+	 */
+	if (set_mode)
+		error = xfs_set_mode(inode, mode);
+
+	return error;
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux