From: wangdi Date: Fri, 4 Aug 2006 01:07:56 +0000 (+0000) Subject: Branch: b_new_cmd X-Git-Tag: v1_8_0_110~486^2~1285 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=c22db47af9b8b1927235ea45adbee159ab72f360;p=fs%2Flustre-release.git Branch: b_new_cmd 1)some fixes according to nikita's comments 2)mdt_getattr/getattr_name should not have fixed size reply, since EA_DATA is not const, and should be set max acl size before pack reply --- diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 4f38860..99dfb0e 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -949,6 +949,39 @@ static int mdd_create_data_object(const struct lu_context *ctxt, 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. */ @@ -961,19 +994,16 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, 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 */ diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index f2dfabf..c58a77c 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -53,6 +53,7 @@ #include /* lu2dt_dev() */ #include +#include #include "mdt_internal.h" /* @@ -322,6 +323,14 @@ static int mdt_getattr(struct mdt_thread_info *info) 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; @@ -446,6 +455,12 @@ static int mdt_getattr_name(struct mdt_thread_info *info) 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); @@ -1511,10 +1526,10 @@ static int mdt_intent_getattr(enum mdt_it_code opcode, 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); @@ -2824,8 +2839,8 @@ static struct mdt_handler mdt_mds_ops[] = { 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), diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 5ac05d8..51b7dcb 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -31,6 +31,7 @@ #endif #define DEBUG_SUBSYSTEM S_MDS +#include #include "mdt_internal.h" /* we do nothing because we do not have refcount now */ @@ -264,6 +265,10 @@ int mdt_reint_open(struct mdt_thread_info *info) 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); diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index a9543be..8995e85 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -624,26 +624,7 @@ static int osd_inode_setattr(const struct lu_context *ctx, 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, @@ -663,7 +644,7 @@ static void osd_fid_build_name(const struct lu_fid *fid, char *name) } 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); @@ -687,23 +668,8 @@ static int osd_mkfile(struct osd_thread_info *info, struct osd_object *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); @@ -732,7 +698,7 @@ static int osd_mkdir(struct osd_thread_info *info, struct osd_object *obj, 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); /* @@ -750,8 +716,7 @@ static int osd_mkreg(struct osd_thread_info *info, struct osd_object *obj, { 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, @@ -759,16 +724,46 @@ 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 *, diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index f865c37..4f1a402 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -50,7 +50,6 @@ /* __REQ_LAYOUT_USER__ */ #endif - /* struct ptlrpc_request, lustre_msg* */ #include @@ -385,7 +384,7 @@ EXPORT_SYMBOL(RMF_REC_SETATTR); /* 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 =