ENTRY;
/* FIXME: Can't do this because of nested transaction deadlock */
- if (cmd == EXT3_IOC_SETFLAGS && (*(int *)arg) & EXT3_JOURNAL_DATA_FL) {
- CERROR("can't set data journal flag on file\n");
- RETURN(-EPERM);
+ if (cmd == EXT3_IOC_SETFLAGS) {
+ /* We can't enable data journaling on OST objects, because
+ * this forces the transaction to be closed in order to
+ * flush the journal, but the caller will already have a
+ * compound transaction open to update the last_rcvd file,
+ * and this thread would deadlock trying to set the flag. */
+ if ((*(int *)arg) & EXT3_JOURNAL_DATA_FL) {
+ CERROR("can't set data journal flag on file\n");
+ RETURN(-EPERM);
+ }
+ /* Because the MDS does not see the EXTENTS_FL set on the
+ * OST objects, mask this flag into all set flags. It is
+ * not legal to clear this flag in any case, so we are not
+ * changing the functionality by doing this. b=22911 */
+ *(int *)arg |= EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL;
}
#ifdef HAVE_EXT4_LDISKFS
return ret;
}
-static void disp_old_kernel_msg(char *feature)
-{
- fprintf(stderr, "WARNING: ldiskfs filesystem does not support \"%s\" "
- "feature.\n\n", feature);
-}
-
static void enable_default_backfs_features(struct mkfs_opts *mop)
{
struct utsname uts;
- int maj_high, maj_low, min;
int ret;
- if (IS_MDT(&mop->mo_ldd))
- strscat(mop->mo_mkfsopts, " -O dir_index,extents,dirdata",
- sizeof(mop->mo_mkfsopts));
- else
+ if (IS_OST(&mop->mo_ldd))
strscat(mop->mo_mkfsopts, " -O dir_index,extents",
- sizeof(mop->mo_mkfsopts));
-
+ sizeof(mop->mo_mkfsopts));
+ else if (IS_MDT(&mop->mo_ldd))
+ strscat(mop->mo_mkfsopts, " -O dir_index,dirdata",
+ sizeof(mop->mo_mkfsopts));
+ else
+ strscat(mop->mo_mkfsopts, " -O dir_index",
+ sizeof(mop->mo_mkfsopts));
/* Upstream e2fsprogs called our uninit_groups feature uninit_bg,
* check for both of them when testing e2fsprogs features. */
- if (is_e2fsprogs_feature_supp("uninit_groups") == 0)
- strscat(mop->mo_mkfsopts, ",uninit_groups",
- sizeof(mop->mo_mkfsopts));
- else if (is_e2fsprogs_feature_supp("uninit_bg") == 0)
+ if (is_e2fsprogs_feature_supp("uninit_bg") == 0)
strscat(mop->mo_mkfsopts, ",uninit_bg",
sizeof(mop->mo_mkfsopts));
+ else if (is_e2fsprogs_feature_supp("uninit_groups") == 0)
+ strscat(mop->mo_mkfsopts, ",uninit_groups",
+ sizeof(mop->mo_mkfsopts));
else
disp_old_e2fsprogs_msg("uninit_bg", 1);
if (ret)
return;
- sscanf(uts.release, "%d.%d.%d", &maj_high, &maj_low, &min);
- printf("%d %d %d\n", maj_high, maj_low, min);
-
/* Multiple mount protection is enabled only if failover node is
* specified and if kernel version is higher than 2.6.9 */
if (failover) {
- if (KERNEL_VERSION(maj_high, maj_low, min) >=
- KERNEL_VERSION(2,6,9)) {
- if (is_e2fsprogs_feature_supp("mmp") == 0)
- strscat(mop->mo_mkfsopts, ",mmp",
- sizeof(mop->mo_mkfsopts));
- else
- disp_old_e2fsprogs_msg("mmp", 1);
- } else {
- disp_old_kernel_msg("mmp");
- }
+ if (is_e2fsprogs_feature_supp("mmp") == 0)
+ strscat(mop->mo_mkfsopts, ",mmp",
+ sizeof(mop->mo_mkfsopts));
+ else
+ disp_old_e2fsprogs_msg("mmp", 1);
}
}
/* Build fs according to type */