Bug#785187: [PATCH] xen: earlycpio: Pull in latest linux earlycpio.[ch]

2015-07-06 Thread Jan Beulich
 On 01.07.15 at 16:43, ian.campb...@citrix.com wrote:
 AFAICT our current version does not correspond to any version in the
 Linux history. This commit resynchronised to the state in Linux
 commit 598bae70c2a8e35c8d39b610cca2b32afcf047af.
 
 Differences from upstream: find_cpio_data is __init, printk instead of
 pr_*.
 
 This appears to fix Debian bug #785187. Appears because my test box
 happens to be AMD and the issue is that the (valid) cpio generated by
 the Intel ucode is not liked by the old Xen code. I've tested by
 hacking the hypervisor to look for the Intel path.
 
 Reported-by: Stephan Seitz stse+debianb...@fsing.rootsland.net
 Signed-off-by: Ian Campbell ian.campb...@citrix.com

Not that it really matters for a Linux import refresh, but anyway:
Acked-by: Jan Beulich jbeul...@suse.com


--
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org



Bug#785187: [PATCH] xen: earlycpio: Pull in latest linux earlycpio.[ch]

2015-07-01 Thread Ian Campbell
AFAICT our current version does not correspond to any version in the
Linux history. This commit resynchronised to the state in Linux
commit 598bae70c2a8e35c8d39b610cca2b32afcf047af.

Differences from upstream: find_cpio_data is __init, printk instead of
pr_*.

This appears to fix Debian bug #785187. Appears because my test box
happens to be AMD and the issue is that the (valid) cpio generated by
the Intel ucode is not liked by the old Xen code. I've tested by
hacking the hypervisor to look for the Intel path.

Reported-by: Stephan Seitz stse+debianb...@fsing.rootsland.net
Signed-off-by: Ian Campbell ian.campb...@citrix.com
Cc: Konrad Rzeszutek Wilk konrad.w...@oracle.com
Cc: Jan Beulich jbeul...@suse.com
Cc: Stephan Seitz stse+debianb...@fsing.rootsland.net
Cc: 785...@bugs.debian.org
---
This should be backported.
---
 xen/common/earlycpio.c  |   39 ---
 xen/include/xen/earlycpio.h |1 +
 2 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/xen/common/earlycpio.c b/xen/common/earlycpio.c
index 5e54142..f6b1a9e 100644
--- a/xen/common/earlycpio.c
+++ b/xen/common/earlycpio.c
@@ -54,25 +54,26 @@ enum cpio_fields {
 
 /**
  * cpio_data find_cpio_data - Search for files in an uncompressed cpio
- * @path:   The directory to search for, including a slash at the end
- * @data:   Pointer to the the cpio archive or a header inside
- * @len:Remaining length of the cpio based on data pointer
- * @offset: When a matching file is found, this is the offset to the
- *  beginning of the cpio. It can be used to iterate through
- *  the cpio to find all files inside of a directory path
+ * @path:   The directory to search for, including a slash at the end
+ * @data:   Pointer to the the cpio archive or a header inside
+ * @len:Remaining length of the cpio based on data pointer
+ * @nextoff:When a matching file is found, this is the offset from the
+ *  beginning of the cpio to the beginning of the next file, not 
the
+ *  matching file itself. It can be used to iterate through the 
cpio
+ *  to find all files inside of a directory path.
  *
- * @return: struct cpio_data containing the address, length and
- *  filename (with the directory path cut off) of the found file.
- *  If you search for a filename and not for files in a directory,
- *  pass the absolute path of the filename in the cpio and make sure
- *  the match returned an empty filename string.
+ * @return: struct cpio_data containing the address, length and
+ *  filename (with the directory path cut off) of the found file.
+ *  If you search for a filename and not for files in a directory,
+ *  pass the absolute path of the filename in the cpio and make 
sure
+ *  the match returned an empty filename string.
  */
 
 struct cpio_data __init find_cpio_data(const char *path, void *data,
- size_t len,  long *offset)
+  size_t len,  long *nextoff)
 {
const size_t cpio_header_len = 8*C_NFIELDS - 2;
-   struct cpio_data cd = { NULL, 0 };
+   struct cpio_data cd = { NULL, 0,  };
const char *p, *dptr, *nptr;
unsigned int ch[C_NFIELDS], *chp, v;
unsigned char c, x;
@@ -129,17 +130,17 @@ struct cpio_data __init find_cpio_data(const char *path, 
void *data,
if ((ch[C_MODE]  017) == 010 
ch[C_NAMESIZE] = mypathsize 
!memcmp(p, path, mypathsize)) {
-   *offset = (long)nptr - (long)data;
+   *nextoff = (long)nptr - (long)data;
if (ch[C_NAMESIZE] - mypathsize = MAX_CPIO_FILE_NAME) {
printk(
File %s exceeding MAX_CPIO_FILE_NAME [%d]\n,
p, MAX_CPIO_FILE_NAME);
}
-   if (ch[C_NAMESIZE] - 1 /* includes \0 */ == mypathsize) 
{
-   cd.data = (void *)dptr;
-   cd.size = ch[C_FILESIZE];
-   return cd; /* Found it! */
-   }
+   strlcpy(cd.name, p + mypathsize, MAX_CPIO_FILE_NAME);
+
+   cd.data = (void *)dptr;
+   cd.size = ch[C_FILESIZE];
+   return cd; /* Found it! */
}
len -= (nptr - p);
p = nptr;
diff --git a/xen/include/xen/earlycpio.h b/xen/include/xen/earlycpio.h
index 85d144a..16d9404 100644
--- a/xen/include/xen/earlycpio.h
+++ b/xen/include/xen/earlycpio.h
@@ -6,6 +6,7 @@
 struct cpio_data {
void *data;
size_t size;
+   char name[MAX_CPIO_FILE_NAME];
 };
 
 struct cpio_data find_cpio_data(const char *path, void *data, size_t len,
-- 
1.7.10.4