Whamcloud - gitweb
libe2p: skip unneeded lstat(2) in fgetflags() and fsetflags()
authorTheodore Ts'o <tytso@mit.edu>
Wed, 24 Feb 2021 02:25:46 +0000 (21:25 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 24 Feb 2021 02:25:46 +0000 (21:25 -0500)
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/e2p/fgetflags.c
lib/e2p/fsetflags.c

index 7b93cba..b2f7bf9 100644 (file)
 
 #include "e2p.h"
 
-#ifdef O_LARGEFILE
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
-#else
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
 #endif
+#ifndef O_NOFOLLOW
+#define O_NOFOLLOW 0
+#endif
+
+#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_NOFOLLOW)
 
 int fgetflags (const char * name, unsigned long * flags)
 {
@@ -72,29 +75,30 @@ int fgetflags (const char * name, unsigned long * flags)
 #if HAVE_EXT2_IOCTLS
        int fd, r, f, save_errno = 0;
 
-       if (!lstat(name, &buf) &&
-           !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
-               goto notsupp;
-       }
 #if !APPLE_DARWIN
-       fd = open (name, OPEN_FLAGS);
-       if (fd == -1)
+       fd = open(name, OPEN_FLAGS);
+       if (fd == -1) {
+               if (errno == ELOOP || errno == ENXIO)
+                       errno = EOPNOTSUPP;
                return -1;
-       r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);
-       if (r == -1)
+       }
+       r = ioctl(fd, EXT2_IOC_GETFLAGS, &f);
+       if (r == -1) {
+               if (errno == ENOTTY)
+                       errno = EOPNOTSUPP;
                save_errno = errno;
+       }
        *flags = f;
-       close (fd);
+       close(fd);
        if (save_errno)
                errno = save_errno;
        return r;
 #else /* APPLE_DARWIN */
-   f = -1;
-   save_errno = syscall(SYS_fsctl, name, EXT2_IOC_GETFLAGS, &f, 0);
-   *flags = f;
-   return (save_errno);
+       f = -1;
+       save_errno = syscall(SYS_fsctl, name, EXT2_IOC_GETFLAGS, &f, 0);
+       *flags = f;
+       return (save_errno);
 #endif /* !APPLE_DARWIN */
-notsupp:
 #endif /* HAVE_EXT2_IOCTLS */
 #endif
        errno = EOPNOTSUPP;
index 027834b..795042b 100644 (file)
 #undef HAVE_CHFLAGS
 #endif
 
-#ifdef O_LARGEFILE
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
-#else
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
 #endif
+#ifndef O_NOFOLLOW
+#define O_NOFOLLOW 0
+#endif
+
+#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_NOFOLLOW)
 
 int fsetflags (const char * name, unsigned long flags)
 {
@@ -78,28 +81,28 @@ int fsetflags (const char * name, unsigned long flags)
        int fd, r, f, save_errno = 0;
        struct stat buf;
 
-       if (!lstat(name, &buf) &&
-           !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
-               goto notsupp;
-       }
 #if !APPLE_DARWIN
-       fd = open (name, OPEN_FLAGS);
-       if (fd == -1)
+       fd = open(name, OPEN_FLAGS);
+       if (fd == -1) {
+               if (errno == ELOOP || errno == ENXIO)
+                       errno = EOPNOTSUPP;
                return -1;
+       }
        f = (int) flags;
-       r = ioctl (fd, EXT2_IOC_SETFLAGS, &f);
-       if (r == -1)
+       r = ioctl(fd, EXT2_IOC_SETFLAGS, &f);
+       if (r == -1) {
+               if (errno == ENOTTY)
+                       errno = EOPNOTSUPP;
                save_errno = errno;
-       close (fd);
+       }
+       close(fd);
        if (save_errno)
                errno = save_errno;
+       return r;
 #else /* APPLE_DARWIN */
        f = (int) flags;
        return syscall(SYS_fsctl, name, EXT2_IOC_SETFLAGS, &f, 0);
 #endif /* !APPLE_DARWIN */
-       return r;
-
-notsupp:
 #endif /* HAVE_EXT2_IOCTLS */
 #endif
        errno = EOPNOTSUPP;