RETURN(rc);
}
+
+static int mdd_create_sanity_check(const struct lu_context *ctxt,
+ struct mdd_device *mdd,
+ struct md_object *pobj,
+ const char *name, struct md_attr *ma)
+{
+ struct lu_fid *fid;
+ int rc;
+
+ fid = &mdd_ctx_info(ctxt)->mti_fid;
+ rc = mdd_lookup(ctxt, pobj, name, fid);
+ if (rc != -ENOENT) {
+ rc = rc ? rc : -EEXIST;
+ RETURN(rc);
+ }
+
+ switch (ma->ma_attr.la_mode & S_IFMT) {
+ case S_IFREG:
+ case S_IFDIR:
+ case S_IFLNK:
+ case S_IFCHR:
+ case S_IFBLK:
+ case S_IFIFO:
+ case S_IFSOCK:
+ rc = 0;
+ break;
+ default:
+ rc = -EINVAL;
+ break;
+ }
+ RETURN(rc);
+}
+
/*
* Create object and insert it into namespace.
*/
struct mdd_object *mdo = md2mdd_obj(pobj);
struct mdd_object *son = md2mdd_obj(child);
struct lu_attr *attr = &ma->ma_attr;
- struct lu_fid *fid;
struct lov_mds_md *lmm = NULL;
struct thandle *handle;
int rc, created = 0, inserted = 0, lmm_size = 0;
ENTRY;
/* sanity checks before big job */
- fid = &mdd_ctx_info(ctxt)->mti_fid;
- rc = mdd_lookup(ctxt, pobj, name, fid);
- if (rc != -ENOENT) {
- rc = rc ? rc : -EEXIST;
+ rc = mdd_create_sanity_check(ctxt, mdd, pobj, name, ma);
+ if (rc)
RETURN(rc);
- }
+
/* no RPC inside the transaction, so OST objects should be created at
* first */
#include <obd.h>
/* lu2dt_dev() */
#include <dt_object.h>
+#include <lustre_mds.h>
#include "mdt_internal.h"
/*
LASSERT(lu_object_assert_exists(info->mti_ctxt,
&info->mti_object->mot_obj.mo_lu));
ENTRY;
+
+
+ req_capsule_set_size(&info->mti_pill, &RMF_EADATA,
+ RCL_SERVER, LUSTRE_POSIX_ACL_MAX_SIZE);
+
+ result = req_capsule_pack(&info->mti_pill);
+ if (result)
+ RETURN(result);
if (MDT_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) {
result = -ENOMEM;
ENTRY;
+ req_capsule_set_size(&info->mti_pill, &RMF_EADATA,
+ RCL_SERVER, LUSTRE_POSIX_ACL_MAX_SIZE);
+
+ rc = req_capsule_pack(&info->mti_pill);
+ if (rc)
+ RETURN(rc);
rc = mdt_getattr_name_lock(info, lhc, MDS_INODELOCK_UPDATE, NULL);
if (lustre_handle_is_used(&lhc->mlh_lh)) {
ldlm_lock_decref(&lhc->mlh_lh, lhc->mlh_mode);
req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD,
RCL_SERVER, mdt->mdt_max_mdsize);
-#ifdef CONFIG_FS_POSIX_ACL
+
req_capsule_set_size(&info->mti_pill, &RMF_EADATA,
- RCL_SERVER, mdt->mdt_max_cookiesize);
-#endif
+ RCL_SERVER, LUSTRE_POSIX_ACL_MAX_SIZE);
+
rc = req_capsule_pack(&info->mti_pill);
if (rc)
RETURN(rc);
DEF_MDT_HNDL_F(0, CONNECT, mdt_connect),
DEF_MDT_HNDL_F(0, DISCONNECT, mdt_disconnect),
DEF_MDT_HNDL_F(0 |HABEO_REFERO, GETSTATUS, mdt_getstatus),
-DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, GETATTR, mdt_getattr),
-DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, GETATTR_NAME, mdt_getattr_name),
+DEF_MDT_HNDL_F(HABEO_CORPUS , GETATTR, mdt_getattr),
+DEF_MDT_HNDL_F(HABEO_CORPUS , GETATTR_NAME, mdt_getattr_name),
DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO|MUTABOR,
SETXATTR, mdt_setxattr),
DEF_MDT_HNDL_F(HABEO_CORPUS, GETXATTR, mdt_getxattr),
#endif
#define DEBUG_SUBSYSTEM S_MDS
+#include <lustre_mds.h>
#include "mdt_internal.h"
/* we do nothing because we do not have refcount now */
req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER,
mdt->mdt_max_mdsize);
+
+ req_capsule_set_size(&info->mti_pill, &RMF_EADATA, RCL_SERVER,
+ LUSTRE_POSIX_ACL_MAX_SIZE);
+
result = req_capsule_pack(&info->mti_pill);
if (result)
RETURN(result);
static int osd_create_pre(struct osd_thread_info *info, struct osd_object *obj,
struct lu_attr *attr, struct thandle *th)
{
- 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;
+ return 0;
}
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, dev_t dev, struct thandle *th)
+ umode_t mode, struct thandle *th)
{
int result;
struct osd_device *osd = osd_obj2dev(obj);
dentry = d_alloc(osd->od_obj_area, &info->oti_str);
if (dentry != 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) {
+ result = dir->i_op->create(dir, dentry, mode, NULL);
+ if (result == 0) {
LASSERT(dentry->d_inode != NULL);
obj->oo_inode = dentry->d_inode;
igrab(obj->oo_inode);
oth = container_of0(th, struct osd_thandle, ot_super);
LASSERT(S_ISDIR(attr->la_mode));
result = osd_mkfile(info, obj, (attr->la_mode &
- (S_IFMT |(S_IRWXUGO|S_ISVTX))), 0, th);
+ (S_IFMT | S_IRWXUGO | S_ISVTX)), th);
if (result == 0) {
LASSERT(obj->oo_inode != NULL);
/*
{
LASSERT(S_ISREG(attr->la_mode));
return osd_mkfile(info, obj, (attr->la_mode &
- (S_IFMT|S_IRWXUGO|S_ISVTX)),
- 0, th);
+ (S_IFMT | S_IRWXUGO | S_ISVTX)), th);
}
static int osd_mksym(struct osd_thread_info *info, struct osd_object *obj,
{
LASSERT(S_ISLNK(attr->la_mode));
return osd_mkfile(info, obj, (attr->la_mode &
- (S_IFMT|S_IRWXUGO|S_ISVTX)),
- 0, th);
+ (S_IFMT | S_IRWXUGO | S_ISVTX)), th);
}
static int osd_mknod(struct osd_thread_info *info, struct osd_object *obj,
struct lu_attr *attr, struct thandle *th)
{
- return osd_mkfile(info, obj, (attr->la_mode &
- (S_IFMT | S_IRWXUGO | S_ISVTX)),
- attr->la_rdev, th);
+ int result;
+ struct osd_device *osd = osd_obj2dev(obj);
+ struct inode *dir;
+ umode_t mode = attr->la_mode & (S_IFMT | S_IRWXUGO | S_ISVTX);
+
+ /*
+ * XXX temporary solution.
+ */
+ struct dentry *dentry;
+
+ LASSERT(osd_invariant(obj));
+ LASSERT(obj->oo_inode == NULL);
+ LASSERT(osd->od_obj_area != NULL);
+
+ dir = osd->od_obj_area->d_inode;
+ 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;
+ info->oti_str.len = strlen(info->oti_name);
+
+ dentry = d_alloc(osd->od_obj_area, &info->oti_str);
+ if (dentry != NULL) {
+ result = dir->i_op->mknod(dir, dentry, mode, attr->la_rdev);
+ if (result == 0) {
+ LASSERT(dentry->d_inode != NULL);
+ obj->oo_inode = dentry->d_inode;
+ igrab(obj->oo_inode);
+ }
+ dput(dentry);
+ } else
+ result = -ENOMEM;
+ LASSERT(osd_invariant(obj));
+ return result;
}
typedef int (*osd_obj_type_f)(struct osd_thread_info *, struct osd_object *,
/* __REQ_LAYOUT_USER__ */
#endif
-
/* struct ptlrpc_request, lustre_msg* */
#include <lustre_req_layout.h>
/* FIXME: this length should be defined as a macro*/
const struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0,
- 4, NULL);
+ 0, NULL);
EXPORT_SYMBOL(RMF_EADATA);
const struct req_msg_field RMF_LOGCOOKIES =