From e9615d46a09a5dc92bf1d2ee408f0c7efd717503 Mon Sep 17 00:00:00 2001 From: yangxin <245051644@qq.com> Date: Fri, 10 Feb 2023 16:39:20 +0800 Subject: [PATCH 2/5] Fix-error-of-getxattr-and-listxattr Signed-off-by: yangxin <245051644@qq.com> --- qtfs/conn.c | 4 --- qtfs/qtfs/qtfs-mod.c | 2 +- qtfs/qtfs/sb.c | 6 ++--- qtfs/qtfs/xattr.c | 55 ++++++++++------------------------------ qtfs/qtfs_server/fsops.c | 16 +++++++----- qtfs/qtinfo/qtinfo.h | 10 ++++---- qtfs/req.h | 4 +-- 7 files changed, 34 insertions(+), 63 deletions(-) diff --git a/qtfs/conn.c b/qtfs/conn.c index af11fbe..26930b1 100644 --- a/qtfs/conn.c +++ b/qtfs/conn.c @@ -76,10 +76,6 @@ static int qtfs_conn_sockserver_init(struct qtfs_sock_var_s *pvar) { struct socket *sock; int ret; - struct sockaddr_in saddr; - saddr.sin_family = AF_INET; - saddr.sin_port = htons(pvar->port); - saddr.sin_addr.s_addr = in_aton(pvar->addr); if (!QTCONN_IS_EPOLL_CONN(pvar) && qtfs_server_main_sock != NULL) { qtfs_info("qtfs server main sock is %lx, valid or out-of-date?", (unsigned long)qtfs_server_main_sock); diff --git a/qtfs/qtfs/qtfs-mod.c b/qtfs/qtfs/qtfs-mod.c index 9ccf0ee..abd9443 100644 --- a/qtfs/qtfs/qtfs-mod.c +++ b/qtfs/qtfs/qtfs-mod.c @@ -9,7 +9,7 @@ static struct file_system_type qtfs_fs_type = { .owner = THIS_MODULE, .name = QTFS_FSTYPE_NAME, .mount = qtfs_fs_mount, - .kill_sb = qtfs_kill_sb,//qtfs_kill_sb, + .kill_sb = qtfs_kill_sb, }; MODULE_ALIAS_FS("qtfs"); diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c index 9374cfb..7445fad 100644 --- a/qtfs/qtfs/sb.c +++ b/qtfs/qtfs/sb.c @@ -18,7 +18,7 @@ static struct inode_operations qtfs_inode_ops; static struct inode_operations qtfs_symlink_inode_ops; struct inode *qtfs_iget(struct super_block *sb, struct inode_info *ii); - +extern ssize_t qtfs_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size); int qtfs_statfs(struct dentry *dentry, struct kstatfs *buf) { struct qtfs_sock_var_s *pvar = qtfs_conn_get_param(); @@ -396,7 +396,6 @@ ssize_t qtfs_writeiter(struct kiocb *kio, struct iov_iter *iov) leftlen -= wrbuflen; } while (leftlen); - //if (qtfs_support_epoll(kio->ki_filp->f_inode->i_mode) || ) { do { struct inode *inode = kio->ki_filp->f_inode; struct qtfs_inode_priv *priv = inode->i_private; @@ -406,7 +405,6 @@ ssize_t qtfs_writeiter(struct kiocb *kio, struct iov_iter *iov) wake_up_interruptible_poll(&priv->readq, EPOLLIN); qtfs_err("writeiter file:%s char:<%s> wakup poll.", filp->f_path.dentry->d_iname, req->path_buf); } - //qtfs_info("qtfs write iter fifo %s sync poll.", filp->f_path.dentry->d_iname); } while (0); qtfs_info("qtfs write %s over, leftlen:%lu.", filp->f_path.dentry->d_iname, leftlen); qtfs_conn_put_param(pvar); @@ -1338,12 +1336,14 @@ static struct inode_operations qtfs_inode_ops = { .getattr = qtfs_getattr, .setattr = qtfs_setattr, .rename = qtfs_rename, + .listxattr = qtfs_xattr_list, }; static struct inode_operations qtfs_symlink_inode_ops = { .get_link = qtfs_getlink, .getattr = qtfs_getattr, .setattr = qtfs_setattr, + .listxattr = qtfs_xattr_list, }; const struct xattr_handler *qtfs_xattr_handlers[] = { diff --git a/qtfs/qtfs/xattr.c b/qtfs/qtfs/xattr.c index a0d394a..a2a605d 100644 --- a/qtfs/qtfs/xattr.c +++ b/qtfs/qtfs/xattr.c @@ -6,69 +6,52 @@ #include "req.h" #include "log.h" -static bool qtfs_xattr_list(struct dentry *dentry) +ssize_t qtfs_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size) { struct qtreq_xattrlist *req; struct qtrsp_xattrlist *rsp; struct qtfs_sock_var_s *pvar = qtfs_conn_get_param(); - bool ret; + ssize_t ret; if (!pvar) { qtfs_err("qtfs_xattr_list Failed to get qtfs sock var"); - return -EINVAL; + return 0; } if (dentry == NULL) { qtfs_err("qtfs_xattr_list dentry is NULL."); qtfs_conn_put_param(pvar); - return false; + return 0; } req = qtfs_sock_msg_buf(pvar, QTFS_SEND); if (qtfs_fullname(req->path, dentry) < 0) { qtfs_err("qtfs fullname failed"); qtfs_conn_put_param(pvar); - return false; + return 0; } - - rsp = qtfs_remote_run(pvar, QTFS_REQ_XATTRLIST, strlen(req->path) + 1); + req->buffer_size = buffer_size; + rsp = qtfs_remote_run(pvar, QTFS_REQ_XATTRLIST, QTFS_SEND_SIZE(struct qtreq_xattrlist, req->path)); if (IS_ERR(rsp) || rsp == NULL) { qtfs_err("qtfs_xattr_list remote run failed."); qtfs_conn_put_param(pvar); - return false; + return 0; } if (rsp->d.ret == QTFS_ERR) { qtfs_err("qtfs_xattr_list failed with ret:%d.", rsp->d.ret); - ret = rsp->d.result; + ret = rsp->d.size; qtfs_conn_put_param(pvar); return ret; } - ret = rsp->d.result; + ret = rsp->d.size; + if (buffer != NULL) { + memcpy(buffer, rsp->name, buffer_size); + } qtfs_conn_put_param(pvar); return ret; } -static bool qtfs_xattr_user_list(struct dentry *dentry) -{ - return qtfs_xattr_list(dentry); -} - -static bool qtfs_xattr_trusted_list(struct dentry *dentry) -{ - return qtfs_xattr_list(dentry); -} - -static bool qtfs_xattr_security_list(struct dentry *dentry) -{ - return qtfs_xattr_list(dentry); -} - -static bool qtfs_xattr_hurd_list(struct dentry *dentry) -{ - return qtfs_xattr_list(dentry); -} - static int qtfs_xattr_set(const struct xattr_handler *handler, struct dentry *dentry, struct inode *inode, const char *name, const void *value, @@ -177,12 +160,6 @@ static int qtfs_xattr_get(const struct xattr_handler *handler, qtfs_err("Failed to get qtfs sock var"); return 0; } - /*if (buf == NULL || size <= 0) { - qtfs_err("xattr get failed, buf:%lx size:%d name:%s dentry:%lx", - (unsigned long)buf, size, (name == NULL) ? "NULL" : name, (unsigned long)dentry); - qtfs_conn_put_param(pvar); - return 0; - }*/ if (dentry == NULL) { qtfs_err("xattr get dentry is NULL."); @@ -216,7 +193,7 @@ static int qtfs_xattr_get(const struct xattr_handler *handler, qtfs_conn_put_param(pvar); return PTR_ERR(rsp); } - if (rsp->d.ret == QTFS_ERR || rsp->d.size > req->d.size || leftlen < rsp->d.size) { + if (rsp->d.ret == QTFS_ERR || (size !=0 && (rsp->d.size > req->d.size || leftlen < rsp->d.size))) { qtfs_err("ret:%d rsp size:%ld req size:%d leftlen:%lu", rsp->d.ret, rsp->d.size, req->d.size, leftlen); goto err_end; @@ -239,28 +216,24 @@ err_end: const struct xattr_handler qtfs_xattr_user_handler = { .prefix = XATTR_USER_PREFIX, - .list = qtfs_xattr_user_list, .get = qtfs_xattr_get, .set = qtfs_xattr_user_set, }; const struct xattr_handler qtfs_xattr_trusted_handler = { .prefix = XATTR_TRUSTED_PREFIX, - .list = qtfs_xattr_trusted_list, .get = qtfs_xattr_get, .set = qtfs_xattr_trusted_set, }; const struct xattr_handler qtfs_xattr_security_handler = { .prefix = XATTR_SECURITY_PREFIX, - .list = qtfs_xattr_security_list, .get = qtfs_xattr_get, .set = qtfs_xattr_security_set, }; const struct xattr_handler qtfs_xattr_hurd_handler = { .prefix = XATTR_HURD_PREFIX, - .list = qtfs_xattr_hurd_list, .get = qtfs_xattr_get, .set = qtfs_xattr_hurd_set, }; diff --git a/qtfs/qtfs_server/fsops.c b/qtfs/qtfs_server/fsops.c index d00db6d..61e8895 100644 --- a/qtfs/qtfs_server/fsops.c +++ b/qtfs/qtfs_server/fsops.c @@ -576,6 +576,7 @@ static int handle_getattr(struct qtserver_arg *arg) qtfs_debug("handle getattr path:%s\n", req->path); ret = kern_path(req->path, 0, &path); if (ret) { + rsp->errno = ret; qtfs_err("handle getattr path:%s failed, ret:%d %s\n", req->path, ret, (ret != -ENOENT) ? "." : "file not exist"); goto failed; } @@ -866,26 +867,27 @@ int handle_xattrlist(struct qtserver_arg *arg) struct qtrsp_xattrlist *rsp = (struct qtrsp_xattrlist *)RSP(arg); struct path path; int ret; - ssize_t size; + ssize_t size, buffer_size; int i; + buffer_size = req->buffer_size; ret = kern_path(req->path, 0, &path); if (ret) { qtfs_err("handle xattr list path error.\n"); - rsp->d.errno = -ENOENT; + rsp->d.size = -ENOENT; goto err_handle; } - size = generic_listxattr(path.dentry, rsp->name, sizeof(rsp->name)); + size = vfs_listxattr(path.dentry, buffer_size == 0 ? NULL : rsp->name, buffer_size); path_put(&path); if (size < 0) { qtfs_err("handle list xattr failed, errno:%ld.\n", size); - rsp->d.errno = size; + rsp->d.size = size; goto err_handle; } if (size == 0) goto err_handle; rsp->d.ret = QTFS_OK; - rsp->d.result = true; + rsp->d.size = size; while (i < size) { qtfs_info("handle list xattr result:%s\n", &rsp->name[i]); i += strlen(&rsp->name[i]) + 1; @@ -894,7 +896,7 @@ int handle_xattrlist(struct qtserver_arg *arg) err_handle: rsp->d.ret = QTFS_ERR; - rsp->d.result = false; + rsp->d.size = size; return sizeof(struct qtrsp_xattrlist); } @@ -970,9 +972,9 @@ int handle_xattrget(struct qtserver_arg *arg) } qtfs_info("handle getxattr: path:%s prefix name:%s : (%s - 0x%llx), size:%ld, reqpos:%d\n", req->path, req->d.prefix_name, kvalue, (__u64)kvalue, error, req->d.pos); len = (error - req->d.pos)>sizeof(rsp->buf)? sizeof(rsp->buf):(error - req->d.pos); + rsp->d.size = len; if (req->d.size > 0) { memcpy(rsp->buf, &kvalue[req->d.pos], len); - rsp->d.size = len; } rsp->d.pos = req->d.pos + len; } else { diff --git a/qtfs/qtinfo/qtinfo.h b/qtfs/qtinfo/qtinfo.h index 0244a6e..eb7e8be 100644 --- a/qtfs/qtinfo/qtinfo.h +++ b/qtfs/qtinfo/qtinfo.h @@ -9,29 +9,29 @@ enum qtfs_req_type QTFS_REQ_OPEN, QTFS_REQ_CLOSE, QTFS_REQ_READ, - QTFS_REQ_READITER, //5 + QTFS_REQ_READITER, // 5 QTFS_REQ_WRITE, QTFS_REQ_LOOKUP, QTFS_REQ_READDIR, QTFS_REQ_MKDIR, - QTFS_REQ_RMDIR, //10 + QTFS_REQ_RMDIR, // 10 QTFS_REQ_GETATTR, QTFS_REQ_SETATTR, QTFS_REQ_ICREATE, QTFS_REQ_MKNOD, - QTFS_REQ_UNLINK, //15 + QTFS_REQ_UNLINK, // 15 QTFS_REQ_SYMLINK, QTFS_REQ_LINK, QTFS_REQ_GETLINK, QTFS_REQ_READLINK, - QTFS_REQ_RENAME, //20 + QTFS_REQ_RENAME, // 20 QTFS_REQ_XATTRLIST, QTFS_REQ_XATTRGET, QTFS_REQ_XATTRSET, QTFS_REQ_SYSMOUNT, - QTFS_REQ_SYSUMOUNT, //25 + QTFS_REQ_SYSUMOUNT, // 25 QTFS_REQ_FIFOPOLL, QTFS_REQ_STATFS, diff --git a/qtfs/req.h b/qtfs/req.h index 3bcfa77..29f8964 100644 --- a/qtfs/req.h +++ b/qtfs/req.h @@ -414,14 +414,14 @@ struct qtrsp_rename { // xattr def #define QTFS_XATTR_LEN 64 struct qtreq_xattrlist { + size_t buffer_size; char path[MAX_PATH_LEN]; }; struct qtrsp_xattrlist { struct qtrsp_xattrlist_len { int ret; - int errno; - bool result; + ssize_t size; }d; char name[QTFS_TAIL_LEN(struct qtrsp_xattrlist_len)]; }; -- 2.33.0