Whamcloud - gitweb
- fixed mdc_op_data stack allocations.
authoryury <yury>
Mon, 22 Nov 2004 12:13:19 +0000 (12:13 +0000)
committeryury <yury>
Mon, 22 Nov 2004 12:13:19 +0000 (12:13 +0000)
lustre/llite/dir.c
lustre/llite/file.c
lustre/llite/llite_lib.c
lustre/llite/namei.c

index 6a96db2..d8ec0d1 100644 (file)
@@ -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;
index ba5695f..f333731 100644 (file)
@@ -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,
index d7be33c..961f491 100644 (file)
@@ -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)
index 00824b7..7e72834 100644 (file)
@@ -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);