123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- POHMELFS network protocol.
- Basic structure used in network communication is following command:
- struct netfs_cmd
- {
- __u16 cmd; /* Command number */
- __u16 csize; /* Attached crypto information size */
- __u16 cpad; /* Attached padding size */
- __u16 ext; /* External flags */
- __u32 size; /* Size of the attached data */
- __u32 trans; /* Transaction id */
- __u64 id; /* Object ID to operate on. Used for feedback.*/
- __u64 start; /* Start of the object. */
- __u64 iv; /* IV sequence */
- __u8 data[0];
- };
- Commands can be embedded into transaction command (which in turn has own command),
- so one can extend protocol as needed without breaking backward compatibility as long
- as old commands are supported. All string lengths include tail 0 byte.
- All commands are transferred over the network in big-endian. CPU endianness is used at the end peers.
- @cmd - command number, which specifies command to be processed. Following
- commands are used currently:
- NETFS_READDIR = 1, /* Read directory for given inode number */
- NETFS_READ_PAGE, /* Read data page from the server */
- NETFS_WRITE_PAGE, /* Write data page to the server */
- NETFS_CREATE, /* Create directory entry */
- NETFS_REMOVE, /* Remove directory entry */
- NETFS_LOOKUP, /* Lookup single object */
- NETFS_LINK, /* Create a link */
- NETFS_TRANS, /* Transaction */
- NETFS_OPEN, /* Open intent */
- NETFS_INODE_INFO, /* Metadata cache coherency synchronization message */
- NETFS_PAGE_CACHE, /* Page cache invalidation message */
- NETFS_READ_PAGES, /* Read multiple contiguous pages in one go */
- NETFS_RENAME, /* Rename object */
- NETFS_CAPABILITIES, /* Capabilities of the client, for example supported crypto */
- NETFS_LOCK, /* Distributed lock message */
- NETFS_XATTR_SET, /* Set extended attribute */
- NETFS_XATTR_GET, /* Get extended attribute */
- @ext - external flags. Used by different commands to specify some extra arguments
- like partial size of the embedded objects or creation flags.
- @size - size of the attached data. For NETFS_READ_PAGE and NETFS_READ_PAGES no data is attached,
- but size of the requested data is incorporated here. It does not include size of the command
- header (struct netfs_cmd) itself.
- @id - id of the object this command operates on. Each command can use it for own purpose.
- @start - start of the object this command operates on. Each command can use it for own purpose.
- @csize, @cpad - size and padding size of the (attached if needed) crypto information.
- Command specifications.
- @NETFS_READDIR
- This command is used to sync content of the remote dir to the client.
- @ext - length of the path to object.
- @size - the same.
- @id - local inode number of the directory to read.
- @start - zero.
- @NETFS_READ_PAGE
- This command is used to read data from remote server.
- Data size does not exceed local page cache size.
- @id - inode number.
- @start - first byte offset.
- @size - number of bytes to read plus length of the path to object.
- @ext - object path length.
- @NETFS_CREATE
- Used to create object.
- It does not require that all directories on top of the object were
- already created, it will create them automatically. Each object has
- associated @netfs_path_entry data structure, which contains creation
- mode (permissions and type) and length of the name as long as name itself.
- @start - 0
- @size - size of the all data structures needed to create a path
- @id - local inode number
- @ext - 0
- @NETFS_REMOVE
- Used to remove object.
- @ext - length of the path to object.
- @size - the same.
- @id - local inode number.
- @start - zero.
- @NETFS_LOOKUP
- Lookup information about object on server.
- @ext - length of the path to object.
- @size - the same.
- @id - local inode number of the directory to look object in.
- @start - local inode number of the object to look at.
- @NETFS_LINK
- Create hard of symlink.
- Command is sent as "object_path|target_path".
- @size - size of the above string.
- @id - parent local inode number.
- @start - 1 for symlink, 0 for hardlink.
- @ext - size of the "object_path" above.
- @NETFS_TRANS
- Transaction header.
- @size - incorporates all embedded command sizes including theirs header sizes.
- @start - transaction generation number - unique id used to find transaction.
- @ext - transaction flags. Unused at the moment.
- @id - 0.
- @NETFS_OPEN
- Open intent for given transaction.
- @id - local inode number.
- @start - 0.
- @size - path length to the object.
- @ext - open flags (O_RDWR and so on).
- @NETFS_INODE_INFO
- Metadata update command.
- It is sent to servers when attributes of the object are changed and received
- when data or metadata were updated. It operates with the following structure:
- struct netfs_inode_info
- {
- unsigned int mode;
- unsigned int nlink;
- unsigned int uid;
- unsigned int gid;
- unsigned int blocksize;
- unsigned int padding;
- __u64 ino;
- __u64 blocks;
- __u64 rdev;
- __u64 size;
- __u64 version;
- };
- It effectively mirrors stat(2) returned data.
- @ext - path length to the object.
- @size - the same plus size of the netfs_inode_info structure.
- @id - local inode number.
- @start - 0.
- @NETFS_PAGE_CACHE
- Command is only received by clients. It contains information about
- page to be marked as not up-to-date.
- @id - client's inode number.
- @start - last byte of the page to be invalidated. If it is not equal to
- current inode size, it will be vmtruncated().
- @size - 0
- @ext - 0
- @NETFS_READ_PAGES
- Used to read multiple contiguous pages in one go.
- @start - first byte of the contiguous region to read.
- @size - contains of two fields: lower 8 bits are used to represent page cache shift
- used by client, another 3 bytes are used to get number of pages.
- @id - local inode number.
- @ext - path length to the object.
- @NETFS_RENAME
- Used to rename object.
- Attached data is formed into following string: "old_path|new_path".
- @id - local inode number.
- @start - parent inode number.
- @size - length of the above string.
- @ext - length of the old path part.
- @NETFS_CAPABILITIES
- Used to exchange crypto capabilities with server.
- If crypto capabilities are not supported by server, then client will disable it
- or fail (if 'crypto_fail_unsupported' mount options was specified).
- @id - superblock index. Used to specify crypto information for group of servers.
- @size - size of the attached capabilities structure.
- @start - 0.
- @size - 0.
- @scsize - 0.
- @NETFS_LOCK
- Used to send lock request/release messages. Although it sends byte range request
- and is capable of flushing pages based on that, it is not used, since all Linux
- filesystems lock the whole inode.
- @id - lock generation number.
- @start - start of the locked range.
- @size - size of the locked range.
- @ext - lock type: read/write. Not used actually. 15'th bit is used to determine,
- if it is lock request (1) or release (0).
- @NETFS_XATTR_SET
- @NETFS_XATTR_GET
- Used to set/get extended attributes for given inode.
- @id - attribute generation number or xattr setting type
- @start - size of the attribute (request or attached)
- @size - name length, path len and data size for given attribute
- @ext - path length for given object
|