Re: [PATCH 4/7] fs: make remaining filesystems use .rename2

From: Boaz Harrosh
Date: Tue Aug 23 2016 - 12:24:55 EST


On 08/23/2016 05:05 PM, Miklos Szeredi wrote:
> This is trivial to do:
>
> - add flags argument to foo_rename()
> - check if flags is zero
> - assign foo_rename() to .rename2 instead of .rename
>
> This doesn't mean it's impossible to support RENAME_NOREPLACE for these
> filesystems, but it is not trivial, like for local filesystems.
> RENAME_NOREPLACE must guarantee atomicity (i.e. it shouldn't be possible
> for a file to be created on one host while it is overwritten by rename on
> another host).
>
> Filesystems converted:
>
> 9p, afs, ceph, coda, ecryptfs, exofs, kernfs, lustre, ncpfs, nfs, ocfs2,
> orangefs.
>
> After this, we can get rid of the duplicate interfaces for rename.
>
> Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxxxxx>
> Cc: Eric Van Hensbergen <ericvh@xxxxxxxxx>
> Cc: David Howells <dhowells@xxxxxxxxxx>
> Cc: Ilya Dryomov <idryomov@xxxxxxxxx>
> Cc: Jan Harkes <jaharkes@xxxxxxxxxx>
> Cc: Tyler Hicks <tyhicks@xxxxxxxxxxxxx>
> Cc: Boaz Harrosh <ooo@xxxxxxxxxxxxxxx>

Hi exofs is not a distributed file system in the nfs-client
sense. All meta-data operations happen on the single exofs mount.
The distribution of an exofs cluster is done by an NFSD-like daemon
that supports pNFS, and an std pNFS-client.
So the code you see below is just the same as an ext4 FS with
a raid of iscsi devices below it. (Even if then later this FS is
exported by an NFSD server)

That said it is fine as is don't sweat over this unused FS so:
ACK-by: Boaz Harrosh <ooo@xxxxxxxxxxxxxxx>

<>

> diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c
> index 622a686bb08b..897280163f3c 100644
> --- a/fs/exofs/namei.c
> +++ b/fs/exofs/namei.c
> @@ -227,7 +227,8 @@ static int exofs_rmdir(struct inode *dir, struct dentry *dentry)
> }
>
> static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,
> - struct inode *new_dir, struct dentry *new_dentry)
> + struct inode *new_dir, struct dentry *new_dentry,
> + unsigned int flags)
> {
> struct inode *old_inode = d_inode(old_dentry);
> struct inode *new_inode = d_inode(new_dentry);
> @@ -237,6 +238,9 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,
> struct exofs_dir_entry *old_de;
> int err = -ENOENT;
>
> + if (flags)
> + return -EINVAL;
> +
> old_de = exofs_find_entry(old_dir, old_dentry, &old_page);
> if (!old_de)
> goto out;
> @@ -310,7 +314,7 @@ const struct inode_operations exofs_dir_inode_operations = {
> .mkdir = exofs_mkdir,
> .rmdir = exofs_rmdir,
> .mknod = exofs_mknod,
> - .rename = exofs_rename,
> + .rename2 = exofs_rename,
> .setattr = exofs_setattr,
> };
>
<>