Date: Wednesday, April 2, 2014 @ 11:39:32
  Author: thomas
Revision: 209737

Fix libmount with 3.14

Added:
  util-linux/trunk/0001-libmount-FS-id-and-parent-ID-could-be-zero.patch
  util-linux/trunk/move_is_mountinfo.patch
Modified:
  util-linux/trunk/PKGBUILD

-------------------------------------------------------+
 0001-libmount-FS-id-and-parent-ID-could-be-zero.patch |   98 ++++++++++++++++
 PKGBUILD                                              |   17 ++
 move_is_mountinfo.patch                               |   46 +++++++
 3 files changed, 158 insertions(+), 3 deletions(-)

Added: 0001-libmount-FS-id-and-parent-ID-could-be-zero.patch
===================================================================
--- 0001-libmount-FS-id-and-parent-ID-could-be-zero.patch                       
        (rev 0)
+++ 0001-libmount-FS-id-and-parent-ID-could-be-zero.patch       2014-04-02 
09:39:32 UTC (rev 209737)
@@ -0,0 +1,98 @@
+From 6c373810f5b1d32824371e9dff6ee5a006388f98 Mon Sep 17 00:00:00 2001
+From: Karel Zak <[email protected]>
+Date: Thu, 20 Feb 2014 16:59:11 +0100
+Subject: [PATCH] libmount: FS id and parent ID could be zero
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It seems that linux 3.14 is able to produce things like:
+
+  19 0 8:3 / / rw,relatime - ext4 /dev/sda3 rw,data=ordered
+     ^
+
+Reported-by: Mantas Mikulėnas <[email protected]>
+Signed-off-by: Karel Zak <[email protected]>
+---
+ libmount/src/tab.c   | 12 ++++--------
+ misc-utils/findmnt.c |  5 +++--
+ 2 files changed, 7 insertions(+), 10 deletions(-)
+
+diff --git a/libmount/src/tab.c b/libmount/src/tab.c
+index 4c2f8a4..332312b 100644
+--- a/libmount/src/tab.c
++++ b/libmount/src/tab.c
+@@ -505,7 +505,7 @@ int mnt_table_get_root_fs(struct libmnt_table *tb, struct 
libmnt_fs **root)
+       assert(tb);
+       assert(root);
+ 
+-      if (!tb || !root)
++      if (!tb || !root || !is_mountinfo(tb))
+               return -EINVAL;
+ 
+       DBG(TAB, mnt_debug_h(tb, "lookup root fs"));
+@@ -515,8 +515,6 @@ int mnt_table_get_root_fs(struct libmnt_table *tb, struct 
libmnt_fs **root)
+       mnt_reset_iter(&itr, MNT_ITER_FORWARD);
+       while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
+               int id = mnt_fs_get_parent_id(fs);
+-              if (!id)
+-                      break;          /* @tab is not a mountinfo file? */
+ 
+               if (!*root || id < root_id) {
+                       *root = fs;
+@@ -524,7 +522,7 @@ int mnt_table_get_root_fs(struct libmnt_table *tb, struct 
libmnt_fs **root)
+               }
+       }
+ 
+-      return root_id ? 0 : -EINVAL;
++      return *root ? 0 : -EINVAL;
+ }
+ 
+ /**
+@@ -545,15 +543,13 @@ int mnt_table_next_child_fs(struct libmnt_table *tb, 
struct libmnt_iter *itr,
+       struct libmnt_fs *fs;
+       int parent_id, lastchld_id = 0, chld_id = 0;
+ 
+-      if (!tb || !itr || !parent)
++      if (!tb || !itr || !parent || !is_mountinfo(tb))
+               return -EINVAL;
+ 
+       DBG(TAB, mnt_debug_h(tb, "lookup next child of '%s'",
+                               mnt_fs_get_target(parent)));
+ 
+       parent_id = mnt_fs_get_id(parent);
+-      if (!parent_id)
+-              return -EINVAL;
+ 
+       /* get ID of the previously returned child */
+       if (itr->head && itr->p != itr->head) {
+@@ -584,7 +580,7 @@ int mnt_table_next_child_fs(struct libmnt_table *tb, 
struct libmnt_iter *itr,
+               }
+       }
+ 
+-      if (!chld_id)
++      if (!*chld)
+               return 1;       /* end of iterator */
+ 
+       /* set the iterator to the @chld for the next call */
+diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c
+index fb21174..988cd73 100644
+--- a/misc-utils/findmnt.c
++++ b/misc-utils/findmnt.c
+@@ -822,8 +822,9 @@ static int tab_is_tree(struct libmnt_table *tb)
+       if (!itr)
+               return 0;
+ 
+-      if (mnt_table_next_fs(tb, itr, &fs) == 0)
+-              rc = mnt_fs_get_id(fs) > 0 && mnt_fs_get_parent_id(fs) > 0;
++      rc = (mnt_table_next_fs(tb, itr, &fs) == 0 &&
++            mnt_fs_is_kernel(fs) &&
++            mnt_fs_get_root(fs));
+ 
+       mnt_free_iter(itr);
+       return rc;
+-- 
+1.9.1
+

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2014-04-02 04:20:01 UTC (rev 209736)
+++ PKGBUILD    2014-04-02 09:39:32 UTC (rev 209737)
@@ -6,7 +6,7 @@
 pkgbase=util-linux
 pkgname=(util-linux libutil-linux)
 pkgver=2.24.1
-pkgrel=4
+pkgrel=5
 pkgdesc="Miscellaneous system utilities for Linux"
 url="http://www.kernel.org/pub/linux/utils/util-linux/";
 arch=('i686' 'x86_64')
@@ -19,13 +19,24 @@
         uuidd.tmpfiles
         pam-login
         pam-common
-        pam-su)
+        pam-su
+        move_is_mountinfo.patch
+        0001-libmount-FS-id-and-parent-ID-could-be-zero.patch)
 md5sums=('88d46ae23ca599ac5af9cf96b531590f'
          'a39554bfd65cccfd8254bb46922f4a67'
          '4368b3f98abd8a32662e094c54e7f9b1'
          'a31374fef2cba0ca34dfc7078e2969e4'
-         'fa85e5cce5d723275b14365ba71a8aad')
+         'fa85e5cce5d723275b14365ba71a8aad'
+         '4cdc5f9a6e51b032274761a82937d438'
+         '2f4bc305bd11d6bfaa81e6c1eb0c6f1b')
 
+prepare() {
+  cd "$pkgname-$pkgver"
+
+  patch -p1 -i "${srcdir}/move_is_mountinfo.patch"
+  patch -p1 -i 
"${srcdir}/0001-libmount-FS-id-and-parent-ID-could-be-zero.patch"
+}
+
 build() {
   cd "$pkgname-$pkgver"
 

Added: move_is_mountinfo.patch
===================================================================
--- move_is_mountinfo.patch                             (rev 0)
+++ move_is_mountinfo.patch     2014-04-02 09:39:32 UTC (rev 209737)
@@ -0,0 +1,46 @@
+diff --git a/libmount/src/tab.c b/libmount/src/tab.c
+index 3633b6a..8ae49c8 100644
+--- a/libmount/src/tab.c
++++ b/libmount/src/tab.c
+@@ -47,6 +47,20 @@
+ #include "strutils.h"
+ #include "loopdev.h"
+ 
++static int is_mountinfo(struct libmnt_table *tb)
++{
++      struct libmnt_fs *fs;
++
++      if (!tb)
++              return 0;
++
++      fs = list_first_entry(&tb->ents, struct libmnt_fs, ents);
++      if (fs && mnt_fs_is_kernel(fs) && mnt_fs_get_root(fs))
++              return 1;
++
++      return 0;
++}
++
+ /**
+  * mnt_new_table:
+  *
+@@ -1229,20 +1335,6 @@ err:
+       return NULL;
+ }
+ 
+-static int is_mountinfo(struct libmnt_table *tb)
+-{
+-      struct libmnt_fs *fs;
+-
+-      if (!tb)
+-              return 0;
+-
+-      fs = list_first_entry(&tb->ents, struct libmnt_fs, ents);
+-      if (fs && mnt_fs_is_kernel(fs) && mnt_fs_get_root(fs))
+-              return 1;
+-
+-      return 0;
+-}
+-
+ /**
+  * mnt_table_is_fs__mounted:
+  * @tb: /proc/self/mountinfo file

Reply via email to