[PVFS2-CVS] commit by robl in pvfs2-1/src/apps/kernel/linux: pvfs2-client-core.c

CVS commit program cvs at parl.clemson.edu
Mon Aug 1 19:49:49 EDT 2005


Update of /projects/cvsroot/pvfs2-1/src/apps/kernel/linux
In directory parlweb:/tmp/cvs-serv3456/src/apps/kernel/linux

Modified Files:
	pvfs2-client-core.c 
Log Message:
Murali's patch to add VFS support for extended attributes.  


Index: pvfs2-client-core.c
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/apps/kernel/linux/pvfs2-client-core.c,v
diff -u -w -p -u -r1.46 -r1.47
--- pvfs2-client-core.c	7 Jul 2005 22:12:09 -0000	1.46
+++ pvfs2-client-core.c	1 Aug 2005 22:49:49 -0000	1.47
@@ -115,6 +115,8 @@ typedef struct
 #endif
     PVFS_Request file_req;
     PVFS_Request mem_req;
+    PVFS_ds_keyval  key;/* used only by geteattr, seteattr */
+    PVFS_ds_keyval  val;
     void *io_kernel_mapped_buf;
 
     int was_handled_inline;
@@ -132,6 +134,7 @@ typedef struct
         PVFS_sysresp_readdir readdir;
         PVFS_sysresp_statfs statfs;
         PVFS_sysresp_io io;
+        PVFS_sysresp_geteattr geteattr;
     } response;
 
 #ifdef CLIENT_CORE_OP_TIMING
@@ -670,6 +673,127 @@ static PVFS_error post_truncate_request(
     return ret;
 }
 
+static PVFS_error post_getxattr_request(vfs_request_t *vfs_request)
+{
+    PVFS_error ret = -PVFS_EINVAL;
+
+    gossip_debug(
+        GOSSIP_CLIENTCORE_DEBUG,
+        "got a getxattr request for fsid %d | handle %Lu\n",
+        vfs_request->in_upcall.req.getxattr.refn.fs_id,
+        Lu(vfs_request->in_upcall.req.getxattr.refn.handle));
+
+    /* We need to fill in the vfs_request->key field here */
+    vfs_request->key.buffer = vfs_request->in_upcall.req.getxattr.key;
+    vfs_request->key.buffer_sz = vfs_request->in_upcall.req.getxattr.key_sz;
+    gossip_debug( GOSSIP_CLIENTCORE_DEBUG, 
+            "getxattr key %s keysz %d\n", 
+            (char *) vfs_request->key.buffer, vfs_request->key.buffer_sz);
+
+    /* We also need to allocate memory for the vfs_request->response.geteattr */
+
+    vfs_request->response.geteattr.val_array = 
+        (PVFS_ds_keyval *) malloc(sizeof(PVFS_ds_keyval));
+    if (vfs_request->response.geteattr.val_array == NULL)
+    {
+        return -PVFS_ENOMEM;
+    }
+    vfs_request->response.geteattr.val_array[0].buffer = 
+        (void *) malloc(PVFS_REQ_LIMIT_VAL_LEN);
+    if (vfs_request->response.geteattr.val_array[0].buffer == NULL)
+    {
+        free(vfs_request->response.geteattr.val_array);
+        return -PVFS_ENOMEM;
+    }
+    vfs_request->response.geteattr.val_array[0].buffer_sz = 
+        PVFS_REQ_LIMIT_VAL_LEN;
+    /* Remember to free these up */
+    ret = PVFS_isys_geteattr_list(
+        vfs_request->in_upcall.req.getxattr.refn,
+        &vfs_request->in_upcall.credentials,
+        1,
+        &vfs_request->key,
+        &vfs_request->response.geteattr,
+        &vfs_request->op_id, 
+        (void *)vfs_request);
+
+    if (ret < 0)
+    {
+        PVFS_perror_gossip("Posting getxattr failed", ret);
+    }
+    return ret;
+}
+
+static PVFS_error post_setxattr_request(vfs_request_t *vfs_request)
+{
+    PVFS_error ret = -PVFS_EINVAL;
+
+    gossip_debug(
+        GOSSIP_CLIENTCORE_DEBUG,
+        "got a setxattr request for fsid %d | handle %Lu\n",
+        vfs_request->in_upcall.req.setxattr.refn.fs_id,
+        Lu(vfs_request->in_upcall.req.setxattr.refn.handle));
+
+    /* We need to fill in the vfs_request->key field here */
+    vfs_request->key.buffer = vfs_request->in_upcall.req.setxattr.keyval.key;
+    vfs_request->key.buffer_sz = 
+        vfs_request->in_upcall.req.setxattr.keyval.key_sz;
+    gossip_debug(
+        GOSSIP_CLIENTCORE_DEBUG,
+        "setxattr key %s\n", (char *) vfs_request->key.buffer);
+    /* We need to fill in the vfs_request->val field here */
+    vfs_request->val.buffer = vfs_request->in_upcall.req.setxattr.keyval.val;
+    vfs_request->val.buffer_sz = 
+        vfs_request->in_upcall.req.setxattr.keyval.val_sz;
+
+    ret = PVFS_isys_seteattr_list(
+        vfs_request->in_upcall.req.setxattr.refn,
+        &vfs_request->in_upcall.credentials,
+        1,
+        &vfs_request->key,
+        &vfs_request->val,
+        vfs_request->in_upcall.req.setxattr.flags,
+        &vfs_request->op_id, 
+        (void *)vfs_request);
+
+    if (ret < 0)
+    {
+        PVFS_perror_gossip("Posting setattr failed", ret);
+    }
+    return ret;
+}
+
+static PVFS_error post_removexattr_request(vfs_request_t *vfs_request)
+{
+    PVFS_error ret = -PVFS_EINVAL;
+
+    gossip_debug(
+        GOSSIP_CLIENTCORE_DEBUG,
+        "got a removexattr request for fsid %d | handle %Lu\n",
+        vfs_request->in_upcall.req.removexattr.refn.fs_id,
+        Lu(vfs_request->in_upcall.req.removexattr.refn.handle));
+
+    /* We need to fill in the vfs_request->key field here */
+    vfs_request->key.buffer = vfs_request->in_upcall.req.removexattr.key;
+    vfs_request->key.buffer_sz = vfs_request->in_upcall.req.removexattr.key_sz;
+    gossip_debug(
+        GOSSIP_CLIENTCORE_DEBUG,
+        "removexattr key %s\n", (char *) vfs_request->key.buffer);
+
+    ret = PVFS_isys_deleattr(
+        vfs_request->in_upcall.req.setxattr.refn,
+        &vfs_request->in_upcall.credentials,
+        &vfs_request->key,
+        &vfs_request->op_id, 
+        (void *)vfs_request);
+
+    if (ret < 0)
+    {
+        PVFS_perror_gossip("Posting deleattr failed", ret);
+    }
+    return ret;
+}
+
 #define generate_upcall_mntent(mntent, in_upcall, mount)              \
 do {                                                                  \
     /*                                                                \
@@ -1628,6 +1752,39 @@ static inline void package_downcall_memb
                 *error_code = -PVFS_EINTR;
             }
             break;
+        case PVFS2_VFS_OP_GETXATTR:
+            if (*error_code == 0)
+            {
+                int val_sz = 
+                    vfs_request->response.geteattr.val_array[0].read_sz;
+                gossip_debug(GOSSIP_CLIENTCORE_DEBUG, 
+                        "getxattr: val_sz %d, val %s\n",
+                        val_sz, 
+                        (char *) vfs_request->response.geteattr.val_array[0].buffer);
+                /* copy the requested key's value out to the downcall */
+                if (val_sz > PVFS_MAX_XATTR_VALUELEN)
+                {
+                    /* This is really bad. Can it happen? */
+                    *error_code = -PVFS_EINVAL;
+                }
+                else
+                {
+                    vfs_request->out_downcall.resp.getxattr.val_sz = val_sz;
+                    memcpy(vfs_request->out_downcall.resp.getxattr.val,
+                            vfs_request->response.geteattr.val_array[0].buffer,
+                            val_sz);
+                }
+            }
+            /* free up the memory allocate to response.geteattr */
+            free(vfs_request->response.geteattr.val_array[0].buffer);
+            vfs_request->response.geteattr.val_array[0].buffer = NULL;
+            free(vfs_request->response.geteattr.val_array);
+            vfs_request->response.geteattr.val_array = NULL;
+            break;
+        case PVFS2_VFS_OP_SETXATTR:
+            break;
+        case PVFS2_VFS_OP_REMOVEXATTR:
+            break;
         default:
             gossip_err("Completed upcall of unknown type %x!\n",
                        vfs_request->in_upcall.type);
@@ -1780,6 +1937,18 @@ static inline PVFS_error handle_unexp_vf
             posted_op = 1;
             ret = post_truncate_request(vfs_request);
             break;
+        case PVFS2_VFS_OP_GETXATTR:
+            posted_op = 1;
+            ret = post_getxattr_request(vfs_request);
+            break;
+        case PVFS2_VFS_OP_SETXATTR:
+            posted_op = 1;
+            ret = post_setxattr_request(vfs_request);
+            break;
+        case PVFS2_VFS_OP_REMOVEXATTR:
+            posted_op = 1;
+            ret = post_removexattr_request(vfs_request);
+            break;
             /*
               NOTE: mount, umount and statfs are blocking
               calls that are serviced inline.
@@ -1818,10 +1987,11 @@ static inline PVFS_error handle_unexp_vf
             posted_op = 1;
             ret = post_fsync_request(vfs_request);
             break;
+        case PVFS2_VFS_OP_LISTXATTR:
         case PVFS2_VFS_OP_INVALID:
         default:
             gossip_err(
-                "Got an unrecognized vfs operation of "
+                "Got an unrecognized/unimplemented vfs operation of "
                 "type %x.\n", vfs_request->in_upcall.type);
             break;
     }
@@ -2333,7 +2503,12 @@ static char *get_vfs_op_name_str(int op_
         { PVFS2_VFS_OP_MMAP_RA_FLUSH, "PVFS2_VFS_OP_MMAP_RA_FLUSH" },
         { PVFS2_VFS_OP_FS_MOUNT, "PVFS2_VFS_OP_FS_MOUNT" },
         { PVFS2_VFS_OP_FS_UMOUNT, "PVFS2_VFS_OP_FS_UMOUNT" },
+        { PVFS2_VFS_OP_GETXATTR,  "PVFS2_VFS_OP_GETXATTR" },
+        { PVFS2_VFS_OP_SETXATTR,  "PVFS2_VFS_OP_SETXATTR" },
+        { PVFS2_VFS_OP_LISTXATTR, "PVFS2_VFS_OP_LISTXATTR" },
+        { PVFS2_VFS_OP_REMOVEXATTR, "PVFS2_VFS_OP_REMOVEXATTR" },
         { PVFS2_VFS_OP_CANCEL, "PVFS2_VFS_OP_CANCEL" },
+        { PVFS2_VFS_OP_FSYNC,  "PVFS2_VFS_OP_FSYNC" },
         { 0, "UNKNOWN" }
     };
 



More information about the PVFS2-CVS mailing list