The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Как в ядре Linux найти на каком разделе инода?, !*! tux2002, 20-Авг-12, 23:32  [смотреть все]
Я думал inode->i_rdev, но что то непохоже.
Подскажите плиз.
Спасибо.
  • Как в ядре Linux найти на каком разделе инода?, !*! Аноним, 23:56 , 20-Авг-12 (1)
    > Я думал inode->i_rdev, но что то непохоже.
    > Подскажите плиз.
    > Спасибо.

    unsigned int minor = MINOR(inode->i_rdev);

    • Как в ядре Linux найти на каком разделе инода?, !*! tux2002, 20:35 , 21-Авг-12 (2)
      >> Я думал inode->i_rdev, но что то непохоже.
      >> Подскажите плиз.
      >> Спасибо.
      > unsigned int minor = MINOR(inode->i_rdev);


                    printk(KERN_INFO \
                       "Owner of inode %ld on device %u change from %d to %d\n",\
                       inode->i_ino,MINOR(inode->i_rdev),inode->i_uid,attr->ia_uid);

      dmesg | grep Owner
      ...
      [    6.639927] Owner of inode 3213 on device 16 change from 0 to 0
      [    6.640186] Owner of inode 3217 on device 15 change from 0 to 0
      [    6.640530] Owner of inode 3221 on device 18 change from 0 to 0
      [    6.640902] Owner of inode 3225 on device 20 change from 0 to 0
      [    6.641172] Owner of inode 3229 on device 19 change from 0 to 0
      [    6.641518] Owner of inode 3233 on device 22 change from 0 to 0
      [    6.641768] Owner of inode 3237 on device 21 change from 0 to 0
      [    6.642120] Owner of inode 3241 on device 24 change from 0 to 0
      [    6.642369] Owner of inode 3245 on device 23 change from 0 to 0
      [    6.642619] Owner of inode 3249 on device 17 change from 0 to 0
      [    6.643018] Owner of inode 3253 on device 27 change from 0 to 0
      [    6.643367] Owner of inode 3257 on device 26 change from 0 to 0
      [    6.643853] Owner of inode 3261 on device 29 change from 0 to 0
      [    6.644181] Owner of inode 3265 on device 28 change from 0 to 0
      [    6.644528] Owner of inode 3269 on device 31 change from 0 to 0
      ...

      Смотрю 9-ый столбец
      dmesg | grep Owner |  awk '{print $9}' | sort | uniq
      0
      1
      10
      11
      12
      128
      129
      13
      130
      131
      132
      133
      134
      135
      136
      14
      15
      16
      17
      18
      19
      2
      20
      21
      22
      229
      23
      232
      24
      25
      26
      27
      28
      29
      3
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      4
      40
      41
      42
      43
      44
      45
      46
      47

      У меня нет столько разделов, откуда эти цифры берутся?

      • Как в ядре Linux найти на каком разделе инода?, !*! tux2002, 16:10 , 23-Авг-12 (3) –1
        Ребята! Давайте подсказывайте! Будущее Юникс на карте! Я могу объясниться что я делаю.
        • Как в ядре Linux найти на каком разделе инода?, !*! pavlinux, 04:20 , 28-Авг-12 (5)
          > Ребята! Давайте подсказывайте! Будущее Юникс на карте! Я могу объясниться что я
          > делаю.

          Ты код давай, мы сами объясним. :)

          • Как в ядре Linux найти на каком разделе инода?, !*! tux2002, 15:37 , 28-Авг-12 (6)
            >> Ребята! Давайте подсказывайте! Будущее Юникс на карте! Я могу объясниться что я
            >> делаю.
            > Ты код давай, мы сами объясним. :)


            --- ./fs/attr.c.orig    2012-08-26 18:07:47.000000000 +0400
            +++ ./fs/attr.c    2012-08-27 15:47:22.000000000 +0400
            @@ -45,26 +45,29 @@
                    return 0;

                /* Make sure a caller can chown. */
            -    if ((ia_valid & ATTR_UID) &&
            -        (current_fsuid() != inode->i_uid ||
            -         attr->ia_uid != inode->i_uid) && !capable(CAP_CHOWN))
            -        return -EPERM;
            +    if (ia_valid & ATTR_UID) {
            +           if ((current_fsuid() == inode->i_uid) ||
            +        capable(CAP_CHOWN))
            +                printk(KERN_INFO \
            +                 "Owner of inode %ld on device %u (device information may be wrong) change from %d to %d\n",\
            +                 inode->i_ino,MINOR(inode->i_rdev),\
            +                 inode->i_uid,attr->ia_uid);
            +
            +           else
            +             return -EPERM;
            +        }

                /* Make sure caller can chgrp. */
            -    if ((ia_valid & ATTR_GID) &&
            -        (current_fsuid() != inode->i_uid ||
            -        (!in_group_p(attr->ia_gid) && attr->ia_gid != inode->i_gid)) &&
            -        !capable(CAP_CHOWN))
            +    if ((ia_valid & ATTR_GID) && !is_owner_or_cap(inode))
                    return -EPERM;

                /* Make sure a caller can chmod. */
                if (ia_valid & ATTR_MODE) {
                    if (!is_owner_or_cap(inode))
                        return -EPERM;
            -        /* Also check the setgid bit! */
            -        if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid :
            -                inode->i_gid) && !capable(CAP_FSETID))
            -            attr->ia_mode &= ~S_ISGID;
            +    /*S_ISGID set only for member of inode group*/
            +    if ((attr->ia_mode & S_ISGID) && !in_group_p(inode->i_gid))
            +        return -EPERM;
                }

                /* Check for setting the inode time. */
            @@ -139,10 +142,15 @@
            {
                unsigned int ia_valid = attr->ia_valid;

            -    if (ia_valid & ATTR_UID)
            -        inode->i_uid = attr->ia_uid;
            -    if (ia_valid & ATTR_GID)
            -        inode->i_gid = attr->ia_gid;
            +        if (ia_valid & ATTR_UID) {
            +            inode->i_uid = attr->ia_uid;
            +            inode->i_mode &= ~S_ISUID;
            +            inode->i_mode &= ~S_ISGID;
            +        }
            +        if (ia_valid & ATTR_GID) {
            +            inode->i_gid = attr->ia_gid;
            +            inode->i_mode &= ~S_ISGID;
            +        }
                if (ia_valid & ATTR_ATIME)
                    inode->i_atime = timespec_trunc(attr->ia_atime,
                                    inode->i_sb->s_time_gran);
            @@ -152,20 +160,14 @@
                if (ia_valid & ATTR_CTIME)
                    inode->i_ctime = timespec_trunc(attr->ia_ctime,
                                    inode->i_sb->s_time_gran);
            -    if (ia_valid & ATTR_MODE) {
            -        umode_t mode = attr->ia_mode;
            -
            -        if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
            -            mode &= ~S_ISGID;
            -        inode->i_mode = mode;
            -    }
            +    if (ia_valid & ATTR_MODE)
            +        inode->i_mode = attr->ia_mode;
            }
            EXPORT_SYMBOL(setattr_copy);

            int notify_change(struct dentry * dentry, struct iattr * attr)
            {
                struct inode *inode = dentry->d_inode;
            -    mode_t mode = inode->i_mode;
                int error;
                struct timespec now;
                unsigned int ia_valid = attr->ia_valid;
            @@ -203,21 +205,6 @@
                    (ia_valid & ATTR_MODE))
                    BUG();

            -    if (ia_valid & ATTR_KILL_SUID) {
            -        if (mode & S_ISUID) {
            -            ia_valid = attr->ia_valid |= ATTR_MODE;
            -            attr->ia_mode = (inode->i_mode & ~S_ISUID);
            -        }
            -    }
            -    if (ia_valid & ATTR_KILL_SGID) {
            -        if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
            -            if (!(ia_valid & ATTR_MODE)) {
            -                ia_valid = attr->ia_valid |= ATTR_MODE;
            -                attr->ia_mode = inode->i_mode;
            -            }
            -            attr->ia_mode &= ~S_ISGID;
            -        }
            -    }
                if (!(attr->ia_valid & ~(ATTR_KILL_SUID | ATTR_KILL_SGID)))
                    return 0;

            • Как в ядре Linux найти на каком разделе инода?, !*! pavlinux, 01:35 , 29-Авг-12 (7)
              > +                printk(KERN_INFO \
              > +                "Owner of inode %ld on device
              > %u (device information may be wrong) change from %d to %d\n",\
              > +                 inode->i_ino,MINOR(inode->i_rdev),\

              printk(KERN_INFO "%u:%u\n", MAJOR(inode->i_rdev), MINOR(inode->i_rdev));


              загляни в <linux/kdev_t.h>, там есть пару макросов нужных.

              • Как в ядре Linux найти на каком разделе инода?, !*! tux2002, 16:15 , 31-Авг-12 (8)
                >> +                printk(KERN_INFO \
                >> +                "Owner of inode %ld on device
                >> %u (device information may be wrong) change from %d to %d\n",\
                >> +                 inode->i_ino,MINOR(inode->i_rdev),\
                > printk(KERN_INFO "%u:%u\n", MAJOR(inode->i_rdev), MINOR(inode->i_rdev));
                > загляни в <linux/kdev_t.h>, там есть пару макросов нужных.

                i_rdev заполняется 0 когда инода создаётся и больше нигде не меняется. struct inode видимо была сделана на вырост и у неё многое до сих пор неактуально. Работает вот это через суперблок:

                               printk(KERN_INFO \
                                 "Owner of inode %ld on device %u:%u change from %d to %d\n",\
                                 inode->i_ino, MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev),\


                Всем спасибо!

      • Как в ядре Linux найти на каком разделе инода?, !*! Alex_S, 08:31 , 24-Авг-12 (4)

        > У меня нет столько разделов, откуда эти цифры берутся?

        /dev  ?




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру