--- fs/xfs/xfs_dfrag.c.orig     2010-06-15 09:16:05.000000000 -0400
+++ fs/xfs/xfs_dfrag.c  2010-06-15 09:30:17.000000000 -0400
@@ -69,7 +69,9 @@ xfs_swapext(
                goto out;
        }

-       if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) {
+       if (!(file->f_mode & FMODE_WRITE) ||
+           !(file->f_mode & FMODE_READ) ||
+            (file->f_flags & O_APPEND)) {
                error = XFS_ERROR(EBADF);
                goto out_put_file;
        }
@@ -81,7 +83,8 @@ xfs_swapext(
        }

        if (!(tmp_file->f_mode & FMODE_WRITE) ||
-           (tmp_file->f_flags & O_APPEND)) {
+           !(tmp_file->f_mode & FMODE_READ) ||
+            (tmp_file->f_flags & O_APPEND)) {
                error = XFS_ERROR(EBADF);
                goto out_put_tmp_file;
        }
@@ -112,6 +115,11 @@ xfs_swapext(

        error = xfs_swap_extents(ip, tip, sxp);

+       if(!error) {
+               file_remove_suid(tmp_file);
+               file_remove_suid(file);
+       }
+ 
  out_put_tmp_file:
        fput(tmp_file);
  out_put_file:
