static inline ALWAYSINLINE int
vc_set_iattr_compat_fscompat(char const *filename,
dev_t dev, ino_t ino, xid_t xid,
- uint32_t flags, uint32_t mask)
+ uint32_t flags, uint32_t mask,
+ mode_t const *mode)
{
- int fd = open(filename, O_RDONLY);
+ int fd;
struct stat st;
int stat_rc;
-
+
+ if (mode!=0 && !S_ISREG(*mode) && !S_ISDIR(*mode)) return 0;
+
+ fd = open(filename, O_RDONLY);
if (fd==-1) return -1;
stat_rc = fstat(fd, &st);
}
if ( (mask&VC_IATTR_BARRIER) ) {
- if (fchmod(fd, (flags&VC_IATTR_BARRIER) ? 0 : (st.st_mode|0500))==-1)
+ if (fchmod(fd, (flags&VC_IATTR_BARRIER) ? 0 :
+ (st.st_mode| (mode ? *mode : 0500)))==-1)
goto err;
}