* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
/* libcfs.h is not really needed here, but on SLES10/PPC, fs.h includes idr.h which
* requires BITS_PER_LONG to be defined */
#include <libcfs/libcfs.h>
+#ifndef BLKGETSIZE64
#include <linux/fs.h> /* for BLKGETSIZE64 */
+#endif
#include <linux/version.h>
#endif
#include <lustre_disk.h>
*/
"\t\t--comment=<user comment>: arbitrary user string (%d bytes)\n"
"\t\t--mountfsoptions=<opts> : permanent mount options\n"
+ "\t\t--network=<net>[,<...>] : network(s) to restrict this ost/mdt to\n"
#ifndef TUNEFS
"\t\t--backfstype=<fstype> : backing fs type (ext3, ldiskfs)\n"
"\t\t--device-size=#N(KB) : device size for loop devices\n"
int maj_high, maj_low, min;
int ret;
- strscat(mop->mo_mkfsopts, " -O dir_index,extents", sizeof(mop->mo_mkfsopts));
+ if (IS_MDT(&mop->mo_ldd))
+ strscat(mop->mo_mkfsopts, " -O dir_index,extents,dirdata",
+ sizeof(mop->mo_mkfsopts));
+ else
+ strscat(mop->mo_mkfsopts, " -O dir_index,extents",
+ sizeof(mop->mo_mkfsopts));
+
/* Upstream e2fsprogs called our uninit_groups feature uninit_bg,
* check for both of them when testing e2fsprogs features. */
/* Build fs according to type */
int make_lustre_backfs(struct mkfs_opts *mop)
{
+ __u64 device_sz = mop->mo_device_sz, block_count = 0;
char mkfs_cmd[PATH_MAX];
char buf[64];
char *dev;
int ret = 0;
- int block_count = 0;
+
+ if (!(mop->mo_flags & MO_IS_LOOP)) {
+ mop->mo_device_sz = get_device_size(mop->mo_device);
+
+ if (mop->mo_device_sz == 0)
+ return ENODEV;
+
+ /* Compare to real size */
+ if (device_sz == 0 || device_sz > mop->mo_device_sz)
+ device_sz = mop->mo_device_sz;
+ else
+ mop->mo_device_sz = device_sz;
+ }
if (mop->mo_device_sz != 0) {
if (mop->mo_device_sz < 8096){
if ((mop->mo_ldd.ldd_mount_type == LDD_MT_EXT3) ||
(mop->mo_ldd.ldd_mount_type == LDD_MT_LDISKFS) ||
(mop->mo_ldd.ldd_mount_type == LDD_MT_LDISKFS2)) {
- __u64 device_sz = mop->mo_device_sz;
-
- /* we really need the size */
- if (device_sz == 0) {
- device_sz = get_device_size(mop->mo_device);
- if (device_sz == 0)
- return ENODEV;
- }
-
/* Journal size in MB */
if (strstr(mop->mo_mkfsopts, "-J") == NULL) {
/* Choose our own default journal size */
vprint("formatting backing filesystem %s on %s\n",
MT_STR(&mop->mo_ldd), dev);
vprint("\ttarget name %s\n", mop->mo_ldd.ldd_svname);
- vprint("\t4k blocks %d\n", block_count);
+ vprint("\t4k blocks "LPU64"\n", block_count);
vprint("\toptions %s\n", mop->mo_mkfsopts);
/* mkfs_cmd's trailing space is important! */
strscat(mkfs_cmd, " ", sizeof(mkfs_cmd));
strscat(mkfs_cmd, dev, sizeof(mkfs_cmd));
if (block_count != 0) {
- sprintf(buf, " %d", block_count);
+ sprintf(buf, " "LPU64, block_count);
strscat(mkfs_cmd, buf, sizeof(mkfs_cmd));
}
if (mop->mo_flags & MO_IS_LOOP)
dev = mop->mo_loopdev;
- ret = mount(dev, mntpt, MT_STR(&mop->mo_ldd), 0, NULL);
+ ret = mount(dev, mntpt, MT_STR(&mop->mo_ldd), 0,
+ mop->mo_ldd.ldd_mount_opts);
if (ret) {
fprintf(stderr, "%s: Unable to mount %s: %s\n",
progname, dev, strerror(errno));
{"verbose", 0, 0, 'v'},
{"writeconf", 0, 0, 'w'},
{"upgrade_to_18", 0, 0, 'U'},
+ {"network", 1, 0, 't'},
{0, 0, 0, 0}
};
char *optstring = "b:c:C:d:ef:Ghi:k:L:m:MnNo:Op:Pqru:vw";
case 'r':
mop->mo_flags |= MO_FORCEFORMAT;
break;
+ case 't':
+ if (!IS_MDT(&mop->mo_ldd) && !IS_OST(&mop->mo_ldd)) {
+ badopt(long_opt[longidx].name, "MDT,OST");
+ return 1;
+ }
+
+ if (!optarg)
+ return 1;
+
+ rc = add_param(mop->mo_ldd.ldd_params,
+ PARAM_NETWORK, optarg);
+ if (rc != 0)
+ return rc;
+ /* Must update the mgs logs */
+ mop->mo_ldd.ldd_flags |= LDD_F_UPDATE;
+ break;
case 'u':
strscpy(mop->mo_ldd.ldd_userdata, optarg,
sizeof(mop->mo_ldd.ldd_userdata));
static int check_mountfsoptions(char *mountopts, char *wanted_mountopts,
int justwarn)
{
- char *ml, *mlp, *item, *ctx;
+ char *ml, *mlp, *item, *ctx = NULL;
int errors = 0;
if (!(ml = strdup(wanted_mountopts))) {