Linuxの備忘録とか・・・(目次へ)Linuxの備忘録とか・・・(目次へ)renameシステムコールとmvコマンドシステムコールにrenameというのがあり、それにもとづくrenameコマンドがありますが、通常ファイル名を変更する場合、mvコマンドを使つかいます。renameコマンドが直感的なコマンド体系でないからだと思います。renameは指定したファイル名においてfromに最初にマッチする部分をtoで置き換える。aaaのファイルをbbbに置き換える場合、以下のように使うことになります。lsaaarenameコマンドは、ディレクトリinodeのデータブロック内の名前を変更することのみで実現しています。従って変更前のファイルと変更後のファイル名が同じファイルシステム下のファイルでないといけない制約がでてきます。異なるファイルシステム下でも可能とするなら、ディレクトリ下のデータブロックの変更だけでなく、変更するファイルのデータブロックの移動処理が発生することになり、そうような機能をideno下で実現するとなると、vfs下でのrename処理が必要となります。vfsではrenameは定義されていません。renameシステムコールが呼ばれると、sys_renameat(renameat)がコールされ、最初にファイルシステムが同じがどうかチェックしています。ファイルが書き込み可能とかの他のチェックをして、vfs_renameをコールします。new_dentry);・・・・vfs_renameではファイル名の変更か、ディレクトリ名の変更かで処理がわかれます。vfs_rename_otherを後者はvfs_rename_dirがコールされ、そこからファイルシステムに依存したrenameコールバック関数へとわたります。add_dirent_to_bufで書き込み内容を編集しそれをディレクトリにアペンドしています。その時、変更前のファイルのiノードをそのまま使用しています。dir->i_version++;・・・・mvというシステムコールは無いようです。変更前のファイルを変更後のファイルとして複写し、変更前のファイルを削除すればよさそうです。このコマンドはファイルシステムを超えて可能です。/mnt/aaa同じファイルシステムではiノードが同じで、異なるファイルシステムでは、iノードが異なっています。mvコマンドで変更前と変更後のファイルが同じファイルシステムの場合、renameシステムコールを使っていることが推測できます。異なるファイルシステム間でmvを動作したstraceの内容です。renameで名前変更ができるか試してみいます。同じファイルシステム間の移動ならば、ここで移動処理は完了します。この場合ファイルシステムが違うためエラーとなっています。移動元を読み込みでオープン、移動先を書き込みの新規作成でオープンして、移動元を移動先に書き込んでいます。ノースAdsense広告情報が設定されていません。