Intereting Posts

Флаги Inode для файловой системы: разница между FS_IOC_GETFLAGS и FS_IOC_FSGETXATTR

В чем разница между FS_IOC_FSGETXATTR ioctl FS_IOC_GETFLAGS и FS_IOC_FSGETXATTR ? Какие флаги оба возвращают?

В контексте Linux FS_IOC_GETFLAGS и FS_IOC_FSGETXATTR оба FS_IOC_FSGETXATTR флаги inode.

GETFLAGS является более старым ioctl и изначально GETFLAGS в ext2 (опять же в Linux); он манипулирует 32-битным значением и, таким образом, имеет ограниченные возможности расширения – не так много доступных неиспользуемых битов.

FSGETXATTR происходит из XFS и недавно (2016 г.) был перемещен из XFS в общий уровень VFS. Он использует структуру данных struct fsxattr , которая допускает большее количество значений и большее расширение.

Оба из них, а также значения возвращаемых данных определены в linux/fs.h Флаги GETFLAGS дополнительно документированы в ioctl_iflags(2) . Общие значения между ними в основном соответствуют GETFLAGS которые исторически поддерживались XFS : «только добавление», «нет обновлений atime», «нет дампа», «неизменяемые» и «синхронные обновления».

Обратите внимание, что в обоих случаях поддержка варьируется от одной файловой системы к другой, и некоторые флаги вообще не поддерживаются.

FS_IOC_GETFLAGS – это интерфейс для доступа к флагам файлов в стиле BSD. Он просто использует гораздо худший интерфейс, чем * BSD, так как вам нужно открыть файл, чтобы получить доступ. * BSD хранит эту информацию в struct stat , поэтому, если вы хотите получить соответствующую информацию в / dev / records в Linux, вы можете заставить ленточный накопитель перематывать его носитель.

FS_IOC_FSGETXATTR – аналогичный, но явно несовместимый интерфейс из XFS, который, похоже, также поддерживается ext4 с сентября 2015 года.

Вывод: оба интерфейса плохо спроектированы, так как им нужно открыть файл, чтобы получить доступ. Сопровождающие, кажется, не заботятся об их интерфейсах, поскольку они не информируют важных пользователей, таких как star которая может выполнять резервное копирование и восстанавливать флаги из интерфейса FS_IOC_GETFLAGS .