Hello,

first, nice work with systemimager :)

I have a issue with systemimager trunk and a newer kernel. I have build
a newer kernelk 2.6.31, copied the modules to boel_binaries.tar.gz file
and the updated the kernel.

All is working perfectly, but lvm makes problems. The partition is
created through parted correctly, but then the pvcreate command fails:

# pvcreate -M2 -ff -y /dev/sda2
  Device /dev/sda2 not found (or ignored by filtering).

This works with a older kernel (2.6.24) without any problem, so it must
be kernel related.

I read and found, that the sysfs may be changed, as in a repository of
lvm i found a change short after the release of the plain old lvm in
systemimager :)
The patch is attached as diff file,
The url for the original file is:
http://sources.redhat.com/ml/lvm2-cvs/2007-10/msg00008.html

I first ask, if anyone have a clue, if this is correct, i don`t want to
use UYOK, as 1 kernel for all distributions is simpler to manage in sum.

I need a new kernel, as we use new hardware /intel dg43gt mainboard, and
some others with ICH10R).


BTW: Are there plans, to upgrade systemimager to a newer kernel, lvm
etc. are here testers or so needed ?

thanks,
ronny

################################################################################
# Added by Ronny Boesger, this is for supporting newer kernels.
# in my case, its 2.6.31
################################################################################

*** lib/filters/filter-sysfs.c  2007-04-26 18:44:58.000000000 +0200
--- lib/filters/filter-sysfs.c.new      2009-09-25 18:48:07.000000000 +0200
***************
*** 20,31 ****
  
  #include <dirent.h>
  
! static int _locate_sysfs_blocks(const char *proc, char *path, size_t len)
  {
        char proc_mounts[PATH_MAX];
-       int r = 0;
        FILE *fp;
        char *split[4], buffer[PATH_MAX + 16];
  
        if (!*proc) {
                log_verbose("No proc filesystem found: skipping sysfs filter");
--- 20,33 ----
  
  #include <dirent.h>
  
! static int _locate_sysfs_blocks(const char *proc, char *path, size_t len,
!                               unsigned *sysfs_depth)
  {
        char proc_mounts[PATH_MAX];
        FILE *fp;
        char *split[4], buffer[PATH_MAX + 16];
+       const char *sys_mnt = NULL;
+       struct stat info;
  
        if (!*proc) {
                log_verbose("No proc filesystem found: skipping sysfs filter");
***************
*** 46,55 ****
        while (fgets(buffer, sizeof(buffer), fp)) {
                if (dm_split_words(buffer, 4, 0, split) == 4 &&
                    !strcmp(split[2], "sysfs")) {
!                       if (dm_snprintf(path, len, "%s/%s", split[1],
!                                        "block") >= 0) {
!                               r = 1;
!                       }
                        break;
                }
        }
--- 48,54 ----
        while (fgets(buffer, sizeof(buffer), fp)) {
                if (dm_split_words(buffer, 4, 0, split) == 4 &&
                    !strcmp(split[2], "sysfs")) {
!                       sys_mnt = split[1];
                        break;
                }
        }
***************
*** 57,63 ****
        if (fclose(fp))
                log_sys_error("fclose", proc_mounts);
  
!       return r;
  }
  
  /*----------------------------------------------------------------
--- 56,125 ----
        if (fclose(fp))
                log_sys_error("fclose", proc_mounts);
  
!       if (!sys_mnt) {
!       log_error("Failed to find sysfs mount point");
!       return 0;
!       }
! 
!       /*
!        * unified classification directory for all kernel subsystems
!        *
!        * /sys/subsystem/block/devices
!        * |-- sda -> 
../../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
!        * |-- sda1 -> 
../../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1
!        *  `-- sr0 -> 
../../../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sr0
!        *
!        */
!       if (dm_snprintf(path, len, "%s/%s", sys_mnt,
!       "subsystem/block/devices") >= 0) {
!       if (!stat(path, &info)) {
!       *sysfs_depth = 0;
!       return 1;
!       }
!         }
! 
!       /*
!        * block subsystem as a class
!        *
!        * /sys/class/block
!        * |-- sda -> 
../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
!        * |-- sda1 -> 
../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1
!        *  `-- sr0 -> 
../../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sr0
!        *
!        */
!       if (dm_snprintf(path, len, "%s/%s", sys_mnt, "class/block") >= 0) {
!       if (!stat(path, &info)) {
!       *sysfs_depth = 0;
!       return 1;
!       }
!       }
!       
!       /*
!        * old block subsystem layout with nested directories
!        *
!        * /sys/block/
!        * |-- sda
!        * |   |-- capability
!        * |   |-- dev
!        * ...
!        * |   |-- sda1
!        * |   |   |-- dev
!        * ...
!        * |
!        * `-- sr0
!        *     |-- capability
!        *     |-- dev
!        * ...
!        *
!        */
!       if (dm_snprintf(path, len, "%s/%s", sys_mnt, "block") >= 0) {
!               if (!stat(path, &info)) {
!               *sysfs_depth = 1;
!               return 1;
!               }
!       }
!       
!       return 0;
  }
  
  /*----------------------------------------------------------------
***************
*** 72,82 ****
  struct dev_set {
        struct dm_pool *mem;
        const char *sys_block;
        int initialised;
        struct entry *slots[SET_BUCKETS];
  };
  
! static struct dev_set *_dev_set_create(struct dm_pool *mem, const char 
*sys_block)
  {
        struct dev_set *ds;
  
--- 134,147 ----
  struct dev_set {
        struct dm_pool *mem;
        const char *sys_block;
+       unsigned sysfs_depth;
        int initialised;
        struct entry *slots[SET_BUCKETS];
  };
  
! static struct dev_set *_dev_set_create(struct dm_pool *mem,
!                                       const char *sys_block,
!                                       unsigned sysfs_depth)
  {
        struct dev_set *ds;
  
***************
*** 85,90 ****
--- 150,156 ----
  
        ds->mem = mem;
        ds->sys_block = dm_pool_strdup(mem, sys_block);
+       ds->sysfs_depth = sysfs_depth;
        ds->initialised = 0;
  
        return ds;
***************
*** 168,180 ****
  /*
   * Recurse through sysfs directories, inserting any devs found.
   */
! static int _read_devs(struct dev_set *ds, const char *dir)
  {
          struct dirent *d;
          DIR *dr;
-       unsigned char dtype;
        struct stat info;
        char path[PATH_MAX];
        dev_t dev = { 0 };
        int r = 1;
  
--- 234,246 ----
  /*
   * Recurse through sysfs directories, inserting any devs found.
   */
! static int _read_devs(struct dev_set *ds, const char *dir, unsigned 
sysfs_depth)
  {
          struct dirent *d;
          DIR *dr;
        struct stat info;
        char path[PATH_MAX];
+       char file[PATH_MAX];
        dev_t dev = { 0 };
        int r = 1;
  
***************
*** 194,224 ****
                        continue;
                }
  
!               dtype = d->d_type;
! 
!               if (dtype == DT_UNKNOWN) {
!                       if (lstat(path, &info) >= 0) {
!                               if (S_ISLNK(info.st_mode))
!                                       dtype = DT_LNK;
!                               else if (S_ISDIR(info.st_mode))
!                                       dtype = DT_DIR;
!                               else if (S_ISREG(info.st_mode))
!                                       dtype = DT_REG;
!                       }
                }
! 
!               if (dtype == DT_DIR) {
!                       if (!_read_devs(ds, path)) {
!                               r = 0;
!                               break;
!                       }
                }
- 
-               if ((dtype == DT_REG && !strcmp(d->d_name, "dev")))
-                       if (!_read_dev(path, &dev) || !_set_insert(ds, dev)) {
-                               r = 0;
-                               break;
-                       }
        }
  
          if (closedir(dr))
--- 260,280 ----
                        continue;
                }
  
!               /* devices have a "dev" file */
!               if (dm_snprintf(file, sizeof(file), "%s/dev", path) < 0) {
!                       log_error("sysfs path name too long: %s in %s",
!                                   d->d_name, dir);
!                       continue;
                }
!               if (!stat(file, &info)) {
!                       /* recurse if we found a device and expect subdirs */
!                       if (sysfs_depth)
!                           _read_devs(ds, path, sysfs_depth - 1);
! 
!                       /* add the device we have found */
!                       if (_read_dev(file, &dev))
!                               _set_insert(ds, dev);
                }
        }
  
          if (closedir(dr))
***************
*** 229,235 ****
  
  static int _init_devs(struct dev_set *ds)
  {
!       if (!_read_devs(ds, ds->sys_block)) {
                ds->initialised = -1;
                return 0;
        }
--- 285,291 ----
  
  static int _init_devs(struct dev_set *ds)
  {
!       if (!_read_devs(ds, ds->sys_block, ds->sysfs_depth)) {
                ds->initialised = -1;
                return 0;
        }
***************
*** 267,277 ****
  struct dev_filter *sysfs_filter_create(const char *proc)
  {
        char sys_block[PATH_MAX];
        struct dm_pool *mem;
        struct dev_set *ds;
        struct dev_filter *f;
  
!       if (!_locate_sysfs_blocks(proc, sys_block, sizeof(sys_block)))
                return NULL;
  
        if (!(mem = dm_pool_create("sysfs", 256))) {
--- 323,334 ----
  struct dev_filter *sysfs_filter_create(const char *proc)
  {
        char sys_block[PATH_MAX];
+       unsigned sysfs_depth;
        struct dm_pool *mem;
        struct dev_set *ds;
        struct dev_filter *f;
  
!       if (!_locate_sysfs_blocks(proc, sys_block, sizeof(sys_block), 
&sysfs_depth))
                return NULL;
  
        if (!(mem = dm_pool_create("sysfs", 256))) {
***************
*** 279,285 ****
                return NULL;
        }
  
!       if (!(ds = _dev_set_create(mem, sys_block))) {
                log_error("sysfs dev_set creation failed");
                goto bad;
        }
--- 336,342 ----
                return NULL;
        }
  
!       if (!(ds = _dev_set_create(mem, sys_block, sysfs_depth))) {
                log_error("sysfs dev_set creation failed");
                goto bad;
        }

<<attachment: rb.vcf>>

------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
sisuite-users mailing list
sisuite-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sisuite-users

Reply via email to