-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Encode overlay file handles as struct ovl_fh containing the file handle encoding of the real upper inode. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
- Loading branch information
Amir Goldstein
authored and
Miklos Szeredi
committed
Jan 24, 2018
1 parent
a01f64b
commit 8ed5eec
Showing
3 changed files
with
106 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
/* | ||
* Overlayfs NFS export support. | ||
* | ||
* Amir Goldstein <amir73il@gmail.com> | ||
* | ||
* Copyright (C) 2017-2018 CTERA Networks. All Rights Reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published by | ||
* the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/fs.h> | ||
#include <linux/cred.h> | ||
#include <linux/mount.h> | ||
#include <linux/namei.h> | ||
#include <linux/xattr.h> | ||
#include <linux/exportfs.h> | ||
#include <linux/ratelimit.h> | ||
#include "overlayfs.h" | ||
|
||
static int ovl_d_to_fh(struct dentry *dentry, char *buf, int buflen) | ||
{ | ||
struct dentry *upper = ovl_dentry_upper(dentry); | ||
struct dentry *origin = ovl_dentry_lower(dentry); | ||
struct ovl_fh *fh = NULL; | ||
int err; | ||
|
||
/* | ||
* On overlay with an upper layer, overlay root inode is encoded as | ||
* an upper file handle, because upper root dir is not indexed. | ||
*/ | ||
if (dentry == dentry->d_sb->s_root && upper) | ||
origin = NULL; | ||
|
||
err = -EACCES; | ||
if (!upper || origin) | ||
goto fail; | ||
|
||
/* TODO: encode non pure-upper by origin */ | ||
fh = ovl_encode_fh(upper, true); | ||
|
||
err = -EOVERFLOW; | ||
if (fh->len > buflen) | ||
goto fail; | ||
|
||
memcpy(buf, (char *)fh, fh->len); | ||
err = fh->len; | ||
|
||
out: | ||
kfree(fh); | ||
return err; | ||
|
||
fail: | ||
pr_warn_ratelimited("overlayfs: failed to encode file handle (%pd2, err=%i, buflen=%d, len=%d, type=%d)\n", | ||
dentry, err, buflen, fh ? (int)fh->len : 0, | ||
fh ? fh->type : 0); | ||
goto out; | ||
} | ||
|
||
static int ovl_dentry_to_fh(struct dentry *dentry, u32 *fid, int *max_len) | ||
{ | ||
int res, len = *max_len << 2; | ||
|
||
res = ovl_d_to_fh(dentry, (char *)fid, len); | ||
if (res <= 0) | ||
return FILEID_INVALID; | ||
|
||
len = res; | ||
|
||
/* Round up to dwords */ | ||
*max_len = (len + 3) >> 2; | ||
return OVL_FILEID; | ||
} | ||
|
||
static int ovl_encode_inode_fh(struct inode *inode, u32 *fid, int *max_len, | ||
struct inode *parent) | ||
{ | ||
struct dentry *dentry; | ||
int type; | ||
|
||
/* TODO: encode connectable file handles */ | ||
if (parent) | ||
return FILEID_INVALID; | ||
|
||
dentry = d_find_any_alias(inode); | ||
if (WARN_ON(!dentry)) | ||
return FILEID_INVALID; | ||
|
||
type = ovl_dentry_to_fh(dentry, fid, max_len); | ||
|
||
dput(dentry); | ||
return type; | ||
} | ||
|
||
const struct export_operations ovl_export_operations = { | ||
.encode_fh = ovl_encode_inode_fh, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters