elentin@falcon:~/test$ ls -l итого 4 dr-------- 2 elentin 1002 4096 Июл 10 18:09 a elentin@falcon:~/test$ elentin@falcon:~/test$ mv a ../b mv: невозможно переместить `a' в `../b': Отказано в доступе
/*
* If we are going to change the parent - check write permissions,
* we'll need to flip '..'.
*/
if (new_dir != old_dir) {
error = inode_permission(old_dentry->d_inode, MAY_WRITE);
if (error)
return error;
}
хаха. операция rename(2) по сути неатомарна, она либо 1) модификация dir entry напрямую либо (переименование) 2) транслируется в link(2). право на запись в dir entries для "." и ".." насильно отобрано у всех, кроме root'а, а то так и / можно не пойми в куда замкнуть.
на самом деле очень даже имеет. rename(2), как я уже поведал, неатомарный и сводится к link(2) в твоём случае в mv. у link(2) две функции - увеличить счётчик link count или обновить ".." для случая mv, если mv делается в пределах той же самой файловой системы. причина, по которой для случая (2) используется link(2) такая, что не-руту в явном виде запрещены манипуляции (на запись) с "." и ".." (через opendir, seekdir & write). проверка на разрешение записи здесь вторична и есть следствие униформности прав доступа в юниксе. я не возражаю, я дополняю Ж)
no subject
no subject
no subject
no subject
no subject
no subject
elentin@falcon:~/test$ ls -l
итого 4
dr-------- 2 elentin 1002 4096 Июл 10 18:09 a
elentin@falcon:~/test$
elentin@falcon:~/test$ mv a ../b
mv: невозможно переместить `a' в `../b': Отказано в доступе
no subject
Вот и первоисточник http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=fs/namei.c;hb=HEAD
no subject
Но если про это не думать, то неочевидно. :)
no subject
mac:~ apple$ chmod 000 a
mac:~ apple$ mv a/ b/
mv: rename a/ to b/a/: Permission denied
mac:~ apple$ uname -a
Darwin mac.local 10.0.0b2 Darwin Kernel Version 10.0.0b2: Tue Jun 23 18:38:45 PDT 2009; root:xnu-1456.1.8~1/RELEASE_I386 i386
mac:~ apple$
Логично.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
но! ежели(а это 99%) происходит запись в данные нода, значит должен
no subject