Skip to contentSkip to conversation

- setting realtime and extent size hint flags via fcntl(XFS_IOC_FSSETXATTR)

PATCH New Vlad Apostolov 1 participant 1 message Jun 6, 2007 XFS filesystem

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 - setting realtime and extent size hint flags via fcntl(XFS_IOC_FSSETXATTR)

This patch fixes error handling when setting realtime and extent size hint flags via fcntl(XFS_IOC_FSSETXATTR).
It also makes XFS_XFLAG_RTINHERIT/XFS_XFLAG_EXTSZINHERIT and XFS_XFLAG_REALTIME/XFS_XFLAG_EXTSIZE flags mutually exclusive. Currently both, the realtime and extent hint flags could be set at the same time, which is not how the code is designed to work and could cause unexpected behavior.
The realtime extent size is taken either from the on disk xfs inode di_extsize (if set to non zero) or from the supperblock sb_rextsize fields. The parent directory inheritance didn't inherit the di_extsize, which is also fixed in this patch.

Regards,
Vlad

fs/xfs/xfs_inode.c +12 -7
Index: linux-xfs/fs/xfs/xfs_inode.c
===================================================================
@@ -793,6 +793,8 @@ _xfs_dic2xflags(
 	if (di_flags & XFS_DIFLAG_ANY) {
 		if (di_flags & XFS_DIFLAG_REALTIME)
 			flags |= XFS_XFLAG_REALTIME;
+		else if (di_flags & XFS_DIFLAG_EXTSIZE)
+			flags |= XFS_XFLAG_EXTSIZE;
 		if (di_flags & XFS_DIFLAG_PREALLOC)
 			flags |= XFS_XFLAG_PREALLOC;
 		if (di_flags & XFS_DIFLAG_IMMUTABLE)
@@ -807,14 +809,12 @@ _xfs_dic2xflags(
 			flags |= XFS_XFLAG_NODUMP;
 		if (di_flags & XFS_DIFLAG_RTINHERIT)
 			flags |= XFS_XFLAG_RTINHERIT;
+		else if (di_flags & XFS_DIFLAG_EXTSZINHERIT)
+			flags |= XFS_XFLAG_EXTSZINHERIT;
 		if (di_flags & XFS_DIFLAG_PROJINHERIT)
 			flags |= XFS_XFLAG_PROJINHERIT;
 		if (di_flags & XFS_DIFLAG_NOSYMLINKS)
 			flags |= XFS_XFLAG_NOSYMLINKS;
-		if (di_flags & XFS_DIFLAG_EXTSIZE)
-			flags |= XFS_XFLAG_EXTSIZE;
-		if (di_flags & XFS_DIFLAG_EXTSZINHERIT)
-			flags |= XFS_XFLAG_EXTSZINHERIT;
 		if (di_flags & XFS_DIFLAG_NODEFRAG)
 			flags |= XFS_XFLAG_NODEFRAG;
 	}
@@ -1200,9 +1200,12 @@ xfs_ialloc(
 			uint	di_flags = 0;
 
 			if ((mode & S_IFMT) == S_IFDIR) {
-				if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
+				if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) {
 					di_flags |= XFS_DIFLAG_RTINHERIT;
-				if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
+					ip->i_d.di_extsize = pip->i_d.di_extsize;
+				}
+				else if (pip->i_d.di_flags &
+					 XFS_DIFLAG_EXTSZINHERIT) {
 					di_flags |= XFS_DIFLAG_EXTSZINHERIT;
 					ip->i_d.di_extsize = pip->i_d.di_extsize;
 				}
@@ -1210,8 +1213,10 @@ xfs_ialloc(
 				if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) {
 					di_flags |= XFS_DIFLAG_REALTIME;
 					ip->i_iocore.io_flags |= XFS_IOCORE_RT;
+					ip->i_d.di_extsize = pip->i_d.di_extsize;
 				}
-				if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
+				else if (pip->i_d.di_flags &
+					 XFS_DIFLAG_EXTSZINHERIT) {
 					di_flags |= XFS_DIFLAG_EXTSIZE;
 					ip->i_d.di_extsize = pip->i_d.di_extsize;
 				}
fs/xfs/xfs_vnodeops.c +36 -5

67 lines not on this page · raw message