From 02edd8e45053445a772a48a2f67fc179587714ce Mon Sep 17 00:00:00 2001 From: yury Date: Mon, 22 Nov 2004 12:13:19 +0000 Subject: [PATCH] - fixed mdc_op_data stack allocations. --- lustre/llite/dir.c | 51 +++++++++++++++---------- lustre/llite/file.c | 10 +++-- lustre/llite/llite_lib.c | 23 +++++++++--- lustre/llite/namei.c | 96 ++++++++++++++++++++++++++++++++---------------- 4 files changed, 121 insertions(+), 59 deletions(-) diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index 6a96db2..d8ec0d1 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -224,13 +224,18 @@ static struct page *ll_get_dir_page(struct inode *dir, unsigned long n) if (!rc) { struct lookup_intent it = { .it_op = IT_READDIR }; struct ptlrpc_request *request; - struct mdc_op_data data; + struct mdc_op_data *op_data; - ll_prepare_mdc_data(&data, dir, NULL, NULL, 0, 0); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(ERR_PTR(-ENOMEM)); + + ll_prepare_mdc_data(op_data, dir, NULL, NULL, 0, 0); rc = md_enqueue(ll_i2sbi(dir)->ll_lmv_exp, LDLM_IBITS, &it, - LCK_PR, &data, &lockh, NULL, 0, + LCK_PR, op_data, &lockh, NULL, 0, ldlm_completion_ast, ll_mdc_blocking_ast, dir); + OBD_FREE(op_data, sizeof(*op_data)); request = (struct ptlrpc_request *)it.d.lustre.it_data; if (request) @@ -374,13 +379,13 @@ done: static int ll_mkdir_stripe(struct inode *inode, unsigned long arg) { - char *name; - struct ll_user_mkdir_stripe lums; struct ptlrpc_request *request = NULL; struct ll_sb_info *sbi = ll_i2sbi(inode); - struct mdc_op_data op_data; + struct ll_user_mkdir_stripe lums; + struct mdc_op_data *op_data; u16 nstripes; mode_t mode; + char *name; int err = 0; ENTRY; @@ -402,9 +407,14 @@ static int ll_mkdir_stripe(struct inode *inode, unsigned long arg) mode = lums.lums_mode; mode = (mode & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR; - ll_prepare_mdc_data(&op_data, inode, NULL, name,lums.lums_namelen,0); - err = md_create(sbi->ll_lmv_exp, &op_data, &nstripes, sizeof(nstripes), + + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + GOTO(out, err = -ENOMEM); + ll_prepare_mdc_data(op_data, inode, NULL, name,lums.lums_namelen,0); + err = md_create(sbi->ll_lmv_exp, op_data, &nstripes, sizeof(nstripes), mode, current->fsuid, current->fsgid, 0, &request); + OBD_FREE(op_data, sizeof(*op_data)); ptlrpc_req_finished(request); EXIT; out: @@ -473,34 +483,37 @@ static int ll_dir_ioctl(struct inode *inode, struct file *file, RETURN(ll_finish_gns(sbi)); case LL_IOC_LOV_SETSTRIPE: { struct ptlrpc_request *request = NULL; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; struct iattr attr = { 0 }; struct lov_user_md lum, *lump = (struct lov_user_md *)arg; int rc = 0; - ll_prepare_mdc_data(&op_data, inode, NULL, NULL, 0, 0); - LASSERT(sizeof(lum) == sizeof(*lump)); LASSERT(sizeof(lum.lmm_objects[0]) == sizeof(lump->lmm_objects[0])); rc = copy_from_user(&lum, lump, sizeof(lum)); if (rc) - return(-EFAULT); + RETURN(-EFAULT); if (lum.lmm_magic != LOV_USER_MAGIC) RETURN(-EINVAL); - rc = md_setattr(sbi->ll_lmv_exp, &op_data, - &attr, &lum, sizeof(lum), NULL, 0, &request); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + + ll_prepare_mdc_data(op_data, inode, NULL, NULL, 0, 0); + + rc = md_setattr(sbi->ll_lmv_exp, op_data, &attr, &lum, + sizeof(lum), NULL, 0, &request); + OBD_FREE(op_data, sizeof(*op_data)); + ptlrpc_req_finished(request); + if (rc) { - ptlrpc_req_finished(request); if (rc != -EPERM && rc != -EACCES) CERROR("md_setattr fails: rc = %d\n", rc); - return rc; } - ptlrpc_req_finished(request); - - return rc; + RETURN(rc); } case LL_IOC_LOV_GETSTRIPE: { struct ptlrpc_request *request = NULL; diff --git a/lustre/llite/file.c b/lustre/llite/file.c index ba5695f..f333731 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -128,17 +128,21 @@ static int ll_intent_file_open(struct file *file, void *lmm, const char *name = file->f_dentry->d_name.name; const int len = file->f_dentry->d_name.len; struct lustre_handle lockh; - struct mdc_op_data data; + struct mdc_op_data *op_data; int rc; if (!parent) RETURN(-ENOENT); - ll_prepare_mdc_data(&data, parent->d_inode, NULL, name, len, O_RDWR); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, parent->d_inode, NULL, name, len, O_RDWR); - rc = md_enqueue(sbi->ll_lmv_exp, LDLM_IBITS, itp, LCK_PR, &data, + rc = md_enqueue(sbi->ll_lmv_exp, LDLM_IBITS, itp, LCK_PR, op_data, &lockh, lmm, lmmsize, ldlm_completion_ast, ll_mdc_blocking_ast, NULL); + OBD_FREE(op_data, sizeof(*op_data)); if (rc == 0) { if (itp->d.lustre.it_lock_mode) memcpy(&itp->d.lustre.it_lock_handle, diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index d7be33c..961f491 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -920,7 +920,7 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr) struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd; struct ll_sb_info *sbi = ll_i2sbi(inode); struct ptlrpc_request *request = NULL; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int ia_valid = attr->ia_valid; int rc = 0; ENTRY; @@ -970,10 +970,15 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr) * inode ourselves so we can call obdo_from_inode() always. */ if (ia_valid & (lsm ? ~(ATTR_SIZE | ATTR_FROM_OPEN | ATTR_RAW) : ~0)) { struct lustre_md md; - ll_prepare_mdc_data(&op_data, inode, NULL, NULL, 0, 0); - rc = md_setattr(sbi->ll_lmv_exp, &op_data, + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, inode, NULL, NULL, 0, 0); + + rc = md_setattr(sbi->ll_lmv_exp, op_data, attr, NULL, 0, NULL, 0, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (rc) { ptlrpc_req_finished(request); if (rc != -EPERM && rc != -EACCES) @@ -1434,7 +1439,7 @@ int ll_iocontrol(struct inode *inode, struct file *file, RETURN(put_user(flags, (int *)arg)); } case EXT3_IOC_SETFLAGS: { - struct mdc_op_data op_data; + struct mdc_op_data *op_data; struct iattr attr; struct obdo *oa; struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd; @@ -1446,14 +1451,20 @@ int ll_iocontrol(struct inode *inode, struct file *file, if (!oa) RETURN(-ENOMEM); - ll_prepare_mdc_data(&op_data, inode, NULL, NULL, 0, 0); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) { + obdo_free(oa); + RETURN(-ENOMEM); + } + ll_prepare_mdc_data(op_data, inode, NULL, NULL, 0, 0); memset(&attr, 0x0, sizeof(attr)); attr.ia_attr_flags = flags; attr.ia_valid |= ATTR_ATTR_FLAG; - rc = md_setattr(sbi->ll_lmv_exp, &op_data, + rc = md_setattr(sbi->ll_lmv_exp, op_data, &attr, NULL, 0, NULL, 0, &req); + OBD_FREE(op_data, sizeof(*op_data)); if (rc) { ptlrpc_req_finished(req); if (rc != -EPERM && rc != -EACCES) diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 00824b7..7e72834 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -526,7 +526,7 @@ static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev) const char *name = nd->last.name; int len = nd->last.len; struct ll_sb_info *sbi = ll_i2sbi(dir); - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int err = -EMLINK; ENTRY; @@ -546,9 +546,14 @@ static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev) case S_IFBLK: case S_IFIFO: case S_IFSOCK: - ll_prepare_mdc_data(&op_data, dir, NULL, name, len, 0); - err = md_create(sbi->ll_lmv_exp, &op_data, NULL, 0, mode, - current->fsuid, current->fsgid, rdev, &request); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0); + err = md_create(sbi->ll_lmv_exp, op_data, NULL, 0, mode, + current->fsuid, current->fsgid, rdev, + &request); + OBD_FREE(op_data, sizeof(*op_data)); if (err == 0) ll_update_times(request, 0, dir); ptlrpc_req_finished(request); @@ -570,7 +575,7 @@ static int ll_mknod(struct inode *dir, struct dentry *child, const char *name = child->d_name.name; int len = child->d_name.len; struct ll_sb_info *sbi = ll_i2sbi(dir); - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int err = -EMLINK; ENTRY; @@ -590,9 +595,14 @@ static int ll_mknod(struct inode *dir, struct dentry *child, case S_IFBLK: case S_IFIFO: case S_IFSOCK: - ll_prepare_mdc_data(&op_data, dir, NULL, name, len, 0); - err = md_create(sbi->ll_lmv_exp, &op_data, NULL, 0, mode, - current->fsuid, current->fsgid, rdev, &request); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0); + err = md_create(sbi->ll_lmv_exp, op_data, NULL, 0, mode, + current->fsuid, current->fsgid, rdev, + &request); + OBD_FREE(op_data, sizeof(*op_data)); if (err) GOTO(out_err, err); @@ -624,7 +634,7 @@ static int ll_symlink_raw(struct nameidata *nd, const char *tgt) int len = nd->last.len; struct ptlrpc_request *request = NULL; struct ll_sb_info *sbi = ll_i2sbi(dir); - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int err = -EMLINK; ENTRY; @@ -634,10 +644,14 @@ static int ll_symlink_raw(struct nameidata *nd, const char *tgt) if (dir->i_nlink >= EXT3_LINK_MAX) RETURN(err); - ll_prepare_mdc_data(&op_data, dir, NULL, name, len, 0); - err = md_create(sbi->ll_lmv_exp, &op_data, + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0); + err = md_create(sbi->ll_lmv_exp, op_data, tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO, current->fsuid, current->fsgid, 0, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (err == 0) ll_update_times(request, 0, dir); @@ -652,17 +666,21 @@ static int ll_link_raw(struct nameidata *srcnd, struct nameidata *tgtnd) const char *name = tgtnd->last.name; int len = tgtnd->last.len; struct ptlrpc_request *request = NULL; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int err; struct ll_sb_info *sbi = ll_i2sbi(dir); - ENTRY; - CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),dir=%lu/%u(%p),target=%s\n", - src->i_ino, src->i_generation, src, - dir->i_ino, dir->i_generation, dir, name); - ll_prepare_mdc_data(&op_data, src, dir, name, len, 0); - err = md_link(sbi->ll_lmv_exp, &op_data, &request); + CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),dir=%lu/%u(%p),target=%s\n", + src->i_ino, src->i_generation, src, dir->i_ino, dir->i_generation, + dir, name); + + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, src, dir, name, len, 0); + err = md_link(sbi->ll_lmv_exp, op_data, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (err == 0) ll_update_times(request, 0, dir); ptlrpc_req_finished(request); @@ -677,16 +695,20 @@ static int ll_mkdir_raw(struct nameidata *nd, int mode) int len = nd->last.len; struct ptlrpc_request *request = NULL; struct ll_sb_info *sbi = ll_i2sbi(dir); - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int err = -EMLINK; ENTRY; CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p)\n", name, dir->i_ino, dir->i_generation, dir); mode = (mode & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR; - ll_prepare_mdc_data(&op_data, dir, NULL, name, len, 0); - err = md_create(sbi->ll_lmv_exp, &op_data, NULL, 0, mode, + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0); + err = md_create(sbi->ll_lmv_exp, op_data, NULL, 0, mode, current->fsuid, current->fsgid, 0, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (err == 0) ll_update_times(request, 0, dir); ptlrpc_req_finished(request); @@ -699,14 +721,18 @@ static int ll_rmdir_raw(struct nameidata *nd) const char *name = nd->last.name; int len = nd->last.len; struct ptlrpc_request *request = NULL; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int rc; ENTRY; CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p)\n", name, dir->i_ino, dir->i_generation, dir); - ll_prepare_mdc_data(&op_data, dir, NULL, name, len, S_IFDIR); - rc = md_unlink(ll_i2sbi(dir)->ll_lmv_exp, &op_data, &request); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, dir, NULL, name, len, S_IFDIR); + rc = md_unlink(ll_i2sbi(dir)->ll_lmv_exp, op_data, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (rc == 0) ll_update_times(request, 0, dir); ptlrpc_req_finished(request); @@ -800,14 +826,18 @@ static int ll_unlink_raw(struct nameidata *nd) const char *name = nd->last.name; int len = nd->last.len; struct ptlrpc_request *request = NULL; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int rc; ENTRY; CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p)\n", name, dir->i_ino, dir->i_generation, dir); - ll_prepare_mdc_data(&op_data, dir, NULL, name, len, 0); - rc = md_unlink(ll_i2sbi(dir)->ll_lmv_exp, &op_data, &request); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0); + rc = md_unlink(ll_i2sbi(dir)->ll_lmv_exp, op_data, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (rc) GOTO(out, rc); ll_update_times(request, 0, dir); @@ -829,16 +859,20 @@ static int ll_rename_raw(struct nameidata *oldnd, struct nameidata *newnd) int newlen = newnd->last.len; struct ptlrpc_request *request = NULL; struct ll_sb_info *sbi = ll_i2sbi(src); - struct mdc_op_data op_data; + struct mdc_op_data *op_data; int err; ENTRY; CDEBUG(D_VFSTRACE, "VFS Op:oldname=%s, src_dir=%lu/%u(%p), newname=%s, " "tgt_dir=%lu/%u(%p)\n", oldname, src->i_ino, src->i_generation, src, newname, tgt->i_ino, tgt->i_generation, tgt); - ll_prepare_mdc_data(&op_data, src, tgt, NULL, 0, 0); - err = md_rename(sbi->ll_lmv_exp, &op_data, - oldname, oldlen, newname, newlen, &request); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + ll_prepare_mdc_data(op_data, src, tgt, NULL, 0, 0); + err = md_rename(sbi->ll_lmv_exp, op_data, oldname, oldlen, + newname, newlen, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (!err) { ll_update_times(request, 0, src); ll_update_times(request, 0, tgt); -- 1.8.3.1