All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@redhat.com>
To: xfs-oss <xfs@oss.sgi.com>
Subject: [PATCH] xfsprogs: restrict platform_test_xfs_fd to regular files
Date: Tue, 08 Oct 2013 10:17:50 -0500	[thread overview]
Message-ID: <5254221E.1000503@redhat.com> (raw)

If a special file (block, char, pipe etc) resides on an
xfs filesystem, platform_test_xfs_[fd|path] will return
true, but a subsequent xfsctl will fail, because the file
operations to support the xfs ioctls are not set up on such
files (see i_fop assignments in xfs_setup_inode()).

>From the xfsctl manpage it's pretty clear that these functions
are supposed to return true iff a subsequent xfsctl can be
handled, so it makes sense to exclude special files.

This was showing up in xfstest generic/306, which creates
the dev/null block device on an xfstest an tries to pwrite
to it with xfs_io - which emitted a warning when the xfsctl
trying to get geometry failed.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/include/linux.h b/include/linux.h
index 5bb91cd..502fd1f 100644
--- a/include/linux.h
+++ b/include/linux.h
@@ -34,20 +34,38 @@ static __inline__ int xfsctl(const char *path, int fd, int cmd, void *p)
 	return ioctl(fd, cmd, p);
 }
 
+/*
+ * platform_test_xfs_*() implies that xfsctl will succeed on the file;
+ * on Linux, at least, special files don't get xfs file ops,
+ * so return 0 for those
+ */
+
 static __inline__ int platform_test_xfs_fd(int fd)
 {
-	struct statfs buf;
-	if (fstatfs(fd, &buf) < 0)
+	struct statfs statfsbuf;
+	struct stat statbuf;
+
+	if (fstatfs(fd, &statfsbuf) < 0)
+		return 0;
+	if (fstat(fd, &statbuf) < 0)
 		return 0;
-	return (buf.f_type == 0x58465342);	/* XFSB */
+	if (!S_ISREG(statbuf.st_mode) && !S_ISDIR(statbuf.st_mode))
+		return 0;
+	return (statfsbuf.f_type == 0x58465342);	/* XFSB */
 }
 
 static __inline__ int platform_test_xfs_path(const char *path)
 {
-	struct statfs buf;
-	if (statfs(path, &buf) < 0)
+	struct statfs statfsbuf;
+	struct stat statbuf;
+
+	if (statfs(path, &statfsbuf) < 0)
+		return 0;
+	if (stat(path, &statbuf) < 0)
+		return 0;
+	if (!S_ISREG(statbuf.st_mode) && !S_ISDIR(statbuf.st_mode))
 		return 0;
-	return (buf.f_type == 0x58465342);	/* XFSB */
+	return (statfsbuf.f_type == 0x58465342);	/* XFSB */
 }
 
 static __inline__ int platform_fstatfs(int fd, struct statfs *buf)

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

             reply	other threads:[~2013-10-08 15:17 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-08 15:17 Eric Sandeen [this message]
2013-10-08 17:23 ` [PATCH] xfsprogs: restrict platform_test_xfs_fd to regular files Christoph Hellwig
2013-10-18 17:27 ` Rich Johnston

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5254221E.1000503@redhat.com \
    --to=sandeen@redhat.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.