The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как в ядре Linux найти на каком разделе инода?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Как в ядре Linux найти на каком разделе инода?"  +/
Сообщение от tux2002 email(ok) on 20-Авг-12, 23:32 
Я думал inode->i_rdev, но что то непохоже.
Подскажите плиз.
Спасибо.
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как в ядре Linux найти на каком разделе инода?"  +/
Сообщение от Аноним (??) on 20-Авг-12, 23:56 
> Я думал inode->i_rdev, но что то непохоже.
> Подскажите плиз.
> Спасибо.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как в ядре Linux найти на каком разделе инода?"  +/
Сообщение от tux2002 email(ok) on 21-Авг-12, 20:35 
>> Я думал 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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Как в ядре Linux найти на каком разделе инода?"  –1 +/
Сообщение от tux2002 email(ok) on 23-Авг-12, 16:10 
Ребята! Давайте подсказывайте! Будущее Юникс на карте! Я могу объясниться что я делаю.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Как в ядре Linux найти на каком разделе инода?"  +/
Сообщение от pavlinux (ok) on 28-Авг-12, 04:20 
> Ребята! Давайте подсказывайте! Будущее Юникс на карте! Я могу объясниться что я
> делаю.

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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


--- ./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;

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Как в ядре Linux найти на каком разделе инода?"  +/
Сообщение от pavlinux (ok) on 29-Авг-12, 01:35 
> +                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>, там есть пару макросов нужных.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Как в ядре Linux найти на каком разделе инода?"  +/
Сообщение от tux2002 email(ok) on 31-Авг-12, 16:15 
>> +                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),\


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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

4. "Как в ядре Linux найти на каком разделе инода?"  +/
Сообщение от Alex_S (??) on 24-Авг-12, 08:31 

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

/dev  ?

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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