From ccdbcce8c4d12bc8893699895d976d0aa9f0d0ea Mon Sep 17 00:00:00 2001
From: shadow <shadow>
Date: Thu, 10 Apr 2008 06:27:13 +0000
Subject: [PATCH] fix iov handling. b=15483 i=green i=johann

---
 lustre/llite/file.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/lustre/llite/file.c b/lustre/llite/file.c
index e2c82f8e19..518e40a3cd 100644
--- a/lustre/llite/file.c
+++ b/lustre/llite/file.c
@@ -1209,7 +1209,7 @@ static int iov_copy_update(unsigned long *nr_segs, const struct iovec **iov_out,
                         ivc->iov_len -= *offset;
                         ivc->iov_base += *offset;
                 }
-                if (ivc->iov_len > size) {
+                if (ivc->iov_len >= size) {
                         ivc->iov_len = size;
                         if (i == 0)
                                 *offset += size;
@@ -1318,14 +1318,14 @@ repeat:
                 chunk = end - *ppos + 1;
                 if ((count == chunk) && (iov_offset == 0)) {
                         if (iov_copy)
-                                OBD_FREE(iov_copy, sizeof(iov) * nrsegs_orig);
+                                OBD_FREE(iov_copy, sizeof(*iov) * nrsegs_orig);
 
                         iov_copy = (struct iovec *)iov;
                         nrsegs_copy = nr_segs;
                 } else {
                         if (!iov_copy) {
                                 nrsegs_orig = nr_segs;
-                                OBD_ALLOC(iov_copy, sizeof(iov) * nr_segs);
+                                OBD_ALLOC(iov_copy, sizeof(*iov) * nr_segs);
                                 if (!iov_copy)
                                         GOTO(out, retval = -ENOMEM); 
                         }
@@ -1333,7 +1333,6 @@ repeat:
                         iov_copy_update(&nr_segs, &iov, &nrsegs_copy, iov_copy,
                                         &iov_offset, chunk);
                 }
- 
         } else {
                 end = *ppos + count - 1;
                 iov_copy = (struct iovec *)iov;
@@ -1435,7 +1434,7 @@ repeat:
         retval = (sum > 0) ? sum : retval;
 
         if (iov_copy && iov_copy != iov)
-                OBD_FREE(iov_copy, sizeof(iov) * nrsegs_orig);
+                OBD_FREE(iov_copy, sizeof(*iov) * nrsegs_orig);
 
         RETURN(retval);
 }
@@ -1536,18 +1535,17 @@ repeat:
                 chunk = end - *ppos + 1;
                 if ((count == chunk) && (iov_offset == 0)) {
                         if (iov_copy)
-                                OBD_FREE(iov_copy, sizeof(iov) * nrsegs_orig);
+                                OBD_FREE(iov_copy, sizeof(*iov) * nrsegs_orig);
 
                         iov_copy = (struct iovec *)iov;
                         nrsegs_copy = nr_segs;
                 } else {
                         if (!iov_copy) {
                                 nrsegs_orig = nr_segs;
-                                OBD_ALLOC(iov_copy, sizeof(iov) * nr_segs);
+                                OBD_ALLOC(iov_copy, sizeof(*iov) * nr_segs);
                                 if (!iov_copy)
                                         GOTO(out, retval = -ENOMEM); 
                         }
-
                         iov_copy_update(&nr_segs, &iov, &nrsegs_copy, iov_copy,
                                         &iov_offset, chunk);
                 }
@@ -1611,7 +1609,7 @@ out:
         up(&ll_i2info(inode)->lli_write_sem);
 
         if (iov_copy && iov_copy != iov)
-                OBD_FREE(iov_copy, sizeof(iov) * nrsegs_orig);
+                OBD_FREE(iov_copy, sizeof(*iov) * nrsegs_orig);
 
         retval = (sum > 0) ? sum : retval;
         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_WRITE_BYTES,
-- 
GitLab