RETURN(0);
}
RETURN(-EINVAL);
- } else if (keylen >= strlen("lovdesc") && !strcmp(key, "lovdesc")) {
+ } else if ((keylen >= strlen("lovdesc") && !strcmp(key, "lovdesc")) ||
+ (keylen == strlen("max_easize") &&
+ !memcmp(key, "max_easize", strlen("max_easize")))) {
+
rc = lmv_check_connect(obd);
if (rc)
RETURN(rc);
rc = obd_get_info(lmv->tgts[0].ltd_exp, keylen, key,
vallen, val);
RETURN(rc);
- }/* else if (keylen >= strlen("getext") && !strcmp(key, "getext")) {
+ } else if (keylen == strlen("max_easize") &&
+ memcmp(key, "max_easize", strlen("max_easize")) == 0) {
+
+ }
+ /* else if (keylen >= strlen("getext") && !strcmp(key, "getext")) {
struct lmv_tgt_desc *tgts;
int i;
RETURN(rc);
}
+int mdc_get_info(struct obd_export *exp, __u32 keylen, void *key,
+ __u32 *vallen, void *val)
+{
+ int rc = -EINVAL;
+
+ if (keylen == strlen("max_easize") &&
+ memcmp(key, "max_easize", strlen("max_easize")) == 0) {
+ int mdsize, *max_easize;
+
+ if (*vallen != sizeof(int))
+ RETURN(-EINVAL);
+ /*FIXME: Huanghua will fix this soon. set fixed size
+ * temporarily*/
+ *(int*)val = MAX_MD_SIZE;
+ mdsize = *(int*)val;
+ if (mdsize > exp->exp_obd->u.cli.cl_max_mds_easize)
+ exp->exp_obd->u.cli.cl_max_mds_easize = mdsize;
+ max_easize = val;
+ *max_easize = exp->exp_obd->u.cli.cl_max_mds_easize;
+ RETURN(0);
+ }
+ RETURN(rc);
+}
+
static int mdc_import_event(struct obd_device *obd, struct obd_import *imp,
enum obd_import_event event)
{
.o_import_event = mdc_import_event,
.o_llog_init = mdc_llog_init,
.o_llog_finish = mdc_llog_finish,
+ .o_get_info = mdc_get_info,
};
struct md_ops mdc_md_ops = {
static int osd_create_pre(struct osd_thread_info *info, struct osd_object *obj,
struct lu_attr *attr, struct thandle *th)
{
- return 0;
+ int result = 0;
+
+ /*sanity check the attr mode*/
+ switch (attr->la_mode & S_IFMT) {
+ case S_IFDIR:
+ case S_IFREG:
+ case S_IFLNK:
+ case S_IFCHR:
+ case S_IFBLK:
+ case S_IFIFO:
+ case S_IFSOCK:
+ result = 0;
+ break;
+ default:
+ CERROR("bad file type %o creating %s\n", attr->la_mode,
+ info->oti_name);
+ result = -EINVAL;
+ break;
+ }
+ return result;
}
static int osd_create_post(struct osd_thread_info *info, struct osd_object *obj,
}
static int osd_mkfile(struct osd_thread_info *info, struct osd_object *obj,
- umode_t mode, struct thandle *th)
+ umode_t mode, dev_t dev, struct thandle *th)
{
int result;
struct osd_device *osd = osd_obj2dev(obj);
LASSERT(osd->od_obj_area != NULL);
dir = osd->od_obj_area->d_inode;
- LASSERT(dir->i_op != NULL && dir->i_op->mkdir != NULL);
+ LASSERT(dir->i_op != NULL && dir->i_op->create != NULL);
osd_fid_build_name(lu_object_fid(&obj->oo_dt.do_lu), info->oti_name);
info->oti_str.name = info->oti_name;
dentry = d_alloc(osd->od_obj_area, &info->oti_str);
if (dentry != NULL) {
- result = dir->i_op->create(dir, dentry, mode, NULL);
+ switch (mode & S_IFMT) {
+ case S_IFDIR:
+ case S_IFREG:
+ case S_IFLNK:
+ result = dir->i_op->create(dir, dentry, mode, NULL);
+ break;
+ case S_IFCHR:
+ case S_IFBLK:
+ case S_IFIFO:
+ case S_IFSOCK:
+ result = dir->i_op->mknod(dir, dentry, mode, dev);
+ break;
+ default:
+ result = -EINVAL;
+ break;
+ }
if (result == 0) {
LASSERT(dentry->d_inode != NULL);
obj->oo_inode = dentry->d_inode;
oth = container_of0(th, struct osd_thandle, ot_super);
LASSERT(S_ISDIR(attr->la_mode));
- result = osd_mkfile(info, obj,
- S_IFDIR | (attr->la_mode & (S_IRWXUGO|S_ISVTX)),
- th);
+ result = osd_mkfile(info, obj, (attr->la_mode &
+ (S_IFMT |(S_IRWXUGO|S_ISVTX))), 0, th);
if (result == 0) {
LASSERT(obj->oo_inode != NULL);
/*
struct lu_attr *attr, struct thandle *th)
{
LASSERT(S_ISREG(attr->la_mode));
- return osd_mkfile(info, obj,
- S_IFREG | (attr->la_mode & (S_IRWXUGO|S_ISVTX)),
- th);
+ return osd_mkfile(info, obj, (attr->la_mode &
+ (S_IFMT|S_IRWXUGO|S_ISVTX)),
+ 0, th);
}
static int osd_mksym(struct osd_thread_info *info, struct osd_object *obj,
struct lu_attr *attr, struct thandle *th)
{
LASSERT(S_ISLNK(attr->la_mode));
-
- return osd_mkfile(info, obj,
- S_IFLNK | (attr->la_mode & (S_IRWXUGO|S_ISVTX)),
- th);
+ return osd_mkfile(info, obj, (attr->la_mode &
+ (S_IFMT|S_IRWXUGO|S_ISVTX)),
+ 0, th);
}
static int osd_mknod(struct osd_thread_info *info, struct osd_object *obj,
struct lu_attr *attr, struct thandle *th)
{
- return -EOPNOTSUPP;
+ return osd_mkfile(info, obj, (attr->la_mode &
+ (S_IFMT | S_IRWXUGO | S_ISVTX)),
+ attr->la_rdev, th);
}
typedef int (*osd_obj_type_f)(struct osd_thread_info *, struct osd_object *,
attr->la_gid = inode->i_gid;
// attr->la_flags = inode->i_flags;
attr->la_nlink = inode->i_nlink;
+ attr->la_rdev = inode->i_rdev;
return 0;
}