#include <sys/ioctl.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <sys/utsname.h>
#include <xfs/xfs.h>
ret = 0;
dout(0) << "detect_feature: failed to set test file extsize, assuming extsize is NOT supported" << dendl;
goto out_close;
+ }
+
+ // make sure we have 3.5 or newer, which includes this fix
+ // aff3a9edb7080f69f07fe76a8bd089b3dfa4cb5d
+ // for this set_extsize bug
+ // http://oss.sgi.com/bugzilla/show_bug.cgi?id=874
+ struct utsname u;
+ int r = uname(&u);
+ assert(r == 0);
+ int major = 0, minor = 0, patch = 0;
+ r = sscanf(u.release, "%d.%d.%d", &major, &minor, &patch);
+ if (r != 3) {
+ ret = 0;
+ dout(0) << __func__ << ": failed to parse kernel version "
+ << u.release << " to verify extsize not buggy, disabling extsize"
+ << dendl;
+ m_has_extsize = false;
+ } else if (major < 3 || (major == 3 && minor < 5)) {
+ dout(0) << __func__ << ": disabling extsize, kernel " << u.release
+ << " is older than 3.5 and has buggy extsize ioctl" << dendl;
+ m_has_extsize = false;
} else {
- dout(0) << "detect_feature: extsize is supported" << dendl;
+ dout(0) << "detect_feature: extsize is supported and kernel "
+ << u.release << " >= 3.5" << dendl;
m_has_extsize = true;
}
} else {
dout(0) << "detect_feature: extsize is disabled by conf" << dendl;
}
-
out_close:
TEMP_FAILURE_RETRY(::close(fd));
out: